@@ -336,8 +336,8 @@ namespace ts {
336
336
}
337
337
338
338
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)) {
341
341
(diagnostics || (diagnostics = [])).push({ ...diag, category: DiagnosticCategory.Suggestion });
342
342
}
343
343
});
@@ -646,7 +646,8 @@ namespace ts {
646
646
Local,
647
647
Parameter,
648
648
}
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;
650
651
651
652
const builtinGlobals = createSymbolTable();
652
653
builtinGlobals.set(undefinedSymbol.escapedName, undefinedSymbol);
@@ -23612,7 +23613,7 @@ namespace ts {
23612
23613
function errorUnusedLocal(declaration: Declaration, name: string, addDiagnostic: AddUnusedDiagnostic) {
23613
23614
const node = getNameOfDeclaration(declaration) || declaration;
23614
23615
const message = isTypeDeclaration(declaration) ? Diagnostics._0_is_declared_but_never_used : Diagnostics._0_is_declared_but_its_value_is_never_read;
23615
- addDiagnostic(UnusedKind.Local, createDiagnosticForNode(node, message, name));
23616
+ addDiagnostic(declaration, UnusedKind.Local, createDiagnosticForNode(node, message, name));
23616
23617
}
23617
23618
23618
23619
function isIdentifierThatStartsWithUnderscore(node: Node) {
@@ -23633,13 +23634,13 @@ namespace ts {
23633
23634
}
23634
23635
const symbol = getSymbolOfNode(member);
23635
23636
if (!symbol.isReferenced && hasModifier(member, ModifierFlags.Private)) {
23636
- addDiagnostic(UnusedKind.Local, createDiagnosticForNode(member.name!, Diagnostics._0_is_declared_but_its_value_is_never_read, symbolToString(symbol)));
23637
+ addDiagnostic(member, UnusedKind.Local, createDiagnosticForNode(member.name!, Diagnostics._0_is_declared_but_its_value_is_never_read, symbolToString(symbol)));
23637
23638
}
23638
23639
break;
23639
23640
case SyntaxKind.Constructor:
23640
23641
for (const parameter of (<ConstructorDeclaration>member).parameters) {
23641
23642
if (!parameter.symbol.isReferenced && hasModifier(parameter, ModifierFlags.Private)) {
23642
- addDiagnostic(UnusedKind.Local, createDiagnosticForNode(parameter.name, Diagnostics.Property_0_is_declared_but_its_value_is_never_read, symbolName(parameter.symbol)));
23643
+ addDiagnostic(parameter, UnusedKind.Local, createDiagnosticForNode(parameter.name, Diagnostics.Property_0_is_declared_but_its_value_is_never_read, symbolName(parameter.symbol)));
23643
23644
}
23644
23645
}
23645
23646
break;
@@ -23664,7 +23665,7 @@ namespace ts {
23664
23665
if (!(node.flags & NodeFlags.Ambient) && last(getSymbolOfNode(node).declarations) === node) {
23665
23666
for (const typeParameter of typeParameters) {
23666
23667
if (!(getMergedSymbol(typeParameter.symbol).isReferenced! & SymbolFlags.TypeParameter) && !isIdentifierThatStartsWithUnderscore(typeParameter.name)) {
23667
- addDiagnostic(UnusedKind.Parameter, createDiagnosticForNode(typeParameter.name, Diagnostics._0_is_declared_but_its_value_is_never_read, symbolName(typeParameter.symbol)));
23668
+ addDiagnostic(typeParameter, UnusedKind.Parameter, createDiagnosticForNode(typeParameter.name, Diagnostics._0_is_declared_but_its_value_is_never_read, symbolName(typeParameter.symbol)));
23668
23669
}
23669
23670
}
23670
23671
}
@@ -23723,7 +23724,7 @@ namespace ts {
23723
23724
const name = local.valueDeclaration && getNameOfDeclaration(local.valueDeclaration);
23724
23725
if (parameter && name) {
23725
23726
if (!isParameterPropertyDeclaration(parameter) && !parameterIsThisKeyword(parameter) && !isIdentifierThatStartsWithUnderscore(name)) {
23726
- addDiagnostic(UnusedKind.Parameter, createDiagnosticForNode(name, Diagnostics._0_is_declared_but_its_value_is_never_read, symbolName(local)));
23727
+ addDiagnostic(parameter, UnusedKind.Parameter, createDiagnosticForNode(name, Diagnostics._0_is_declared_but_its_value_is_never_read, symbolName(local)));
23727
23728
}
23728
23729
}
23729
23730
else {
@@ -23739,7 +23740,7 @@ namespace ts {
23739
23740
(importClause.namedBindings.kind === SyntaxKind.NamespaceImport ? 1 : importClause.namedBindings.elements.length)
23740
23741
: 0);
23741
23742
if (nDeclarations === unuseds.length) {
23742
- addDiagnostic(UnusedKind.Local, unuseds.length === 1
23743
+ addDiagnostic(importDecl, UnusedKind.Local, unuseds.length === 1
23743
23744
? createDiagnosticForNode(importDecl, Diagnostics._0_is_declared_but_its_value_is_never_read, idText(first(unuseds).name!))
23744
23745
: createDiagnosticForNode(importDecl, Diagnostics.All_imports_in_import_declaration_are_unused));
23745
23746
}
@@ -23754,26 +23755,26 @@ namespace ts {
23754
23755
addToGroup(unusedVariables, bindingPattern.parent.parent, bindingPattern.parent, getNodeId);
23755
23756
}
23756
23757
else {
23757
- addDiagnostic(kind, bindingElements.length === 1
23758
+ addDiagnostic(bindingPattern, kind, bindingElements.length === 1
23758
23759
? createDiagnosticForNode(bindingPattern, Diagnostics._0_is_declared_but_its_value_is_never_read, idText(cast(first(bindingElements).name, isIdentifier)))
23759
23760
: createDiagnosticForNode(bindingPattern, Diagnostics.All_destructured_elements_are_unused));
23760
23761
}
23761
23762
}
23762
23763
else {
23763
23764
for (const e of bindingElements) {
23764
- addDiagnostic(kind, createDiagnosticForNode(e, Diagnostics._0_is_declared_but_its_value_is_never_read, idText(cast(e.name, isIdentifier))));
23765
+ addDiagnostic(e, kind, createDiagnosticForNode(e, Diagnostics._0_is_declared_but_its_value_is_never_read, idText(cast(e.name, isIdentifier))));
23765
23766
}
23766
23767
}
23767
23768
});
23768
23769
unusedVariables.forEach(([declarationList, declarations]) => {
23769
23770
if (declarationList.declarations.length === declarations.length) {
23770
- addDiagnostic(UnusedKind.Local, declarations.length === 1
23771
+ addDiagnostic(declarationList, UnusedKind.Local, declarations.length === 1
23771
23772
? createDiagnosticForNode(first(declarations).name, Diagnostics._0_is_declared_but_its_value_is_never_read, bindingNameText(first(declarations).name))
23772
23773
: createDiagnosticForNode(declarationList.parent.kind === SyntaxKind.VariableStatement ? declarationList.parent : declarationList, Diagnostics.All_variables_are_unused));
23773
23774
}
23774
23775
else {
23775
23776
for (const decl of declarations) {
23776
- addDiagnostic(UnusedKind.Local, createDiagnosticForNode(decl, Diagnostics._0_is_declared_but_its_value_is_never_read, idText(cast(decl.name, isIdentifier))));
23777
+ addDiagnostic(decl, UnusedKind.Local, createDiagnosticForNode(decl, Diagnostics._0_is_declared_but_its_value_is_never_read, idText(cast(decl.name, isIdentifier))));
23777
23778
}
23778
23779
}
23779
23780
});
@@ -26626,8 +26627,8 @@ namespace ts {
26626
26627
}
26627
26628
26628
26629
if (!node.isDeclarationFile && (compilerOptions.noUnusedLocals || compilerOptions.noUnusedParameters)) {
26629
- checkUnusedIdentifiers(getPotentiallyUnusedIdentifiers(node), (kind, diag) => {
26630
- if (unusedIsError(kind)) {
26630
+ checkUnusedIdentifiers(getPotentiallyUnusedIdentifiers(node), (containingNode, kind, diag) => {
26631
+ if (!containsParseError(containingNode) && unusedIsError(kind)) {
26631
26632
diagnostics.add(diag);
26632
26633
}
26633
26634
});
0 commit comments