Skip to content

Commit 63c0a88

Browse files
committed
Merge pull request #885 from Microsoft/symbolInfoOfUndefinedAndArguments
Fix how arguments and undefined are shown in the quickInfo
2 parents 77a93d2 + dfb7785 commit 63c0a88

File tree

4 files changed

+34
-19
lines changed

4 files changed

+34
-19
lines changed

src/compiler/checker.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,12 @@ module ts {
105105
writeTypeParameter: writeTypeParameter,
106106
writeTypeParametersOfSymbol: writeTypeParametersOfSymbol,
107107
isImplementationOfOverload: isImplementationOfOverload,
108-
getAliasedSymbol: resolveImport
108+
getAliasedSymbol: resolveImport,
109+
isUndefinedSymbol: symbol => symbol === undefinedSymbol,
110+
isArgumentsSymbol: symbol => symbol === argumentsSymbol
109111
};
110112

111-
var undefinedSymbol = createSymbol(SymbolFlags.Undefined | SymbolFlags.Property | SymbolFlags.Transient, "undefined");
113+
var undefinedSymbol = createSymbol(SymbolFlags.Property | SymbolFlags.Transient, "undefined");
112114
var argumentsSymbol = createSymbol(SymbolFlags.Property | SymbolFlags.Transient, "arguments");
113115
var unknownSymbol = createSymbol(SymbolFlags.Property | SymbolFlags.Transient, "unknown");
114116
var resolvingSymbol = createSymbol(SymbolFlags.Transient, "__resolving__");

src/compiler/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -656,6 +656,8 @@ module ts {
656656
writeTypeParameter(tp: TypeParameter, writer: SymbolWriter, enclosingDeclaration?: Node, flags?: TypeFormatFlags): void;
657657
writeTypeParametersOfSymbol(symbol: Symbol, writer: SymbolWriter, enclosingDeclaraiton?: Node, flags?: TypeFormatFlags): void;
658658
isImplementationOfOverload(node: FunctionDeclaration): boolean;
659+
isUndefinedSymbol(symbol: Symbol): boolean;
660+
isArgumentsSymbol(symbol: Symbol): boolean;
659661

660662
// Returns the constant value of this enum member, or 'undefined' if the enum member has a
661663
// computed value.
@@ -767,8 +769,6 @@ module ts {
767769
Transient = 0x02000000, // Transient symbol (created during type check)
768770
Prototype = 0x04000000, // Symbol for the prototype property (without source code representation)
769771

770-
Undefined = 0x08000000, // Symbol for the undefined
771-
772772
Value = Variable | Property | EnumMember | Function | Class | Enum | ValueModule | Method | GetAccessor | SetAccessor,
773773
Type = Class | Interface | Enum | TypeLiteral | ObjectLiteral | TypeParameter,
774774
Namespace = ValueModule | NamespaceModule,

src/services/services.ts

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2250,7 +2250,7 @@ module ts {
22502250
return undefined;
22512251
}
22522252

2253-
function createCompletionEntry(symbol: Symbol): CompletionEntry {
2253+
function createCompletionEntry(symbol: Symbol, typeChecker: TypeChecker): CompletionEntry {
22542254
// Try to get a valid display name for this symbol, if we could not find one, then ignore it.
22552255
// We would like to only show things that can be added after a dot, so for instance numeric properties can
22562256
// not be accessed with a dot (a.1 <- invalid)
@@ -2261,15 +2261,15 @@ module ts {
22612261

22622262
return {
22632263
name: displayName,
2264-
kind: getSymbolKind(symbol),
2264+
kind: getSymbolKind(symbol, typeChecker),
22652265
kindModifiers: getSymbolModifiers(symbol)
22662266
};
22672267
}
22682268

22692269
function getCompletionsAtPosition(filename: string, position: number, isMemberCompletion: boolean) {
22702270
function getCompletionEntriesFromSymbols(symbols: Symbol[], session: CompletionSession): void {
22712271
forEach(symbols, symbol => {
2272-
var entry = createCompletionEntry(symbol);
2272+
var entry = createCompletionEntry(symbol, session.typeChecker);
22732273
if (entry && !lookUp(session.symbols, entry.name)) {
22742274
session.entries.push(entry);
22752275
session.symbols[entry.name] = symbol;
@@ -2608,7 +2608,7 @@ module ts {
26082608
if (symbol) {
26092609
var type = session.typeChecker.getTypeOfSymbol(symbol);
26102610
Debug.assert(type, "Could not find type for symbol");
2611-
var completionEntry = createCompletionEntry(symbol);
2611+
var completionEntry = createCompletionEntry(symbol, session.typeChecker);
26122612
// TODO(drosen): Right now we just permit *all* semantic meanings when calling 'getSymbolKind'
26132613
// which is permissible given that it is backwards compatible; but really we should consider
26142614
// passing the meaning for the node so that we don't report that a suggestion for a value is an interface.
@@ -2657,15 +2657,15 @@ module ts {
26572657
}
26582658

26592659
// TODO(drosen): use contextual SemanticMeaning.
2660-
function getSymbolKind(symbol: Symbol): string {
2660+
function getSymbolKind(symbol: Symbol, typeResolver: TypeChecker): string {
26612661
var flags = typeInfoResolver.getRootSymbol(symbol).getFlags();
26622662

26632663
if (flags & SymbolFlags.Class) return ScriptElementKind.classElement;
26642664
if (flags & SymbolFlags.Enum) return ScriptElementKind.enumElement;
26652665
if (flags & SymbolFlags.Interface) return ScriptElementKind.interfaceElement;
26662666
if (flags & SymbolFlags.TypeParameter) return ScriptElementKind.typeParameterElement;
26672667

2668-
var result = getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(symbol, flags);
2668+
var result = getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(symbol, flags, typeResolver);
26692669
if (result === ScriptElementKind.unknown) {
26702670
if (flags & SymbolFlags.TypeParameter) return ScriptElementKind.typeParameterElement;
26712671
if (flags & SymbolFlags.EnumMember) return ScriptElementKind.variableElement;
@@ -2675,16 +2675,19 @@ module ts {
26752675
return result;
26762676
}
26772677

2678-
function getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(symbol: Symbol, flags: SymbolFlags) {
2678+
function getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(symbol: Symbol, flags: SymbolFlags, typeResolver: TypeChecker) {
2679+
if (typeResolver.isUndefinedSymbol(symbol)) {
2680+
return ScriptElementKind.variableElement;
2681+
}
2682+
if (typeResolver.isArgumentsSymbol(symbol)) {
2683+
return ScriptElementKind.localVariableElement;
2684+
}
26792685
if (flags & SymbolFlags.Variable) {
26802686
if (isFirstDeclarationOfSymbolParameter(symbol)) {
26812687
return ScriptElementKind.parameterElement;
26822688
}
26832689
return isLocalVariableOrFunction(symbol) ? ScriptElementKind.localVariableElement : ScriptElementKind.variableElement;
26842690
}
2685-
if (flags & SymbolFlags.Undefined) {
2686-
return ScriptElementKind.variableElement;
2687-
}
26882691
if (flags & SymbolFlags.Function) return isLocalVariableOrFunction(symbol) ? ScriptElementKind.localFunctionElement : ScriptElementKind.functionElement;
26892692
if (flags & SymbolFlags.GetAccessor) return ScriptElementKind.memberGetAccessorElement;
26902693
if (flags & SymbolFlags.SetAccessor) return ScriptElementKind.memberSetAccessorElement;
@@ -2746,7 +2749,7 @@ module ts {
27462749
var displayParts: SymbolDisplayPart[] = [];
27472750
var documentation: SymbolDisplayPart[];
27482751
var symbolFlags = typeResolver.getRootSymbol(symbol).flags;
2749-
var symbolKind = getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(symbol, symbolFlags);
2752+
var symbolKind = getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(symbol, symbolFlags, typeResolver);
27502753
var hasAddedSymbolInfo: boolean;
27512754
// Class at constructor site need to be shown as constructor apart from property,method, vars
27522755
if (symbolKind !== ScriptElementKind.unknown || symbolFlags & SymbolFlags.Class || symbolFlags & SymbolFlags.Import) {
@@ -2952,8 +2955,10 @@ module ts {
29522955
if (symbolKind !== ScriptElementKind.unknown) {
29532956
if (type) {
29542957
addPrefixForAnyFunctionOrVar(symbol, symbolKind);
2958+
// For properties, variables and local vars: show the type
29552959
if (symbolKind === ScriptElementKind.memberVariableElement ||
2956-
symbolFlags & SymbolFlags.Variable) {
2960+
symbolFlags & SymbolFlags.Variable ||
2961+
symbolKind === ScriptElementKind.localVariableElement) {
29572962
displayParts.push(punctuationPart(SyntaxKind.ColonToken));
29582963
displayParts.push(spacePart());
29592964
// If the type is type parameter, format it specially
@@ -2978,7 +2983,7 @@ module ts {
29782983
}
29792984
}
29802985
else {
2981-
symbolKind = getSymbolKind(symbol);
2986+
symbolKind = getSymbolKind(symbol, typeResolver);
29822987
}
29832988
}
29842989

@@ -3184,7 +3189,7 @@ module ts {
31843189

31853190
var declarations = symbol.getDeclarations();
31863191
var symbolName = typeInfoResolver.symbolToString(symbol); // Do not get scoped name, just the name of the symbol
3187-
var symbolKind = getSymbolKind(symbol);
3192+
var symbolKind = getSymbolKind(symbol, typeInfoResolver);
31883193
var containerSymbol = symbol.parent;
31893194
var containerName = containerSymbol ? typeInfoResolver.symbolToString(containerSymbol, node) : "";
31903195

@@ -5175,7 +5180,7 @@ module ts {
51755180

51765181
// Only allow a symbol to be renamed if it actually has at least one declaration.
51775182
if (symbol && symbol.getDeclarations() && symbol.getDeclarations().length > 0) {
5178-
var kind = getSymbolKind(symbol);
5183+
var kind = getSymbolKind(symbol, typeInfoResolver);
51795184
if (kind) {
51805185
return getRenameInfo(symbol.name, typeInfoResolver.getFullyQualifiedName(symbol), kind,
51815186
getSymbolModifiers(symbol),
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/// <reference path='fourslash.ts'/>
2+
3+
////function foo(x: string) {
4+
//// return /*1*/arguments;
5+
////}
6+
7+
goTo.marker('1');
8+
verify.quickInfoIs('(local var) arguments: IArguments');

0 commit comments

Comments
 (0)