Merge pull request #5043 from Microsoft/findRefsOnVarInExtends

Correctly recognize value symbol presence of expressions in extends clauses
This commit is contained in:
Daniel Rosenwasser 2015-10-01 12:36:12 -07:00
commit acef223f95
6 changed files with 59 additions and 1 deletions

View file

@ -14224,7 +14224,21 @@ namespace ts {
}
if (isHeritageClauseElementIdentifier(<EntityName>entityName)) {
let meaning = entityName.parent.kind === SyntaxKind.ExpressionWithTypeArguments ? SymbolFlags.Type : SymbolFlags.Namespace;
let meaning = SymbolFlags.None;
// In an interface or class, we're definitely interested in a type.
if (entityName.parent.kind === SyntaxKind.ExpressionWithTypeArguments) {
meaning = SymbolFlags.Type;
// In a class 'extends' clause we are also looking for a value.
if (isExpressionWithTypeArgumentsInClassExtendsClause(entityName.parent)) {
meaning |= SymbolFlags.Value;
}
}
else {
meaning = SymbolFlags.Namespace;
}
meaning |= SymbolFlags.Alias;
return resolveEntityName(<EntityName>entityName, meaning);
}

View file

@ -8,6 +8,7 @@ var x = foo1;
class y extends x {}
>y : Symbol(y, Decl(foo2.ts, 1, 13))
>x : Symbol(x, Decl(foo2.ts, 1, 3))
=== tests/cases/conformance/classes/classExpressions/foo1.ts ===
class x{}

View file

@ -9,4 +9,5 @@ var x = A;
class C extends x { } // error, could not find symbol xs
>C : Symbol(C, Decl(extendNonClassSymbol1.ts, 1, 10))
>x : Symbol(x, Decl(extendNonClassSymbol1.ts, 1, 3))

View file

@ -0,0 +1,15 @@
/// <reference path="fourslash.ts"/>
////var [|Base|] = class { };
////class C extends [|Base|] { }
let ranges = test.ranges();
for (let range of ranges) {
goTo.position(range.start);
verify.referencesCountIs(ranges.length);
for (let expectedReference of ranges) {
verify.referencesAtPositionContains(expectedReference);
}
}

View file

@ -0,0 +1,17 @@
/// <reference path="fourslash.ts"/>
////interface [|Base|] { }
////namespace n {
//// var Base = class { };
//// interface I extends [|Base|] { }
////}
let ranges = test.ranges();
for (let range of ranges) {
goTo.position(range.start);
verify.referencesCountIs(ranges.length);
for (let expectedReference of ranges) {
verify.referencesAtPositionContains(expectedReference);
}
}

View file

@ -0,0 +1,10 @@
/// <reference path="fourslash.ts"/>
////var Base = class { };
////class C extends Base implements [|Base|] { }
let ranges = test.ranges();
for (let range of ranges) {
verify.referencesCountIs(0);
}