├── .gitattributes
├── .gitignore
├── .nuget
└── packages.config
├── CONTRIBUTING.md
├── LICENSE
├── NuGet.config
├── PublicApiAnalyzer.sln
├── PublicApiAnalyzer
├── Directory.Build.props
├── Directory.Build.targets
├── PublicApiAnalyzer.CodeFixes
│ ├── ApiDesign
│ │ └── DeclarePublicAPIFix.cs
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ ├── PublicAPI.Shipped.txt
│ ├── PublicAPI.Unshipped.txt
│ ├── PublicApiAnalyzer.CodeFixes.csproj
│ ├── PublicApiAnalyzer.Metadata.nuspec
│ ├── PublicApiAnalyzer.nuspec
│ └── tools
│ │ ├── install.ps1
│ │ └── uninstall.ps1
├── PublicApiAnalyzer.Internal.ruleset
├── PublicApiAnalyzer.Test
│ ├── ApiDesign
│ │ └── DeclarePublicAPIAnalyzerTests.cs
│ ├── AttributeTests.cs
│ ├── ExportCodeFixProviderAttributeNameTest.cs
│ ├── Helpers
│ │ ├── CodeFixVerifier.Helper.cs
│ │ ├── DiagnosticResult.cs
│ │ ├── DiagnosticResultLocation.cs
│ │ ├── DiagnosticVerifier.Helper.cs
│ │ ├── MetadataReferences.cs
│ │ ├── TestDiagnosticProvider.cs
│ │ └── TestXmlReferenceResolver.cs
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ ├── PublicApiAnalyzer.Test.csproj
│ ├── PublicApiTests.cs
│ └── Verifiers
│ │ ├── CodeFixVerifier.cs
│ │ └── DiagnosticVerifier.cs
├── PublicApiAnalyzer.Vsix
│ ├── Properties
│ │ └── launchSettings.json
│ ├── PublicApiAnalyzer.Vsix.csproj
│ └── source.extension.vsixmanifest
├── PublicApiAnalyzer.ruleset
├── PublicApiAnalyzer
│ ├── AnalyzerCategory.cs
│ ├── AnalyzerConstants.cs
│ ├── ApiDesign
│ │ ├── DeclarePublicAPIAnalyzer.Impl.cs
│ │ └── DeclarePublicAPIAnalyzer.cs
│ ├── ExcludeFromCodeCoverageAttribute.cs
│ ├── Helpers
│ │ ├── IMethodSymbolExtensions.cs
│ │ ├── ISymbolExtensions.cs
│ │ └── ObjectExtensions.cs
│ ├── NoCodeFixAttribute.cs
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ ├── PublicAPI.Shipped.txt
│ ├── PublicAPI.Unshipped.txt
│ ├── PublicApiAnalyzer.csproj
│ ├── RoslynDiagnosticIds.cs
│ ├── RoslynDiagnosticsResources.Designer.cs
│ └── RoslynDiagnosticsResources.resx
├── stylecop.json
└── version.json
├── README.md
├── THIRD-PARTY-NOTICES.txt
├── appveyor.yml
├── build
├── build.ps1
├── keys
│ ├── PublicApiAnalyzer.snk
│ └── TestingKey.snk
└── opencover-report.ps1
├── codecov.yml
├── docs
├── RS0016.md
├── RS0017.md
├── RS0022.md
├── RS0024.md
├── RS0025.md
├── RS0026.md
└── RS0027.md
└── global.json
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Source code files
2 | *.cs text
3 | *.vsixmanifest text
4 | *.config text
5 | *.resx text
6 | *.vstemplate text
7 | *.nuspec text
8 | *.md text
9 | *.txt text
10 | *.ps1 text
11 | LICENSE text
12 |
13 | # Projects and solutions
14 | *.sln text
15 | *.csproj text
16 |
17 | # Certainly binary files
18 | *.png binary
19 | *.ico binary
20 | *.snk binary
21 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Build output
2 | bin/
3 | obj/
4 |
5 | # Artifacts of the IDE and build
6 | *.sln.ide/
7 | .vs/
8 | packages/
9 | *.suo
10 | *.user
11 | TestResults/
12 | OpenCover.Reports/
13 | .nuget/NuGet.exe
14 | build/nuget/
15 | *.log
16 |
17 | # Visual Studio performance tools
18 | *.psess
19 | *.vsp
20 | *.vspx
21 |
--------------------------------------------------------------------------------
/.nuget/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing
2 |
3 | If you want to contribute code you can get started by looking for issues marked as
4 | [up for grabs](https://github.com/DotNetAnalyzers/PublicApiAnalyzer/labels/up%20for%20grabs).
5 | We also have the [easy](https://github.com/DotNetAnalyzers/PublicApiAnalyzer/labels/easy) tag
6 | for issues suitable if you are unfamiliar with roslyn.
7 |
8 | Also see the [contributing guide](CONTRIBUTING.md).
9 |
10 | You can also help by filing issues, participating in discussions and doing code review.
11 |
12 | ## Implementing a diagnostic
13 |
14 | To start working on an issue, simply add a comment to the issue indicating you are working on implementing it.
15 |
16 | ## Building
17 |
18 | Visual Studio 2015 is required for building this repository. The Visual Studio 2015 SDK is required for building the
19 | VSIX extension project and for debugging in an experimental visual studio hive.
20 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (c) Tunnel Vision Laboratories, LLC. All rights reserved.
2 |
3 | Licensed under the Apache License, Version 2.0 (the "License"); you may not use
4 | these files except in compliance with the License. You may obtain a copy of the
5 | License at
6 |
7 | http://www.apache.org/licenses/LICENSE-2.0
8 |
9 | Unless required by applicable law or agreed to in writing, software distributed
10 | under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
11 | CONDITIONS OF ANY KIND, either express or implied. See the License for the
12 | specific language governing permissions and limitations under the License.
13 |
--------------------------------------------------------------------------------
/NuGet.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/PublicApiAnalyzer.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 15
4 | VisualStudioVersion = 15.0.26906.1
5 | MinimumVisualStudioVersion = 15.0
6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PublicApiAnalyzer", "PublicApiAnalyzer\PublicApiAnalyzer\PublicApiAnalyzer.csproj", "{627985B3-0CF1-4BD4-AE60-E54214B8563C}"
7 | EndProject
8 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{A3ABF729-C055-4ED6-B72C-75ADB618D14A}"
9 | ProjectSection(SolutionItems) = preProject
10 | .nuget\packages.config = .nuget\packages.config
11 | EndProjectSection
12 | EndProject
13 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PublicApiAnalyzer.Test", "PublicApiAnalyzer\PublicApiAnalyzer.Test\PublicApiAnalyzer.Test.csproj", "{C489533B-81AA-4240-9B55-B0CF0054B9E9}"
14 | EndProject
15 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PublicApiAnalyzer.Vsix", "PublicApiAnalyzer\PublicApiAnalyzer.Vsix\PublicApiAnalyzer.Vsix.csproj", "{B6281E4F-86D6-4526-9BA9-357CCF7B77B9}"
16 | EndProject
17 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{518166A7-F023-490D-B092-FEF1447EBC3B}"
18 | ProjectSection(SolutionItems) = preProject
19 | appveyor.yml = appveyor.yml
20 | CONTRIBUTING.md = CONTRIBUTING.md
21 | LICENSE = LICENSE
22 | README.md = README.md
23 | THIRD-PARTY-NOTICES.txt = THIRD-PARTY-NOTICES.txt
24 | EndProjectSection
25 | EndProject
26 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{7B1E5C00-D8DB-41A6-AEB4-671EF3AD3586}"
27 | ProjectSection(SolutionItems) = preProject
28 | build\build.ps1 = build\build.ps1
29 | PublicApiAnalyzer\Directory.Build.props = PublicApiAnalyzer\Directory.Build.props
30 | PublicApiAnalyzer\Directory.Build.targets = PublicApiAnalyzer\Directory.Build.targets
31 | build\opencover-report.ps1 = build\opencover-report.ps1
32 | EndProjectSection
33 | EndProject
34 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PublicApiAnalyzer.CodeFixes", "PublicApiAnalyzer\PublicApiAnalyzer.CodeFixes\PublicApiAnalyzer.CodeFixes.csproj", "{8974DAEA-DD04-44B4-86A2-B430D066E9A1}"
35 | EndProject
36 | Global
37 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
38 | Debug|Any CPU = Debug|Any CPU
39 | Release|Any CPU = Release|Any CPU
40 | EndGlobalSection
41 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
42 | {627985B3-0CF1-4BD4-AE60-E54214B8563C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
43 | {627985B3-0CF1-4BD4-AE60-E54214B8563C}.Debug|Any CPU.Build.0 = Debug|Any CPU
44 | {627985B3-0CF1-4BD4-AE60-E54214B8563C}.Release|Any CPU.ActiveCfg = Release|Any CPU
45 | {627985B3-0CF1-4BD4-AE60-E54214B8563C}.Release|Any CPU.Build.0 = Release|Any CPU
46 | {C489533B-81AA-4240-9B55-B0CF0054B9E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
47 | {C489533B-81AA-4240-9B55-B0CF0054B9E9}.Debug|Any CPU.Build.0 = Debug|Any CPU
48 | {C489533B-81AA-4240-9B55-B0CF0054B9E9}.Release|Any CPU.ActiveCfg = Release|Any CPU
49 | {C489533B-81AA-4240-9B55-B0CF0054B9E9}.Release|Any CPU.Build.0 = Release|Any CPU
50 | {B6281E4F-86D6-4526-9BA9-357CCF7B77B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
51 | {B6281E4F-86D6-4526-9BA9-357CCF7B77B9}.Debug|Any CPU.Build.0 = Debug|Any CPU
52 | {B6281E4F-86D6-4526-9BA9-357CCF7B77B9}.Release|Any CPU.ActiveCfg = Release|Any CPU
53 | {B6281E4F-86D6-4526-9BA9-357CCF7B77B9}.Release|Any CPU.Build.0 = Release|Any CPU
54 | {8974DAEA-DD04-44B4-86A2-B430D066E9A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
55 | {8974DAEA-DD04-44B4-86A2-B430D066E9A1}.Debug|Any CPU.Build.0 = Debug|Any CPU
56 | {8974DAEA-DD04-44B4-86A2-B430D066E9A1}.Release|Any CPU.ActiveCfg = Release|Any CPU
57 | {8974DAEA-DD04-44B4-86A2-B430D066E9A1}.Release|Any CPU.Build.0 = Release|Any CPU
58 | EndGlobalSection
59 | GlobalSection(SolutionProperties) = preSolution
60 | HideSolutionNode = FALSE
61 | EndGlobalSection
62 | GlobalSection(ExtensibilityGlobals) = postSolution
63 | SolutionGuid = {F897640F-51AE-4982-B0D2-FB5F255A8549}
64 | EndGlobalSection
65 | EndGlobal
66 |
--------------------------------------------------------------------------------
/PublicApiAnalyzer/Directory.Build.props:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | An analyzer for packages with public APIs.
6 | Public API Analyzer
7 | Tunnel Vision Laboratories, LLC
8 | Copyright © Tunnel Vision Laboratories, LLC 2015
9 | en-US
10 |
11 |
12 |
13 | False
14 |
15 |
16 |
17 | 7.1
18 | strict
19 |
20 |
21 |
22 |
23 | true
24 |
25 |
26 |
27 | portable
28 | true
29 |
30 |
31 |
32 |
39 | True
40 | $(NoWarn),1573,1591
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 | stylecop.json
62 |
63 |
64 |
65 |
--------------------------------------------------------------------------------
/PublicApiAnalyzer/Directory.Build.targets:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/PublicApiAnalyzer/PublicApiAnalyzer.CodeFixes/ApiDesign/DeclarePublicAPIFix.cs:
--------------------------------------------------------------------------------
1 | // Copyright (c) Tunnel Vision Laboratories, LLC. All Rights Reserved.
2 | // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
3 |
4 | namespace PublicApiAnalyzer.ApiDesign
5 | {
6 | using System;
7 | using System.Collections.Generic;
8 | using System.Collections.Immutable;
9 | using System.Composition;
10 | using System.Diagnostics;
11 | using System.Linq;
12 | using System.Threading;
13 | using System.Threading.Tasks;
14 | using Microsoft.CodeAnalysis;
15 | using Microsoft.CodeAnalysis.CodeActions;
16 | using Microsoft.CodeAnalysis.CodeFixes;
17 | using Microsoft.CodeAnalysis.Text;
18 |
19 | [ExportCodeFixProvider(LanguageNames.CSharp, LanguageNames.VisualBasic, Name = "DeclarePublicAPIFix")]
20 | [Shared]
21 | internal sealed class DeclarePublicAPIFix : CodeFixProvider
22 | {
23 | public sealed override ImmutableArray FixableDiagnosticIds { get; } =
24 | ImmutableArray.Create(RoslynDiagnosticIds.DeclarePublicApiRuleId);
25 |
26 | public sealed override FixAllProvider GetFixAllProvider()
27 | {
28 | return new PublicSurfaceAreaFixAllProvider();
29 | }
30 |
31 | public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context)
32 | {
33 | var project = context.Document.Project;
34 | TextDocument publicSurfaceAreaDocument = GetPublicSurfaceAreaDocument(project);
35 | if (publicSurfaceAreaDocument == null)
36 | {
37 | return;
38 | }
39 |
40 | var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false);
41 | var semanticModel = await context.Document.GetSemanticModelAsync(context.CancellationToken).ConfigureAwait(false);
42 | foreach (var diagnostic in context.Diagnostics)
43 | {
44 | string minimalSymbolName = diagnostic.Properties[DeclarePublicAPIAnalyzer.MinimalNamePropertyBagKey];
45 | string publicSurfaceAreaSymbolName = diagnostic.Properties[DeclarePublicAPIAnalyzer.PublicApiNamePropertyBagKey];
46 | ImmutableHashSet siblingSymbolNamesToRemove = diagnostic.Properties[DeclarePublicAPIAnalyzer.PublicApiNamesOfSiblingsToRemovePropertyBagKey]
47 | .Split(DeclarePublicAPIAnalyzer.PublicApiNamesOfSiblingsToRemovePropertyBagValueSeparator.ToCharArray())
48 | .ToImmutableHashSet();
49 |
50 | context.RegisterCodeFix(
51 | new AdditionalDocumentChangeAction(
52 | $"Add {minimalSymbolName} to public API",
53 | c => this.GetFixAsync(publicSurfaceAreaDocument, publicSurfaceAreaSymbolName, siblingSymbolNamesToRemove, c)),
54 | diagnostic);
55 | }
56 | }
57 |
58 | private static TextDocument GetPublicSurfaceAreaDocument(Project project)
59 | {
60 | return project.AdditionalDocuments.FirstOrDefault(doc => doc.Name.Equals(DeclarePublicAPIAnalyzer.UnshippedFileName, StringComparison.Ordinal));
61 | }
62 |
63 | private static SourceText AddSymbolNamesToSourceText(SourceText sourceText, IEnumerable newSymbolNames)
64 | {
65 | HashSet lines = GetLinesFromSourceText(sourceText);
66 |
67 | foreach (string name in newSymbolNames)
68 | {
69 | lines.Add(name);
70 | }
71 |
72 | var sortedLines = lines.OrderBy(s => s, StringComparer.Ordinal);
73 |
74 | var newSourceText = sourceText.Replace(new TextSpan(0, sourceText.Length), string.Join(Environment.NewLine, sortedLines) + GetEndOfFileText(sourceText));
75 | return newSourceText;
76 | }
77 |
78 | private static SourceText RemoveSymbolNamesFromSourceText(SourceText sourceText, ImmutableHashSet linesToRemove)
79 | {
80 | if (linesToRemove.IsEmpty)
81 | {
82 | return sourceText;
83 | }
84 |
85 | var lines = GetLinesFromSourceText(sourceText);
86 | var newLines = lines.Where(line => !linesToRemove.Contains(line));
87 |
88 | var sortedLines = newLines.OrderBy(s => s, StringComparer.Ordinal);
89 |
90 | string newText = sortedLines.Any() ? string.Join(Environment.NewLine, sortedLines) + GetEndOfFileText(sourceText) : string.Empty;
91 | var newSourceText = sourceText.Replace(new TextSpan(0, sourceText.Length), newText);
92 | return newSourceText;
93 | }
94 |
95 | private static HashSet GetLinesFromSourceText(SourceText sourceText)
96 | {
97 | var lines = new HashSet();
98 |
99 | foreach (var textLine in sourceText.Lines)
100 | {
101 | string text = textLine.ToString();
102 | if (!string.IsNullOrWhiteSpace(text))
103 | {
104 | lines.Add(text);
105 | }
106 | }
107 |
108 | return lines;
109 | }
110 |
111 | ///
112 | /// Returns the trailing newline from the end of , if one exists.
113 | ///
114 | /// The source text.
115 | /// if ends with a trailing newline;
116 | /// otherwise, .
117 | private static string GetEndOfFileText(SourceText sourceText)
118 | {
119 | if (sourceText.Length == 0)
120 | {
121 | // An empty file is treated as though it ends with an empty line
122 | return Environment.NewLine;
123 | }
124 |
125 | var lastLine = sourceText.Lines[sourceText.Lines.Count - 1];
126 | return lastLine.Span.IsEmpty ? Environment.NewLine : string.Empty;
127 | }
128 |
129 | private async Task GetFixAsync(TextDocument publicSurfaceAreaDocument, string newSymbolName, ImmutableHashSet siblingSymbolNamesToRemove, CancellationToken cancellationToken)
130 | {
131 | var sourceText = await publicSurfaceAreaDocument.GetTextAsync(cancellationToken).ConfigureAwait(false);
132 | var newSourceText = AddSymbolNamesToSourceText(sourceText, new[] { newSymbolName });
133 | newSourceText = RemoveSymbolNamesFromSourceText(newSourceText, siblingSymbolNamesToRemove);
134 |
135 | return publicSurfaceAreaDocument.Project.Solution.WithAdditionalDocumentText(publicSurfaceAreaDocument.Id, newSourceText);
136 | }
137 |
138 | private class AdditionalDocumentChangeAction : CodeAction
139 | {
140 | private readonly Func> createChangedAdditionalDocument;
141 |
142 | public AdditionalDocumentChangeAction(string title, Func> createChangedAdditionalDocument)
143 | {
144 | this.Title = title;
145 | this.createChangedAdditionalDocument = createChangedAdditionalDocument;
146 | }
147 |
148 | public override string Title { get; }
149 |
150 | public override string EquivalenceKey => this.Title;
151 |
152 | protected override Task GetChangedSolutionAsync(CancellationToken cancellationToken)
153 | {
154 | return this.createChangedAdditionalDocument(cancellationToken);
155 | }
156 | }
157 |
158 | private class FixAllAdditionalDocumentChangeAction : CodeAction
159 | {
160 | private readonly List>> diagnosticsToFix;
161 | private readonly Solution solution;
162 |
163 | public FixAllAdditionalDocumentChangeAction(string title, Solution solution, List>> diagnosticsToFix)
164 | {
165 | this.Title = title;
166 | this.solution = solution;
167 | this.diagnosticsToFix = diagnosticsToFix;
168 | }
169 |
170 | public override string Title { get; }
171 |
172 | protected override async Task GetChangedSolutionAsync(CancellationToken cancellationToken)
173 | {
174 | var updatedPublicSurfaceAreaText = new List>();
175 |
176 | foreach (var pair in this.diagnosticsToFix)
177 | {
178 | var project = pair.Key;
179 | var diagnostics = pair.Value;
180 |
181 | var publicSurfaceAreaAdditionalDocument = GetPublicSurfaceAreaDocument(project);
182 |
183 | if (publicSurfaceAreaAdditionalDocument == null)
184 | {
185 | continue;
186 | }
187 |
188 | var sourceText = await publicSurfaceAreaAdditionalDocument.GetTextAsync(cancellationToken).ConfigureAwait(false);
189 |
190 | var groupedDiagnostics =
191 | diagnostics
192 | .Where(d => d.Location.IsInSource)
193 | .GroupBy(d => d.Location.SourceTree);
194 |
195 | var newSymbolNames = new List();
196 | var symbolNamesToRemoveBuilder = ImmutableHashSet.CreateBuilder();
197 |
198 | foreach (var grouping in groupedDiagnostics)
199 | {
200 | var document = project.GetDocument(grouping.Key);
201 |
202 | if (document == null)
203 | {
204 | continue;
205 | }
206 |
207 | var root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
208 | var semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);
209 |
210 | foreach (var diagnostic in grouping)
211 | {
212 | string publicSurfaceAreaSymbolName = diagnostic.Properties[DeclarePublicAPIAnalyzer.PublicApiNamePropertyBagKey];
213 |
214 | newSymbolNames.Add(publicSurfaceAreaSymbolName);
215 |
216 | string siblingNamesToRemove = diagnostic.Properties[DeclarePublicAPIAnalyzer.PublicApiNamesOfSiblingsToRemovePropertyBagKey];
217 | if (siblingNamesToRemove.Length > 0)
218 | {
219 | var namesToRemove = siblingNamesToRemove.Split(DeclarePublicAPIAnalyzer.PublicApiNamesOfSiblingsToRemovePropertyBagValueSeparator.ToCharArray());
220 | foreach (var nameToRemove in namesToRemove)
221 | {
222 | symbolNamesToRemoveBuilder.Add(nameToRemove);
223 | }
224 | }
225 | }
226 | }
227 |
228 | var symbolNamesToRemove = symbolNamesToRemoveBuilder.ToImmutable();
229 |
230 | // We shouldn't be attempting to remove any symbol name, while also adding it.
231 | Debug.Assert(newSymbolNames.All(newSymbolName => !symbolNamesToRemove.Contains(newSymbolName)), "Assertion failed: newSymbolNames.All(newSymbolName => !symbolNamesToRemove.Contains(newSymbolName))");
232 |
233 | var newSourceText = AddSymbolNamesToSourceText(sourceText, newSymbolNames);
234 | newSourceText = RemoveSymbolNamesFromSourceText(newSourceText, symbolNamesToRemove);
235 |
236 | updatedPublicSurfaceAreaText.Add(new KeyValuePair(publicSurfaceAreaAdditionalDocument.Id, newSourceText));
237 | }
238 |
239 | var newSolution = this.solution;
240 |
241 | foreach (var pair in updatedPublicSurfaceAreaText)
242 | {
243 | newSolution = newSolution.WithAdditionalDocumentText(pair.Key, pair.Value);
244 | }
245 |
246 | return newSolution;
247 | }
248 | }
249 |
250 | private class PublicSurfaceAreaFixAllProvider : FixAllProvider
251 | {
252 | public override async Task GetFixAsync(FixAllContext fixAllContext)
253 | {
254 | var diagnosticsToFix = new List>>();
255 | string titleFormat = "Add all items in {0} {1} to the public API";
256 | string title = null;
257 |
258 | switch (fixAllContext.Scope)
259 | {
260 | case FixAllScope.Document:
261 | {
262 | var diagnostics = await fixAllContext.GetDocumentDiagnosticsAsync(fixAllContext.Document).ConfigureAwait(false);
263 | diagnosticsToFix.Add(new KeyValuePair>(fixAllContext.Project, diagnostics));
264 | title = string.Format(titleFormat, "document", fixAllContext.Document.Name);
265 | break;
266 | }
267 |
268 | case FixAllScope.Project:
269 | {
270 | var project = fixAllContext.Project;
271 | var diagnostics = await fixAllContext.GetAllDiagnosticsAsync(project).ConfigureAwait(false);
272 | diagnosticsToFix.Add(new KeyValuePair>(fixAllContext.Project, diagnostics));
273 | title = string.Format(titleFormat, "project", fixAllContext.Project.Name);
274 | break;
275 | }
276 |
277 | case FixAllScope.Solution:
278 | {
279 | foreach (var project in fixAllContext.Solution.Projects)
280 | {
281 | var diagnostics = await fixAllContext.GetAllDiagnosticsAsync(project).ConfigureAwait(false);
282 | diagnosticsToFix.Add(new KeyValuePair>(project, diagnostics));
283 | }
284 |
285 | title = "Add all items in the solution to the public API";
286 | break;
287 | }
288 |
289 | case FixAllScope.Custom:
290 | return null;
291 |
292 | default:
293 | break;
294 | }
295 |
296 | return new FixAllAdditionalDocumentChangeAction(title, fixAllContext.Solution, diagnosticsToFix);
297 | }
298 | }
299 | }
300 | }
301 |
--------------------------------------------------------------------------------
/PublicApiAnalyzer/PublicApiAnalyzer.CodeFixes/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | // Copyright (c) Tunnel Vision Laboratories, LLC. All Rights Reserved.
2 | // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
3 |
4 | using System;
5 | using System.Reflection;
6 | using System.Runtime.CompilerServices;
7 | using System.Runtime.InteropServices;
8 |
9 | // General Information about an assembly is controlled through the following
10 | // set of attributes. Change these attribute values to modify the information
11 | // associated with an assembly.
12 | [assembly: AssemblyTrademark("")]
13 | [assembly: AssemblyCulture("")]
14 | [assembly: CLSCompliant(false)]
15 |
16 | // Setting ComVisible to false makes the types in this assembly not visible
17 | // to COM components. If you need to access a type in this assembly from
18 | // COM, set the ComVisible attribute to true on that type.
19 | [assembly: ComVisible(false)]
20 |
21 | [assembly: InternalsVisibleTo("PublicApiAnalyzer.Test, PublicKey=00240000048000009400000006020000002400005253413100040000010001008d7949d002a66db66875775e2b20a3bbf6589ea56624495d375c3d1f15d2517d2baa654575f5384b91edf0e3951c0c85a7a0228391d6a92134b14d8720e3926338e4f5b349f8066f2f98a8a83263bb54ba74a41a91ca51e02f4a3feb666a578bb38bd275397051ef4532b03256a159a9fa54102ce3d5718e5afbd794ee15df92")]
22 |
--------------------------------------------------------------------------------
/PublicApiAnalyzer/PublicApiAnalyzer.CodeFixes/PublicAPI.Shipped.txt:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/PublicApiAnalyzer/PublicApiAnalyzer.CodeFixes/PublicAPI.Unshipped.txt:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/PublicApiAnalyzer/PublicApiAnalyzer.CodeFixes/PublicApiAnalyzer.CodeFixes.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | netstandard1.1;net452
6 | PublicApiAnalyzer
7 | true
8 | true
9 | PublicApiAnalyzer.nuspec
10 | PublicApiAnalyzer.Metadata.nuspec
11 |
12 |
13 |
14 |
15 | $(NoWarn),NU5105
16 |
17 |
18 |
19 |
20 |
21 | portable-net45+win8
22 |
23 |
24 |
25 |
26 |
27 | ..\PublicApiAnalyzer.ruleset
28 |
29 |
30 |
31 | true
32 | ..\..\build\keys\PublicApiAnalyzer.snk
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 | DotNetAnalyzers.PublicApiAnalyzer
58 | $(BaseNuspecId)
59 | $(BaseNuspecId)
60 |
61 | $(BaseNuspecId).Unstable
62 | $(BaseNuspecId).Unstable
63 |
64 | $(ImplementationNuspecId)
65 | $(MetadataNuspecId)
66 |
67 | $(AssemblyVersion)
68 | $(NuspecUnstableVersion)-g$(GitCommitIdShort)
69 | $(PackageVersion)
70 |
71 | true
72 |
73 | $(NuspecStableVersion)
74 | $(NuspecUnstableVersion)
75 |
76 | $(NuspecUnstableVersion)
77 | $(NuspecStableVersion)
78 |
79 | id=$(NuspecId);configuration=$(Configuration);GitCommitIdShort=$(GitCommitIdShort);version=$(NuspecVersion);tag=$(NuspecStableVersion);implId=$(ImplementationNuspecId);implVersion=$(ImplementationNuspecVersion)
80 |
81 |
82 |
83 |
84 |
87 |
88 |
89 |
--------------------------------------------------------------------------------
/PublicApiAnalyzer/PublicApiAnalyzer.CodeFixes/PublicApiAnalyzer.Metadata.nuspec:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | $id$
5 | 0.0.0
6 | $id$
7 | Sam Harwell et. al.
8 | Sam Harwell
9 | https://raw.githubusercontent.com/DotNetAnalyzers/PublicApiAnalyzer/$GitCommitIdShort$/LICENSE
10 | https://github.com/DotNetAnalyzers/PublicApiAnalyzer
11 | false
12 | An analyzer for packages with public APIs.
13 | https://github.com/DotNetAnalyzers/PublicApiAnalyzer/releases/$tag$
14 | Copyright Sam Harwell 2015
15 | API DotNetAnalyzers Roslyn Diagnostic Analyzer
16 | true
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/PublicApiAnalyzer/PublicApiAnalyzer.CodeFixes/PublicApiAnalyzer.nuspec:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | $id$
5 | 0.0.0
6 | $id$
7 | Sam Harwell et. al.
8 | Sam Harwell
9 | https://raw.githubusercontent.com/DotNetAnalyzers/PublicApiAnalyzer/$version$/LICENSE
10 | https://github.com/DotNetAnalyzers/PublicApiAnalyzer
11 | false
12 | An analyzer for packages with public APIs.
13 | https://github.com/DotNetAnalyzers/PublicApiAnalyzer/releases/$version$
14 | Copyright Sam Harwell 2015
15 | API DotNetAnalyzers Roslyn Diagnostic Analyzer
16 | true
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/PublicApiAnalyzer/PublicApiAnalyzer.CodeFixes/tools/install.ps1:
--------------------------------------------------------------------------------
1 | param($installPath, $toolsPath, $package, $project)
2 |
3 | $analyzersPaths = Join-Path (Join-Path (Split-Path -Path $toolsPath -Parent) "analyzers" ) * -Resolve
4 |
5 | foreach($analyzersPath in $analyzersPaths)
6 | {
7 | # Install the language agnostic analyzers.
8 | if (Test-Path $analyzersPath)
9 | {
10 | foreach ($analyzerFilePath in Get-ChildItem $analyzersPath -Filter *.dll)
11 | {
12 | if($project.Object.AnalyzerReferences)
13 | {
14 | $project.Object.AnalyzerReferences.Add($analyzerFilePath.FullName)
15 | }
16 | }
17 | }
18 | }
19 |
20 | # $project.Type gives the language name like (C# or VB.NET)
21 | $languageFolder = ""
22 | if($project.Type -eq "C#")
23 | {
24 | $languageFolder = "cs"
25 | }
26 | if($project.Type -eq "VB.NET")
27 | {
28 | $languageFolder = "vb"
29 | }
30 | if($languageFolder -eq "")
31 | {
32 | return
33 | }
34 |
35 | foreach($analyzersPath in $analyzersPaths)
36 | {
37 | # Install language specific analyzers.
38 | $languageAnalyzersPath = join-path $analyzersPath $languageFolder
39 | if (Test-Path $languageAnalyzersPath)
40 | {
41 | foreach ($analyzerFilePath in Get-ChildItem $languageAnalyzersPath -Filter *.dll)
42 | {
43 | if($project.Object.AnalyzerReferences)
44 | {
45 | $project.Object.AnalyzerReferences.Add($analyzerFilePath.FullName)
46 | }
47 | }
48 | }
49 | }
50 | # SIG # Begin signature block
51 | # MIIaoQYJKoZIhvcNAQcCoIIakjCCGo4CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
52 | # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
53 | # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU2Q/XtUMgeda05ZRH6iWmJDPu
54 | # oTCgghWCMIIEwzCCA6ugAwIBAgITMwAAAHPGWcJSl4OjOgAAAAAAczANBgkqhkiG
55 | # 9w0BAQUFADB3MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G
56 | # A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEw
57 | # HwYDVQQDExhNaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EwHhcNMTUwMzIwMTczMjA0
58 | # WhcNMTYwNjIwMTczMjA0WjCBszELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
59 | # bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
60 | # b3JhdGlvbjENMAsGA1UECxMETU9QUjEnMCUGA1UECxMebkNpcGhlciBEU0UgRVNO
61 | # OkJCRUMtMzBDQS0yREJFMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBT
62 | # ZXJ2aWNlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp0QvcscV762c
63 | # vJQkN4+yFC55LDaPb7KevwD6jHhhG5S5Uij0cT8HGE/y6Je/f3Ow4zVsoSviUbYn
64 | # qqI1ASnzKaVQ3natkrIUuQ8Mllkya3MeSL9Q877ogSskJFB0fOph5o8RAe6yfSD1
65 | # CkMqVGVAxRwMNFDik+TCDS7gUJlQaAZ9h3v2jQWOR+Xt0ELjY93j7iXPqVCjT4K7
66 | # x5WFfasB4FBCFeBZg8lR4D2gKOh/gnzSuRoCHqhzdFfIf7gJs7pF4EfCdNSp2BLX
67 | # Lxuc1K567c/CWXMh3LDjZMMd5i8EvFv9ssV+Nua6VnlcHRWrsaB9FygH8+OpkVg8
68 | # tkWf1jVh3QIDAQABo4IBCTCCAQUwHQYDVR0OBBYEFDUsc4HZ7HD5Sj2P/0fAfApo
69 | # obgbMB8GA1UdIwQYMBaAFCM0+NlSRnAK7UD7dvuzK7DDNbMPMFQGA1UdHwRNMEsw
70 | # SaBHoEWGQ2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3Rz
71 | # L01pY3Jvc29mdFRpbWVTdGFtcFBDQS5jcmwwWAYIKwYBBQUHAQEETDBKMEgGCCsG
72 | # AQUFBzAChjxodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY3Jv
73 | # c29mdFRpbWVTdGFtcFBDQS5jcnQwEwYDVR0lBAwwCgYIKwYBBQUHAwgwDQYJKoZI
74 | # hvcNAQEFBQADggEBABhW2Lwu5/R0+yuB1kWyYWp9G8CaWAHqZhnXuCn1jzz09iI2
75 | # d1FUmQud9f7Fg9U7F18kV7sSywfz8omzn+eIMTZc0N0QbbGdHG5zeUCA26QRbUwQ
76 | # 6BCVoUNlxEgptx5suXvzd7dgvF0jpzSnWPUVzaasjBvdqMfy/L2f24Jaiu9s8vsu
77 | # w79c0Y2DVhPd4x2T7ReueUVSCxzhK8AzUN271fiW2JRLQ0tRCF8tnA5TKJe7RuvG
78 | # emKndxIklRnPRf1Y2R0getwBvO8Lg3pDeZDUR+AIteZ96oBsSHnsJwxb8T45Ur6a
79 | # lIw5sEMholc7XInenHZH5DEg0aJpQ86Btpv5rzgwggTsMIID1KADAgECAhMzAAAB
80 | # Cix5rtd5e6asAAEAAAEKMA0GCSqGSIb3DQEBBQUAMHkxCzAJBgNVBAYTAlVTMRMw
81 | # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
82 | # aWNyb3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jvc29mdCBDb2RlIFNp
83 | # Z25pbmcgUENBMB4XDTE1MDYwNDE3NDI0NVoXDTE2MDkwNDE3NDI0NVowgYMxCzAJ
84 | # BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k
85 | # MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xDTALBgNVBAsTBE1PUFIx
86 | # HjAcBgNVBAMTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjCCASIwDQYJKoZIhvcNAQEB
87 | # BQADggEPADCCAQoCggEBAJL8bza74QO5KNZG0aJhuqVG+2MWPi75R9LH7O3HmbEm
88 | # UXW92swPBhQRpGwZnsBfTVSJ5E1Q2I3NoWGldxOaHKftDXT3p1Z56Cj3U9KxemPg
89 | # 9ZSXt+zZR/hsPfMliLO8CsUEp458hUh2HGFGqhnEemKLwcI1qvtYb8VjC5NJMIEb
90 | # e99/fE+0R21feByvtveWE1LvudFNOeVz3khOPBSqlw05zItR4VzRO/COZ+owYKlN
91 | # Wp1DvdsjusAP10sQnZxN8FGihKrknKc91qPvChhIqPqxTqWYDku/8BTzAMiwSNZb
92 | # /jjXiREtBbpDAk8iAJYlrX01boRoqyAYOCj+HKIQsaUCAwEAAaOCAWAwggFcMBMG
93 | # A1UdJQQMMAoGCCsGAQUFBwMDMB0GA1UdDgQWBBSJ/gox6ibN5m3HkZG5lIyiGGE3
94 | # NDBRBgNVHREESjBIpEYwRDENMAsGA1UECxMETU9QUjEzMDEGA1UEBRMqMzE1OTUr
95 | # MDQwNzkzNTAtMTZmYS00YzYwLWI2YmYtOWQyYjFjZDA1OTg0MB8GA1UdIwQYMBaA
96 | # FMsR6MrStBZYAck3LjMWFrlMmgofMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9j
97 | # cmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY0NvZFNpZ1BDQV8w
98 | # OC0zMS0yMDEwLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6
99 | # Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljQ29kU2lnUENBXzA4LTMx
100 | # LTIwMTAuY3J0MA0GCSqGSIb3DQEBBQUAA4IBAQCmqFOR3zsB/mFdBlrrZvAM2PfZ
101 | # hNMAUQ4Q0aTRFyjnjDM4K9hDxgOLdeszkvSp4mf9AtulHU5DRV0bSePgTxbwfo/w
102 | # iBHKgq2k+6apX/WXYMh7xL98m2ntH4LB8c2OeEti9dcNHNdTEtaWUu81vRmOoECT
103 | # oQqlLRacwkZ0COvb9NilSTZUEhFVA7N7FvtH/vto/MBFXOI/Enkzou+Cxd5AGQfu
104 | # FcUKm1kFQanQl56BngNb/ErjGi4FrFBHL4z6edgeIPgF+ylrGBT6cgS3C6eaZOwR
105 | # XU9FSY0pGi370LYJU180lOAWxLnqczXoV+/h6xbDGMcGszvPYYTitkSJlKOGMIIF
106 | # vDCCA6SgAwIBAgIKYTMmGgAAAAAAMTANBgkqhkiG9w0BAQUFADBfMRMwEQYKCZIm
107 | # iZPyLGQBGRYDY29tMRkwFwYKCZImiZPyLGQBGRYJbWljcm9zb2Z0MS0wKwYDVQQD
108 | # EyRNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMTAwODMx
109 | # MjIxOTMyWhcNMjAwODMxMjIyOTMyWjB5MQswCQYDVQQGEwJVUzETMBEGA1UECBMK
110 | # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0
111 | # IENvcnBvcmF0aW9uMSMwIQYDVQQDExpNaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBD
112 | # QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJyWVwZMGS/HZpgICBC
113 | # mXZTbD4b1m/My/Hqa/6XFhDg3zp0gxq3L6Ay7P/ewkJOI9VyANs1VwqJyq4gSfTw
114 | # aKxNS42lvXlLcZtHB9r9Jd+ddYjPqnNEf9eB2/O98jakyVxF3K+tPeAoaJcap6Vy
115 | # c1bxF5Tk/TWUcqDWdl8ed0WDhTgW0HNbBbpnUo2lsmkv2hkL/pJ0KeJ2L1TdFDBZ
116 | # +NKNYv3LyV9GMVC5JxPkQDDPcikQKCLHN049oDI9kM2hOAaFXE5WgigqBTK3S9dP
117 | # Y+fSLWLxRT3nrAgA9kahntFbjCZT6HqqSvJGzzc8OJ60d1ylF56NyxGPVjzBrAlf
118 | # A9MCAwEAAaOCAV4wggFaMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMsR6MrS
119 | # tBZYAck3LjMWFrlMmgofMAsGA1UdDwQEAwIBhjASBgkrBgEEAYI3FQEEBQIDAQAB
120 | # MCMGCSsGAQQBgjcVAgQWBBT90TFO0yaKleGYYDuoMW+mPLzYLTAZBgkrBgEEAYI3
121 | # FAIEDB4KAFMAdQBiAEMAQTAfBgNVHSMEGDAWgBQOrIJgQFYnl+UlE/wq4QpTlVnk
122 | # pDBQBgNVHR8ESTBHMEWgQ6BBhj9odHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtp
123 | # L2NybC9wcm9kdWN0cy9taWNyb3NvZnRyb290Y2VydC5jcmwwVAYIKwYBBQUHAQEE
124 | # SDBGMEQGCCsGAQUFBzAChjhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2Nl
125 | # cnRzL01pY3Jvc29mdFJvb3RDZXJ0LmNydDANBgkqhkiG9w0BAQUFAAOCAgEAWTk+
126 | # fyZGr+tvQLEytWrrDi9uqEn361917Uw7LddDrQv+y+ktMaMjzHxQmIAhXaw9L0y6
127 | # oqhWnONwu7i0+Hm1SXL3PupBf8rhDBdpy6WcIC36C1DEVs0t40rSvHDnqA2iA6VW
128 | # 4LiKS1fylUKc8fPv7uOGHzQ8uFaa8FMjhSqkghyT4pQHHfLiTviMocroE6WRTsgb
129 | # 0o9ylSpxbZsa+BzwU9ZnzCL/XB3Nooy9J7J5Y1ZEolHN+emjWFbdmwJFRC9f9Nqu
130 | # 1IIybvyklRPk62nnqaIsvsgrEA5ljpnb9aL6EiYJZTiU8XofSrvR4Vbo0HiWGFzJ
131 | # NRZf3ZMdSY4tvq00RBzuEBUaAF3dNVshzpjHCe6FDoxPbQ4TTj18KUicctHzbMrB
132 | # 7HCjV5JXfZSNoBtIA1r3z6NnCnSlNu0tLxfI5nI3EvRvsTxngvlSso0zFmUeDord
133 | # EN5k9G/ORtTTF+l5xAS00/ss3x+KnqwK+xMnQK3k+eGpf0a7B2BHZWBATrBC7E7t
134 | # s3Z52Ao0CW0cgDEf4g5U3eWh++VHEK1kmP9QFi58vwUheuKVQSdpw5OPlcmN2Jsh
135 | # rg1cnPCiroZogwxqLbt2awAdlq3yFnv2FoMkuYjPaqhHMS+a3ONxPdcAfmJH0c6I
136 | # ybgY+g5yjcGjPa8CQGr/aZuW4hCoELQ3UAjWwz0wggYHMIID76ADAgECAgphFmg0
137 | # AAAAAAAcMA0GCSqGSIb3DQEBBQUAMF8xEzARBgoJkiaJk/IsZAEZFgNjb20xGTAX
138 | # BgoJkiaJk/IsZAEZFgltaWNyb3NvZnQxLTArBgNVBAMTJE1pY3Jvc29mdCBSb290
139 | # IENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw0wNzA0MDMxMjUzMDlaFw0yMTA0MDMx
140 | # MzAzMDlaMHcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD
141 | # VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xITAf
142 | # BgNVBAMTGE1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQTCCASIwDQYJKoZIhvcNAQEB
143 | # BQADggEPADCCAQoCggEBAJ+hbLHf20iSKnxrLhnhveLjxZlRI1Ctzt0YTiQP7tGn
144 | # 0UytdDAgEesH1VSVFUmUG0KSrphcMCbaAGvoe73siQcP9w4EmPCJzB/LMySHnfL0
145 | # Zxws/HvniB3q506jocEjU8qN+kXPCdBer9CwQgSi+aZsk2fXKNxGU7CG0OUoRi4n
146 | # rIZPVVIM5AMs+2qQkDBuh/NZMJ36ftaXs+ghl3740hPzCLdTbVK0RZCfSABKR2YR
147 | # JylmqJfk0waBSqL5hKcRRxQJgp+E7VV4/gGaHVAIhQAQMEbtt94jRrvELVSfrx54
148 | # QTF3zJvfO4OToWECtR0Nsfz3m7IBziJLVP/5BcPCIAsCAwEAAaOCAaswggGnMA8G
149 | # A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFCM0+NlSRnAK7UD7dvuzK7DDNbMPMAsG
150 | # A1UdDwQEAwIBhjAQBgkrBgEEAYI3FQEEAwIBADCBmAYDVR0jBIGQMIGNgBQOrIJg
151 | # QFYnl+UlE/wq4QpTlVnkpKFjpGEwXzETMBEGCgmSJomT8ixkARkWA2NvbTEZMBcG
152 | # CgmSJomT8ixkARkWCW1pY3Jvc29mdDEtMCsGA1UEAxMkTWljcm9zb2Z0IFJvb3Qg
153 | # Q2VydGlmaWNhdGUgQXV0aG9yaXR5ghB5rRahSqClrUxzWPQHEy5lMFAGA1UdHwRJ
154 | # MEcwRaBDoEGGP2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1
155 | # Y3RzL21pY3Jvc29mdHJvb3RjZXJ0LmNybDBUBggrBgEFBQcBAQRIMEYwRAYIKwYB
156 | # BQUHMAKGOGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljcm9z
157 | # b2Z0Um9vdENlcnQuY3J0MBMGA1UdJQQMMAoGCCsGAQUFBwMIMA0GCSqGSIb3DQEB
158 | # BQUAA4ICAQAQl4rDXANENt3ptK132855UU0BsS50cVttDBOrzr57j7gu1BKijG1i
159 | # uFcCy04gE1CZ3XpA4le7r1iaHOEdAYasu3jyi9DsOwHu4r6PCgXIjUji8FMV3U+r
160 | # kuTnjWrVgMHmlPIGL4UD6ZEqJCJw+/b85HiZLg33B+JwvBhOnY5rCnKVuKE5nGct
161 | # xVEO6mJcPxaYiyA/4gcaMvnMMUp2MT0rcgvI6nA9/4UKE9/CCmGO8Ne4F+tOi3/F
162 | # NSteo7/rvH0LQnvUU3Ih7jDKu3hlXFsBFwoUDtLaFJj1PLlmWLMtL+f5hYbMUVbo
163 | # nXCUbKw5TNT2eb+qGHpiKe+imyk0BncaYsk9Hm0fgvALxyy7z0Oz5fnsfbXjpKh0
164 | # NbhOxXEjEiZ2CzxSjHFaRkMUvLOzsE1nyJ9C/4B5IYCeFTBm6EISXhrIniIh0EPp
165 | # K+m79EjMLNTYMoBMJipIJF9a6lbvpt6Znco6b72BJ3QGEe52Ib+bgsEnVLaxaj2J
166 | # oXZhtG6hE6a/qkfwEm/9ijJssv7fUciMI8lmvZ0dhxJkAj0tr1mPuOQh5bWwymO0
167 | # eFQF1EEuUKyUsKV4q7OglnUa2ZKHE3UiLzKoCG6gW4wlv6DvhMoh1useT8ma7kng
168 | # 9wFlb4kLfchpyOZu6qeXzjEp/w7FW1zYTRuh2Povnj8uVRZryROj/TGCBIkwggSF
169 | # AgEBMIGQMHkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD
170 | # VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xIzAh
171 | # BgNVBAMTGk1pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBAhMzAAABCix5rtd5e6as
172 | # AAEAAAEKMAkGBSsOAwIaBQCggaIwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw
173 | # HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFNWy
174 | # JYWiXrB52VhT/lC+8pUKXim8MEIGCisGAQQBgjcCAQwxNDAyoBiAFgBpAG4AcwB0
175 | # AGEAbABsAC4AcABzADGhFoAUaHR0cDovL21pY3Jvc29mdC5jb20wDQYJKoZIhvcN
176 | # AQEBBQAEggEAPijsy7fqbQghv6HRRRSMUi3S6UmVRRL/NIehIU4uTM0SniruHlUf
177 | # YBFAp5PhTCjaj2dNnFL6J4zIcaugqI3Shk6kuopA3Vd8YIiqMOc/9CJ3lRxJ3/nI
178 | # BBAAWpEYXo4xs2500Bco5TpoMUJORWUN15onwqGp+YIc/aWYX1Jtfqvb5oaiTcvI
179 | # 2OWx1dyFfpWxc56hX4eyo3Lj5l2454Z5bB40kzLX07qCgvY+MRYSd89P1uNUtBEB
180 | # qkaymzrmVkTMZaUn4YdyAHR7CfJ7sgMmiOyQ+YySDBDD6HPycGwLpdip93Bmjjfz
181 | # Yj/4ERbiVOPRRpa2GtCAsNXtPiw0SSaQJaGCAigwggIkBgkqhkiG9w0BCQYxggIV
182 | # MIICEQIBATCBjjB3MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ
183 | # MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
184 | # MSEwHwYDVQQDExhNaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0ECEzMAAABzxlnCUpeD
185 | # ozoAAAAAAHMwCQYFKw4DAhoFAKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEw
186 | # HAYJKoZIhvcNAQkFMQ8XDTE1MDYxOTAyNTk0OFowIwYJKoZIhvcNAQkEMRYEFGZQ
187 | # e8ojPYUl1DjvBan3KNtqFEJdMA0GCSqGSIb3DQEBBQUABIIBAJHjS6vTvsLIuzBU
188 | # xQdQopG+qV3hJzqh7u1uPdsknaqMLWjn9zF7Qy6q7gk17eCQ+uStUXdqMCYWqX6J
189 | # GkpaBZGZpmmQ2uEau2G6TuxdN4nVFAmlO5W+RbfLBTizjTH3/VRJsLiIHNu0JpmM
190 | # SjbuKpROk3wKYiUIsbWrHU0rpWmU6lX/xGv/zIZrMskzJ0Xas7+78S1zHeHlsoWS
191 | # TMNtcy+MJfhAfAg6AX1x9Ga7T4J2uT+zo16rMqkIgH/VGmS3+/1ZIMY92ev6BOps
192 | # smrx6ksElucvRtwE41kulKtPbziSPaIhCQyoIvvalwdjO+F0nd3lip/k4dJpUpzj
193 | # d2EmeyI=
194 | # SIG # End signature block
195 |
--------------------------------------------------------------------------------
/PublicApiAnalyzer/PublicApiAnalyzer.CodeFixes/tools/uninstall.ps1:
--------------------------------------------------------------------------------
1 | param($installPath, $toolsPath, $package, $project)
2 |
3 | $analyzersPaths = Join-Path (Join-Path (Split-Path -Path $toolsPath -Parent) "analyzers" ) * -Resolve
4 |
5 | foreach($analyzersPath in $analyzersPaths)
6 | {
7 | # Uninstall the language agnostic analyzers.
8 | if (Test-Path $analyzersPath)
9 | {
10 | foreach ($analyzerFilePath in Get-ChildItem $analyzersPath -Filter *.dll)
11 | {
12 | if($project.Object.AnalyzerReferences)
13 | {
14 | $project.Object.AnalyzerReferences.Remove($analyzerFilePath.FullName)
15 | }
16 | }
17 | }
18 | }
19 |
20 | # $project.Type gives the language name like (C# or VB.NET)
21 | $languageFolder = ""
22 | if($project.Type -eq "C#")
23 | {
24 | $languageFolder = "cs"
25 | }
26 | if($project.Type -eq "VB.NET")
27 | {
28 | $languageFolder = "vb"
29 | }
30 | if($languageFolder -eq "")
31 | {
32 | return
33 | }
34 |
35 | foreach($analyzersPath in $analyzersPaths)
36 | {
37 | # Uninstall language specific analyzers.
38 | $languageAnalyzersPath = join-path $analyzersPath $languageFolder
39 | if (Test-Path $languageAnalyzersPath)
40 | {
41 | foreach ($analyzerFilePath in Get-ChildItem $languageAnalyzersPath -Filter *.dll)
42 | {
43 | if($project.Object.AnalyzerReferences)
44 | {
45 | try
46 | {
47 | $project.Object.AnalyzerReferences.Remove($analyzerFilePath.FullName)
48 | }
49 | catch
50 | {
51 |
52 | }
53 | }
54 | }
55 | }
56 | }
57 | # SIG # Begin signature block
58 | # MIIapQYJKoZIhvcNAQcCoIIaljCCGpICAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
59 | # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
60 | # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUA+iPf06reDGl8vnuLnqw/MIv
61 | # 3FmgghWCMIIEwzCCA6ugAwIBAgITMwAAAHQNgGQOfWd9owAAAAAAdDANBgkqhkiG
62 | # 9w0BAQUFADB3MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G
63 | # A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEw
64 | # HwYDVQQDExhNaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EwHhcNMTUwMzIwMTczMjA1
65 | # WhcNMTYwNjIwMTczMjA1WjCBszELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
66 | # bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
67 | # b3JhdGlvbjENMAsGA1UECxMETU9QUjEnMCUGA1UECxMebkNpcGhlciBEU0UgRVNO
68 | # OjdEMkUtMzc4Mi1CMEY3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBT
69 | # ZXJ2aWNlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4NFrifjVvo5Y
70 | # gN/jD+4M6zszXn3GnmZHP9AerBSCDRiftpwnIvG2hpREQXSJkW8X9t+Y5jbLX3iS
71 | # 6XJ+S7kExWIUc3HGf2NBW+tk8r1cVWJGzA9ewQnEr9nxvyV94BegUO4lqkXl48Z+
72 | # vxBZqcGPPtn77GQbY1u1p7jq681X6xtD9WWRv1D1+cEGvH2qzDfnBqmgzLH1M8wN
73 | # ssh1ZgDRbTCTR8+OomdEXhoTf/McHucPncG8SPyBgW1UauJpE8bO9ZdnMmxIyhHC
74 | # VjrW3Dpi9PwQl2RIC4pc8RbClfDLYBukA5sMyfe7kr8Ac2czHKJ673VKGUZaDH6a
75 | # W6A6HVQ16wIDAQABo4IBCTCCAQUwHQYDVR0OBBYEFCUsOGYFtEU5DmC29u69PuDd
76 | # r4wNMB8GA1UdIwQYMBaAFCM0+NlSRnAK7UD7dvuzK7DDNbMPMFQGA1UdHwRNMEsw
77 | # SaBHoEWGQ2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3Rz
78 | # L01pY3Jvc29mdFRpbWVTdGFtcFBDQS5jcmwwWAYIKwYBBQUHAQEETDBKMEgGCCsG
79 | # AQUFBzAChjxodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY3Jv
80 | # c29mdFRpbWVTdGFtcFBDQS5jcnQwEwYDVR0lBAwwCgYIKwYBBQUHAwgwDQYJKoZI
81 | # hvcNAQEFBQADggEBAEEG50j6xJHcMBMNInjC0iPTszPL+yYh1978CncY+4Nyzu/U
82 | # LIaP4xXj1RICZ1xbN9MDe02RW0FTZgn9457fLHgJORo2HYqBocllfJx7kbIPSptB
83 | # 3cdEC2EFyUwu8rRrKKoIR+4IrGZUF1aQiMbpddAhEDh5yT+7VTDFpjmmU7/NXFbS
84 | # ThcUvGISy+lL8MWR3J2EypjWDttWFGht21OLMM+6J2V1oDFvk6N1EGDqqu7uduvl
85 | # jAup0655zzS+SR8i0MT1o+/zrjDcjohGI4ygqjyXrwfbdug2VN+Ls4mewOospGBr
86 | # 8d/DthI6rzM4elFxNTXm5AjiUZaC+b7hG4N8e2cwggTsMIID1KADAgECAhMzAAAB
87 | # Cix5rtd5e6asAAEAAAEKMA0GCSqGSIb3DQEBBQUAMHkxCzAJBgNVBAYTAlVTMRMw
88 | # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
89 | # aWNyb3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jvc29mdCBDb2RlIFNp
90 | # Z25pbmcgUENBMB4XDTE1MDYwNDE3NDI0NVoXDTE2MDkwNDE3NDI0NVowgYMxCzAJ
91 | # BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k
92 | # MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xDTALBgNVBAsTBE1PUFIx
93 | # HjAcBgNVBAMTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjCCASIwDQYJKoZIhvcNAQEB
94 | # BQADggEPADCCAQoCggEBAJL8bza74QO5KNZG0aJhuqVG+2MWPi75R9LH7O3HmbEm
95 | # UXW92swPBhQRpGwZnsBfTVSJ5E1Q2I3NoWGldxOaHKftDXT3p1Z56Cj3U9KxemPg
96 | # 9ZSXt+zZR/hsPfMliLO8CsUEp458hUh2HGFGqhnEemKLwcI1qvtYb8VjC5NJMIEb
97 | # e99/fE+0R21feByvtveWE1LvudFNOeVz3khOPBSqlw05zItR4VzRO/COZ+owYKlN
98 | # Wp1DvdsjusAP10sQnZxN8FGihKrknKc91qPvChhIqPqxTqWYDku/8BTzAMiwSNZb
99 | # /jjXiREtBbpDAk8iAJYlrX01boRoqyAYOCj+HKIQsaUCAwEAAaOCAWAwggFcMBMG
100 | # A1UdJQQMMAoGCCsGAQUFBwMDMB0GA1UdDgQWBBSJ/gox6ibN5m3HkZG5lIyiGGE3
101 | # NDBRBgNVHREESjBIpEYwRDENMAsGA1UECxMETU9QUjEzMDEGA1UEBRMqMzE1OTUr
102 | # MDQwNzkzNTAtMTZmYS00YzYwLWI2YmYtOWQyYjFjZDA1OTg0MB8GA1UdIwQYMBaA
103 | # FMsR6MrStBZYAck3LjMWFrlMmgofMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9j
104 | # cmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY0NvZFNpZ1BDQV8w
105 | # OC0zMS0yMDEwLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6
106 | # Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljQ29kU2lnUENBXzA4LTMx
107 | # LTIwMTAuY3J0MA0GCSqGSIb3DQEBBQUAA4IBAQCmqFOR3zsB/mFdBlrrZvAM2PfZ
108 | # hNMAUQ4Q0aTRFyjnjDM4K9hDxgOLdeszkvSp4mf9AtulHU5DRV0bSePgTxbwfo/w
109 | # iBHKgq2k+6apX/WXYMh7xL98m2ntH4LB8c2OeEti9dcNHNdTEtaWUu81vRmOoECT
110 | # oQqlLRacwkZ0COvb9NilSTZUEhFVA7N7FvtH/vto/MBFXOI/Enkzou+Cxd5AGQfu
111 | # FcUKm1kFQanQl56BngNb/ErjGi4FrFBHL4z6edgeIPgF+ylrGBT6cgS3C6eaZOwR
112 | # XU9FSY0pGi370LYJU180lOAWxLnqczXoV+/h6xbDGMcGszvPYYTitkSJlKOGMIIF
113 | # vDCCA6SgAwIBAgIKYTMmGgAAAAAAMTANBgkqhkiG9w0BAQUFADBfMRMwEQYKCZIm
114 | # iZPyLGQBGRYDY29tMRkwFwYKCZImiZPyLGQBGRYJbWljcm9zb2Z0MS0wKwYDVQQD
115 | # EyRNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMTAwODMx
116 | # MjIxOTMyWhcNMjAwODMxMjIyOTMyWjB5MQswCQYDVQQGEwJVUzETMBEGA1UECBMK
117 | # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0
118 | # IENvcnBvcmF0aW9uMSMwIQYDVQQDExpNaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBD
119 | # QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJyWVwZMGS/HZpgICBC
120 | # mXZTbD4b1m/My/Hqa/6XFhDg3zp0gxq3L6Ay7P/ewkJOI9VyANs1VwqJyq4gSfTw
121 | # aKxNS42lvXlLcZtHB9r9Jd+ddYjPqnNEf9eB2/O98jakyVxF3K+tPeAoaJcap6Vy
122 | # c1bxF5Tk/TWUcqDWdl8ed0WDhTgW0HNbBbpnUo2lsmkv2hkL/pJ0KeJ2L1TdFDBZ
123 | # +NKNYv3LyV9GMVC5JxPkQDDPcikQKCLHN049oDI9kM2hOAaFXE5WgigqBTK3S9dP
124 | # Y+fSLWLxRT3nrAgA9kahntFbjCZT6HqqSvJGzzc8OJ60d1ylF56NyxGPVjzBrAlf
125 | # A9MCAwEAAaOCAV4wggFaMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMsR6MrS
126 | # tBZYAck3LjMWFrlMmgofMAsGA1UdDwQEAwIBhjASBgkrBgEEAYI3FQEEBQIDAQAB
127 | # MCMGCSsGAQQBgjcVAgQWBBT90TFO0yaKleGYYDuoMW+mPLzYLTAZBgkrBgEEAYI3
128 | # FAIEDB4KAFMAdQBiAEMAQTAfBgNVHSMEGDAWgBQOrIJgQFYnl+UlE/wq4QpTlVnk
129 | # pDBQBgNVHR8ESTBHMEWgQ6BBhj9odHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtp
130 | # L2NybC9wcm9kdWN0cy9taWNyb3NvZnRyb290Y2VydC5jcmwwVAYIKwYBBQUHAQEE
131 | # SDBGMEQGCCsGAQUFBzAChjhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2Nl
132 | # cnRzL01pY3Jvc29mdFJvb3RDZXJ0LmNydDANBgkqhkiG9w0BAQUFAAOCAgEAWTk+
133 | # fyZGr+tvQLEytWrrDi9uqEn361917Uw7LddDrQv+y+ktMaMjzHxQmIAhXaw9L0y6
134 | # oqhWnONwu7i0+Hm1SXL3PupBf8rhDBdpy6WcIC36C1DEVs0t40rSvHDnqA2iA6VW
135 | # 4LiKS1fylUKc8fPv7uOGHzQ8uFaa8FMjhSqkghyT4pQHHfLiTviMocroE6WRTsgb
136 | # 0o9ylSpxbZsa+BzwU9ZnzCL/XB3Nooy9J7J5Y1ZEolHN+emjWFbdmwJFRC9f9Nqu
137 | # 1IIybvyklRPk62nnqaIsvsgrEA5ljpnb9aL6EiYJZTiU8XofSrvR4Vbo0HiWGFzJ
138 | # NRZf3ZMdSY4tvq00RBzuEBUaAF3dNVshzpjHCe6FDoxPbQ4TTj18KUicctHzbMrB
139 | # 7HCjV5JXfZSNoBtIA1r3z6NnCnSlNu0tLxfI5nI3EvRvsTxngvlSso0zFmUeDord
140 | # EN5k9G/ORtTTF+l5xAS00/ss3x+KnqwK+xMnQK3k+eGpf0a7B2BHZWBATrBC7E7t
141 | # s3Z52Ao0CW0cgDEf4g5U3eWh++VHEK1kmP9QFi58vwUheuKVQSdpw5OPlcmN2Jsh
142 | # rg1cnPCiroZogwxqLbt2awAdlq3yFnv2FoMkuYjPaqhHMS+a3ONxPdcAfmJH0c6I
143 | # ybgY+g5yjcGjPa8CQGr/aZuW4hCoELQ3UAjWwz0wggYHMIID76ADAgECAgphFmg0
144 | # AAAAAAAcMA0GCSqGSIb3DQEBBQUAMF8xEzARBgoJkiaJk/IsZAEZFgNjb20xGTAX
145 | # BgoJkiaJk/IsZAEZFgltaWNyb3NvZnQxLTArBgNVBAMTJE1pY3Jvc29mdCBSb290
146 | # IENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw0wNzA0MDMxMjUzMDlaFw0yMTA0MDMx
147 | # MzAzMDlaMHcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD
148 | # VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xITAf
149 | # BgNVBAMTGE1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQTCCASIwDQYJKoZIhvcNAQEB
150 | # BQADggEPADCCAQoCggEBAJ+hbLHf20iSKnxrLhnhveLjxZlRI1Ctzt0YTiQP7tGn
151 | # 0UytdDAgEesH1VSVFUmUG0KSrphcMCbaAGvoe73siQcP9w4EmPCJzB/LMySHnfL0
152 | # Zxws/HvniB3q506jocEjU8qN+kXPCdBer9CwQgSi+aZsk2fXKNxGU7CG0OUoRi4n
153 | # rIZPVVIM5AMs+2qQkDBuh/NZMJ36ftaXs+ghl3740hPzCLdTbVK0RZCfSABKR2YR
154 | # JylmqJfk0waBSqL5hKcRRxQJgp+E7VV4/gGaHVAIhQAQMEbtt94jRrvELVSfrx54
155 | # QTF3zJvfO4OToWECtR0Nsfz3m7IBziJLVP/5BcPCIAsCAwEAAaOCAaswggGnMA8G
156 | # A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFCM0+NlSRnAK7UD7dvuzK7DDNbMPMAsG
157 | # A1UdDwQEAwIBhjAQBgkrBgEEAYI3FQEEAwIBADCBmAYDVR0jBIGQMIGNgBQOrIJg
158 | # QFYnl+UlE/wq4QpTlVnkpKFjpGEwXzETMBEGCgmSJomT8ixkARkWA2NvbTEZMBcG
159 | # CgmSJomT8ixkARkWCW1pY3Jvc29mdDEtMCsGA1UEAxMkTWljcm9zb2Z0IFJvb3Qg
160 | # Q2VydGlmaWNhdGUgQXV0aG9yaXR5ghB5rRahSqClrUxzWPQHEy5lMFAGA1UdHwRJ
161 | # MEcwRaBDoEGGP2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1
162 | # Y3RzL21pY3Jvc29mdHJvb3RjZXJ0LmNybDBUBggrBgEFBQcBAQRIMEYwRAYIKwYB
163 | # BQUHMAKGOGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljcm9z
164 | # b2Z0Um9vdENlcnQuY3J0MBMGA1UdJQQMMAoGCCsGAQUFBwMIMA0GCSqGSIb3DQEB
165 | # BQUAA4ICAQAQl4rDXANENt3ptK132855UU0BsS50cVttDBOrzr57j7gu1BKijG1i
166 | # uFcCy04gE1CZ3XpA4le7r1iaHOEdAYasu3jyi9DsOwHu4r6PCgXIjUji8FMV3U+r
167 | # kuTnjWrVgMHmlPIGL4UD6ZEqJCJw+/b85HiZLg33B+JwvBhOnY5rCnKVuKE5nGct
168 | # xVEO6mJcPxaYiyA/4gcaMvnMMUp2MT0rcgvI6nA9/4UKE9/CCmGO8Ne4F+tOi3/F
169 | # NSteo7/rvH0LQnvUU3Ih7jDKu3hlXFsBFwoUDtLaFJj1PLlmWLMtL+f5hYbMUVbo
170 | # nXCUbKw5TNT2eb+qGHpiKe+imyk0BncaYsk9Hm0fgvALxyy7z0Oz5fnsfbXjpKh0
171 | # NbhOxXEjEiZ2CzxSjHFaRkMUvLOzsE1nyJ9C/4B5IYCeFTBm6EISXhrIniIh0EPp
172 | # K+m79EjMLNTYMoBMJipIJF9a6lbvpt6Znco6b72BJ3QGEe52Ib+bgsEnVLaxaj2J
173 | # oXZhtG6hE6a/qkfwEm/9ijJssv7fUciMI8lmvZ0dhxJkAj0tr1mPuOQh5bWwymO0
174 | # eFQF1EEuUKyUsKV4q7OglnUa2ZKHE3UiLzKoCG6gW4wlv6DvhMoh1useT8ma7kng
175 | # 9wFlb4kLfchpyOZu6qeXzjEp/w7FW1zYTRuh2Povnj8uVRZryROj/TGCBI0wggSJ
176 | # AgEBMIGQMHkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD
177 | # VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xIzAh
178 | # BgNVBAMTGk1pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBAhMzAAABCix5rtd5e6as
179 | # AAEAAAEKMAkGBSsOAwIaBQCggaYwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw
180 | # HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFHxv
181 | # QEFmGVD4yYwxkgEb+6vYK1SsMEYGCisGAQQBgjcCAQwxODA2oByAGgB1AG4AaQBu
182 | # AHMAdABhAGwAbAAuAHAAcwAxoRaAFGh0dHA6Ly9taWNyb3NvZnQuY29tMA0GCSqG
183 | # SIb3DQEBAQUABIIBAIQVySydDm+61yXfwvTRQm9YV2k/tk6GJYRhfMIfUkKD3ysR
184 | # wEN+nXa15Lk6exFXkTnD4O0UxJQUXUso3SfpPmUifQ6fMJYxPsXnyHENiWXsdQ8r
185 | # 5DXgbByYcJS0QsHBxv6wNUAa3UOCV4znYZ4DQ+MY/L4QT9hN7kC7kOHuF0F6Kohz
186 | # 22KHpUwnw5tH+EqjP3oUla0NdrMHJEKAUDaAJ5sVuHIJOiOTbv34x7hd2fty8Gv9
187 | # VJ1KW8Kwv/k6PXzf0u9kpDtw5K5IjPwBgrY+Ds/ufuqLdNNfECHO7LhP//fUtmAz
188 | # qv0r+3LC0ro6Fp1nruAvRpXvtrGMDGy8hk5ofK+hggIoMIICJAYJKoZIhvcNAQkG
189 | # MYICFTCCAhECAQEwgY4wdzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0
190 | # b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh
191 | # dGlvbjEhMB8GA1UEAxMYTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBAhMzAAAAdA2A
192 | # ZA59Z32jAAAAAAB0MAkGBSsOAwIaBQCgXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcN
193 | # AQcBMBwGCSqGSIb3DQEJBTEPFw0xNTA2MTkwMjU5NDhaMCMGCSqGSIb3DQEJBDEW
194 | # BBS3ur37KGDNwz4wbagIdT/bQ0V7eDANBgkqhkiG9w0BAQUFAASCAQCcfMVGV2cj
195 | # D1Zp77HKsBOTX7x6b9fgXDytnkbjr9hT4nydyIh1qCEFpCBjFi59iEAbMDEvv9M8
196 | # YsSesU0pi0PjGX//XEzfYqQ5C+j7D91PSLG8JbWXq0PT20LHBOyiyJ4/dl6flfeN
197 | # BAlw1RS6xyNdSsczoLfq71p4OI3Ob5VFy9cfNqBhiYV9NqpOzUh6toJH2Q4gyn8B
198 | # AeKTws6OU0lgc19mw0ezTMULb3NeOuowY9PMF6GcR4Btu9+zq5T0E89PUXE/wr6x
199 | # LYAAyX43lASSLOB8t6xZP/getsRkA7dCWZsrzQzhsyxdE4Krb1QY1esNMaB0t2zO
200 | # yHkt4p+Ldz8C
201 | # SIG # End signature block
202 |
--------------------------------------------------------------------------------
/PublicApiAnalyzer/PublicApiAnalyzer.Internal.ruleset:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/PublicApiAnalyzer/PublicApiAnalyzer.Test/AttributeTests.cs:
--------------------------------------------------------------------------------
1 | // Copyright (c) Tunnel Vision Laboratories, LLC. All Rights Reserved.
2 | // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
3 |
4 | namespace PublicApiAnalyzer.Test
5 | {
6 | using Xunit;
7 |
8 | public class AttributeTests
9 | {
10 | [Fact]
11 | public void TestNoCodeFixAttributeReason()
12 | {
13 | string reason = "Reason";
14 | var attribute = new NoCodeFixAttribute(reason);
15 | Assert.Same(reason, attribute.Reason);
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/PublicApiAnalyzer/PublicApiAnalyzer.Test/ExportCodeFixProviderAttributeNameTest.cs:
--------------------------------------------------------------------------------
1 | // Copyright (c) Tunnel Vision Laboratories, LLC. All Rights Reserved.
2 | // Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
3 |
4 | namespace PublicApiAnalyzer.Test
5 | {
6 | using System;
7 | using System.Collections.Generic;
8 | using System.Linq;
9 | using System.Reflection;
10 | using Microsoft.CodeAnalysis;
11 | using Microsoft.CodeAnalysis.CodeFixes;
12 | using PublicApiAnalyzer.ApiDesign;
13 | using Xunit;
14 |
15 | public class ExportCodeFixProviderAttributeNameTest
16 | {
17 | public static IEnumerable