Minor refactor in goToTypeDefinition (#25951)

This commit is contained in:
Andy
2018-07-25 17:10:06 -07:00
committed by GitHub
parent 1e8a5bf2f1
commit f12e9a8389
2 changed files with 11 additions and 14 deletions

View File

@@ -136,15 +136,8 @@ namespace ts.GoToDefinition {
const symbol = typeChecker.getSymbolAtLocation(node);
const type = symbol && typeChecker.getTypeOfSymbolAtLocation(symbol, node);
if (!type) {
return undefined;
}
if (type.isUnion() && !(type.flags & TypeFlags.Enum)) {
return flatMap(type.types, t => t.symbol && getDefinitionFromSymbol(typeChecker, t.symbol, node));
}
return type.symbol && getDefinitionFromSymbol(typeChecker, type.symbol, node);
return type && flatMap(type.isUnion() && !(type.flags & TypeFlags.Enum) ? type.types : [type], t =>
t.symbol && getDefinitionFromSymbol(typeChecker, t.symbol, node));
}
export function getDefinitionAndBoundSpan(program: Program, sourceFile: SourceFile, position: number): DefinitionInfoAndBoundSpan | undefined {
@@ -230,7 +223,7 @@ namespace ts.GoToDefinition {
}
function getCallSignatureDefinition(): DefinitionInfo[] | undefined {
return isCallExpressionTarget(node) || isNewExpressionTarget(node) || isNameOfFunctionDeclaration(node)
return isCallOrNewExpressionTarget(node) || isNameOfFunctionDeclaration(node)
? getSignatureDefinition(symbol.declarations, /*selectConstructors*/ false)
: undefined;
}

View File

@@ -194,16 +194,20 @@ namespace ts {
}
export function isCallExpressionTarget(node: Node): boolean {
return isCallOrNewExpressionTarget(node, SyntaxKind.CallExpression);
return isCallOrNewExpressionTargetWorker(node, isCallExpression);
}
export function isNewExpressionTarget(node: Node): boolean {
return isCallOrNewExpressionTarget(node, SyntaxKind.NewExpression);
return isCallOrNewExpressionTargetWorker(node, isNewExpression);
}
function isCallOrNewExpressionTarget(node: Node, kind: SyntaxKind): boolean {
export function isCallOrNewExpressionTarget(node: Node): boolean {
return isCallOrNewExpressionTargetWorker(node, isCallOrNewExpression);
}
function isCallOrNewExpressionTargetWorker<T extends CallExpression | NewExpression>(node: Node, pred: (node: Node) => node is T): boolean {
const target = climbPastPropertyAccess(node);
return !!target && !!target.parent && target.parent.kind === kind && (<CallExpression>target.parent).expression === target;
return !!target && !!target.parent && pred(target.parent) && target.parent.expression === target;
}
export function climbPastPropertyAccess(node: Node) {