From 20b4c99b27ad926b249b926ca33de2da2f987e7a Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> Date: Tue, 8 Oct 2019 13:20:34 -0700 Subject: [PATCH] Backward-compatible accessor emit Accessors are now only emitted in d.ts when useDefineForClassFields is set. Otherwise, properties that originated as accessors are prefixed with a JSDoc tag: `/**@accessor*/` The checker now understands `/**@accessor*/` tags for the purpose of error reporting; if --useDefineForClassFields is provided, an ambient base property with `/**@accessor*/` will be treated as an accessor, not as a property. --- src/compiler/checker.ts | 3 +- src/compiler/transformers/declarations.ts | 81 +++++++++++++++---- ...DeclarationEmitVisibilityErrors.errors.txt | 4 +- tests/baselines/reference/accessorWithES5.js | 41 +++++++++- .../reference/accessorWithES5.symbols | 24 ++++-- .../baselines/reference/accessorWithES5.types | 15 ++++ .../reference/ambientAccessors(target=es3).js | 12 +-- .../reference/ambientAccessors(target=es5).js | 12 +-- .../reference/assertionTypePredicates1.js | 6 +- tests/baselines/reference/classdecl.js | 7 +- .../reference/commentsdoNotEmitComments.js | 3 +- .../reference/commentsemitComments.js | 3 +- .../baselines/reference/declFileAccessors.js | 44 ++++------ .../reference/declFilePrivateStatic.js | 8 +- ...eTypeAnnotationVisibilityErrorAccessors.js | 36 ++++----- .../declarationEmitClassMemberNameConflict.js | 4 +- .../declarationEmitProtectedMembers.js | 9 +-- .../baselines/reference/dynamicNamesErrors.js | 8 +- .../isDeclarationVisibleNodeKinds.js | 4 +- tests/baselines/reference/properties.js | 3 +- .../reference/propertyOverridesAccessors6.js | 18 +++++ .../propertyOverridesAccessors6.symbols | 20 +++++ .../propertyOverridesAccessors6.types | 21 +++++ .../reference/readonlyInDeclarationFile.js | 30 +++---- .../reference/symbolDeclarationEmit11.js | 3 +- .../reference/symbolDeclarationEmit12.js | 4 +- .../reference/symbolDeclarationEmit13.js | 4 +- .../reference/symbolDeclarationEmit14.js | 4 +- .../reference/symbolDeclarationEmit4.js | 3 +- .../reference/typeGuardOfFormThisMember.js | 5 +- .../typeGuardOfFormThisMemberErrors.js | 5 +- .../uniqueSymbolsDeclarationsErrors.js | 6 +- .../accessorWithES5.ts | 11 ++- .../propertyOverridesAccessors6.ts | 11 +++ 34 files changed, 311 insertions(+), 161 deletions(-) create mode 100644 tests/baselines/reference/propertyOverridesAccessors6.js create mode 100644 tests/baselines/reference/propertyOverridesAccessors6.symbols create mode 100644 tests/baselines/reference/propertyOverridesAccessors6.types create mode 100644 tests/cases/conformance/classes/propertyMemberDeclarations/propertyOverridesAccessors6.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index e8a535b844fec..02ed0f3836187 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -31642,7 +31642,8 @@ namespace ts { if (basePropertyFlags !== SymbolFlags.Property && derivedPropertyFlags === SymbolFlags.Property) { errorMessage = Diagnostics.Class_0_defines_instance_member_accessor_1_but_extended_class_2_defines_it_as_instance_member_property; } - else if (basePropertyFlags === SymbolFlags.Property && derivedPropertyFlags !== SymbolFlags.Property) { + else if (basePropertyFlags === SymbolFlags.Property && derivedPropertyFlags !== SymbolFlags.Property + && !(base.valueDeclaration && base.valueDeclaration.flags & NodeFlags.Ambient && getJSDocTags(base.valueDeclaration).find(tag => tag.tagName.escapedText === "accessor"))) { errorMessage = Diagnostics.Class_0_defines_instance_member_property_1_but_extended_class_2_defines_it_as_instance_member_accessor; } else { diff --git a/src/compiler/transformers/declarations.ts b/src/compiler/transformers/declarations.ts index 1c6bd16e1baeb..24056c2908441 100644 --- a/src/compiler/transformers/declarations.ts +++ b/src/compiler/transformers/declarations.ts @@ -83,6 +83,7 @@ namespace ts { let emittedImports: readonly AnyImportSyntax[] | undefined; // must be declared in container so it can be `undefined` while transformer's first pass const resolver = context.getEmitResolver(); const options = context.getCompilerOptions(); + const newLine = getNewLineCharacter(options); const { noResolve, stripInternal } = options; return transformRoot; @@ -864,25 +865,35 @@ namespace ts { return cleanup(sig); } case SyntaxKind.GetAccessor: { - const isPrivate = hasModifier(input, ModifierFlags.Private); - const accessorType = getTypeAnnotationFromAllAccessorDeclarations(input, resolver.getAllAccessorDeclarations(input)); - return cleanup(updateGetAccessor( - input, - /*decorators*/ undefined, - ensureModifiers(input), - input.name, - updateAccessorParamsList(input, isPrivate), - !isPrivate ? ensureType(input, accessorType) : undefined, - /*body*/ undefined)); + if (options.useDefineForClassFields) { + const isPrivate = hasModifier(input, ModifierFlags.Private); + const accessorType = getTypeAnnotationFromAllAccessorDeclarations(input, resolver.getAllAccessorDeclarations(input)); + return cleanup(updateGetAccessor( + input, + /*decorators*/ undefined, + ensureModifiers(input), + input.name, + updateAccessorParamsList(input, isPrivate), + !isPrivate ? ensureType(input, accessorType) : undefined, + /*body*/ undefined)); + } + else { + return cleanup(ensureAccessor(input)); + } } case SyntaxKind.SetAccessor: { - return cleanup(updateSetAccessor( - input, - /*decorators*/ undefined, - ensureModifiers(input), - input.name, - updateAccessorParamsList(input, hasModifier(input, ModifierFlags.Private)), - /*body*/ undefined)); + if (options.useDefineForClassFields) { + return cleanup(updateSetAccessor( + input, + /*decorators*/ undefined, + ensureModifiers(input), + input.name, + updateAccessorParamsList(input, hasModifier(input, ModifierFlags.Private)), + /*body*/ undefined)); + } + else { + return cleanup(ensureAccessor(input)); + } } case SyntaxKind.PropertyDeclaration: return cleanup(updateProperty( @@ -1455,6 +1466,42 @@ namespace ts { return accessorType; } + function ensureAccessor(node: AccessorDeclaration): PropertyDeclaration | undefined { + const accessors = resolver.getAllAccessorDeclarations(node); + if (node.kind !== accessors.firstAccessor.kind) { + return; + } + const accessorType = getTypeAnnotationFromAllAccessorDeclarations(node, accessors); + const prop = createProperty(/*decorators*/ undefined, maskModifiers(node, /*mask*/ undefined, (!accessors.setAccessor) ? ModifierFlags.Readonly : ModifierFlags.None), node.name, node.questionToken, ensureType(node, accessorType), /*initializer*/ undefined); + const leadingsSyntheticCommentRanges = accessors.secondAccessor && getLeadingCommentRangesOfNode(accessors.secondAccessor, currentSourceFile); + if (leadingsSyntheticCommentRanges) { + for (const range of leadingsSyntheticCommentRanges) { + if (range.kind === SyntaxKind.MultiLineCommentTrivia) { + let text = currentSourceFile.text.slice(range.pos + 2, range.end - 2); + const lines = text.split(/\r\n?|\n/g); + if (lines.length > 1) { + const lastLines = lines.slice(1); + const indentation = guessIndentation(lastLines); + text = [lines[0], ...map(lastLines, l => l.slice(indentation))].join(newLine); + } + addSyntheticLeadingComment( + prop, + range.kind, + text, + range.hasTrailingNewLine + ); + } + } + } + addSyntheticLeadingComment( + prop, + SyntaxKind.MultiLineCommentTrivia, + "*@accessor", + /*hasTrailingNewLine*/ false + ); + return prop; + } + function transformHeritageClauses(nodes: NodeArray | undefined) { return createNodeArray(filter(map(nodes, clause => updateHeritageClause(clause, visitNodes(createNodeArray(filter(clause.types, t => { return isEntityNameExpression(t.expression) || (clause.token === SyntaxKind.ExtendsKeyword && t.expression.kind === SyntaxKind.NullKeyword); diff --git a/tests/baselines/reference/accessorDeclarationEmitVisibilityErrors.errors.txt b/tests/baselines/reference/accessorDeclarationEmitVisibilityErrors.errors.txt index cb9f3fd79d6bb..8846832915ae0 100644 --- a/tests/baselines/reference/accessorDeclarationEmitVisibilityErrors.errors.txt +++ b/tests/baselines/reference/accessorDeclarationEmitVisibilityErrors.errors.txt @@ -1,5 +1,5 @@ tests/cases/compiler/accessorDeclarationEmitVisibilityErrors.ts(2,18): error TS2304: Cannot find name 'DoesNotExist'. -tests/cases/compiler/accessorDeclarationEmitVisibilityErrors.ts(2,18): error TS4106: Parameter 'arg' of accessor has or is using private name 'DoesNotExist'. +tests/cases/compiler/accessorDeclarationEmitVisibilityErrors.ts(2,18): error TS4037: Parameter type of public setter 'bet' from exported class has or is using private name 'DoesNotExist'. ==== tests/cases/compiler/accessorDeclarationEmitVisibilityErrors.ts (2 errors) ==== @@ -8,5 +8,5 @@ tests/cases/compiler/accessorDeclarationEmitVisibilityErrors.ts(2,18): error TS4 ~~~~~~~~~~~~ !!! error TS2304: Cannot find name 'DoesNotExist'. ~~~~~~~~~~~~ -!!! error TS4106: Parameter 'arg' of accessor has or is using private name 'DoesNotExist'. +!!! error TS4037: Parameter type of public setter 'bet' from exported class has or is using private name 'DoesNotExist'. } \ No newline at end of file diff --git a/tests/baselines/reference/accessorWithES5.js b/tests/baselines/reference/accessorWithES5.js index ccd2c3e7573d8..fdc88c458cfba 100644 --- a/tests/baselines/reference/accessorWithES5.js +++ b/tests/baselines/reference/accessorWithES5.js @@ -10,13 +10,21 @@ class D { } } +class E { + // comment 1 + get x() { return 2; } + // comment 2 + set x(v) { } +} + var x = { get a() { return 1 } } var y = { set b(v) { } -} +} + //// [accessorWithES5.js] var C = /** @class */ (function () { @@ -42,9 +50,40 @@ var D = /** @class */ (function () { }); return D; }()); +var E = /** @class */ (function () { + function E() { + } + Object.defineProperty(E.prototype, "x", { + // comment 1 + get: function () { return 2; }, + // comment 2 + set: function (v) { }, + enumerable: true, + configurable: true + }); + return E; +}()); var x = { get a() { return 1; } }; var y = { set b(v) { } }; + + +//// [accessorWithES5.d.ts] +declare class C { + /**@accessor*/ readonly x: number; +} +declare class D { + /**@accessor*/ x: any; +} +declare class E { + /**@accessor*/ x: number; +} +declare var x: { + readonly a: number; +}; +declare var y: { + b: any; +}; diff --git a/tests/baselines/reference/accessorWithES5.symbols b/tests/baselines/reference/accessorWithES5.symbols index 1a0d8ee70eac6..79e61c4b7de53 100644 --- a/tests/baselines/reference/accessorWithES5.symbols +++ b/tests/baselines/reference/accessorWithES5.symbols @@ -18,17 +18,31 @@ class D { } } +class E { +>E : Symbol(E, Decl(accessorWithES5.ts, 9, 1)) + + // comment 1 + get x() { return 2; } +>x : Symbol(E.x, Decl(accessorWithES5.ts, 11, 9), Decl(accessorWithES5.ts, 13, 25)) + + // comment 2 + set x(v) { } +>x : Symbol(E.x, Decl(accessorWithES5.ts, 11, 9), Decl(accessorWithES5.ts, 13, 25)) +>v : Symbol(v, Decl(accessorWithES5.ts, 15, 10)) +} + var x = { ->x : Symbol(x, Decl(accessorWithES5.ts, 11, 3)) +>x : Symbol(x, Decl(accessorWithES5.ts, 18, 3)) get a() { return 1 } ->a : Symbol(a, Decl(accessorWithES5.ts, 11, 9)) +>a : Symbol(a, Decl(accessorWithES5.ts, 18, 9)) } var y = { ->y : Symbol(y, Decl(accessorWithES5.ts, 15, 3)) +>y : Symbol(y, Decl(accessorWithES5.ts, 22, 3)) set b(v) { } ->b : Symbol(b, Decl(accessorWithES5.ts, 15, 9)) ->v : Symbol(v, Decl(accessorWithES5.ts, 16, 10)) +>b : Symbol(b, Decl(accessorWithES5.ts, 22, 9)) +>v : Symbol(v, Decl(accessorWithES5.ts, 23, 10)) } + diff --git a/tests/baselines/reference/accessorWithES5.types b/tests/baselines/reference/accessorWithES5.types index 604f7c4301b30..f160309b7f03f 100644 --- a/tests/baselines/reference/accessorWithES5.types +++ b/tests/baselines/reference/accessorWithES5.types @@ -19,6 +19,20 @@ class D { } } +class E { +>E : E + + // comment 1 + get x() { return 2; } +>x : number +>2 : 2 + + // comment 2 + set x(v) { } +>x : number +>v : number +} + var x = { >x : { readonly a: number; } >{ get a() { return 1 }} : { readonly a: number; } @@ -36,3 +50,4 @@ var y = { >b : any >v : any } + diff --git a/tests/baselines/reference/ambientAccessors(target=es3).js b/tests/baselines/reference/ambientAccessors(target=es3).js index 4ddebd5e0eb12..3863426d3a0f3 100644 --- a/tests/baselines/reference/ambientAccessors(target=es3).js +++ b/tests/baselines/reference/ambientAccessors(target=es3).js @@ -19,12 +19,8 @@ declare class C { //// [ambientAccessors.d.ts] declare class C { - static get a(): string; - static set a(value: string); - private static get b(); - private static set b(value); - get x(): string; - set x(value: string); - private get y(); - private set y(value); + /**@accessor*/ static a: string; + /**@accessor*/ private static b; + /**@accessor*/ x: string; + /**@accessor*/ private y; } diff --git a/tests/baselines/reference/ambientAccessors(target=es5).js b/tests/baselines/reference/ambientAccessors(target=es5).js index 4ddebd5e0eb12..3863426d3a0f3 100644 --- a/tests/baselines/reference/ambientAccessors(target=es5).js +++ b/tests/baselines/reference/ambientAccessors(target=es5).js @@ -19,12 +19,8 @@ declare class C { //// [ambientAccessors.d.ts] declare class C { - static get a(): string; - static set a(value: string); - private static get b(); - private static set b(value); - get x(): string; - set x(value: string); - private get y(); - private set y(value); + /**@accessor*/ static a: string; + /**@accessor*/ private static b; + /**@accessor*/ x: string; + /**@accessor*/ private y; } diff --git a/tests/baselines/reference/assertionTypePredicates1.js b/tests/baselines/reference/assertionTypePredicates1.js index 145bb98bce980..e6b29a54c2e92 100644 --- a/tests/baselines/reference/assertionTypePredicates1.js +++ b/tests/baselines/reference/assertionTypePredicates1.js @@ -303,9 +303,7 @@ declare let Q1: new (x: unknown) => x is string; declare let Q2: new (x: boolean) => asserts x; declare let Q3: new (x: unknown) => asserts x is string; declare class Wat { - get p1(): this is string; - set p1(x: this is string); - get p2(): asserts this is string; - set p2(x: asserts this is string); + /**@accessor*/ p1: this is string; + /**@accessor*/ p2: asserts this is string; } declare function f20(x: unknown): void; diff --git a/tests/baselines/reference/classdecl.js b/tests/baselines/reference/classdecl.js index 43d67d0cb1110..674a1f7413139 100644 --- a/tests/baselines/reference/classdecl.js +++ b/tests/baselines/reference/classdecl.js @@ -218,14 +218,13 @@ declare class a { constructor(s: string); pgF(): void; pv: any; - get d(): number; - set d(a: number); - static get p2(): { + /**@accessor*/ d: number; + /**@accessor*/ static readonly p2: { x: number; y: number; }; private static d2; - private static get p3(); + /**@accessor*/ private static readonly p3; private pv3; private foo; } diff --git a/tests/baselines/reference/commentsdoNotEmitComments.js b/tests/baselines/reference/commentsdoNotEmitComments.js index 865ae43c4de22..ae7442f109a64 100644 --- a/tests/baselines/reference/commentsdoNotEmitComments.js +++ b/tests/baselines/reference/commentsdoNotEmitComments.js @@ -144,8 +144,7 @@ declare class c { constructor(); b: number; myFoo(): number; - get prop1(): number; - set prop1(val: number); + prop1: number; foo1(a: number): string; foo1(b: string): string; } diff --git a/tests/baselines/reference/commentsemitComments.js b/tests/baselines/reference/commentsemitComments.js index 8bfb1c59c9abd..e69567d2e733b 100644 --- a/tests/baselines/reference/commentsemitComments.js +++ b/tests/baselines/reference/commentsemitComments.js @@ -160,9 +160,8 @@ declare class c { /** function comment */ myFoo(): number; /** getter comment*/ - get prop1(): number; /** setter comment*/ - set prop1(val: number); + /**@accessor*/ prop1: number; /** overload signature1*/ foo1(a: number): string; /** Overload signature 2*/ diff --git a/tests/baselines/reference/declFileAccessors.js b/tests/baselines/reference/declFileAccessors.js index 103f86d688e69..4d020a72c3d2d 100644 --- a/tests/baselines/reference/declFileAccessors.js +++ b/tests/baselines/reference/declFileAccessors.js @@ -273,47 +273,35 @@ var c2 = /** @class */ (function () { /** This is comment for c1*/ export declare class c1 { /** getter property*/ - get p3(): number; /** setter property*/ - set p3(/** this is value*/ value: number); + /**@accessor*/ p3: number; /** private getter property*/ - private get pp3(); /** private setter property*/ - private set pp3(value); + /**@accessor*/ private pp3; /** static getter property*/ - static get s3(): number; /** setter property*/ - static set s3(/** this is value*/ value: number); - get nc_p3(): number; - set nc_p3(value: number); - private get nc_pp3(); - private set nc_pp3(value); - static get nc_s3(): string; - static set nc_s3(value: string); - get onlyGetter(): number; - set onlySetter(value: number); + /**@accessor*/ static s3: number; + /**@accessor*/ nc_p3: number; + /**@accessor*/ private nc_pp3; + /**@accessor*/ static nc_s3: string; + /**@accessor*/ readonly onlyGetter: number; + /**@accessor*/ onlySetter: number; } //// [declFileAccessors_1.d.ts] /** This is comment for c2 - the global class*/ declare class c2 { /** getter property*/ - get p3(): number; /** setter property*/ - set p3(/** this is value*/ value: number); + /**@accessor*/ p3: number; /** private getter property*/ - private get pp3(); /** private setter property*/ - private set pp3(value); + /**@accessor*/ private pp3; /** static getter property*/ - static get s3(): number; /** setter property*/ - static set s3(/** this is value*/ value: number); - get nc_p3(): number; - set nc_p3(value: number); - private get nc_pp3(); - private set nc_pp3(value); - static get nc_s3(): string; - static set nc_s3(value: string); - get onlyGetter(): number; - set onlySetter(value: number); + /**@accessor*/ static s3: number; + /**@accessor*/ nc_p3: number; + /**@accessor*/ private nc_pp3; + /**@accessor*/ static nc_s3: string; + /**@accessor*/ readonly onlyGetter: number; + /**@accessor*/ onlySetter: number; } diff --git a/tests/baselines/reference/declFilePrivateStatic.js b/tests/baselines/reference/declFilePrivateStatic.js index 9dd2adc8c59ef..33028af3092b6 100644 --- a/tests/baselines/reference/declFilePrivateStatic.js +++ b/tests/baselines/reference/declFilePrivateStatic.js @@ -51,8 +51,8 @@ declare class C { static y: number; private static a; static b(): void; - private static get c(); - static get d(): number; - private static set e(value); - static set f(v: any); + /**@accessor*/ private static readonly c; + /**@accessor*/ static readonly d: number; + /**@accessor*/ private static e; + /**@accessor*/ static f: any; } diff --git a/tests/baselines/reference/declFileTypeAnnotationVisibilityErrorAccessors.js b/tests/baselines/reference/declFileTypeAnnotationVisibilityErrorAccessors.js index 598ac67c20ed5..45aa7a33c4f7a 100644 --- a/tests/baselines/reference/declFileTypeAnnotationVisibilityErrorAccessors.js +++ b/tests/baselines/reference/declFileTypeAnnotationVisibilityErrorAccessors.js @@ -271,27 +271,21 @@ declare module m { } } export class c { - get foo1(): private1; - get foo2(): private1; - set foo3(param: private1); - get foo4(): private1; - set foo4(param: private1); - get foo5(): private1; - set foo5(param: private1); - get foo11(): public1; - get foo12(): public1; - set foo13(param: public1); - get foo14(): public1; - set foo14(param: public1); - get foo15(): public1; - set foo15(param: public1); - get foo111(): m2.public2; - get foo112(): m2.public2; - set foo113(param: m2.public2); - get foo114(): m2.public2; - set foo114(param: m2.public2); - get foo115(): m2.public2; - set foo115(param: m2.public2); + /**@accessor*/ readonly foo1: private1; + /**@accessor*/ readonly foo2: private1; + /**@accessor*/ foo3: private1; + /**@accessor*/ foo4: private1; + /**@accessor*/ foo5: private1; + /**@accessor*/ readonly foo11: public1; + /**@accessor*/ readonly foo12: public1; + /**@accessor*/ foo13: public1; + /**@accessor*/ foo14: public1; + /**@accessor*/ foo15: public1; + /**@accessor*/ readonly foo111: m2.public2; + /**@accessor*/ readonly foo112: m2.public2; + /**@accessor*/ foo113: m2.public2; + /**@accessor*/ foo114: m2.public2; + /**@accessor*/ foo115: m2.public2; } export {}; } diff --git a/tests/baselines/reference/declarationEmitClassMemberNameConflict.js b/tests/baselines/reference/declarationEmitClassMemberNameConflict.js index 43523aba38f0e..be3da0584c755 100644 --- a/tests/baselines/reference/declarationEmitClassMemberNameConflict.js +++ b/tests/baselines/reference/declarationEmitClassMemberNameConflict.js @@ -103,10 +103,10 @@ export declare class C2 { bar(): (t: typeof C2) => void; } export declare class C3 { - get C3(): number; + /**@accessor*/ readonly C3: number; bar(): (t: typeof C3) => void; } export declare class C4 { - set C4(v: any); + /**@accessor*/ C4: any; bar(): (t: typeof C4) => void; } diff --git a/tests/baselines/reference/declarationEmitProtectedMembers.js b/tests/baselines/reference/declarationEmitProtectedMembers.js index e0a2b40ffd50c..d86fd42c110d9 100644 --- a/tests/baselines/reference/declarationEmitProtectedMembers.js +++ b/tests/baselines/reference/declarationEmitProtectedMembers.js @@ -138,12 +138,11 @@ var C4 = /** @class */ (function () { declare class C1 { protected x: number; protected f(): number; - protected set accessor(a: number); - protected get accessor(): number; + /**@accessor*/ protected accessor: number; protected static sx: number; protected static sf(): number; - protected static set staticSetter(a: number); - protected static get staticGetter(): number; + /**@accessor*/ protected static staticSetter: number; + /**@accessor*/ protected static readonly staticGetter: number; } declare class C2 extends C1 { protected f(): number; @@ -154,7 +153,7 @@ declare class C3 extends C2 { static sx: number; f(): number; static sf(): number; - static get staticGetter(): number; + /**@accessor*/ static readonly staticGetter: number; } declare class C4 { protected a: number; diff --git a/tests/baselines/reference/dynamicNamesErrors.js b/tests/baselines/reference/dynamicNamesErrors.js index 8433527d73fd6..3ceb29df6b6fb 100644 --- a/tests/baselines/reference/dynamicNamesErrors.js +++ b/tests/baselines/reference/dynamicNamesErrors.js @@ -101,12 +101,12 @@ export interface InterfaceMemberVisibility { export declare class ClassMemberVisibility { static [x]: number; static [y](): number; - static get [z](): number; - static set [w](value: number); + /**@accessor*/ static readonly [z]: number; + /**@accessor*/ static [w]: number; [x]: number; [y](): number; - get [z](): number; - set [w](value: number); + /**@accessor*/ readonly [z]: number; + /**@accessor*/ [w]: number; } export declare type ObjectTypeVisibility = { [x]: number; diff --git a/tests/baselines/reference/isDeclarationVisibleNodeKinds.js b/tests/baselines/reference/isDeclarationVisibleNodeKinds.js index 40f5e59083c0c..dbf15972df431 100644 --- a/tests/baselines/reference/isDeclarationVisibleNodeKinds.js +++ b/tests/baselines/reference/isDeclarationVisibleNodeKinds.js @@ -184,7 +184,7 @@ declare module schema { } declare module schema { class T { - get createValidator9(): (data: T) => T; - set createValidator10(v: (data: T) => T); + /**@accessor*/ readonly createValidator9: (data: T) => T; + /**@accessor*/ createValidator10: (data: T) => T; } } diff --git a/tests/baselines/reference/properties.js b/tests/baselines/reference/properties.js index 27688f5837578..cd90872007318 100644 --- a/tests/baselines/reference/properties.js +++ b/tests/baselines/reference/properties.js @@ -32,6 +32,5 @@ var MyClass = /** @class */ (function () { //// [properties.d.ts] declare class MyClass { - get Count(): number; - set Count(value: number); + /**@accessor*/ Count: number; } diff --git a/tests/baselines/reference/propertyOverridesAccessors6.js b/tests/baselines/reference/propertyOverridesAccessors6.js new file mode 100644 index 0000000000000..700e4b50fb809 --- /dev/null +++ b/tests/baselines/reference/propertyOverridesAccessors6.js @@ -0,0 +1,18 @@ +//// [tests/cases/conformance/classes/propertyMemberDeclarations/propertyOverridesAccessors6.ts] //// + +//// [a.d.ts] +declare class A { + /**@accessor*/ p: number +} +//// [b.ts] +class B extends A { + get p() { return 1 } + set p(value) { } +} + + +//// [b.js] +class B extends A { + get p() { return 1; } + set p(value) { } +} diff --git a/tests/baselines/reference/propertyOverridesAccessors6.symbols b/tests/baselines/reference/propertyOverridesAccessors6.symbols new file mode 100644 index 0000000000000..459dabf74261f --- /dev/null +++ b/tests/baselines/reference/propertyOverridesAccessors6.symbols @@ -0,0 +1,20 @@ +=== tests/cases/conformance/classes/propertyMemberDeclarations/a.d.ts === +declare class A { +>A : Symbol(A, Decl(a.d.ts, 0, 0)) + + /**@accessor*/ p: number +>p : Symbol(A.p, Decl(a.d.ts, 0, 17)) +} +=== tests/cases/conformance/classes/propertyMemberDeclarations/b.ts === +class B extends A { +>B : Symbol(B, Decl(b.ts, 0, 0)) +>A : Symbol(A, Decl(a.d.ts, 0, 0)) + + get p() { return 1 } +>p : Symbol(B.p, Decl(b.ts, 0, 19), Decl(b.ts, 1, 24)) + + set p(value) { } +>p : Symbol(B.p, Decl(b.ts, 0, 19), Decl(b.ts, 1, 24)) +>value : Symbol(value, Decl(b.ts, 2, 10)) +} + diff --git a/tests/baselines/reference/propertyOverridesAccessors6.types b/tests/baselines/reference/propertyOverridesAccessors6.types new file mode 100644 index 0000000000000..694c7e44687b8 --- /dev/null +++ b/tests/baselines/reference/propertyOverridesAccessors6.types @@ -0,0 +1,21 @@ +=== tests/cases/conformance/classes/propertyMemberDeclarations/a.d.ts === +declare class A { +>A : A + + /**@accessor*/ p: number +>p : number +} +=== tests/cases/conformance/classes/propertyMemberDeclarations/b.ts === +class B extends A { +>B : B +>A : A + + get p() { return 1 } +>p : number +>1 : 1 + + set p(value) { } +>p : number +>value : number +} + diff --git a/tests/baselines/reference/readonlyInDeclarationFile.js b/tests/baselines/reference/readonlyInDeclarationFile.js index 7419e27c013b5..c43807c658a19 100644 --- a/tests/baselines/reference/readonlyInDeclarationFile.js +++ b/tests/baselines/reference/readonlyInDeclarationFile.js @@ -149,27 +149,21 @@ declare class C { private readonly a1; protected readonly a2: number; readonly a3: number; - private get b1(); - protected get b2(): number; - get b3(): number; - private get c1(); - private set c1(value); - protected get c2(): number; - protected set c2(value: number); - get c3(): number; - set c3(value: number); + /**@accessor*/ private readonly b1; + /**@accessor*/ protected readonly b2: number; + /**@accessor*/ readonly b3: number; + /**@accessor*/ private c1; + /**@accessor*/ protected c2: number; + /**@accessor*/ c3: number; private static readonly s1; protected static readonly s2: number; static readonly s3: number; - private static get t1(); - protected static get t2(): number; - static get t3(): number; - private static get u1(); - private static set u1(value); - protected static get u2(): number; - protected static set u2(value: number); - static get u3(): number; - static set u3(value: number); + /**@accessor*/ private static readonly t1; + /**@accessor*/ protected static readonly t2: number; + /**@accessor*/ static readonly t3: number; + /**@accessor*/ private static u1; + /**@accessor*/ protected static u2: number; + /**@accessor*/ static u3: number; } declare var z: { readonly a: string; diff --git a/tests/baselines/reference/symbolDeclarationEmit11.js b/tests/baselines/reference/symbolDeclarationEmit11.js index b0cd9cfddbd5b..0116144af8eab 100644 --- a/tests/baselines/reference/symbolDeclarationEmit11.js +++ b/tests/baselines/reference/symbolDeclarationEmit11.js @@ -19,6 +19,5 @@ C[Symbol.iterator] = 0; declare class C { static [Symbol.iterator]: number; static [Symbol.isConcatSpreadable](): void; - static get [Symbol.toPrimitive](): string; - static set [Symbol.toPrimitive](x: string); + /**@accessor*/ static [Symbol.toPrimitive]: string; } diff --git a/tests/baselines/reference/symbolDeclarationEmit12.js b/tests/baselines/reference/symbolDeclarationEmit12.js index 5d9f70334d44e..d118ffe7ad96d 100644 --- a/tests/baselines/reference/symbolDeclarationEmit12.js +++ b/tests/baselines/reference/symbolDeclarationEmit12.js @@ -35,8 +35,8 @@ declare module M { [Symbol.iterator]: I; [Symbol.toPrimitive](x: I): void; [Symbol.isConcatSpreadable](): I; - get [Symbol.toPrimitive](): any; - set [Symbol.toPrimitive](x: I); + /**@accessor*/ readonly [Symbol.toPrimitive]: any; + /**@accessor*/ [Symbol.toPrimitive]: I; } export {}; } diff --git a/tests/baselines/reference/symbolDeclarationEmit13.js b/tests/baselines/reference/symbolDeclarationEmit13.js index dc00d00fc9828..27656436cd104 100644 --- a/tests/baselines/reference/symbolDeclarationEmit13.js +++ b/tests/baselines/reference/symbolDeclarationEmit13.js @@ -13,6 +13,6 @@ class C { //// [symbolDeclarationEmit13.d.ts] declare class C { - get [Symbol.toPrimitive](): string; - set [Symbol.toStringTag](x: any); + /**@accessor*/ readonly [Symbol.toPrimitive]: string; + /**@accessor*/ [Symbol.toStringTag]: any; } diff --git a/tests/baselines/reference/symbolDeclarationEmit14.js b/tests/baselines/reference/symbolDeclarationEmit14.js index f79c4e254f03b..8e9265f946ce5 100644 --- a/tests/baselines/reference/symbolDeclarationEmit14.js +++ b/tests/baselines/reference/symbolDeclarationEmit14.js @@ -13,6 +13,6 @@ class C { //// [symbolDeclarationEmit14.d.ts] declare class C { - get [Symbol.toPrimitive](): string; - get [Symbol.toStringTag](): string; + /**@accessor*/ readonly [Symbol.toPrimitive]: string; + /**@accessor*/ readonly [Symbol.toStringTag]: string; } diff --git a/tests/baselines/reference/symbolDeclarationEmit4.js b/tests/baselines/reference/symbolDeclarationEmit4.js index fb3099ec49dbd..ae68f10e0d4f5 100644 --- a/tests/baselines/reference/symbolDeclarationEmit4.js +++ b/tests/baselines/reference/symbolDeclarationEmit4.js @@ -13,6 +13,5 @@ class C { //// [symbolDeclarationEmit4.d.ts] declare class C { - get [Symbol.toPrimitive](): string; - set [Symbol.toPrimitive](x: string); + /**@accessor*/ [Symbol.toPrimitive]: string; } diff --git a/tests/baselines/reference/typeGuardOfFormThisMember.js b/tests/baselines/reference/typeGuardOfFormThisMember.js index 50c8ff0f7890a..aca2da07e8b24 100644 --- a/tests/baselines/reference/typeGuardOfFormThisMember.js +++ b/tests/baselines/reference/typeGuardOfFormThisMember.js @@ -178,9 +178,8 @@ declare namespace Test { class FileSystemObject { path: string; isFSO: this is FileSystemObject; - get isFile(): this is File; - set isFile(param: this is File); - get isDirectory(): this is Directory; + /**@accessor*/ isFile: this is File; + /**@accessor*/ readonly isDirectory: this is Directory; isNetworked: this is (Networked & this); constructor(path: string); } diff --git a/tests/baselines/reference/typeGuardOfFormThisMemberErrors.js b/tests/baselines/reference/typeGuardOfFormThisMemberErrors.js index 8456dc1797ee8..83270080cdb37 100644 --- a/tests/baselines/reference/typeGuardOfFormThisMemberErrors.js +++ b/tests/baselines/reference/typeGuardOfFormThisMemberErrors.js @@ -103,9 +103,8 @@ declare namespace Test { class FileSystemObject { path: string; isFSO: this is FileSystemObject; - get isFile(): this is File; - set isFile(param: this is File); - get isDirectory(): this is Directory; + /**@accessor*/ isFile: this is File; + /**@accessor*/ readonly isDirectory: this is Directory; isNetworked: this is (Networked & this); constructor(path: string); } diff --git a/tests/baselines/reference/uniqueSymbolsDeclarationsErrors.js b/tests/baselines/reference/uniqueSymbolsDeclarationsErrors.js index 723ec89c0a65d..71d75dffeaa5a 100644 --- a/tests/baselines/reference/uniqueSymbolsDeclarationsErrors.js +++ b/tests/baselines/reference/uniqueSymbolsDeclarationsErrors.js @@ -141,9 +141,7 @@ export declare class ClassWithPrivateNamedMethods { static [s](): void; } export declare class ClassWithPrivateNamedAccessors { - get [s](): any; - set [s](v: any); - static get [s](): any; - static set [s](v: any); + /**@accessor*/ [s]: any; + /**@accessor*/ static [s]: any; } export {}; diff --git a/tests/cases/conformance/classes/propertyMemberDeclarations/memberAccessorDeclarations/accessorWithES5.ts b/tests/cases/conformance/classes/propertyMemberDeclarations/memberAccessorDeclarations/accessorWithES5.ts index 7704e60c6069b..7404069354caf 100644 --- a/tests/cases/conformance/classes/propertyMemberDeclarations/memberAccessorDeclarations/accessorWithES5.ts +++ b/tests/cases/conformance/classes/propertyMemberDeclarations/memberAccessorDeclarations/accessorWithES5.ts @@ -1,4 +1,6 @@ // @target: ES5 +// @useDefineForClassFields: false +// @declaration: true class C { get x() { @@ -11,10 +13,17 @@ class D { } } +class E { + // comment 1 + get x() { return 2; } + // comment 2 + set x(v) { } +} + var x = { get a() { return 1 } } var y = { set b(v) { } -} \ No newline at end of file +} diff --git a/tests/cases/conformance/classes/propertyMemberDeclarations/propertyOverridesAccessors6.ts b/tests/cases/conformance/classes/propertyMemberDeclarations/propertyOverridesAccessors6.ts new file mode 100644 index 0000000000000..8edf93cca868f --- /dev/null +++ b/tests/cases/conformance/classes/propertyMemberDeclarations/propertyOverridesAccessors6.ts @@ -0,0 +1,11 @@ +// @target: esnext +// @useDefineForClassFields: true +// @Filename: a.d.ts +declare class A { + /**@accessor*/ p: number +} +// @Filename: b.ts +class B extends A { + get p() { return 1 } + set p(value) { } +}