diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 2040ba0d856..5bcf1871f7d 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -2144,6 +2144,14 @@ module ts { } var symbol = createSymbol(SymbolFlags.UnionProperty | SymbolFlags.Transient, prop.name); symbol.unionType = type; + + symbol.declarations = []; + for (var i = 0; i < types.length; i++) { + var s = getPropertyOfType(types[i], prop.name); + if (s.declarations) + symbol.declarations.push.apply(symbol.declarations, s.declarations); + } + members[prop.name] = symbol; }); var callSignatures = getUnionSignatures(types, SignatureKind.Call); diff --git a/src/services/services.ts b/src/services/services.ts index b6bea438c5a..39575138cc6 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -2382,7 +2382,6 @@ module ts { } function getSymbolModifiers(symbol: Symbol): string { - symbol = typeInfoResolver.getRootSymbols(symbol)[0]; return symbol && symbol.declarations && symbol.declarations.length > 0 ? getNodeModifiers(symbol.declarations[0]) : ScriptElementKindModifier.none; @@ -2643,11 +2642,7 @@ module ts { var result: DefinitionInfo[] = []; - // The symbol could be a unionProperty, we need to ensure we are collecting all - // declarations, so use getRootSymbol first. - forEach(typeInfoResolver.getRootSymbols(symbol), s => { - getDefinitionFromSymbol(s, node, result); - }); + getDefinitionFromSymbol(symbol, node, result); return result; } @@ -3162,13 +3157,7 @@ module ts { return [getReferenceEntryFromNode(node)]; } - var declarations = symbol.getDeclarations(); - - // Handle union properties - declarations = []; - forEach(typeInfoResolver.getRootSymbols(symbol), s => { - declarations.push.apply(declarations, s.declarations); - }); + var declarations = symbol.declarations; // The symbol was an internal symbol and does not have a declaration e.g.undefined symbol if (!declarations || !declarations.length) {