Skip to content

Commit acef223

Browse files
Merge pull request microsoft#5043 from Microsoft/findRefsOnVarInExtends
Correctly recognize value symbol presence of expressions in extends clauses
2 parents a6ba6fa + cbca154 commit acef223

6 files changed

Lines changed: 59 additions & 1 deletion

src/compiler/checker.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14224,7 +14224,21 @@ namespace ts {
1422414224
}
1422514225

1422614226
if (isHeritageClauseElementIdentifier(<EntityName>entityName)) {
14227-
let meaning = entityName.parent.kind === SyntaxKind.ExpressionWithTypeArguments ? SymbolFlags.Type : SymbolFlags.Namespace;
14227+
let meaning = SymbolFlags.None;
14228+
14229+
// In an interface or class, we're definitely interested in a type.
14230+
if (entityName.parent.kind === SyntaxKind.ExpressionWithTypeArguments) {
14231+
meaning = SymbolFlags.Type;
14232+
14233+
// In a class 'extends' clause we are also looking for a value.
14234+
if (isExpressionWithTypeArgumentsInClassExtendsClause(entityName.parent)) {
14235+
meaning |= SymbolFlags.Value;
14236+
}
14237+
}
14238+
else {
14239+
meaning = SymbolFlags.Namespace;
14240+
}
14241+
1422814242
meaning |= SymbolFlags.Alias;
1422914243
return resolveEntityName(<EntityName>entityName, meaning);
1423014244
}

tests/baselines/reference/extendClassExpressionFromModule.symbols

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ var x = foo1;
88

99
class y extends x {}
1010
>y : Symbol(y, Decl(foo2.ts, 1, 13))
11+
>x : Symbol(x, Decl(foo2.ts, 1, 3))
1112

1213
=== tests/cases/conformance/classes/classExpressions/foo1.ts ===
1314
class x{}

tests/baselines/reference/extendNonClassSymbol1.symbols

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ var x = A;
99

1010
class C extends x { } // error, could not find symbol xs
1111
>C : Symbol(C, Decl(extendNonClassSymbol1.ts, 1, 10))
12+
>x : Symbol(x, Decl(extendNonClassSymbol1.ts, 1, 3))
1213

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/// <reference path="fourslash.ts"/>
2+
3+
4+
////var [|Base|] = class { };
5+
////class C extends [|Base|] { }
6+
7+
let ranges = test.ranges();
8+
for (let range of ranges) {
9+
goTo.position(range.start);
10+
11+
verify.referencesCountIs(ranges.length);
12+
for (let expectedReference of ranges) {
13+
verify.referencesAtPositionContains(expectedReference);
14+
}
15+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/// <reference path="fourslash.ts"/>
2+
3+
////interface [|Base|] { }
4+
////namespace n {
5+
//// var Base = class { };
6+
//// interface I extends [|Base|] { }
7+
////}
8+
9+
let ranges = test.ranges();
10+
for (let range of ranges) {
11+
goTo.position(range.start);
12+
13+
verify.referencesCountIs(ranges.length);
14+
for (let expectedReference of ranges) {
15+
verify.referencesAtPositionContains(expectedReference);
16+
}
17+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/// <reference path="fourslash.ts"/>
2+
3+
4+
////var Base = class { };
5+
////class C extends Base implements [|Base|] { }
6+
7+
let ranges = test.ranges();
8+
for (let range of ranges) {
9+
verify.referencesCountIs(0);
10+
}

0 commit comments

Comments
 (0)