Skip to content

Commit 24f906a

Browse files
committed
Error when emitted type in declaration file references inaccessible 'this'
1 parent 1c9fae8 commit 24f906a

6 files changed

Lines changed: 28 additions & 11 deletions

File tree

src/compiler/checker.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1606,12 +1606,10 @@ namespace ts {
16061606
: (<IntrinsicType>type).intrinsicName);
16071607
}
16081608
else if (type.flags & TypeFlags.ThisType) {
1609-
if (inObjectTypeLiteral && globalFlags & TypeFormatFlags.RewriteInaccessibleThis) {
1610-
writeType((<TypeParameter>type).constraint, flags);
1611-
}
1612-
else {
1613-
writer.writeKeyword("this");
1609+
if (inObjectTypeLiteral) {
1610+
writer.reportInaccessibleThisError();
16141611
}
1612+
writer.writeKeyword("this");
16151613
}
16161614
else if (type.flags & TypeFlags.Reference) {
16171615
writeTypeReference(<TypeReference>type, flags);
@@ -14682,17 +14680,17 @@ namespace ts {
1468214680
? getTypeOfSymbol(symbol)
1468314681
: unknownType;
1468414682

14685-
getSymbolDisplayBuilder().buildTypeDisplay(type, writer, enclosingDeclaration, flags | TypeFormatFlags.RewriteInaccessibleThis);
14683+
getSymbolDisplayBuilder().buildTypeDisplay(type, writer, enclosingDeclaration, flags);
1468614684
}
1468714685

1468814686
function writeReturnTypeOfSignatureDeclaration(signatureDeclaration: SignatureDeclaration, enclosingDeclaration: Node, flags: TypeFormatFlags, writer: SymbolWriter) {
1468914687
let signature = getSignatureFromDeclaration(signatureDeclaration);
14690-
getSymbolDisplayBuilder().buildTypeDisplay(getReturnTypeOfSignature(signature), writer, enclosingDeclaration, flags | TypeFormatFlags.RewriteInaccessibleThis);
14688+
getSymbolDisplayBuilder().buildTypeDisplay(getReturnTypeOfSignature(signature), writer, enclosingDeclaration, flags);
1469114689
}
1469214690

1469314691
function writeTypeOfExpression(expr: Expression, enclosingDeclaration: Node, flags: TypeFormatFlags, writer: SymbolWriter) {
1469414692
let type = getTypeOfExpression(expr);
14695-
getSymbolDisplayBuilder().buildTypeDisplay(type, writer, enclosingDeclaration, flags | TypeFormatFlags.RewriteInaccessibleThis);
14693+
getSymbolDisplayBuilder().buildTypeDisplay(type, writer, enclosingDeclaration, flags);
1469614694
}
1469714695

1469814696
function hasGlobalName(name: string): boolean {

src/compiler/declarationEmitter.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ namespace ts {
5252
let enclosingDeclaration: Node;
5353
let currentSourceFile: SourceFile;
5454
let reportedDeclarationError = false;
55+
let errorNameNode: DeclarationName;
5556
let emitJsDocComments = compilerOptions.removeComments ? function (declaration: Node) { } : writeJsDocComments;
5657
let emit = compilerOptions.stripInternal ? stripInternal : emitNode;
5758

@@ -152,6 +153,7 @@ namespace ts {
152153
function createAndSetNewTextWriterWithSymbolWriter(): EmitTextWriterWithSymbolWriter {
153154
let writer = <EmitTextWriterWithSymbolWriter>createTextWriter(newLine);
154155
writer.trackSymbol = trackSymbol;
156+
writer.reportInaccessibleThisError = reportInaccessibleThisError;
155157
writer.writeKeyword = writer.write;
156158
writer.writeOperator = writer.write;
157159
writer.writePunctuation = writer.write;
@@ -257,6 +259,13 @@ namespace ts {
257259
handleSymbolAccessibilityError(resolver.isSymbolAccessible(symbol, enclosingDeclaration, meaning));
258260
}
259261

262+
function reportInaccessibleThisError() {
263+
if (errorNameNode) {
264+
diagnostics.push(createDiagnosticForNode(errorNameNode, Diagnostics.The_inferred_type_of_0_references_an_inaccessible_this_type_A_type_annotation_is_necessary,
265+
declarationNameToString(errorNameNode)));
266+
}
267+
}
268+
260269
function writeTypeOfDeclaration(declaration: AccessorDeclaration | VariableLikeDeclaration, type: TypeNode, getSymbolAccessibilityDiagnostic: GetSymbolAccessibilityDiagnostic) {
261270
writer.getSymbolAccessibilityDiagnostic = getSymbolAccessibilityDiagnostic;
262271
write(": ");
@@ -265,7 +274,9 @@ namespace ts {
265274
emitType(type);
266275
}
267276
else {
277+
errorNameNode = declaration.name;
268278
resolver.writeTypeOfDeclaration(declaration, enclosingDeclaration, TypeFormatFlags.UseTypeOfFunction, writer);
279+
errorNameNode = undefined;
269280
}
270281
}
271282

@@ -277,7 +288,9 @@ namespace ts {
277288
emitType(signature.type);
278289
}
279290
else {
291+
errorNameNode = signature.name;
280292
resolver.writeReturnTypeOfSignatureDeclaration(signature, enclosingDeclaration, TypeFormatFlags.UseTypeOfFunction, writer);
293+
errorNameNode = undefined;
281294
}
282295
}
283296

src/compiler/diagnosticMessages.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1656,6 +1656,10 @@
16561656
"category": "Error",
16571657
"code": 2526
16581658
},
1659+
"The inferred type of '{0}' references an inaccessible 'this' type. A type annotation is necessary.": {
1660+
"category": "Error",
1661+
"code": 2527
1662+
},
16591663
"JSX element attributes type '{0}' must be an object type.": {
16601664
"category": "Error",
16611665
"code": 2600

src/compiler/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1497,6 +1497,7 @@ namespace ts {
14971497
// declaration emitter to help determine if it should patch up the final declaration file
14981498
// with import statements it previously saw (but chose not to emit).
14991499
trackSymbol(symbol: Symbol, enclosingDeclaration?: Node, meaning?: SymbolFlags): void;
1500+
reportInaccessibleThisError(): void;
15001501
}
15011502

15021503
export const enum TypeFormatFlags {
@@ -1509,7 +1510,6 @@ namespace ts {
15091510
WriteTypeArgumentsOfSignature = 0x00000020, // Write the type arguments instead of type parameters of the signature
15101511
InElementType = 0x00000040, // Writing an array or union element type
15111512
UseFullyQualifiedType = 0x00000080, // Write out the fully qualified type name (eg. Module.Type, instead of Type)
1512-
RewriteInaccessibleThis = 0x00000100, // Rewrite references to inaccessible "this"
15131513
}
15141514

15151515
export const enum SymbolFormatFlags {

src/compiler/utilities.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ namespace ts {
6565
increaseIndent: () => { },
6666
decreaseIndent: () => { },
6767
clear: () => str = "",
68-
trackSymbol: () => { }
68+
trackSymbol: () => { },
69+
reportInaccessibleThisError: () => { }
6970
};
7071
}
7172

src/services/utilities.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,8 @@ namespace ts {
626626
increaseIndent: () => { indent++; },
627627
decreaseIndent: () => { indent--; },
628628
clear: resetWriter,
629-
trackSymbol: () => { }
629+
trackSymbol: () => { },
630+
reportInaccessibleThisError: () => { }
630631
};
631632

632633
function writeIndent() {

0 commit comments

Comments
 (0)