Skip to content

Commit 1a7862c

Browse files
committed
Merge pull request #786 from Microsoft/aliasCompletion
Show aliases in completion list
2 parents a37106d + 6968d83 commit 1a7862c

File tree

6 files changed

+115
-2
lines changed

6 files changed

+115
-2
lines changed

src/compiler/checker.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ module ts {
9393
getFullyQualifiedName: getFullyQualifiedName,
9494
getResolvedSignature: getResolvedSignature,
9595
getEnumMemberValue: getEnumMemberValue,
96-
isValidPropertyAccess: isValidPropertyAccess
96+
isValidPropertyAccess: isValidPropertyAccess,
97+
getAliasedSymbol: resolveImport
9798
};
9899

99100
var undefinedSymbol = createSymbol(SymbolFlags.Property | SymbolFlags.Transient, "undefined");

src/compiler/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -657,6 +657,7 @@ module ts {
657657
getEnumMemberValue(node: EnumMember): number;
658658

659659
isValidPropertyAccess(node: PropertyAccess, propertyName: string): boolean;
660+
getAliasedSymbol(symbol: Symbol): Symbol;
660661
}
661662

662663
export interface TextWriter {

src/services/services.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1025,6 +1025,8 @@ module ts {
10251025
static primitiveType = "primitive type";
10261026

10271027
static label = "label";
1028+
1029+
static alias = "alias"
10281030
}
10291031

10301032
export class ScriptElementKindModifier {
@@ -2145,6 +2147,12 @@ module ts {
21452147

21462148
if (mappedNode.kind === SyntaxKind.Identifier || mappedNode.kind === SyntaxKind.QualifiedName || mappedNode.kind === SyntaxKind.PropertyAccess) {
21472149
var symbol = typeInfoResolver.getSymbolInfo(mappedNode);
2150+
2151+
// This is an alias, follow what it aliases
2152+
if (symbol && symbol.flags & SymbolFlags.Import) {
2153+
symbol = typeInfoResolver.getAliasedSymbol(symbol);
2154+
}
2155+
21482156
if (symbol && symbol.flags & SymbolFlags.HasExports) {
21492157
// Extract module or enum members
21502158
forEachValue(symbol.exports, symbol => {
@@ -2195,7 +2203,7 @@ module ts {
21952203
else {
21962204
isMemberCompletion = false;
21972205
/// TODO filter meaning based on the current context
2198-
var symbolMeanings = SymbolFlags.Type | SymbolFlags.Value | SymbolFlags.Namespace;
2206+
var symbolMeanings = SymbolFlags.Type | SymbolFlags.Value | SymbolFlags.Namespace | SymbolFlags.Import;
21992207
var symbols = typeInfoResolver.getSymbolsInScope(mappedNode, symbolMeanings);
22002208

22012209
getCompletionEntriesFromSymbols(symbols, activeCompletionSession);
@@ -2293,6 +2301,7 @@ module ts {
22932301
if (flags & SymbolFlags.Constructor) return ScriptElementKind.constructorImplementationElement;
22942302
if (flags & SymbolFlags.TypeParameter) return ScriptElementKind.typeParameterElement;
22952303
if (flags & SymbolFlags.EnumMember) return ScriptElementKind.variableElement;
2304+
if (flags & SymbolFlags.Import) return ScriptElementKind.alias;
22962305

22972306
return ScriptElementKind.unknown;
22982307
}
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+
////module M {
4+
//// export var value;
5+
////
6+
//// import x = M;
7+
//// /*1*/
8+
//// x./*2*/
9+
////}
10+
11+
goTo.marker("1");
12+
verify.memberListContains("x", undefined, undefined, undefined ,/*kind: */ "alias");
13+
14+
goTo.marker("2");
15+
verify.memberListContains("value");
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
////module M {
4+
//// export interface I { }
5+
//// export class C {
6+
//// static property;
7+
//// }
8+
//// export enum E {
9+
//// value = 0
10+
//// }
11+
//// export module N {
12+
//// export var v;
13+
//// }
14+
//// export var V = 0;
15+
//// export function F() { }
16+
//// export import A = M;
17+
////}
18+
////
19+
////import m = M;
20+
////import c = M.C;
21+
////import e = M.E;
22+
////import n = M.N;
23+
////import v = M.V;
24+
////import f = M.F;
25+
////import a = M.A;
26+
////
27+
////m./*1*/;
28+
////c./*2*/;
29+
////e./*3*/;
30+
////n./*4*/;
31+
////v./*5*/;
32+
////f./*6*/;
33+
////a./*7*/;
34+
35+
36+
// Module m
37+
goTo.marker("1");
38+
verify.memberListContains("I");
39+
verify.memberListContains("C");
40+
verify.memberListContains("E");
41+
verify.memberListContains("N");
42+
verify.memberListContains("V");
43+
verify.memberListContains("F");
44+
verify.memberListContains("A");
45+
46+
// Class C
47+
goTo.marker("2");
48+
verify.memberListContains("property");
49+
50+
// Enum E
51+
goTo.marker("3");
52+
verify.memberListContains("value");
53+
54+
// Module N
55+
goTo.marker("4");
56+
verify.memberListContains("v");
57+
58+
// var V
59+
goTo.marker("5");
60+
verify.memberListContains("toFixed");
61+
62+
// function F
63+
goTo.marker("6");
64+
verify.memberListContains("call");
65+
66+
// alias a
67+
goTo.marker("7");
68+
verify.memberListContains("I");
69+
verify.memberListContains("C");
70+
verify.memberListContains("E");
71+
verify.memberListContains("N");
72+
verify.memberListContains("V");
73+
verify.memberListContains("F");
74+
verify.memberListContains("A");
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
////declare module 'foobar' {
4+
//// interface Q { x: number; }
5+
////}
6+
////declare module 'thing' {
7+
//// import x = require('foobar');
8+
//// var m: x./*1*/;
9+
////}
10+
11+
// Q does not show up in member list of x
12+
goTo.marker("1");
13+
verify.memberListContains("Q");

0 commit comments

Comments
 (0)