Skip to content

Commit c4ddc5b

Browse files
author
Arthur Ozga
committed
Respond to more comments
1 parent 5b739cf commit c4ddc5b

File tree

5 files changed

+50
-54
lines changed

5 files changed

+50
-54
lines changed

src/compiler/checker.ts

Lines changed: 38 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2191,43 +2191,44 @@ namespace ts {
21912191
return result;
21922192
}
21932193

2194-
function createTypeParameterDeclarationFromType(type: TypeParameter, enclosingDeclaration: Node): TypeParameterDeclaration {
2194+
function typeParameterToDeclaration(type: TypeParameter, enclosingDeclaration?: Node): TypeParameterDeclaration {
21952195
if (!(type && type.symbol && type.flags & TypeFlags.TypeParameter)) {
21962196
return undefined;
21972197
}
21982198

21992199
const constraint = typeToTypeNode(getConstraintFromTypeParameter(type), enclosingDeclaration);
22002200
const defaultParameter = typeToTypeNode(getDefaultFromTypeParameter(type), enclosingDeclaration);
22012201

2202+
// TODO: use method internal to typeToTypeNode.
22022203
const name = symbolToString(type.symbol);
22032204
return createTypeParameterDeclaration(name, constraint, defaultParameter);
22042205
}
22052206

2206-
function createParameterDeclarationFromSymbol(parameterSymbol: Symbol, enclosingDeclaration: Node): ParameterDeclaration {
2207+
function symbolToParameterDeclaration(parameterSymbol: Symbol, enclosingDeclaration?: Node): ParameterDeclaration {
22072208
const parameterDeclaration = parameterSymbol.declarations[0] as ParameterDeclaration;
22082209
const parameterType = getTypeOfSymbol(parameterSymbol);
22092210
const parameterTypeNode = typeToTypeNode(parameterType, enclosingDeclaration);
22102211
// TODO: how should we clone members/modifiers?
22112212
// TODO: check initializer accessibility correctly.
22122213
const parameterNode = createParameter(
2213-
parameterDeclaration.decorators && parameterDeclaration.decorators.map(getSynthesizedDeepClone),
2214-
parameterDeclaration.modifiers && parameterDeclaration.modifiers.map(getSynthesizedDeepClone),
2214+
parameterDeclaration.decorators,
2215+
parameterDeclaration.modifiers,
22152216
parameterDeclaration.dotDotDotToken && createToken(SyntaxKind.DotDotDotToken),
2216-
getSynthesizedDeepClone(parameterDeclaration.name),
2217+
parameterDeclaration.name,
22172218
parameterDeclaration.questionToken && createToken(SyntaxKind.QuestionToken),
22182219
parameterTypeNode,
2219-
parameterDeclaration.initializer && getSynthesizedDeepClone(parameterDeclaration.initializer));
2220+
parameterDeclaration.initializer);
22202221
return parameterNode;
22212222
}
22222223

2223-
function signatureToSignatureDeclaration(signature: Signature, kind: SyntaxKind, enclosingDeclaration: Node): SignatureDeclaration {
2224-
const typeParameters = signature.typeParameters && signature.typeParameters.map(parameter => createTypeParameterDeclarationFromType(parameter, enclosingDeclaration));
2225-
const parameters = signature.parameters.map(parameter => createParameterDeclarationFromSymbol(parameter, enclosingDeclaration));
2226-
const type = createTypeNodeExceptAny(getReturnTypeOfSignature(signature));
2224+
function signatureToSignatureDeclaration(signature: Signature, kind: SyntaxKind, enclosingDeclaration?: Node): SignatureDeclaration {
2225+
const typeParameters = signature.typeParameters && signature.typeParameters.map(parameter => typeParameterToDeclaration(parameter, enclosingDeclaration));
2226+
const parameters = signature.parameters.map(parameter => symbolToParameterDeclaration(parameter, enclosingDeclaration));
2227+
const type = typeToTypeNodeExceptAny(getReturnTypeOfSignature(signature));
22272228

22282229
return createSignatureDeclaration(kind, typeParameters, parameters, type);
22292230

2230-
function createTypeNodeExceptAny(type: Type): TypeNode | undefined {
2231+
function typeToTypeNodeExceptAny(type: Type): TypeNode | undefined {
22312232
const typeNode = typeToTypeNode(type, enclosingDeclaration);
22322233
return typeNode && typeNode.kind !== SyntaxKind.AnyKeyword ? typeNode : undefined;
22332234
}
@@ -2236,17 +2237,17 @@ namespace ts {
22362237

22372238
// function typeToDisplayParts
22382239

2239-
function typeToTypeNode(type: Type, enclosingDeclaration: Node, returnNodeOnError?: boolean): TypeNode {
2240+
function typeToTypeNode(type: Type, enclosingDeclaration?: Node, returnNodeOnError?: boolean): TypeNode {
22402241
let encounteredError = false;
22412242
let inObjectTypeLiteral = false;
22422243
let checkAlias = true;
22432244
let symbolStack: Symbol[] = undefined;
22442245

2245-
const result = createTypeNodeWorker(type);
2246+
const result = typeToTypeNodeWorker(type);
22462247
// returnNodeOnError = true; // TODO: unset.
22472248
return encounteredError && !returnNodeOnError ? undefined: result;
22482249

2249-
function createTypeNodeWorker(type: Type): TypeNode {
2250+
function typeToTypeNodeWorker(type: Type): TypeNode {
22502251
if (!type) {
22512252
encounteredError = true;
22522253
return undefined;
@@ -2308,7 +2309,7 @@ namespace ts {
23082309

23092310
if (objectFlags & ObjectFlags.Reference) {
23102311
Debug.assert(!!(type.flags & TypeFlags.Object));
2311-
return createTypeReferenceNodeFromType(<TypeReference>type);
2312+
return typeReferenceToTypeReferenceNode(<TypeReference>type);
23122313
}
23132314
if (objectFlags & ObjectFlags.ClassOrInterface) {
23142315
Debug.assert(!!(type.flags & TypeFlags.Object));
@@ -2347,25 +2348,25 @@ namespace ts {
23472348

23482349
if (type.flags & TypeFlags.Index) {
23492350
const indexedType = (<IndexType>type).type;
2350-
const indexTypeNode = createTypeNodeWorker(indexedType);
2351+
const indexTypeNode = typeToTypeNodeWorker(indexedType);
23512352
return createTypeOperatorNode(indexTypeNode);
23522353
}
23532354
if (type.flags & TypeFlags.IndexedAccess) {
2354-
const objectTypeNode = createTypeNodeWorker((<IndexedAccessType>type).objectType);
2355-
const indexTypeNode = createTypeNodeWorker((<IndexedAccessType>type).indexType);
2355+
const objectTypeNode = typeToTypeNodeWorker((<IndexedAccessType>type).objectType);
2356+
const indexTypeNode = typeToTypeNodeWorker((<IndexedAccessType>type).indexType);
23562357
return createIndexedAccessTypeNode(objectTypeNode, indexTypeNode);
23572358
}
23582359

23592360
Debug.fail("Should be unreachable.");
23602361

23612362
function mapToTypeNodeArray(types: Type[]): NodeArray<TypeNode> {
2362-
return types && asNodeArray(types.map(createTypeNodeWorker) as TypeNode[]);
2363+
return types && asNodeArray(types.map(typeToTypeNodeWorker) as TypeNode[]);
23632364
}
23642365

23652366
function createMappedTypeNodeFromType(type: MappedType) {
23662367
Debug.assert(!!(type.flags & TypeFlags.Object));
23672368
const typeParameter = getTypeParameterFromMappedType(<MappedType>type);
2368-
const typeParameterNode = createTypeParameterDeclarationFromType(typeParameter, enclosingDeclaration);
2369+
const typeParameterNode = typeParameterToDeclaration(typeParameter, enclosingDeclaration);
23692370

23702371
const templateTypeNode = typeToTypeNode(getTemplateTypeFromMappedType(<MappedType>type), enclosingDeclaration);
23712372
const readonlyToken = (<MappedType>type).declaration && (<MappedType>type).declaration.readonlyToken ? createToken(SyntaxKind.ReadonlyKeyword) : undefined;
@@ -2464,10 +2465,10 @@ namespace ts {
24642465
}
24652466
}
24662467

2467-
function createTypeReferenceNodeFromType(type: TypeReference) {
2468+
function typeReferenceToTypeReferenceNode(type: TypeReference) {
24682469
const typeArguments: Type[] = type.typeArguments || emptyArray;
24692470
if (type.target === globalArrayType) {
2470-
const elementType = createTypeNodeWorker(typeArguments[0]);
2471+
const elementType = typeToTypeNodeWorker(typeArguments[0]);
24712472
return createArrayTypeNode(elementType);
24722473
}
24732474
else if (type.target.objectFlags & ObjectFlags.Tuple) {
@@ -2489,21 +2490,20 @@ namespace ts {
24892490
// When type parameters are their own type arguments for the whole group (i.e. we have
24902491
// the default outer type arguments), we don't show the group.
24912492
if (!rangeEquals(outerTypeParameters, typeArguments, start, i)) {
2492-
const name = createNameFromSymbol(parent);
2493-
const qualifiedNamePart = name;
2493+
const qualifiedNamePart = createNameFromSymbol(parent, /*mustBeIdentifier*/ true);
24942494
if (!qualifiedName) {
2495-
qualifiedName = createQualifiedName(qualifiedNamePart, /*right*/undefined);
2495+
qualifiedName = createQualifiedName(qualifiedNamePart, /*right*/ undefined);
24962496
}
24972497
else {
24982498
Debug.assert(!qualifiedName.right);
24992499
qualifiedName.right = qualifiedNamePart;
2500-
qualifiedName = createQualifiedName(qualifiedName, /*right*/undefined);
2500+
qualifiedName = createQualifiedName(qualifiedName, /*right*/ undefined);
25012501
}
25022502
}
25032503
}
25042504
}
25052505
let entityName: EntityName = undefined;
2506-
const nameIdentifier = createNameFromSymbol(type.symbol);
2506+
const nameIdentifier = createNameFromSymbol(type.symbol, /*mustBeIdentifier*/ true);
25072507
if (qualifiedName) {
25082508
Debug.assert(!qualifiedName.right);
25092509
qualifiedName.right = nameIdentifier;
@@ -2544,7 +2544,7 @@ namespace ts {
25442544
if (!oldDeclaration) {
25452545
return;
25462546
}
2547-
const propertyName = getSynthesizedDeepClone(oldDeclaration.name);
2547+
const propertyName = oldDeclaration.name;
25482548
const optionalToken = propertySymbol.flags & SymbolFlags.Optional ? createToken(SyntaxKind.QuestionToken) : undefined;;
25492549
if (propertySymbol.flags & (SymbolFlags.Function | SymbolFlags.Method) && !getPropertiesOfObjectType(propertyType).length) {
25502550
const signatures = getSignaturesOfType(propertyType, SignatureKind.Call);
@@ -2559,16 +2559,16 @@ namespace ts {
25592559
typeElements.push(createPropertySignature(
25602560
propertyName,
25612561
optionalToken,
2562-
createTypeNodeWorker(propertyType),
2562+
typeToTypeNodeWorker(propertyType),
25632563
/*initializer*/undefined));
25642564
}
25652565
}
25662566
return typeElements.length ? typeElements : undefined;
25672567
}
25682568

2569-
function createNameFromSymbol(symbol: Symbol): Identifier;
2570-
function createNameFromSymbol(symbol: Symbol): EntityName;
2571-
function createNameFromSymbol(symbol: Symbol): EntityName {
2569+
function createNameFromSymbol(symbol: Symbol, mustBeIdentifier: true): Identifier;
2570+
function createNameFromSymbol(symbol: Symbol, mustBeIdentifier?: false): EntityName;
2571+
function createNameFromSymbol(symbol: Symbol, mustBeIdentifier: boolean | undefined): EntityName {
25722572
let parentSymbol: Symbol;
25732573
let meaning: SymbolFlags;
25742574

@@ -2586,8 +2586,12 @@ namespace ts {
25862586
}
25872587

25882588
parentSymbol = undefined;
2589-
const result = createEntityNameFromSymbolChain(chain, chain.length - 1);
2590-
return result;
2589+
if(mustBeIdentifier && chain.length !== 1) {
2590+
encounteredError = true;
2591+
// TODO: failing to get an identifier when we expect one generates an unprintable node.
2592+
// Should error handling be more severe?
2593+
}
2594+
return createEntityNameFromSymbolChain(chain, chain.length - 1);
25912595

25922596
function createEntityNameFromSymbolChain(chain: Symbol[], index: number): EntityName {
25932597
Debug.assert(chain && 0 <= index && index < chain.length);

src/compiler/factory.ts

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -67,15 +67,6 @@ namespace ts {
6767
return clone;
6868
}
6969

70-
/* @internal */
71-
export function getSynthesizedDeepClone<T extends Node>(node: T | undefined): T {
72-
if (node === undefined) {
73-
return undefined;
74-
}
75-
const clone = visitEachChild(node, getSynthesizedDeepClone, nullTransformationContext);
76-
return clone === node ? getSynthesizedClone(node) : clone;
77-
}
78-
7970
// Literals
8071

8172
export function createLiteral(value: string): StringLiteral;
@@ -227,9 +218,7 @@ namespace ts {
227218

228219
// Type Elements
229220

230-
export function createConstructSignature() {
231-
throw new Error("not implemented.");
232-
}
221+
// TODO: add signatures
233222

234223
// Types
235224

@@ -251,7 +240,7 @@ namespace ts {
251240

252241
export function createTypeReferenceNode(typeName: string | EntityName, typeArguments: NodeArray<TypeNode> | undefined) {
253242
const typeReference = createSynthesizedNode(SyntaxKind.TypeReference) as TypeReferenceNode;
254-
typeReference.typeName = isQualifiedName(<EntityName>typeName) ? <QualifiedName>typeName : asName(<string | Identifier>typeName);
243+
typeReference.typeName = asName(typeName);
255244
typeReference.typeArguments = typeArguments;
256245
return typeReference;
257246
}
@@ -388,7 +377,7 @@ namespace ts {
388377
: node;
389378
}
390379

391-
// TODO: ask if we should have multiple implementations. Some T's can't have question token.
380+
// TODO: Split according to AST nodes.
392381
export function createSignatureDeclaration<T extends SignatureDeclaration>(kind: SyntaxKind, typeParameters: TypeParameterDeclaration[] | undefined, parameters: ParameterDeclaration[], type: TypeNode | undefined): T;
393382
export function createSignatureDeclaration<T extends SignatureDeclaration & TypeElement>(kind: SyntaxKind, typeParameters: TypeParameterDeclaration[] | undefined, parameters: ParameterDeclaration[], type: TypeNode | undefined, name: string | PropertyName, questionToken: QuestionToken | undefined): T;
394383
export function createSignatureDeclaration<T extends SignatureDeclaration & TypeElement>(kind: SyntaxKind, typeParameters: TypeParameterDeclaration[] | undefined, parameters: ParameterDeclaration[], type: TypeNode | undefined, name?: string | PropertyName, questionToken?: QuestionToken): T {
@@ -2030,7 +2019,8 @@ namespace ts {
20302019
function asName(name: string | Identifier): Identifier;
20312020
function asName(name: string | BindingName): BindingName;
20322021
function asName(name: string | PropertyName): PropertyName;
2033-
function asName(name: string | Identifier | BindingName | PropertyName) {
2022+
function asName(name: string | EntityName): EntityName;
2023+
function asName(name: string | Identifier | BindingName | PropertyName | QualifiedName) {
20342024
return typeof name === "string" ? createIdentifier(name) : name;
20352025
}
20362026

src/services/codefixes/fixAddMissingMember.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ namespace ts.codefix {
3131
return undefined;
3232
}
3333

34-
let typeNode: TypeNode = createKeywordTypeNode(SyntaxKind.AnyKeyword);
34+
let typeNode: TypeNode;
3535

3636
if (token.parent.parent.kind === SyntaxKind.BinaryExpression) {
3737
const binaryExpression = token.parent.parent as BinaryExpression;
@@ -41,6 +41,8 @@ namespace ts.codefix {
4141
typeNode = checker.typeToTypeNode(widenedType, classDeclaration) || typeNode;
4242
}
4343

44+
typeNode = typeNode ? typeNode : createKeywordTypeNode(SyntaxKind.AnyKeyword);
45+
4446
const openBrace = getOpenBraceOfClassLike(classDeclaration, sourceFile);
4547

4648
const property = createProperty(

src/services/codefixes/helpers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ namespace ts.codefix {
6262
}
6363

6464
const declaration = declarations[0] as Declaration;
65-
const name = declaration.name ? getSynthesizedDeepClone(declaration.name) as PropertyName : undefined;
65+
const name = <PropertyName>declaration.name;
6666
const visibilityModifier = createVisibilityModifier(getModifierFlags(declaration));
6767
const modifiers = visibilityModifier ? createNodeArray([visibilityModifier]) : undefined;
6868
const type = checker.getWidenedType(checker.getTypeOfSymbolAtLocation(symbol, enclosingDeclaration));

src/services/textChanges.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -275,8 +275,8 @@ namespace ts.textChanges {
275275

276276
/**
277277
* This function should be used to insert nodes in lists when nodes don't carry separators as the part of the node range,
278-
* i.e. arguments in arguments lists, parameters in parameter lists etc. Statements or class elements are different in sense that
279-
* for them separators are treated as the part of the node.
278+
* i.e. arguments in arguments lists, parameters in parameter lists etc.
279+
* Separators are treated as part of the node for statements and class elements.
280280
*/
281281
public insertNodeInListAfter(sourceFile: SourceFile, after: Node, newNode: Node) {
282282
const containingList = formatting.SmartIndenter.getContainingList(after, sourceFile);
@@ -484,7 +484,7 @@ namespace ts.textChanges {
484484
private static normalize(changes: Change[]) {
485485
// order changes by start position
486486
const normalized = stableSort(changes, (a, b) => a.range.pos - b.range.pos);
487-
// verify that end position of the change is less than start position of the next change
487+
// verify that change intervals to not overlap, except possible at end points.
488488
for (let i = 0; i < normalized.length - 2; i++) {
489489
Debug.assert(normalized[i].range.end <= normalized[i + 1].range.pos);
490490
}

0 commit comments

Comments
 (0)