@@ -111,124 +111,123 @@ namespace ts.SymbolDisplay {
111
111
112
112
let signature : Signature ;
113
113
type = isThisExpression ? typeChecker . getTypeAtLocation ( location ) : typeChecker . getTypeOfSymbolAtLocation ( symbol . exportSymbol || symbol , location ) ;
114
- if ( type ) {
115
- if ( location . parent && location . parent . kind === SyntaxKind . PropertyAccessExpression ) {
116
- const right = ( < PropertyAccessExpression > location . parent ) . name ;
117
- // Either the location is on the right of a property access, or on the left and the right is missing
118
- if ( right === location || ( right && right . getFullWidth ( ) === 0 ) ) {
119
- location = location . parent ;
120
- }
121
- }
122
114
123
- // try get the call/construct signature from the type if it matches
124
- let callExpressionLike : CallExpression | NewExpression | JsxOpeningLikeElement ;
125
- if ( isCallOrNewExpression ( location ) ) {
126
- callExpressionLike = < CallExpression | NewExpression > location ;
127
- }
128
- else if ( isCallExpressionTarget ( location ) || isNewExpressionTarget ( location ) ) {
129
- callExpressionLike = < CallExpression | NewExpression > location . parent ;
115
+ if ( location . parent && location . parent . kind === SyntaxKind . PropertyAccessExpression ) {
116
+ const right = ( < PropertyAccessExpression > location . parent ) . name ;
117
+ // Either the location is on the right of a property access, or on the left and the right is missing
118
+ if ( right === location || ( right && right . getFullWidth ( ) === 0 ) ) {
119
+ location = location . parent ;
130
120
}
131
- else if ( location . parent && isJsxOpeningLikeElement ( location . parent ) && isFunctionLike ( symbol . valueDeclaration ) ) {
132
- callExpressionLike = < JsxOpeningLikeElement > location . parent ;
121
+ }
122
+
123
+ // try get the call/construct signature from the type if it matches
124
+ let callExpressionLike : CallExpression | NewExpression | JsxOpeningLikeElement ;
125
+ if ( isCallOrNewExpression ( location ) ) {
126
+ callExpressionLike = < CallExpression | NewExpression > location ;
127
+ }
128
+ else if ( isCallExpressionTarget ( location ) || isNewExpressionTarget ( location ) ) {
129
+ callExpressionLike = < CallExpression | NewExpression > location . parent ;
130
+ }
131
+ else if ( location . parent && isJsxOpeningLikeElement ( location . parent ) && isFunctionLike ( symbol . valueDeclaration ) ) {
132
+ callExpressionLike = < JsxOpeningLikeElement > location . parent ;
133
+ }
134
+
135
+ if ( callExpressionLike ) {
136
+ const candidateSignatures : Signature [ ] = [ ] ;
137
+ signature = typeChecker . getResolvedSignature ( callExpressionLike , candidateSignatures ) ;
138
+ if ( ! signature && candidateSignatures . length ) {
139
+ // Use the first candidate:
140
+ signature = candidateSignatures [ 0 ] ;
133
141
}
134
142
135
- if ( callExpressionLike ) {
136
- const candidateSignatures : Signature [ ] = [ ] ;
137
- signature = typeChecker . getResolvedSignature ( callExpressionLike , candidateSignatures ) ;
138
- if ( ! signature && candidateSignatures . length ) {
139
- // Use the first candidate:
140
- signature = candidateSignatures [ 0 ] ;
141
- }
143
+ const useConstructSignatures = callExpressionLike . kind === SyntaxKind . NewExpression || ( isCallExpression ( callExpressionLike ) && callExpressionLike . expression . kind === SyntaxKind . SuperKeyword ) ;
142
144
143
- const useConstructSignatures = callExpressionLike . kind === SyntaxKind . NewExpression || ( isCallExpression ( callExpressionLike ) && callExpressionLike . expression . kind === SyntaxKind . SuperKeyword ) ;
145
+ const allSignatures = useConstructSignatures ? type . getConstructSignatures ( ) : type . getCallSignatures ( ) ;
144
146
145
- const allSignatures = useConstructSignatures ? type . getConstructSignatures ( ) : type . getCallSignatures ( ) ;
147
+ if ( ! contains ( allSignatures , signature . target ) && ! contains ( allSignatures , signature ) ) {
148
+ // Get the first signature if there is one -- allSignatures may contain
149
+ // either the original signature or its target, so check for either
150
+ signature = allSignatures . length ? allSignatures [ 0 ] : undefined ;
151
+ }
146
152
147
- if ( ! contains ( allSignatures , signature . target ) && ! contains ( allSignatures , signature ) ) {
148
- // Get the first signature if there is one -- allSignatures may contain
149
- // either the original signature or its target, so check for either
150
- signature = allSignatures . length ? allSignatures [ 0 ] : undefined ;
153
+ if ( signature ) {
154
+ if ( useConstructSignatures && ( symbolFlags & SymbolFlags . Class ) ) {
155
+ // Constructor
156
+ symbolKind = ScriptElementKind . constructorImplementationElement ;
157
+ addPrefixForAnyFunctionOrVar ( type . symbol , symbolKind ) ;
151
158
}
152
-
153
- if ( signature ) {
154
- if ( useConstructSignatures && ( symbolFlags & SymbolFlags . Class ) ) {
155
- // Constructor
156
- symbolKind = ScriptElementKind . constructorImplementationElement ;
157
- addPrefixForAnyFunctionOrVar ( type . symbol , symbolKind ) ;
159
+ else if ( symbolFlags & SymbolFlags . Alias ) {
160
+ symbolKind = ScriptElementKind . alias ;
161
+ pushTypePart ( symbolKind ) ;
162
+ displayParts . push ( spacePart ( ) ) ;
163
+ if ( useConstructSignatures ) {
164
+ displayParts . push ( keywordPart ( SyntaxKind . NewKeyword ) ) ;
165
+ displayParts . push ( spacePart ( ) ) ;
158
166
}
159
- else if ( symbolFlags & SymbolFlags . Alias ) {
160
- symbolKind = ScriptElementKind . alias ;
161
- pushTypePart ( symbolKind ) ;
167
+ addFullSymbolName ( symbol ) ;
168
+ }
169
+ else {
170
+ addPrefixForAnyFunctionOrVar ( symbol , symbolKind ) ;
171
+ }
172
+
173
+ switch ( symbolKind ) {
174
+ case ScriptElementKind . jsxAttribute :
175
+ case ScriptElementKind . memberVariableElement :
176
+ case ScriptElementKind . variableElement :
177
+ case ScriptElementKind . constElement :
178
+ case ScriptElementKind . letElement :
179
+ case ScriptElementKind . parameterElement :
180
+ case ScriptElementKind . localVariableElement :
181
+ // If it is call or construct signature of lambda's write type name
182
+ displayParts . push ( punctuationPart ( SyntaxKind . ColonToken ) ) ;
162
183
displayParts . push ( spacePart ( ) ) ;
163
184
if ( useConstructSignatures ) {
164
185
displayParts . push ( keywordPart ( SyntaxKind . NewKeyword ) ) ;
165
186
displayParts . push ( spacePart ( ) ) ;
166
187
}
167
- addFullSymbolName ( symbol ) ;
168
- }
169
- else {
170
- addPrefixForAnyFunctionOrVar ( symbol , symbolKind ) ;
171
- }
188
+ if ( ! ( type . flags & TypeFlags . Object && ( < ObjectType > type ) . objectFlags & ObjectFlags . Anonymous ) && type . symbol ) {
189
+ addRange ( displayParts , symbolToDisplayParts ( typeChecker , type . symbol , enclosingDeclaration , /*meaning*/ undefined , SymbolFormatFlags . WriteTypeParametersOrArguments ) ) ;
190
+ }
191
+ addSignatureDisplayParts ( signature , allSignatures , TypeFormatFlags . WriteArrowStyleSignature ) ;
192
+ break ;
172
193
173
- switch ( symbolKind ) {
174
- case ScriptElementKind . jsxAttribute :
175
- case ScriptElementKind . memberVariableElement :
176
- case ScriptElementKind . variableElement :
177
- case ScriptElementKind . constElement :
178
- case ScriptElementKind . letElement :
179
- case ScriptElementKind . parameterElement :
180
- case ScriptElementKind . localVariableElement :
181
- // If it is call or construct signature of lambda's write type name
182
- displayParts . push ( punctuationPart ( SyntaxKind . ColonToken ) ) ;
183
- displayParts . push ( spacePart ( ) ) ;
184
- if ( useConstructSignatures ) {
185
- displayParts . push ( keywordPart ( SyntaxKind . NewKeyword ) ) ;
186
- displayParts . push ( spacePart ( ) ) ;
187
- }
188
- if ( ! ( type . flags & TypeFlags . Object && ( < ObjectType > type ) . objectFlags & ObjectFlags . Anonymous ) && type . symbol ) {
189
- addRange ( displayParts , symbolToDisplayParts ( typeChecker , type . symbol , enclosingDeclaration , /*meaning*/ undefined , SymbolFormatFlags . WriteTypeParametersOrArguments ) ) ;
190
- }
191
- addSignatureDisplayParts ( signature , allSignatures , TypeFormatFlags . WriteArrowStyleSignature ) ;
192
- break ;
193
-
194
- default :
195
- // Just signature
196
- addSignatureDisplayParts ( signature , allSignatures ) ;
197
- }
198
- hasAddedSymbolInfo = true ;
194
+ default :
195
+ // Just signature
196
+ addSignatureDisplayParts ( signature , allSignatures ) ;
199
197
}
198
+ hasAddedSymbolInfo = true ;
200
199
}
201
- else if ( ( isNameOfFunctionDeclaration ( location ) && ! ( symbolFlags & SymbolFlags . Accessor ) ) || // name of function declaration
202
- ( location . kind === SyntaxKind . ConstructorKeyword && location . parent . kind === SyntaxKind . Constructor ) ) { // At constructor keyword of constructor declaration
203
- // get the signature from the declaration and write it
204
- const functionDeclaration = < FunctionLike > location . parent ;
205
- // Use function declaration to write the signatures only if the symbol corresponding to this declaration
206
- const locationIsSymbolDeclaration = find ( symbol . declarations , declaration =>
207
- declaration === ( location . kind === SyntaxKind . ConstructorKeyword ? functionDeclaration . parent : functionDeclaration ) ) ;
208
-
209
- if ( locationIsSymbolDeclaration ) {
210
- const allSignatures = functionDeclaration . kind === SyntaxKind . Constructor ? type . getNonNullableType ( ) . getConstructSignatures ( ) : type . getNonNullableType ( ) . getCallSignatures ( ) ;
211
- if ( ! typeChecker . isImplementationOfOverload ( functionDeclaration ) ) {
212
- signature = typeChecker . getSignatureFromDeclaration ( functionDeclaration ) ;
213
- }
214
- else {
215
- signature = allSignatures [ 0 ] ;
216
- }
217
-
218
- if ( functionDeclaration . kind === SyntaxKind . Constructor ) {
219
- // show (constructor) Type(...) signature
220
- symbolKind = ScriptElementKind . constructorImplementationElement ;
221
- addPrefixForAnyFunctionOrVar ( type . symbol , symbolKind ) ;
222
- }
223
- else {
224
- // (function/method) symbol(..signature)
225
- addPrefixForAnyFunctionOrVar ( functionDeclaration . kind === SyntaxKind . CallSignature &&
226
- ! ( type . symbol . flags & SymbolFlags . TypeLiteral || type . symbol . flags & SymbolFlags . ObjectLiteral ) ? type . symbol : symbol , symbolKind ) ;
227
- }
200
+ }
201
+ else if ( ( isNameOfFunctionDeclaration ( location ) && ! ( symbolFlags & SymbolFlags . Accessor ) ) || // name of function declaration
202
+ ( location . kind === SyntaxKind . ConstructorKeyword && location . parent . kind === SyntaxKind . Constructor ) ) { // At constructor keyword of constructor declaration
203
+ // get the signature from the declaration and write it
204
+ const functionDeclaration = < FunctionLike > location . parent ;
205
+ // Use function declaration to write the signatures only if the symbol corresponding to this declaration
206
+ const locationIsSymbolDeclaration = find ( symbol . declarations , declaration =>
207
+ declaration === ( location . kind === SyntaxKind . ConstructorKeyword ? functionDeclaration . parent : functionDeclaration ) ) ;
208
+
209
+ if ( locationIsSymbolDeclaration ) {
210
+ const allSignatures = functionDeclaration . kind === SyntaxKind . Constructor ? type . getNonNullableType ( ) . getConstructSignatures ( ) : type . getNonNullableType ( ) . getCallSignatures ( ) ;
211
+ if ( ! typeChecker . isImplementationOfOverload ( functionDeclaration ) ) {
212
+ signature = typeChecker . getSignatureFromDeclaration ( functionDeclaration ) ;
213
+ }
214
+ else {
215
+ signature = allSignatures [ 0 ] ;
216
+ }
228
217
229
- addSignatureDisplayParts ( signature , allSignatures ) ;
230
- hasAddedSymbolInfo = true ;
218
+ if ( functionDeclaration . kind === SyntaxKind . Constructor ) {
219
+ // show (constructor) Type(...) signature
220
+ symbolKind = ScriptElementKind . constructorImplementationElement ;
221
+ addPrefixForAnyFunctionOrVar ( type . symbol , symbolKind ) ;
222
+ }
223
+ else {
224
+ // (function/method) symbol(..signature)
225
+ addPrefixForAnyFunctionOrVar ( functionDeclaration . kind === SyntaxKind . CallSignature &&
226
+ ! ( type . symbol . flags & SymbolFlags . TypeLiteral || type . symbol . flags & SymbolFlags . ObjectLiteral ) ? type . symbol : symbol , symbolKind ) ;
231
227
}
228
+
229
+ addSignatureDisplayParts ( signature , allSignatures ) ;
230
+ hasAddedSymbolInfo = true ;
232
231
}
233
232
}
234
233
}
@@ -417,7 +416,9 @@ namespace ts.SymbolDisplay {
417
416
symbolFlags & SymbolFlags . Accessor ||
418
417
symbolKind === ScriptElementKind . memberFunctionElement ) {
419
418
const allSignatures = type . getNonNullableType ( ) . getCallSignatures ( ) ;
420
- addSignatureDisplayParts ( allSignatures [ 0 ] , allSignatures ) ;
419
+ if ( allSignatures . length ) {
420
+ addSignatureDisplayParts ( allSignatures [ 0 ] , allSignatures ) ;
421
+ }
421
422
}
422
423
}
423
424
}
0 commit comments