@@ -24682,7 +24682,7 @@ namespace ts {
24682
24682
24683
24683
function registerForUnusedIdentifiersCheck(node: PotentiallyUnusedIdentifier): void {
24684
24684
// May be in a call such as getTypeOfNode that happened to call this. But potentiallyUnusedIdentifiers is only defined in the scope of `checkSourceFile`.
24685
- if (produceDiagnostics) {
24685
+ if (produceDiagnostics && !(node.flags & NodeFlags.Ambient) ) {
24686
24686
const sourceFile = getSourceFileOfNode(node);
24687
24687
let potentiallyUnusedIdentifiers = allPotentiallyUnusedIdentifiers.get(sourceFile.path);
24688
24688
if (!potentiallyUnusedIdentifiers) {
@@ -24709,9 +24709,6 @@ namespace ts {
24709
24709
checkUnusedClassMembers(node, addDiagnostic);
24710
24710
checkUnusedTypeParameters(node, addDiagnostic);
24711
24711
break;
24712
- case SyntaxKind.InterfaceDeclaration:
24713
- checkUnusedTypeParameters(node, addDiagnostic);
24714
- break;
24715
24712
case SyntaxKind.SourceFile:
24716
24713
case SyntaxKind.ModuleDeclaration:
24717
24714
case SyntaxKind.Block:
@@ -24728,7 +24725,7 @@ namespace ts {
24728
24725
case SyntaxKind.MethodDeclaration:
24729
24726
case SyntaxKind.GetAccessor:
24730
24727
case SyntaxKind.SetAccessor:
24731
- if (node.body) {
24728
+ if (node.body) { // Don't report unused parameters in overloads
24732
24729
checkUnusedLocalsAndParameters(node, addDiagnostic);
24733
24730
}
24734
24731
checkUnusedTypeParameters(node, addDiagnostic);
@@ -24739,9 +24736,12 @@ namespace ts {
24739
24736
case SyntaxKind.FunctionType:
24740
24737
case SyntaxKind.ConstructorType:
24741
24738
case SyntaxKind.TypeAliasDeclaration:
24742
- case SyntaxKind.InferType :
24739
+ case SyntaxKind.InterfaceDeclaration :
24743
24740
checkUnusedTypeParameters(node, addDiagnostic);
24744
24741
break;
24742
+ case SyntaxKind.InferType:
24743
+ checkUnusedInferTypeParameter(node, addDiagnostic);
24744
+ break;
24745
24745
default:
24746
24746
Debug.assertNever(node, "Node should not have been registered for unused identifiers check");
24747
24747
}
@@ -24759,77 +24759,74 @@ namespace ts {
24759
24759
}
24760
24760
24761
24761
function checkUnusedClassMembers(node: ClassDeclaration | ClassExpression, addDiagnostic: AddUnusedDiagnostic): void {
24762
- if (!(node.flags & NodeFlags.Ambient)) {
24763
- for (const member of node.members) {
24764
- switch (member.kind) {
24765
- case SyntaxKind.MethodDeclaration:
24766
- case SyntaxKind.PropertyDeclaration:
24767
- case SyntaxKind.GetAccessor:
24768
- case SyntaxKind.SetAccessor:
24769
- if (member.kind === SyntaxKind.SetAccessor && member.symbol.flags & SymbolFlags.GetAccessor) {
24770
- // Already would have reported an error on the getter.
24771
- break;
24772
- }
24773
- const symbol = getSymbolOfNode(member);
24774
- if (!symbol.isReferenced && hasModifier(member, ModifierFlags.Private)) {
24775
- addDiagnostic(member, UnusedKind.Local, createDiagnosticForNode(member.name!, Diagnostics._0_is_declared_but_its_value_is_never_read, symbolToString(symbol)));
24776
- }
24762
+ for (const member of node.members) {
24763
+ switch (member.kind) {
24764
+ case SyntaxKind.MethodDeclaration:
24765
+ case SyntaxKind.PropertyDeclaration:
24766
+ case SyntaxKind.GetAccessor:
24767
+ case SyntaxKind.SetAccessor:
24768
+ if (member.kind === SyntaxKind.SetAccessor && member.symbol.flags & SymbolFlags.GetAccessor) {
24769
+ // Already would have reported an error on the getter.
24777
24770
break;
24778
- case SyntaxKind.Constructor:
24779
- for (const parameter of (<ConstructorDeclaration>member).parameters) {
24780
- if (!parameter.symbol.isReferenced && hasModifier(parameter, ModifierFlags.Private)) {
24781
- addDiagnostic(parameter, UnusedKind.Local, createDiagnosticForNode(parameter.name, Diagnostics.Property_0_is_declared_but_its_value_is_never_read, symbolName(parameter.symbol)));
24782
- }
24771
+ }
24772
+ const symbol = getSymbolOfNode(member);
24773
+ if (!symbol.isReferenced && hasModifier(member, ModifierFlags.Private)) {
24774
+ addDiagnostic(member, UnusedKind.Local, createDiagnosticForNode(member.name!, Diagnostics._0_is_declared_but_its_value_is_never_read, symbolToString(symbol)));
24775
+ }
24776
+ break;
24777
+ case SyntaxKind.Constructor:
24778
+ for (const parameter of (<ConstructorDeclaration>member).parameters) {
24779
+ if (!parameter.symbol.isReferenced && hasModifier(parameter, ModifierFlags.Private)) {
24780
+ addDiagnostic(parameter, UnusedKind.Local, createDiagnosticForNode(parameter.name, Diagnostics.Property_0_is_declared_but_its_value_is_never_read, symbolName(parameter.symbol)));
24783
24781
}
24784
- break;
24785
- case SyntaxKind.IndexSignature:
24786
- case SyntaxKind.SemicolonClassElement :
24787
- // Can't be private
24788
- break;
24789
- default:
24790
- Debug.fail();
24791
- }
24782
+ }
24783
+ break;
24784
+ case SyntaxKind.IndexSignature :
24785
+ case SyntaxKind.SemicolonClassElement:
24786
+ // Can't be private
24787
+ break;
24788
+ default:
24789
+ Debug.fail();
24792
24790
}
24793
24791
}
24794
24792
}
24795
24793
24796
- function checkUnusedTypeParameters(node: ClassLikeDeclaration | SignatureDeclaration | InterfaceDeclaration | TypeAliasDeclaration | InferTypeNode, addDiagnostic: AddUnusedDiagnostic): void {
24794
+ function checkUnusedInferTypeParameter(node: InferTypeNode, addDiagnostic: AddUnusedDiagnostic): void {
24795
+ const { typeParameter } = node;
24796
+ if (isTypeParameterUnused(typeParameter)) {
24797
+ addDiagnostic(node, UnusedKind.Parameter, createDiagnosticForNode(node, Diagnostics._0_is_declared_but_its_value_is_never_read, idText(typeParameter.name)));
24798
+ }
24799
+ }
24800
+
24801
+ function checkUnusedTypeParameters(node: ClassLikeDeclaration | SignatureDeclaration | InterfaceDeclaration | TypeAliasDeclaration, addDiagnostic: AddUnusedDiagnostic): void {
24797
24802
// Only report errors on the last declaration for the type parameter container;
24798
24803
// this ensures that all uses have been accounted for.
24799
- if (node.flags & NodeFlags.Ambient || node.kind !== SyntaxKind.InferType && last(getSymbolOfNode(node).declarations) !== node) return;
24804
+ if (last(getSymbolOfNode(node).declarations) !== node) return;
24800
24805
24801
- if (node.kind === SyntaxKind.InferType) {
24802
- const { typeParameter } = node;
24803
- if (isTypeParameterUnused(typeParameter)) {
24804
- addDiagnostic(node, UnusedKind.Parameter, createDiagnosticForNode(node, Diagnostics._0_is_declared_but_its_value_is_never_read, idText(typeParameter.name)));
24805
- }
24806
- }
24807
- else {
24808
- const typeParameters = getEffectiveTypeParameterDeclarations(node);
24809
- const seenParentsWithEveryUnused = new NodeSet<DeclarationWithTypeParameterChildren>();
24810
-
24811
- for (const typeParameter of typeParameters) {
24812
- if (!isTypeParameterUnused(typeParameter)) continue;
24813
-
24814
- const name = idText(typeParameter.name);
24815
- const { parent } = typeParameter;
24816
- if (parent.kind !== SyntaxKind.InferType && parent.typeParameters!.every(isTypeParameterUnused)) {
24817
- if (seenParentsWithEveryUnused.tryAdd(parent)) {
24818
- const range = isJSDocTemplateTag(parent)
24819
- // Whole @template tag
24820
- ? rangeOfNode(parent)
24821
- // Include the `<>` in the error message
24822
- : rangeOfTypeParameters(parent.typeParameters!);
24823
- const only = typeParameters.length === 1;
24824
- const message = only ? Diagnostics._0_is_declared_but_its_value_is_never_read : Diagnostics.All_type_parameters_are_unused;
24825
- const arg0 = only ? name : undefined;
24826
- addDiagnostic(typeParameter, UnusedKind.Parameter, createFileDiagnostic(getSourceFileOfNode(parent), range.pos, range.end - range.pos, message, arg0));
24827
- }
24828
- }
24829
- else {
24830
- addDiagnostic(typeParameter, UnusedKind.Parameter, createDiagnosticForNode(typeParameter, Diagnostics._0_is_declared_but_its_value_is_never_read, name));
24806
+ const typeParameters = getEffectiveTypeParameterDeclarations(node);
24807
+ const seenParentsWithEveryUnused = new NodeSet<DeclarationWithTypeParameterChildren>();
24808
+
24809
+ for (const typeParameter of typeParameters) {
24810
+ if (!isTypeParameterUnused(typeParameter)) continue;
24811
+
24812
+ const name = idText(typeParameter.name);
24813
+ const { parent } = typeParameter;
24814
+ if (parent.kind !== SyntaxKind.InferType && parent.typeParameters!.every(isTypeParameterUnused)) {
24815
+ if (seenParentsWithEveryUnused.tryAdd(parent)) {
24816
+ const range = isJSDocTemplateTag(parent)
24817
+ // Whole @template tag
24818
+ ? rangeOfNode(parent)
24819
+ // Include the `<>` in the error message
24820
+ : rangeOfTypeParameters(parent.typeParameters!);
24821
+ const only = typeParameters.length === 1;
24822
+ const message = only ? Diagnostics._0_is_declared_but_its_value_is_never_read : Diagnostics.All_type_parameters_are_unused;
24823
+ const arg0 = only ? name : undefined;
24824
+ addDiagnostic(typeParameter, UnusedKind.Parameter, createFileDiagnostic(getSourceFileOfNode(parent), range.pos, range.end - range.pos, message, arg0));
24831
24825
}
24832
24826
}
24827
+ else {
24828
+ addDiagnostic(typeParameter, UnusedKind.Parameter, createDiagnosticForNode(typeParameter, Diagnostics._0_is_declared_but_its_value_is_never_read, name));
24829
+ }
24833
24830
}
24834
24831
}
24835
24832
function isTypeParameterUnused(typeParameter: TypeParameterDeclaration): boolean {
0 commit comments