diff --git a/src/ListDotNetTypes/ListDotNetTypes.csproj b/src/ListDotNetTypes/ListDotNetTypes.csproj index a12ef279d..21fbb4c3f 100644 --- a/src/ListDotNetTypes/ListDotNetTypes.csproj +++ b/src/ListDotNetTypes/ListDotNetTypes.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/Meziantou.Analyzer/Rules/AvoidUnusedInternalTypesAnalyzer.cs b/src/Meziantou.Analyzer/Rules/AvoidUnusedInternalTypesAnalyzer.cs index 2ad4660a4..6c593bdee 100644 --- a/src/Meziantou.Analyzer/Rules/AvoidUnusedInternalTypesAnalyzer.cs +++ b/src/Meziantou.Analyzer/Rules/AvoidUnusedInternalTypesAnalyzer.cs @@ -41,6 +41,7 @@ public override void Initialize(AnalysisContext context) ctx.RegisterOperationAction(analyzerContext.AnalyzeMemberReference, OperationKind.PropertyReference, OperationKind.FieldReference, OperationKind.MethodReference, OperationKind.EventReference); ctx.RegisterOperationAction(analyzerContext.AnalyzeVariableDeclarator, OperationKind.VariableDeclarator); ctx.RegisterOperationAction(analyzerContext.AnalyzeConversion, OperationKind.Conversion); + ctx.RegisterOperationAction(analyzerContext.AnalyzeIsType, OperationKind.IsType); ctx.RegisterOperationAction(analyzerContext.AnalyzeIsPattern, OperationKind.IsPattern); ctx.RegisterOperationAction(analyzerContext.AnalyzeDelegateCreation, OperationKind.DelegateCreation); ctx.RegisterCompilationEndAction(analyzerContext.AnalyzeCompilationEnd); @@ -278,6 +279,15 @@ public void AnalyzeIsPattern(OperationAnalysisContext context) } } + public void AnalyzeIsType(OperationAnalysisContext context) + { + var operation = (IIsTypeOperation)context.Operation; + if (operation.TypeOperand is not null) + { + AddUsedType(operation, operation.TypeOperand); + } + } + public void AnalyzeDelegateCreation(OperationAnalysisContext context) { var operation = (IDelegateCreationOperation)context.Operation; diff --git a/tests/Meziantou.Analyzer.Test/Rules/AvoidUnusedInternalTypesAnalyzerTests.cs b/tests/Meziantou.Analyzer.Test/Rules/AvoidUnusedInternalTypesAnalyzerTests.cs index a63f74fdc..f0ca4a9f0 100644 --- a/tests/Meziantou.Analyzer.Test/Rules/AvoidUnusedInternalTypesAnalyzerTests.cs +++ b/tests/Meziantou.Analyzer.Test/Rules/AvoidUnusedInternalTypesAnalyzerTests.cs @@ -1717,6 +1717,33 @@ await CreateProjectBuilder() .ValidateAsync(); } + [Fact] + public async Task InternalInterfaceOnlyUsedInTypeCheck_NoDiagnostic() + { + const string SourceCode = """ + public sealed class Foo + { + public static string? Run(object x) + { + if (x is IRunnable) + { + return null; + } + + return "X"; + } + } + + internal interface IRunnable + { + void Run(); + } + """; + await CreateProjectBuilder() + .WithSourceCode(SourceCode) + .ValidateAsync(); + } + [Fact] public async Task InternalRecordUsedInPatternMatching_NoDiagnostic() {