Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/compiler/utilities.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5565,7 +5565,8 @@ namespace ts {

export function getDeclarationModifierFlagsFromSymbol(s: Symbol, isWrite = false): ModifierFlags {
if (s.valueDeclaration) {
const declaration = (isWrite && s.declarations && find(s.declarations, d => d.kind === SyntaxKind.SetAccessor)) || s.valueDeclaration;
const declaration = (isWrite && s.declarations && find(s.declarations, isSetAccessorDeclaration))
|| (s.flags & SymbolFlags.GetAccessor && find(s.declarations, isGetAccessorDeclaration)) || s.valueDeclaration;
const flags = getCombinedModifierFlags(declaration);
return s.parent && s.parent.flags & SymbolFlags.Class ? flags : flags & ~ModifierFlags.AccessibilityModifier;
}
Expand Down
61 changes: 61 additions & 0 deletions tests/baselines/reference/accessorDeclarationOrder.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
//// [accessorDeclarationOrder.ts]
class C1 {
#name: string;

public get name() {
return this.#name;
}

private set name(name: string) {
this.#name = name;
}
}

class C2 {
#name: string;

private set name(name: string) {
this.#name = name;
}

public get name() {
return this.#name;
}
}

const c1 = new C1();
const c2 = new C2();


// no error
c1.name;

// no error
c2.name;


//// [accessorDeclarationOrder.js]
class C1 {
#name;
get name() {
return this.#name;
}
set name(name) {
this.#name = name;
}
}
class C2 {
#name;
set name(name) {
this.#name = name;
}
get name() {
return this.#name;
}
}
const c1 = new C1();
const c2 = new C2();
// no error
c1.name;
// no error
c2.name;
72 changes: 72 additions & 0 deletions tests/baselines/reference/accessorDeclarationOrder.symbols
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
=== tests/cases/compiler/accessorDeclarationOrder.ts ===
class C1 {
>C1 : Symbol(C1, Decl(accessorDeclarationOrder.ts, 0, 0))

#name: string;
>#name : Symbol(C1.#name, Decl(accessorDeclarationOrder.ts, 0, 10))

public get name() {
>name : Symbol(C1.name, Decl(accessorDeclarationOrder.ts, 1, 18), Decl(accessorDeclarationOrder.ts, 5, 5))

return this.#name;
>this.#name : Symbol(C1.#name, Decl(accessorDeclarationOrder.ts, 0, 10))
>this : Symbol(C1, Decl(accessorDeclarationOrder.ts, 0, 0))
}

private set name(name: string) {
>name : Symbol(C1.name, Decl(accessorDeclarationOrder.ts, 1, 18), Decl(accessorDeclarationOrder.ts, 5, 5))
>name : Symbol(name, Decl(accessorDeclarationOrder.ts, 7, 21))

this.#name = name;
>this.#name : Symbol(C1.#name, Decl(accessorDeclarationOrder.ts, 0, 10))
>this : Symbol(C1, Decl(accessorDeclarationOrder.ts, 0, 0))
>name : Symbol(name, Decl(accessorDeclarationOrder.ts, 7, 21))
}
}

class C2 {
>C2 : Symbol(C2, Decl(accessorDeclarationOrder.ts, 10, 1))

#name: string;
>#name : Symbol(C2.#name, Decl(accessorDeclarationOrder.ts, 12, 10))

private set name(name: string) {
>name : Symbol(C2.name, Decl(accessorDeclarationOrder.ts, 13, 18), Decl(accessorDeclarationOrder.ts, 17, 5))
>name : Symbol(name, Decl(accessorDeclarationOrder.ts, 15, 21))

this.#name = name;
>this.#name : Symbol(C2.#name, Decl(accessorDeclarationOrder.ts, 12, 10))
>this : Symbol(C2, Decl(accessorDeclarationOrder.ts, 10, 1))
>name : Symbol(name, Decl(accessorDeclarationOrder.ts, 15, 21))
}

public get name() {
>name : Symbol(C2.name, Decl(accessorDeclarationOrder.ts, 13, 18), Decl(accessorDeclarationOrder.ts, 17, 5))

return this.#name;
>this.#name : Symbol(C2.#name, Decl(accessorDeclarationOrder.ts, 12, 10))
>this : Symbol(C2, Decl(accessorDeclarationOrder.ts, 10, 1))
}
}

const c1 = new C1();
>c1 : Symbol(c1, Decl(accessorDeclarationOrder.ts, 24, 5))
>C1 : Symbol(C1, Decl(accessorDeclarationOrder.ts, 0, 0))

const c2 = new C2();
>c2 : Symbol(c2, Decl(accessorDeclarationOrder.ts, 25, 5))
>C2 : Symbol(C2, Decl(accessorDeclarationOrder.ts, 10, 1))


// no error
c1.name;
>c1.name : Symbol(C1.name, Decl(accessorDeclarationOrder.ts, 1, 18), Decl(accessorDeclarationOrder.ts, 5, 5))
>c1 : Symbol(c1, Decl(accessorDeclarationOrder.ts, 24, 5))
>name : Symbol(C1.name, Decl(accessorDeclarationOrder.ts, 1, 18), Decl(accessorDeclarationOrder.ts, 5, 5))

// no error
c2.name;
>c2.name : Symbol(C2.name, Decl(accessorDeclarationOrder.ts, 13, 18), Decl(accessorDeclarationOrder.ts, 17, 5))
>c2 : Symbol(c2, Decl(accessorDeclarationOrder.ts, 25, 5))
>name : Symbol(C2.name, Decl(accessorDeclarationOrder.ts, 13, 18), Decl(accessorDeclarationOrder.ts, 17, 5))

76 changes: 76 additions & 0 deletions tests/baselines/reference/accessorDeclarationOrder.types
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
=== tests/cases/compiler/accessorDeclarationOrder.ts ===
class C1 {
>C1 : C1

#name: string;
>#name : string

public get name() {
>name : string

return this.#name;
>this.#name : string
>this : this
}

private set name(name: string) {
>name : string
>name : string

this.#name = name;
>this.#name = name : string
>this.#name : string
>this : this
>name : string
}
}

class C2 {
>C2 : C2

#name: string;
>#name : string

private set name(name: string) {
>name : string
>name : string

this.#name = name;
>this.#name = name : string
>this.#name : string
>this : this
>name : string
}

public get name() {
>name : string

return this.#name;
>this.#name : string
>this : this
}
}

const c1 = new C1();
>c1 : C1
>new C1() : C1
>C1 : typeof C1

const c2 = new C2();
>c2 : C2
>new C2() : C2
>C2 : typeof C2


// no error
c1.name;
>c1.name : string
>c1 : C1
>name : string

// no error
c2.name;
>c2.name : string
>c2 : C2
>name : string

35 changes: 35 additions & 0 deletions tests/cases/compiler/accessorDeclarationOrder.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// @target: esnext

class C1 {
#name: string;

public get name() {
return this.#name;
}

private set name(name: string) {
this.#name = name;
}
}

class C2 {
#name: string;

private set name(name: string) {
this.#name = name;
}

public get name() {
return this.#name;
}
}

const c1 = new C1();
const c2 = new C2();


// no error
c1.name;

// no error
c2.name;