Skip to content

Commit e26e448

Browse files
author
Andy Hanson
committed
Don't report unused diagnostics when the unused node has a parse error
1 parent 66e9aaa commit e26e448

File tree

2 files changed

+23
-15
lines changed

2 files changed

+23
-15
lines changed

src/compiler/checker.ts

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -336,8 +336,8 @@ namespace ts {
336336
}
337337

338338
function addUnusedDiagnostics() {
339-
checkUnusedIdentifiers(getPotentiallyUnusedIdentifiers(file), (kind, diag) => {
340-
if (!unusedIsError(kind)) {
339+
checkUnusedIdentifiers(getPotentiallyUnusedIdentifiers(file), (containingNode, kind, diag) => {
340+
if (!containsParseError(containingNode) && !unusedIsError(kind)) {
341341
(diagnostics || (diagnostics = [])).push({ ...diag, category: DiagnosticCategory.Suggestion });
342342
}
343343
});
@@ -646,7 +646,8 @@ namespace ts {
646646
Local,
647647
Parameter,
648648
}
649-
type AddUnusedDiagnostic = (type: UnusedKind, diagnostic: DiagnosticWithLocation) => void;
649+
/** @param containingNode Node to check for parse error */
650+
type AddUnusedDiagnostic = (containingNode: Node, type: UnusedKind, diagnostic: DiagnosticWithLocation) => void;
650651

651652
const builtinGlobals = createSymbolTable();
652653
builtinGlobals.set(undefinedSymbol.escapedName, undefinedSymbol);
@@ -23595,7 +23596,7 @@ namespace ts {
2359523596
function errorUnusedLocal(declaration: Declaration, name: string, addDiagnostic: AddUnusedDiagnostic) {
2359623597
const node = getNameOfDeclaration(declaration) || declaration;
2359723598
const message = isTypeDeclaration(declaration) ? Diagnostics._0_is_declared_but_never_used : Diagnostics._0_is_declared_but_its_value_is_never_read;
23598-
addDiagnostic(UnusedKind.Local, createDiagnosticForNode(node, message, name));
23599+
addDiagnostic(declaration, UnusedKind.Local, createDiagnosticForNode(node, message, name));
2359923600
}
2360023601

2360123602
function isIdentifierThatStartsWithUnderscore(node: Node) {
@@ -23616,13 +23617,13 @@ namespace ts {
2361623617
}
2361723618
const symbol = getSymbolOfNode(member);
2361823619
if (!symbol.isReferenced && hasModifier(member, ModifierFlags.Private)) {
23619-
addDiagnostic(UnusedKind.Local, createDiagnosticForNode(member.name!, Diagnostics._0_is_declared_but_its_value_is_never_read, symbolToString(symbol)));
23620+
addDiagnostic(member, UnusedKind.Local, createDiagnosticForNode(member.name!, Diagnostics._0_is_declared_but_its_value_is_never_read, symbolToString(symbol)));
2362023621
}
2362123622
break;
2362223623
case SyntaxKind.Constructor:
2362323624
for (const parameter of (<ConstructorDeclaration>member).parameters) {
2362423625
if (!parameter.symbol.isReferenced && hasModifier(parameter, ModifierFlags.Private)) {
23625-
addDiagnostic(UnusedKind.Local, createDiagnosticForNode(parameter.name, Diagnostics.Property_0_is_declared_but_its_value_is_never_read, symbolName(parameter.symbol)));
23626+
addDiagnostic(parameter, UnusedKind.Local, createDiagnosticForNode(parameter.name, Diagnostics.Property_0_is_declared_but_its_value_is_never_read, symbolName(parameter.symbol)));
2362623627
}
2362723628
}
2362823629
break;
@@ -23647,7 +23648,7 @@ namespace ts {
2364723648
if (!(node.flags & NodeFlags.Ambient) && last(getSymbolOfNode(node).declarations) === node) {
2364823649
for (const typeParameter of typeParameters) {
2364923650
if (!(getMergedSymbol(typeParameter.symbol).isReferenced! & SymbolFlags.TypeParameter) && !isIdentifierThatStartsWithUnderscore(typeParameter.name)) {
23650-
addDiagnostic(UnusedKind.Parameter, createDiagnosticForNode(typeParameter.name, Diagnostics._0_is_declared_but_its_value_is_never_read, symbolName(typeParameter.symbol)));
23651+
addDiagnostic(typeParameter, UnusedKind.Parameter, createDiagnosticForNode(typeParameter.name, Diagnostics._0_is_declared_but_its_value_is_never_read, symbolName(typeParameter.symbol)));
2365123652
}
2365223653
}
2365323654
}
@@ -23706,7 +23707,7 @@ namespace ts {
2370623707
const name = local.valueDeclaration && getNameOfDeclaration(local.valueDeclaration);
2370723708
if (parameter && name) {
2370823709
if (!isParameterPropertyDeclaration(parameter) && !parameterIsThisKeyword(parameter) && !isIdentifierThatStartsWithUnderscore(name)) {
23709-
addDiagnostic(UnusedKind.Parameter, createDiagnosticForNode(name, Diagnostics._0_is_declared_but_its_value_is_never_read, symbolName(local)));
23710+
addDiagnostic(parameter, UnusedKind.Parameter, createDiagnosticForNode(name, Diagnostics._0_is_declared_but_its_value_is_never_read, symbolName(local)));
2371023711
}
2371123712
}
2371223713
else {
@@ -23722,7 +23723,7 @@ namespace ts {
2372223723
(importClause.namedBindings.kind === SyntaxKind.NamespaceImport ? 1 : importClause.namedBindings.elements.length)
2372323724
: 0);
2372423725
if (nDeclarations === unuseds.length) {
23725-
addDiagnostic(UnusedKind.Local, unuseds.length === 1
23726+
addDiagnostic(importDecl, UnusedKind.Local, unuseds.length === 1
2372623727
? createDiagnosticForNode(importDecl, Diagnostics._0_is_declared_but_its_value_is_never_read, idText(first(unuseds).name!))
2372723728
: createDiagnosticForNode(importDecl, Diagnostics.All_imports_in_import_declaration_are_unused));
2372823729
}
@@ -23737,26 +23738,26 @@ namespace ts {
2373723738
addToGroup(unusedVariables, bindingPattern.parent.parent, bindingPattern.parent, getNodeId);
2373823739
}
2373923740
else {
23740-
addDiagnostic(kind, bindingElements.length === 1
23741+
addDiagnostic(bindingPattern, kind, bindingElements.length === 1
2374123742
? createDiagnosticForNode(bindingPattern, Diagnostics._0_is_declared_but_its_value_is_never_read, idText(cast(first(bindingElements).name, isIdentifier)))
2374223743
: createDiagnosticForNode(bindingPattern, Diagnostics.All_destructured_elements_are_unused));
2374323744
}
2374423745
}
2374523746
else {
2374623747
for (const e of bindingElements) {
23747-
addDiagnostic(kind, createDiagnosticForNode(e, Diagnostics._0_is_declared_but_its_value_is_never_read, idText(cast(e.name, isIdentifier))));
23748+
addDiagnostic(e, kind, createDiagnosticForNode(e, Diagnostics._0_is_declared_but_its_value_is_never_read, idText(cast(e.name, isIdentifier))));
2374823749
}
2374923750
}
2375023751
});
2375123752
unusedVariables.forEach(([declarationList, declarations]) => {
2375223753
if (declarationList.declarations.length === declarations.length) {
23753-
addDiagnostic(UnusedKind.Local, declarations.length === 1
23754+
addDiagnostic(declarationList, UnusedKind.Local, declarations.length === 1
2375423755
? createDiagnosticForNode(first(declarations).name, Diagnostics._0_is_declared_but_its_value_is_never_read, bindingNameText(first(declarations).name))
2375523756
: createDiagnosticForNode(declarationList.parent.kind === SyntaxKind.VariableStatement ? declarationList.parent : declarationList, Diagnostics.All_variables_are_unused));
2375623757
}
2375723758
else {
2375823759
for (const decl of declarations) {
23759-
addDiagnostic(UnusedKind.Local, createDiagnosticForNode(decl, Diagnostics._0_is_declared_but_its_value_is_never_read, idText(cast(decl.name, isIdentifier))));
23760+
addDiagnostic(decl, UnusedKind.Local, createDiagnosticForNode(decl, Diagnostics._0_is_declared_but_its_value_is_never_read, idText(cast(decl.name, isIdentifier))));
2376023761
}
2376123762
}
2376223763
});
@@ -26609,8 +26610,8 @@ namespace ts {
2660926610
}
2661026611

2661126612
if (!node.isDeclarationFile && (compilerOptions.noUnusedLocals || compilerOptions.noUnusedParameters)) {
26612-
checkUnusedIdentifiers(getPotentiallyUnusedIdentifiers(node), (kind, diag) => {
26613-
if (unusedIsError(kind)) {
26613+
checkUnusedIdentifiers(getPotentiallyUnusedIdentifiers(node), (containingNode, kind, diag) => {
26614+
if (!containsParseError(containingNode) && unusedIsError(kind)) {
2661426615
diagnostics.add(diag);
2661526616
}
2661626617
});
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
// @Filename: /a.ts
4+
////export {};
5+
////const a = 1 d;
6+
7+
verify.getSuggestionDiagnostics([]);

0 commit comments

Comments
 (0)