@@ -2384,13 +2384,13 @@ namespace ts {
23842384
23852385 function createMappedTypeNodeFromType(type: MappedType) {
23862386 Debug.assert(!!(type.flags & TypeFlags.Object));
2387- const typeParameter = getTypeParameterFromMappedType(<MappedType> type);
2387+ const typeParameter = getTypeParameterFromMappedType(type);
23882388 const typeParameterNode = typeParameterToDeclaration(typeParameter);
23892389
2390- const templateType = getTemplateTypeFromMappedType(<MappedType> type);
2391- const templateTypeNode = templateType && typeToTypeNodeHelper(templateType);
2392- const readonlyToken = (<MappedType> type) .declaration && (<MappedType> type) .declaration.readonlyToken ? createToken(SyntaxKind.ReadonlyKeyword) : undefined;
2393- const questionToken = (<MappedType> type) .declaration && (<MappedType> type) .declaration.questionToken ? createToken(SyntaxKind.QuestionToken) : undefined;
2390+ const templateType = getTemplateTypeFromMappedType(type);
2391+ const templateTypeNode = typeToTypeNodeHelper(templateType);
2392+ const readonlyToken = type.declaration && type.declaration.readonlyToken ? createToken(SyntaxKind.ReadonlyKeyword) : undefined;
2393+ const questionToken = type.declaration && type.declaration.questionToken ? createToken(SyntaxKind.QuestionToken) : undefined;
23942394
23952395 return createMappedTypeNode(readonlyToken, typeParameterNode, questionToken, templateTypeNode);
23962396 }
@@ -2402,7 +2402,7 @@ namespace ts {
24022402 if (symbol.flags & SymbolFlags.Class && !getBaseTypeVariableOfClass(symbol) ||
24032403 symbol.flags & (SymbolFlags.Enum | SymbolFlags.ValueModule) ||
24042404 shouldWriteTypeOfFunctionSymbol()) {
2405- return createTypeQueryNodeFromType(type );
2405+ return createTypeQueryNodeFromSymbol(symbol );
24062406 }
24072407 else if (contains(context.symbolStack, symbol)) {
24082408 // If type is an anonymous type literal in a type alias declaration, use type alias name
@@ -2477,12 +2477,9 @@ namespace ts {
24772477 return createTypeLiteralNode(members);
24782478 }
24792479
2480- function createTypeQueryNodeFromType(type: Type) {
2481- const symbol = type.symbol;
2482- if (symbol) {
2483- const entityName = symbolToName(symbol, /*expectsIdentifier*/ false);
2484- return createTypeQueryNode(entityName);
2485- }
2480+ function createTypeQueryNodeFromSymbol(symbol: Symbol) {
2481+ const entityName = symbolToName(symbol, /*expectsIdentifier*/ false);
2482+ return createTypeQueryNode(entityName);
24862483 }
24872484
24882485 function typeReferenceToTypeNode(type: TypeReference) {
@@ -2542,7 +2539,7 @@ namespace ts {
25422539 entityName = nameIdentifier;
25432540 }
25442541 const typeParameterCount = (type.target.typeParameters || emptyArray).length;
2545- const typeArgumentNodes = typeArguments.length > 0 ? mapToTypeNodeArray(typeArguments.slice(i, typeParameterCount - i)) : undefined;
2542+ const typeArgumentNodes = some( typeArguments) ? mapToTypeNodeArray(typeArguments.slice(i, typeParameterCount - i)) : undefined;
25462543 return createTypeReferenceNode(entityName, typeArgumentNodes);
25472544 }
25482545 }
@@ -2604,13 +2601,13 @@ namespace ts {
26042601 const name = getNameFromIndexInfo(indexInfo);
26052602
26062603 const indexingParameter = createParameter(
2607- /*decorators*/ undefined,
2608- /*modifiers*/ undefined,
2609- /*dotDotDotToken*/ undefined,
2604+ /*decorators*/ undefined,
2605+ /*modifiers*/ undefined,
2606+ /*dotDotDotToken*/ undefined,
26102607 name,
2611- /*questionToken*/ undefined,
2608+ /*questionToken*/ undefined,
26122609 indexerTypeNode,
2613- /*initializer*/ undefined);
2610+ /*initializer*/ undefined);
26142611 const typeNode = typeToTypeNodeHelper(indexInfo.type);
26152612 return createIndexSignatureDeclaration(
26162613 [indexingParameter],
@@ -2623,21 +2620,14 @@ namespace ts {
26232620
26242621 const typeParameters = signature.typeParameters && signature.typeParameters.map(parameter => typeParameterToDeclaration(parameter));
26252622 const parameters = signature.parameters.map(parameter => symbolToParameterDeclaration(parameter));
2626- const returnTypeNode = typeToTypeNodeExceptAny( getReturnTypeOfSignature(signature) );
2627-
2628- return createSignatureDeclaration( kind, typeParameters, parameters, returnTypeNode) ;
2623+ const returnType = getReturnTypeOfSignature(signature);
2624+ const returnTypeNode = returnType && typeToTypeNodeHelper(returnType);
2625+ const returnTypeNodeExceptAny = returnTypeNode && returnTypeNode. kind !== SyntaxKind.AnyKeyword ? returnTypeNode : undefined ;
26292626
2630- function typeToTypeNodeExceptAny(type: Type): TypeNode | undefined {
2631- const typeNode = type && typeToTypeNodeHelper(type);
2632- return typeNode && typeNode.kind !== SyntaxKind.AnyKeyword ? typeNode : undefined;
2633- }
2627+ return createSignatureDeclaration(kind, typeParameters, parameters, returnTypeNodeExceptAny);
26342628 }
26352629
26362630 function typeParameterToDeclaration(type: TypeParameter): TypeParameterDeclaration {
2637- if (!(type && type.symbol && type.flags & TypeFlags.TypeParameter)) {
2638- return undefined;
2639- }
2640-
26412631 const constraint = getConstraintFromTypeParameter(type);
26422632 const constraintNode = constraint && typeToTypeNodeHelper(constraint);
26432633 const defaultParameter = getDefaultFromTypeParameter(type);
@@ -2647,10 +2637,10 @@ namespace ts {
26472637 }
26482638
26492639 function symbolToParameterDeclaration(parameterSymbol: Symbol): ParameterDeclaration {
2650- const parameterDeclaration = parameterSymbol.declarations[0] as ParameterDeclaration ;
2640+ const parameterDeclaration = <ParameterDeclaration>getDeclarationOfKind( parameterSymbol, SyntaxKind.Parameter) ;
26512641 const parameterType = getTypeOfSymbol(parameterSymbol);
26522642 const parameterTypeNode = typeToTypeNodeHelper(parameterType);
2653- // TODO(aozgaa): check initializer accessibility correctly .
2643+ // TODO(aozgaa): In the future, check initializer accessibility.
26542644 const parameterNode = createParameter(
26552645 parameterDeclaration.decorators,
26562646 parameterDeclaration.modifiers,
@@ -2666,7 +2656,6 @@ namespace ts {
26662656 function symbolToName(symbol: Symbol, expectsIdentifier: true): Identifier;
26672657 function symbolToName(symbol: Symbol, expectsIdentifier: false): EntityName;
26682658 function symbolToName(symbol: Symbol, expectsIdentifier: boolean): EntityName {
2669- let parentSymbol: Symbol;
26702659
26712660 // Try to get qualified name if the symbol is not a type parameter and there is an enclosing declaration.
26722661 let chain: Symbol[];
@@ -2679,8 +2668,6 @@ namespace ts {
26792668 chain = [symbol];
26802669 }
26812670
2682- parentSymbol = undefined;
2683-
26842671 if (expectsIdentifier && chain.length !== 1
26852672 && !context.encounteredError
26862673 && !(context.flags & NodeBuilderFlags.allowQualifedNameInPlaceOfIdentifier)) {
@@ -2728,6 +2715,7 @@ namespace ts {
27282715 /** @param endOfChain Set to false for recursive calls; non-recursive calls should always output something. */
27292716 function getSymbolChain(symbol: Symbol, meaning: SymbolFlags, endOfChain: boolean): Symbol[] | undefined {
27302717 let accessibleSymbolChain = getAccessibleSymbolChain(symbol, context.enclosingDeclaration, meaning, /*useOnlyExternalAliasing*/false);
2718+ let parentSymbol: Symbol;
27312719
27322720 if (!accessibleSymbolChain ||
27332721 needsQualification(accessibleSymbolChain[0], context.enclosingDeclaration, accessibleSymbolChain.length === 1 ? meaning : getQualifiedLeftMeaning(meaning))) {
@@ -2737,6 +2725,7 @@ namespace ts {
27372725 if (parent) {
27382726 const parentChain = getSymbolChain(parent, getQualifiedLeftMeaning(meaning), /*endOfChain*/ false);
27392727 if (parentChain) {
2728+ parentSymbol = parent;
27402729 accessibleSymbolChain = parentChain.concat(accessibleSymbolChain || [symbol]);
27412730 }
27422731 }
@@ -2745,8 +2734,7 @@ namespace ts {
27452734 if (accessibleSymbolChain) {
27462735 return accessibleSymbolChain;
27472736 }
2748-
2749- else if (
2737+ if (
27502738 // If this is the last part of outputting the symbol, always output. The cases apply only to parent symbols.
27512739 endOfChain ||
27522740 // If a parent symbol is an external module, don't write it. (We prefer just `x` vs `"foo/bar".x`.)
@@ -2759,8 +2747,8 @@ namespace ts {
27592747 }
27602748
27612749 function getNameOfSymbol(symbol: Symbol): string {
2762- if (symbol.declarations && symbol.declarations.length) {
2763- const declaration = symbol.declarations[0];
2750+ const declaration = firstOrUndefined( symbol.declarations);
2751+ if ( declaration) {
27642752 if (declaration.name) {
27652753 return declarationNameToString(declaration.name);
27662754 }
0 commit comments