Skip to content

Commit 4fa32a2

Browse files
author
Arthur Ozga
committed
make enclosingdeclaration arg required
1 parent dee9ced commit 4fa32a2

File tree

5 files changed

+38
-49
lines changed

5 files changed

+38
-49
lines changed

src/compiler/checker.ts

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

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

2199-
const constraint = createTypeNode(getConstraintFromTypeParameter(type)) as TypeNode;
2200-
const defaultParameter = createTypeNode(getDefaultFromTypeParameter(type)) as TypeNode;
2199+
const constraint = createTypeNode(getConstraintFromTypeParameter(type), enclosingDeclaration);
2200+
const defaultParameter = createTypeNode(getDefaultFromTypeParameter(type), enclosingDeclaration);
22012201

22022202
const name = symbolToString(type.symbol);
22032203
return createTypeParameterDeclaration(name, constraint, defaultParameter);
22042204
}
22052205

22062206
// TODO: enclosing declaration appears to be unused in getTypeOfSymbolAtLocation
2207-
function createParameterDeclarationFromSymbol(parameterSymbol: Symbol): ParameterDeclaration {
2207+
function createParameterDeclarationFromSymbol(parameterSymbol: Symbol, enclosingDeclaration: Node): ParameterDeclaration {
22082208
const parameterDeclaration = parameterSymbol.declarations[0] as ParameterDeclaration;
22092209
const parameterType = getTypeOfSymbol(parameterSymbol);
2210-
const parameterTypeNode = checker.createTypeNode(parameterType);
2210+
const parameterTypeNode = createTypeNode(parameterType, enclosingDeclaration);
22112211
// TODO: clone binding names correctly.
22122212
// TODO: copy initialzer in a way that checks whether all symbols used in expression are accessible here, and qualify them appropriately.
22132213
const parameterNode = createParameter(
@@ -2222,25 +2222,24 @@ namespace ts {
22222222
}
22232223

22242224
// TODO: expose this, remove copy from helper, possibly don't expose createParameter/TypeParameter?
2225-
function createSignatureParts(signature: Signature): SignatureParts {
2225+
function createSignatureParts(signature: Signature, enclosingDeclaration: Node): SignatureParts {
22262226
return {
2227-
typeParameters: signature.typeParameters && signature.typeParameters.map(createTypeParameterDeclarationFromType),
2228-
parameters: signature.parameters.map(createParameterDeclarationFromSymbol),
2227+
typeParameters: signature.typeParameters && signature.typeParameters.map(parameter => createTypeParameterDeclarationFromType(parameter,enclosingDeclaration)),
2228+
parameters: signature.parameters.map(parameter => createParameterDeclarationFromSymbol(parameter,enclosingDeclaration)),
22292229
type: createTypeNodeExceptAny(getReturnTypeOfSignature(signature))
22302230
}
22312231

22322232
function createTypeNodeExceptAny(type: Type): TypeNode | undefined {
2233-
const typeNode = createTypeNode(type);
2233+
const typeNode = createTypeNode(type, enclosingDeclaration);
22342234
return typeNode && typeNode.kind !== SyntaxKind.AnyKeyword ? typeNode : undefined;
22352235
}
22362236
}
22372237

2238-
function createTypeNode(type: Type): TypeNode {
2238+
function createTypeNode(type: Type, enclosingDeclaration: Node): TypeNode {
22392239
let undefinedArgumentIsError = true;
22402240
let encounteredError = false;
22412241
let inObjectTypeLiteral = false;
22422242
let checkAlias = true;
2243-
let enclosingDeclaration: Node = undefined; // TODO: add parameter.
22442243
let symbolStack: Symbol[] = undefined;
22452244

22462245
let result = createTypeNodeWorker(type);
@@ -2256,7 +2255,7 @@ namespace ts {
22562255
return undefined;
22572256
}
22582257

2259-
const typeString = typeToString(type); typeString; // TODO: remove.
2258+
const typeString = typeToString(type, enclosingDeclaration); typeString; // TODO: remove.
22602259

22612260
if (type.flags & TypeFlags.Any) {
22622261
// TODO: add other case where type ends up being `any`.
@@ -2315,15 +2314,8 @@ namespace ts {
23152314

23162315
if (objectFlags & ObjectFlags.Reference) {
23172316
Debug.assert(!!(type.flags & TypeFlags.Object));
2318-
// and vice versa.
2319-
// this case includes tuple types
2320-
// TODO: test empty tuples, see if they are coherent.
23212317
return createTypeReferenceNodeFromType(<TypeReference>type);
23222318
}
2323-
2324-
if (type.flags & TypeFlags.EnumLiteral) {
2325-
throw new Error("Enum literal not implemented");
2326-
}
23272319
if (objectFlags & ObjectFlags.ClassOrInterface) {
23282320
Debug.assert(!!(type.flags & TypeFlags.Object));
23292321
// TODO: Detect whether class is named and fail if not.
@@ -2397,9 +2389,9 @@ namespace ts {
23972389
// TODO: does typeParameter have the same constraint or do we need to overwrite it somehow?
23982390
const typeParameter = getTypeParameterFromMappedType(<MappedType>type);
23992391
// const constraintType = getConstraintTypeFromMappedType(<MappedType>type);
2400-
const typeParameterNode = createTypeParameterDeclarationFromType(typeParameter);
2392+
const typeParameterNode = createTypeParameterDeclarationFromType(typeParameter, enclosingDeclaration);
24012393

2402-
const templateTypeNode = createTypeNode(getTemplateTypeFromMappedType(<MappedType>type));
2394+
const templateTypeNode = createTypeNode(getTemplateTypeFromMappedType(<MappedType>type), enclosingDeclaration);
24032395
const readonlyToken = (<MappedType>type).declaration && (<MappedType>type).declaration.readonlyToken ? createToken(SyntaxKind.ReadonlyKeyword) : undefined;
24042396
const questionToken = (<MappedType>type).declaration && (<MappedType>type).declaration.questionToken ? createToken(SyntaxKind.QuestionToken) : undefined;
24052397

@@ -2474,12 +2466,12 @@ namespace ts {
24742466

24752467
if (resolved.callSignatures.length === 1 && !resolved.constructSignatures.length) {
24762468
const signature = resolved.callSignatures[0];
2477-
const signatureParts = createSignatureParts(signature);
2469+
const signatureParts = createSignatureParts(signature, enclosingDeclaration);
24782470
return createSignatureDeclaration<FunctionTypeNode>(SyntaxKind.FunctionType, signatureParts.typeParameters, signatureParts.parameters, signatureParts.type);
24792471
}
24802472
if (resolved.constructSignatures.length === 1 && !resolved.callSignatures.length) {
24812473
const signature = resolved.constructSignatures[0];
2482-
const signatureParts = createSignatureParts(signature);
2474+
const signatureParts = createSignatureParts(signature, enclosingDeclaration);
24832475
return createSignatureDeclaration<ConstructorTypeNode>(SyntaxKind.ConstructorType, signatureParts.typeParameters, signatureParts.parameters, signatureParts.type);
24842476
}
24852477
}
@@ -2559,18 +2551,18 @@ namespace ts {
25592551
function createTypeNodesFromResolvedType(resolvedType: ResolvedType): TypeElement[] {
25602552
const typeElements: TypeElement[] = [];
25612553
for (const signature of resolvedType.callSignatures) {
2562-
const signatureParts = createSignatureParts(signature);
2554+
const signatureParts = createSignatureParts(signature, enclosingDeclaration);
25632555
typeElements.push(createSignatureDeclaration<CallSignatureDeclaration>(SyntaxKind.CallSignature, signatureParts.typeParameters, signatureParts.parameters, signatureParts.type));
25642556
}
25652557
for (const signature of resolvedType.constructSignatures) {
2566-
const signatureParts = createSignatureParts(signature);
2558+
const signatureParts = createSignatureParts(signature, enclosingDeclaration);
25672559
typeElements.push(createSignatureDeclaration<ConstructSignatureDeclaration>(SyntaxKind.ConstructSignature, signatureParts.typeParameters, signatureParts.parameters, signatureParts.type));
25682560
}
25692561
if (resolvedType.stringIndexInfo) {
2570-
typeElements.push(createIndexSignatureFromIndexInfo(resolvedType.stringIndexInfo, IndexKind.String));
2562+
typeElements.push(createIndexSignatureFromIndexInfo(resolvedType.stringIndexInfo, IndexKind.String, enclosingDeclaration));
25712563
}
25722564
if (resolvedType.numberIndexInfo) {
2573-
typeElements.push(createIndexSignatureFromIndexInfo(resolvedType.numberIndexInfo, IndexKind.Number));
2565+
typeElements.push(createIndexSignatureFromIndexInfo(resolvedType.numberIndexInfo, IndexKind.Number, enclosingDeclaration));
25742566
}
25752567

25762568
const properties = resolvedType.properties;
@@ -2589,7 +2581,7 @@ namespace ts {
25892581
if (propertySymbol.flags & (SymbolFlags.Function | SymbolFlags.Method) && !getPropertiesOfObjectType(propertyType).length) {
25902582
const signatures = getSignaturesOfType(propertyType, SignatureKind.Call);
25912583
for (const signature of signatures) {
2592-
const signatureParts = createSignatureParts(signature);
2584+
const signatureParts = createSignatureParts(signature, enclosingDeclaration);
25932585
const methodDeclaration = createSignatureDeclaration<MethodSignature>(SyntaxKind.MethodSignature, signatureParts.typeParameters, signatureParts.parameters, signatureParts.type, propertyName, optionalToken);
25942586
methodDeclaration.questionToken = optionalToken;
25952587
typeElements.push(methodDeclaration);
@@ -2599,7 +2591,7 @@ namespace ts {
25992591
typeElements.push(createPropertySignature(
26002592
propertyName
26012593
, optionalToken
2602-
, createTypeNode(propertyType)
2594+
, createTypeNodeWorker(propertyType)
26032595
, /*initializer*/undefined));
26042596
}
26052597
}
@@ -2608,7 +2600,7 @@ namespace ts {
26082600
}
26092601
}
26102602

2611-
function createIndexSignatureFromIndexInfo(indexInfo: IndexInfo, kind: IndexKind): IndexSignatureDeclaration {
2603+
function createIndexSignatureFromIndexInfo(indexInfo: IndexInfo, kind: IndexKind, enclosingDeclaration: Node): IndexSignatureDeclaration {
26122604
const indexerTypeNode = createKeywordTypeNode(kind === IndexKind.String ? SyntaxKind.StringKeyword : SyntaxKind.NumberKeyword);
26132605

26142606
const name = getNameFromIndexInfo(indexInfo);
@@ -2620,7 +2612,7 @@ namespace ts {
26202612
, /*questionToken*/ undefined
26212613
, indexerTypeNode
26222614
, /*initializer*/ undefined);
2623-
const typeNode = createTypeNode(indexInfo.type);
2615+
const typeNode = createTypeNode(indexInfo.type, enclosingDeclaration);
26242616
return createIndexSignatureDeclaration(
26252617
[indexingParameter]
26262618
, typeNode

src/compiler/types.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2469,11 +2469,11 @@ namespace ts {
24692469
getNonNullableType(type: Type): Type;
24702470

24712471
/** Note that the resulting nodes cannot be checked. */
2472-
createTypeNode(type: Type): TypeNode;
2472+
createTypeNode(type: Type, enclosingDeclaration: Node): TypeNode;
24732473
/** Note that the resulting nodes cannot be checked. */
2474-
createIndexSignatureFromIndexInfo(indexInfo: IndexInfo, kind: IndexKind): IndexSignatureDeclaration;
2474+
createIndexSignatureFromIndexInfo(indexInfo: IndexInfo, kind: IndexKind, enclosingDeclaration: Node): IndexSignatureDeclaration;
24752475
/** Note that the resulting nodes cannot be checked. */
2476-
createSignatureParts(signature: Signature): SignatureParts;
2476+
createSignatureParts(signature: Signature, enclosingDeclaration: Node): SignatureParts;
24772477

24782478
getSymbolsInScope(location: Node, meaning: SymbolFlags): Symbol[];
24792479
getSymbolAtLocation(node: Node): Symbol;

src/services/codefixes/fixAddMissingMember.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ namespace ts.codefix {
3838

3939
const checker = context.program.getTypeChecker();
4040
const widenedType = checker.getWidenedType(checker.getBaseTypeOfLiteralType(checker.getTypeAtLocation(binaryExpression.right)));
41-
typeNode = checker.createTypeNode(widenedType) || typeNode;
41+
typeNode = checker.createTypeNode(widenedType, classDeclaration) || typeNode;
4242
}
4343

4444
const openBrace = getOpenBraceOfClassLike(classDeclaration, sourceFile);

src/services/codefixes/fixClassIncorrectlyImplementsInterface.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ namespace ts.codefix {
1111
const token = getTokenAtPosition(sourceFile, start);
1212
const checker = context.program.getTypeChecker();
1313

14-
const classDecl = getContainingClass(token);
15-
if (!classDecl) {
14+
const classDeclaration = getContainingClass(token);
15+
if (!classDeclaration) {
1616
return undefined;
1717
}
1818

19-
const openBrace = getOpenBraceOfClassLike(classDecl, sourceFile);
20-
const classType = checker.getTypeAtLocation(classDecl) as InterfaceType;
21-
const implementedTypeNodes = getClassImplementsHeritageClauseElements(classDecl);
19+
const openBrace = getOpenBraceOfClassLike(classDeclaration, sourceFile);
20+
const classType = checker.getTypeAtLocation(classDeclaration) as InterfaceType;
21+
const implementedTypeNodes = getClassImplementsHeritageClauseElements(classDeclaration);
2222

2323
const hasNumericIndexSignature = !!checker.getIndexTypeOfType(classType, IndexKind.Number);
2424
const hasStringIndexSignature = !!checker.getIndexTypeOfType(classType, IndexKind.String);
@@ -34,7 +34,7 @@ namespace ts.codefix {
3434
let newNodes: Node[] = [];
3535
createAndAddMissingIndexSignatureDeclaration(implementedType, IndexKind.Number, hasNumericIndexSignature, newNodes);
3636
createAndAddMissingIndexSignatureDeclaration(implementedType, IndexKind.String, hasStringIndexSignature, newNodes);
37-
newNodes = newNodes.concat(createMissingMemberNodes(classDecl, nonPrivateMembers, checker));
37+
newNodes = newNodes.concat(createMissingMemberNodes(classDeclaration, nonPrivateMembers, checker));
3838
const message = formatStringFromArgs(getLocaleSpecificMessage(Diagnostics.Implement_interface_0), [implementedTypeNode.getText()]);
3939
if (newNodes.length > 0) {
4040
pushAction(result, newNodes, message);
@@ -53,7 +53,7 @@ namespace ts.codefix {
5353
if (!indexInfoOfKind) {
5454
return undefined;
5555
}
56-
const newIndexSignatureDeclaration = checker.createIndexSignatureFromIndexInfo(indexInfoOfKind, kind);
56+
const newIndexSignatureDeclaration = checker.createIndexSignatureFromIndexInfo(indexInfoOfKind, kind, classDeclaration);
5757
newNodes.push(newIndexSignatureDeclaration);
5858
}
5959

src/services/codefixes/helpers.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ namespace ts.codefix {
6262
case SyntaxKind.SetAccessor:
6363
case SyntaxKind.PropertySignature:
6464
case SyntaxKind.PropertyDeclaration:
65-
const typeNode = checker.createTypeNode(type);
65+
const typeNode = checker.createTypeNode(type, enclosingDeclaration);
6666
// TODO: add modifiers.
6767
const property = createProperty(
6868
/*decorators*/undefined
@@ -89,19 +89,16 @@ namespace ts.codefix {
8989
const optional = !!(symbol.flags & SymbolFlags.Optional);
9090
if (declarations.length === 1) {
9191
Debug.assert(signatures.length === 1);
92-
// TODO: suppress any return type
93-
// TODO: get parameters working.
94-
// TODO: add support for type parameters.
9592
const signature = signatures[0];
96-
const signatureParts = checker.createSignatureParts(signature);
93+
const signatureParts = checker.createSignatureParts(signature, enclosingDeclaration);
9794
return createStubbedMethod(modifiers, name, optional, signatureParts.typeParameters, signatureParts.parameters, signatureParts.type);
9895
}
9996

10097
let signatureDeclarations = [];
10198
for (let i = 0; i < signatures.length; i++) {
10299
// TODO: make signatures instead of methods
103100
const signature = signatures[i];
104-
const signatureParts = checker.createSignatureParts(signature);
101+
const signatureParts = checker.createSignatureParts(signature, enclosingDeclaration);
105102
signatureDeclarations.push(createMethod(
106103
/*decorators*/ undefined
107104
, modifiers
@@ -116,7 +113,7 @@ namespace ts.codefix {
116113

117114
if (declarations.length > signatures.length) {
118115
let signature = checker.getSignatureFromDeclaration(declarations[declarations.length - 1] as SignatureDeclaration);
119-
const signatureParts = checker.createSignatureParts(signature);
116+
const signatureParts = checker.createSignatureParts(signature, enclosingDeclaration);
120117
signatureDeclarations.push(createStubbedMethod(modifiers, name, optional, signatureParts.typeParameters, signatureParts.parameters, signatureParts.type));
121118
}
122119
else {

0 commit comments

Comments
 (0)