Skip to content

Commit a39bb0a

Browse files
author
Arthur Ozga
committed
midway through response to ron's comments
1 parent fb4e3d8 commit a39bb0a

3 files changed

Lines changed: 110 additions & 127 deletions

File tree

src/compiler/checker.ts

Lines changed: 26 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)