diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index de07b62ac56..5a2561e81ed 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -29265,6 +29265,13 @@ namespace ts { case SyntaxKind.BindingElement: case SyntaxKind.FunctionDeclaration: case SyntaxKind.ImportSpecifier: // https://github.com/Microsoft/TypeScript/pull/7591 + case SyntaxKind.Identifier: // https://github.com/microsoft/TypeScript/issues/36098 + // Identifiers are used as declarations of assignment declarations whose parents may be + // SyntaxKind.CallExpression - `Object.defineProperty(thing, "aField", {value: 42});` + // SyntaxKind.ElementAccessExpression - `thing["aField"] = 42;` or `thing["aField"];` (with a doc comment on it) + // or SyntaxKind.PropertyAccessExpression - `thing.aField = 42;` + // all of which are pretty much always values, or at least imply a value meaning. + // It may be apprpriate to treat these as aliases in the future. return DeclarationSpaces.ExportValue; default: return Debug.failBadSyntaxKind(d); diff --git a/tests/baselines/reference/jsFileESModuleWithEnumTag.symbols b/tests/baselines/reference/jsFileESModuleWithEnumTag.symbols new file mode 100644 index 00000000000..eca7cdf3f9d --- /dev/null +++ b/tests/baselines/reference/jsFileESModuleWithEnumTag.symbols @@ -0,0 +1,38 @@ +=== tests/cases/compiler/jsFileESModuleWithEnumTag.js === +export {}; // mark as module +/** @enum {number} */ +const ChangeDetectionStrategy = { +>ChangeDetectionStrategy : Symbol(ChangeDetectionStrategy, Decl(jsFileESModuleWithEnumTag.js, 2, 5), Decl(jsFileESModuleWithEnumTag.js, 5, 2), Decl(jsFileESModuleWithEnumTag.js, 6, 67), Decl(jsFileESModuleWithEnumTag.js, 8, 22), Decl(jsFileESModuleWithEnumTag.js, 8, 70) ... and 1 more) + + OnPush: 0, +>OnPush : Symbol(OnPush, Decl(jsFileESModuleWithEnumTag.js, 2, 33)) + + Default: 1, +>Default : Symbol(Default, Decl(jsFileESModuleWithEnumTag.js, 3, 12)) + +}; +ChangeDetectionStrategy[ChangeDetectionStrategy.OnPush] = 'OnPush'; +>ChangeDetectionStrategy : Symbol(ChangeDetectionStrategy, Decl(jsFileESModuleWithEnumTag.js, 2, 5), Decl(jsFileESModuleWithEnumTag.js, 5, 2), Decl(jsFileESModuleWithEnumTag.js, 6, 67), Decl(jsFileESModuleWithEnumTag.js, 8, 22), Decl(jsFileESModuleWithEnumTag.js, 8, 70) ... and 1 more) +>ChangeDetectionStrategy.OnPush : Symbol(OnPush, Decl(jsFileESModuleWithEnumTag.js, 2, 33)) +>ChangeDetectionStrategy : Symbol(ChangeDetectionStrategy, Decl(jsFileESModuleWithEnumTag.js, 2, 5), Decl(jsFileESModuleWithEnumTag.js, 5, 2), Decl(jsFileESModuleWithEnumTag.js, 6, 67), Decl(jsFileESModuleWithEnumTag.js, 8, 22), Decl(jsFileESModuleWithEnumTag.js, 8, 70) ... and 1 more) +>OnPush : Symbol(OnPush, Decl(jsFileESModuleWithEnumTag.js, 2, 33)) + +ChangeDetectionStrategy[ChangeDetectionStrategy.Default] = 'Default'; +>ChangeDetectionStrategy : Symbol(ChangeDetectionStrategy, Decl(jsFileESModuleWithEnumTag.js, 2, 5), Decl(jsFileESModuleWithEnumTag.js, 5, 2), Decl(jsFileESModuleWithEnumTag.js, 6, 67), Decl(jsFileESModuleWithEnumTag.js, 8, 22), Decl(jsFileESModuleWithEnumTag.js, 8, 70) ... and 1 more) +>ChangeDetectionStrategy.Default : Symbol(Default, Decl(jsFileESModuleWithEnumTag.js, 3, 12)) +>ChangeDetectionStrategy : Symbol(ChangeDetectionStrategy, Decl(jsFileESModuleWithEnumTag.js, 2, 5), Decl(jsFileESModuleWithEnumTag.js, 5, 2), Decl(jsFileESModuleWithEnumTag.js, 6, 67), Decl(jsFileESModuleWithEnumTag.js, 8, 22), Decl(jsFileESModuleWithEnumTag.js, 8, 70) ... and 1 more) +>Default : Symbol(Default, Decl(jsFileESModuleWithEnumTag.js, 3, 12)) + +Object.defineProperty(ChangeDetectionStrategy, "aField", {value: 42}); +>Object.defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --)) +>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --)) +>ChangeDetectionStrategy : Symbol(ChangeDetectionStrategy, Decl(jsFileESModuleWithEnumTag.js, 2, 5), Decl(jsFileESModuleWithEnumTag.js, 5, 2), Decl(jsFileESModuleWithEnumTag.js, 6, 67), Decl(jsFileESModuleWithEnumTag.js, 8, 22), Decl(jsFileESModuleWithEnumTag.js, 8, 70) ... and 1 more) +>"aField" : Symbol(ChangeDetectionStrategy.aField, Decl(jsFileESModuleWithEnumTag.js, 7, 69)) +>value : Symbol(value, Decl(jsFileESModuleWithEnumTag.js, 8, 58)) + +/** @type {number} */ +ChangeDetectionStrategy["bField"]; +>ChangeDetectionStrategy : Symbol(ChangeDetectionStrategy, Decl(jsFileESModuleWithEnumTag.js, 2, 5), Decl(jsFileESModuleWithEnumTag.js, 5, 2), Decl(jsFileESModuleWithEnumTag.js, 6, 67), Decl(jsFileESModuleWithEnumTag.js, 8, 22), Decl(jsFileESModuleWithEnumTag.js, 8, 70) ... and 1 more) + + diff --git a/tests/baselines/reference/jsFileESModuleWithEnumTag.types b/tests/baselines/reference/jsFileESModuleWithEnumTag.types new file mode 100644 index 00000000000..c3165a75f2f --- /dev/null +++ b/tests/baselines/reference/jsFileESModuleWithEnumTag.types @@ -0,0 +1,52 @@ +=== tests/cases/compiler/jsFileESModuleWithEnumTag.js === +export {}; // mark as module +/** @enum {number} */ +const ChangeDetectionStrategy = { +>ChangeDetectionStrategy : { OnPush: number; Default: number; } +>{ OnPush: 0, Default: 1,} : { OnPush: number; Default: number; } + + OnPush: 0, +>OnPush : number +>0 : 0 + + Default: 1, +>Default : number +>1 : 1 + +}; +ChangeDetectionStrategy[ChangeDetectionStrategy.OnPush] = 'OnPush'; +>ChangeDetectionStrategy[ChangeDetectionStrategy.OnPush] = 'OnPush' : "OnPush" +>ChangeDetectionStrategy[ChangeDetectionStrategy.OnPush] : error +>ChangeDetectionStrategy : { OnPush: number; Default: number; } +>ChangeDetectionStrategy.OnPush : number +>ChangeDetectionStrategy : { OnPush: number; Default: number; } +>OnPush : number +>'OnPush' : "OnPush" + +ChangeDetectionStrategy[ChangeDetectionStrategy.Default] = 'Default'; +>ChangeDetectionStrategy[ChangeDetectionStrategy.Default] = 'Default' : "Default" +>ChangeDetectionStrategy[ChangeDetectionStrategy.Default] : error +>ChangeDetectionStrategy : { OnPush: number; Default: number; } +>ChangeDetectionStrategy.Default : number +>ChangeDetectionStrategy : { OnPush: number; Default: number; } +>Default : number +>'Default' : "Default" + +Object.defineProperty(ChangeDetectionStrategy, "aField", {value: 42}); +>Object.defineProperty(ChangeDetectionStrategy, "aField", {value: 42}) : any +>Object.defineProperty : (o: any, p: string | number | symbol, attributes: PropertyDescriptor & ThisType) => any +>Object : ObjectConstructor +>defineProperty : (o: any, p: string | number | symbol, attributes: PropertyDescriptor & ThisType) => any +>ChangeDetectionStrategy : { OnPush: number; Default: number; } +>"aField" : "aField" +>{value: 42} : { value: number; } +>value : number +>42 : 42 + +/** @type {number} */ +ChangeDetectionStrategy["bField"]; +>ChangeDetectionStrategy["bField"] : error +>ChangeDetectionStrategy : { OnPush: number; Default: number; } +>"bField" : "bField" + + diff --git a/tests/cases/compiler/jsFileESModuleWithEnumTag.ts b/tests/cases/compiler/jsFileESModuleWithEnumTag.ts new file mode 100644 index 00000000000..dd6d0b90d69 --- /dev/null +++ b/tests/cases/compiler/jsFileESModuleWithEnumTag.ts @@ -0,0 +1,16 @@ +// @allowJs: true +// @checkJs: true +// @noEmit: true +// @filename: jsFileESModuleWithEnumTag.js +export {}; // mark as module +/** @enum {number} */ +const ChangeDetectionStrategy = { + OnPush: 0, + Default: 1, +}; +ChangeDetectionStrategy[ChangeDetectionStrategy.OnPush] = 'OnPush'; +ChangeDetectionStrategy[ChangeDetectionStrategy.Default] = 'Default'; +Object.defineProperty(ChangeDetectionStrategy, "aField", {value: 42}); +/** @type {number} */ +ChangeDetectionStrategy["bField"]; +