diff --git a/src/Diagnostics/Roslyn/Core/ApiDesign/DeclarePublicAPIAnalyzer.cs b/src/Diagnostics/Roslyn/Core/ApiDesign/DeclarePublicAPIAnalyzer.cs index c1b032d4f8261e91e9071bfd293f6106f1fa6da5..24aaa18b103f6b98d41263f3047b18f6da421b08 100644 --- a/src/Diagnostics/Roslyn/Core/ApiDesign/DeclarePublicAPIAnalyzer.cs +++ b/src/Diagnostics/Roslyn/Core/ApiDesign/DeclarePublicAPIAnalyzer.cs @@ -5,6 +5,7 @@ using System.Collections.Immutable; using System.IO; using System.Linq; +using System.Threading; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Diagnostics; using Microsoft.CodeAnalysis.Text; @@ -82,7 +83,7 @@ public override void Initialize(AnalysisContext context) { context.RegisterCompilationStartAction(compilationContext => { - AdditionalText publicApiAdditionalText = TryGetPublicApiSpec(compilationContext.Options.AdditionalFiles); + AdditionalText publicApiAdditionalText = TryGetPublicApiSpec(compilationContext.Options.AdditionalFiles, compilationContext.CancellationToken); var publicApiSourceText = publicApiAdditionalText.GetText(compilationContext.CancellationToken); if (publicApiAdditionalText == null) @@ -90,7 +91,7 @@ public override void Initialize(AnalysisContext context) return; } - HashSet declaredPublicSymbols = ReadPublicSymbols(publicApiSourceText); + HashSet declaredPublicSymbols = ReadPublicSymbols(publicApiSourceText, compilationContext.CancellationToken); HashSet examinedPublicTypes = new HashSet(); object lockObj = new object(); @@ -203,12 +204,14 @@ internal static string GetPublicApiName(ISymbol symbol) return null; } - private static HashSet ReadPublicSymbols(SourceText file) + private static HashSet ReadPublicSymbols(SourceText file, CancellationToken cancellationToken) { HashSet publicSymbols = new HashSet(); foreach (var line in file.Lines) { + cancellationToken.ThrowIfCancellationRequested(); + var text = line.ToString(); if (!string.IsNullOrWhiteSpace(text)) @@ -248,10 +251,12 @@ private static bool IsPublicOrPublicProtected(ISymbol symbol) return false; } - private static AdditionalText TryGetPublicApiSpec(ImmutableArray additionalTexts) + private static AdditionalText TryGetPublicApiSpec(ImmutableArray additionalTexts, CancellationToken cancellationToken) { foreach (var text in additionalTexts) { + cancellationToken.ThrowIfCancellationRequested(); + if (Path.GetFileName(text.Path).Equals(PublicApiFileName, StringComparison.OrdinalIgnoreCase)) { return text;