Skip to content

Commit

Permalink
Fix for crash when using ca call expression on private identifier com…
Browse files Browse the repository at this point in the history
…ing from an any typed variable. (GH #42860)
  • Loading branch information
dragomirtitian committed Feb 18, 2021
1 parent 05ee94f commit 21eb38b
Show file tree
Hide file tree
Showing 6 changed files with 145 additions and 2 deletions.
11 changes: 10 additions & 1 deletion src/compiler/checker.ts
Expand Up @@ -21978,7 +21978,16 @@ namespace ts {
const type = getTypeOfDottedName((<PropertyAccessExpression>node).expression, diagnostic);
if (type) {
const name = (<PropertyAccessExpression>node).name;
const prop = getPropertyOfType(type, isPrivateIdentifier(name) ? getSymbolNameForPrivateIdentifier(type.symbol, name.escapedText) : name.escapedText);
let prop: Symbol | undefined;
if (isPrivateIdentifier(name)) {
if (!type.symbol) {
return undefined;
}
prop = getPropertyOfType(type, getSymbolNameForPrivateIdentifier(type.symbol, name.escapedText));
}
else {
prop = getPropertyOfType(type, name.escapedText);
}
return prop && getExplicitTypeOfSymbol(prop, diagnostic);
}
return undefined;
Expand Down
34 changes: 33 additions & 1 deletion tests/baselines/reference/privateNameAndAny.errors.txt
@@ -1,14 +1,46 @@
tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(5,15): error TS2339: Property '#bar' does not exist on type 'any'.
tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(9,9): error TS2571: Object is of type 'unknown'.
tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(10,9): error TS2571: Object is of type 'unknown'.
tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(10,15): error TS2339: Property '#bar' does not exist on type 'any'.
tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(11,9): error TS2571: Object is of type 'unknown'.
tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(14,15): error TS2339: Property '#foo' does not exist on type 'never'.
tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(15,15): error TS2339: Property '#bar' does not exist on type 'never'.
tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(16,15): error TS2339: Property '#foo' does not exist on type 'never'.


==== tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts (1 errors) ====
==== tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts (8 errors) ====
class A {
#foo = true;
method(thing: any) {
thing.#foo; // OK
thing.#bar; // Error
~~~~
!!! error TS2339: Property '#bar' does not exist on type 'any'.
thing.#foo();
}
methodU(thing: unknown) {
thing.#foo;
~~~~~
!!! error TS2571: Object is of type 'unknown'.
thing.#bar;
~~~~~
!!! error TS2571: Object is of type 'unknown'.
~~~~
!!! error TS2339: Property '#bar' does not exist on type 'any'.
thing.#foo();
~~~~~
!!! error TS2571: Object is of type 'unknown'.
}
methodN(thing: never) {
thing.#foo;
~~~~
!!! error TS2339: Property '#foo' does not exist on type 'never'.
thing.#bar;
~~~~
!!! error TS2339: Property '#bar' does not exist on type 'never'.
thing.#foo();
~~~~
!!! error TS2339: Property '#foo' does not exist on type 'never'.
}
};

23 changes: 23 additions & 0 deletions tests/baselines/reference/privateNameAndAny.js
Expand Up @@ -4,6 +4,17 @@ class A {
method(thing: any) {
thing.#foo; // OK
thing.#bar; // Error
thing.#foo();
}
methodU(thing: unknown) {
thing.#foo;
thing.#bar;
thing.#foo();
}
methodN(thing: never) {
thing.#foo;
thing.#bar;
thing.#foo();
}
};

Expand All @@ -24,6 +35,18 @@ class A {
method(thing) {
__classPrivateFieldGet(thing, _foo); // OK
thing.; // Error
__classPrivateFieldGet(thing, _foo).call(// Error
thing);
}
methodU(thing) {
__classPrivateFieldGet(thing, _foo);
thing.;
__classPrivateFieldGet(thing, _foo).call(thing);
}
methodN(thing) {
__classPrivateFieldGet(thing, _foo);
thing.;
__classPrivateFieldGet(thing, _foo).call(thing);
}
}
_foo = new WeakMap();
Expand Down
29 changes: 29 additions & 0 deletions tests/baselines/reference/privateNameAndAny.symbols
Expand Up @@ -14,6 +14,35 @@ class A {

thing.#bar; // Error
>thing : Symbol(thing, Decl(privateNameAndAny.ts, 2, 11))

thing.#foo();
>thing : Symbol(thing, Decl(privateNameAndAny.ts, 2, 11))
}
methodU(thing: unknown) {
>methodU : Symbol(A.methodU, Decl(privateNameAndAny.ts, 6, 5))
>thing : Symbol(thing, Decl(privateNameAndAny.ts, 7, 12))

thing.#foo;
>thing : Symbol(thing, Decl(privateNameAndAny.ts, 7, 12))

thing.#bar;
>thing : Symbol(thing, Decl(privateNameAndAny.ts, 7, 12))

thing.#foo();
>thing : Symbol(thing, Decl(privateNameAndAny.ts, 7, 12))
}
methodN(thing: never) {
>methodN : Symbol(A.methodN, Decl(privateNameAndAny.ts, 11, 5))
>thing : Symbol(thing, Decl(privateNameAndAny.ts, 12, 12))

thing.#foo;
>thing : Symbol(thing, Decl(privateNameAndAny.ts, 12, 12))

thing.#bar;
>thing : Symbol(thing, Decl(privateNameAndAny.ts, 12, 12))

thing.#foo();
>thing : Symbol(thing, Decl(privateNameAndAny.ts, 12, 12))
}
};

39 changes: 39 additions & 0 deletions tests/baselines/reference/privateNameAndAny.types
Expand Up @@ -17,6 +17,45 @@ class A {
thing.#bar; // Error
>thing.#bar : any
>thing : any

thing.#foo();
>thing.#foo() : any
>thing.#foo : any
>thing : any
}
methodU(thing: unknown) {
>methodU : (thing: unknown) => void
>thing : unknown

thing.#foo;
>thing.#foo : any
>thing : unknown

thing.#bar;
>thing.#bar : any
>thing : unknown

thing.#foo();
>thing.#foo() : any
>thing.#foo : any
>thing : unknown
}
methodN(thing: never) {
>methodN : (thing: never) => void
>thing : never

thing.#foo;
>thing.#foo : any
>thing : never

thing.#bar;
>thing.#bar : any
>thing : never

thing.#foo();
>thing.#foo() : any
>thing.#foo : any
>thing : never
}
};

Expand Up @@ -6,5 +6,16 @@ class A {
method(thing: any) {
thing.#foo; // OK
thing.#bar; // Error
thing.#foo();
}
methodU(thing: unknown) {
thing.#foo;
thing.#bar;
thing.#foo();
}
methodN(thing: never) {
thing.#foo;
thing.#bar;
thing.#foo();
}
};

0 comments on commit 21eb38b

Please sign in to comment.