@@ -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);
@@ -23595,7 +23596,7 @@ namespace ts {
23595
23596
function errorUnusedLocal(declaration: Declaration, name: string, addDiagnostic: AddUnusedDiagnostic) {
23596
23597
const node = getNameOfDeclaration(declaration) || declaration;
23597
23598
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));
23599
23600
}
23600
23601
23601
23602
function isIdentifierThatStartsWithUnderscore(node: Node) {
@@ -23616,13 +23617,13 @@ namespace ts {
23616
23617
}
23617
23618
const symbol = getSymbolOfNode(member);
23618
23619
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)));
23620
23621
}
23621
23622
break;
23622
23623
case SyntaxKind.Constructor:
23623
23624
for (const parameter of (<ConstructorDeclaration>member).parameters) {
23624
23625
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)));
23626
23627
}
23627
23628
}
23628
23629
break;
@@ -23647,7 +23648,7 @@ namespace ts {
23647
23648
if (!(node.flags & NodeFlags.Ambient) && last(getSymbolOfNode(node).declarations) === node) {
23648
23649
for (const typeParameter of typeParameters) {
23649
23650
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)));
23651
23652
}
23652
23653
}
23653
23654
}
@@ -23706,7 +23707,7 @@ namespace ts {
23706
23707
const name = local.valueDeclaration && getNameOfDeclaration(local.valueDeclaration);
23707
23708
if (parameter && name) {
23708
23709
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)));
23710
23711
}
23711
23712
}
23712
23713
else {
@@ -23722,7 +23723,7 @@ namespace ts {
23722
23723
(importClause.namedBindings.kind === SyntaxKind.NamespaceImport ? 1 : importClause.namedBindings.elements.length)
23723
23724
: 0);
23724
23725
if (nDeclarations === unuseds.length) {
23725
- addDiagnostic(UnusedKind.Local, unuseds.length === 1
23726
+ addDiagnostic(importDecl, UnusedKind.Local, unuseds.length === 1
23726
23727
? createDiagnosticForNode(importDecl, Diagnostics._0_is_declared_but_its_value_is_never_read, idText(first(unuseds).name!))
23727
23728
: createDiagnosticForNode(importDecl, Diagnostics.All_imports_in_import_declaration_are_unused));
23728
23729
}
@@ -23737,26 +23738,26 @@ namespace ts {
23737
23738
addToGroup(unusedVariables, bindingPattern.parent.parent, bindingPattern.parent, getNodeId);
23738
23739
}
23739
23740
else {
23740
- addDiagnostic(kind, bindingElements.length === 1
23741
+ addDiagnostic(bindingPattern, kind, bindingElements.length === 1
23741
23742
? createDiagnosticForNode(bindingPattern, Diagnostics._0_is_declared_but_its_value_is_never_read, idText(cast(first(bindingElements).name, isIdentifier)))
23742
23743
: createDiagnosticForNode(bindingPattern, Diagnostics.All_destructured_elements_are_unused));
23743
23744
}
23744
23745
}
23745
23746
else {
23746
23747
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))));
23748
23749
}
23749
23750
}
23750
23751
});
23751
23752
unusedVariables.forEach(([declarationList, declarations]) => {
23752
23753
if (declarationList.declarations.length === declarations.length) {
23753
- addDiagnostic(UnusedKind.Local, declarations.length === 1
23754
+ addDiagnostic(declarationList, UnusedKind.Local, declarations.length === 1
23754
23755
? createDiagnosticForNode(first(declarations).name, Diagnostics._0_is_declared_but_its_value_is_never_read, bindingNameText(first(declarations).name))
23755
23756
: createDiagnosticForNode(declarationList.parent.kind === SyntaxKind.VariableStatement ? declarationList.parent : declarationList, Diagnostics.All_variables_are_unused));
23756
23757
}
23757
23758
else {
23758
23759
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))));
23760
23761
}
23761
23762
}
23762
23763
});
@@ -26609,8 +26610,8 @@ namespace ts {
26609
26610
}
26610
26611
26611
26612
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)) {
26614
26615
diagnostics.add(diag);
26615
26616
}
26616
26617
});
0 commit comments