Skip to content

Commit 8925f8c

Browse files
Add eslint plugin and rule to check for use of deprecated APIs (#1890)
1 parent 05b1fca commit 8925f8c

30 files changed

Lines changed: 152 additions & 69 deletions
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"changes": [
3+
{
4+
"packageName": "@typespec/compiler",
5+
"comment": "Cleanup deprecated use",
6+
"type": "none"
7+
}
8+
],
9+
"packageName": "@typespec/compiler"
10+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"changes": [
3+
{
4+
"packageName": "@typespec/eslint-config-typespec",
5+
"comment": "Add `deprecated/deprecated` rule",
6+
"type": "minor"
7+
}
8+
],
9+
"packageName": "@typespec/eslint-config-typespec"
10+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"changes": [
3+
{
4+
"packageName": "@typespec/http",
5+
"comment": "Cleanup deprecated use",
6+
"type": "none"
7+
}
8+
],
9+
"packageName": "@typespec/http"
10+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"changes": [
3+
{
4+
"packageName": "@typespec/rest",
5+
"comment": "Cleanup deprecated use",
6+
"type": "none"
7+
}
8+
],
9+
"packageName": "@typespec/rest"
10+
}

common/config/rush/pnpm-lock.yaml

Lines changed: 21 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/compiler/core/helpers/type-name-utils.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { printId } from "../../formatter/print/printer.js";
2+
import { isTemplateInstance } from "../type-utils.js";
23
import {
34
Enum,
45
Interface,
@@ -39,7 +40,7 @@ export function getTypeName(type: Type, options?: TypeNameOptions): string {
3940
case "Union":
4041
return type.name
4142
? getIdentifierName(type.name, options)
42-
: type.options.map((x) => getTypeName(x, options)).join(" | ");
43+
: [...type.variants.values()].map((x) => getTypeName(x.type, options)).join(" | ");
4344
case "UnionVariant":
4445
return getTypeName(type.type, options);
4546
case "Tuple":
@@ -119,9 +120,9 @@ function getModelName(model: Model, options: TypeNameOptions | undefined) {
119120
return nsPrefix + "(anonymous model)";
120121
}
121122
const modelName = nsPrefix + getIdentifierName(model.name, options);
122-
if (model.templateArguments && model.templateArguments.length > 0) {
123+
if (isTemplateInstance(model)) {
123124
// template instantiation
124-
const args = model.templateArguments.map((x) => getTypeName(x, options));
125+
const args = model.templateMapper.args.map((x) => getTypeName(x, options));
125126
return `${modelName}<${args.join(", ")}>`;
126127
} else if ((model.node as ModelStatementNode)?.templateParameters?.length > 0) {
127128
// template
@@ -159,8 +160,10 @@ function getModelPropertyName(prop: ModelProperty, options: TypeNameOptions | un
159160

160161
function getInterfaceName(iface: Interface, options: TypeNameOptions | undefined) {
161162
let interfaceName = getIdentifierName(iface.name, options);
162-
if (iface.templateArguments && iface.templateArguments.length > 0) {
163-
interfaceName += `<${iface.templateArguments.map((x) => getTypeName(x, options)).join(", ")}>`;
163+
if (isTemplateInstance(iface)) {
164+
interfaceName += `<${iface.templateMapper.args
165+
.map((x) => getTypeName(x, options))
166+
.join(", ")}>`;
164167
}
165168
return `${getNamespacePrefix(iface.namespace, options)}${interfaceName}`;
166169
}

packages/compiler/core/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ export * from "./emitter-utils.js";
88
export * from "./formatter.js";
99
export * from "./helpers/index.js";
1010
export {
11+
// eslint-disable-next-line deprecation/deprecation
1112
createCadlLibrary,
1213
createTypeSpecLibrary,
1314
paramMessage,
15+
// eslint-disable-next-line deprecation/deprecation
1416
setCadlNamespace,
1517
setTypeSpecNamespace,
1618
} from "./library.js";

packages/compiler/core/path-utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,7 @@ export function getPathFromPathComponents(pathComponents: readonly string[]) {
436436
export function removeTrailingDirectorySeparator(path: string): string;
437437
export function removeTrailingDirectorySeparator(path: string) {
438438
if (hasTrailingDirectorySeparator(path)) {
439-
return path.substr(0, path.length - 1);
439+
return path.substring(0, path.length - 1);
440440
}
441441

442442
return path;

packages/compiler/core/program.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,10 +335,13 @@ export async function compile(
335335
if (resolvedMain) {
336336
let emit = options.emit;
337337
let emitterOptions = options.options;
338+
/* eslint-disable deprecation/deprecation */
338339
if (options.emitters) {
339340
emit ??= Object.keys(options.emitters);
340341
emitterOptions ??= options.emitters;
341342
}
343+
/* eslint-enable deprecation/deprecation */
344+
342345
await loadEmitters(resolvedMain, emit ?? [], emitterOptions ?? {});
343346
}
344347

@@ -1199,6 +1202,7 @@ export function createStateAccessors(
11991202
* Resolve compiler options from input options.
12001203
*/
12011204
function resolveOptions(options: CompilerOptions): CompilerOptions {
1205+
// eslint-disable-next-line deprecation/deprecation
12021206
const outputDir = options.outputDir ?? options.outputPath;
12031207
return {
12041208
...options,

packages/compiler/core/projector.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,7 @@ export function createProjector(
272272

273273
if (model.templateMapper) {
274274
projectedModel.templateMapper = projectTemplateMapper(model.templateMapper);
275+
// eslint-disable-next-line deprecation/deprecation
275276
projectedModel.templateArguments = mutate(projectedModel.templateMapper.args);
276277
}
277278

@@ -336,6 +337,7 @@ export function createProjector(
336337

337338
if (scalar.templateMapper) {
338339
projectedScalar.templateMapper = projectTemplateMapper(scalar.templateMapper);
340+
// eslint-disable-next-line deprecation/deprecation
339341
projectedScalar.templateArguments = mutate(projectedScalar.templateMapper.args);
340342
}
341343

@@ -406,6 +408,7 @@ export function createProjector(
406408

407409
if (op.templateMapper) {
408410
projectedOp.templateMapper = projectTemplateMapper(op.templateMapper);
411+
// eslint-disable-next-line deprecation/deprecation
409412
projectedOp.templateArguments = mutate(projectedOp.templateMapper.args);
410413
}
411414

@@ -436,6 +439,7 @@ export function createProjector(
436439

437440
if (iface.templateMapper) {
438441
projectedIface.templateMapper = projectTemplateMapper(iface.templateMapper);
442+
// eslint-disable-next-line deprecation/deprecation
439443
projectedIface.templateArguments = mutate(projectedIface.templateMapper.args);
440444
}
441445

@@ -468,6 +472,7 @@ export function createProjector(
468472

469473
if (union.templateMapper) {
470474
projectedUnion.templateMapper = projectTemplateMapper(union.templateMapper);
475+
// eslint-disable-next-line deprecation/deprecation
471476
projectedUnion.templateArguments = mutate(projectedUnion.templateMapper.args);
472477
}
473478

0 commit comments

Comments
 (0)