Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Project>
<Import Project="Sdk.props" Sdk="Microsoft.DotNet.Arcade.Sdk" />
<Import Project="$(RepositoryEngineeringDir)ApiCompatibility\PublicApiAnalyzer.props" />

<!-- TFMs and their permutations -->
<PropertyGroup>
Expand Down
1 change: 1 addition & 0 deletions Directory.Build.targets
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
<Import Project="$(MSBuildThisFileDirectory)\eng\MSBuild\Shared.targets" />
<Import Project="$(MSBuildThisFileDirectory)\eng\MSBuild\Generators.targets" />
<Import Project="$(MSBuildThisFileDirectory)\eng\MSBuild\ProjectStaging.targets" />
<Import Project="$(RepositoryEngineeringDir)ApiCompatibility\PublicApiAnalyzer.targets" />

<!-- Warning stuff -->
<PropertyGroup>
Expand Down
20 changes: 20 additions & 0 deletions eng/ApiCompatibility/PublicApiAnalyzer.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<Project>

<PropertyGroup Condition="'$(UsePublicApiAnalyzers)' == 'true'">
<!-- https://github.com/dotnet/roslyn-analyzers/blob/main/src/PublicApiAnalyzers/Microsoft.CodeAnalysis.PublicApiAnalyzers.md -->
<WarningsAsErrors>$(WarningsAsErrors);RS0016;RS0017;RS0022;RS0024;RS0025;RS0036;RS0037;RS0041;RS0048</WarningsAsErrors>
</PropertyGroup>

<PropertyGroup>
<!--
TODO: Enable the following:
* RS0026: Symbol 'XYZ' violates the backcompat requirement: 'Do not add multiple overloads with optional parameters'.
https://github.com/dotnet/extensions/issues/4167

* RS0027: 'XYZ' violates the backcompat requirement: 'API with optional parameter(s) should have the most parameters amongst its public overloads'.
https://github.com/dotnet/extensions/issues/4168
-->
<NoWarn>$(NoWarn);RS0026;RS0027</NoWarn>
</PropertyGroup>

</Project>
13 changes: 13 additions & 0 deletions eng/ApiCompatibility/PublicApiAnalyzer.targets
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<Project>

<ItemGroup Condition="'$(UsePublicApiAnalyzers)' == 'true'">
<PackageReference Include="Microsoft.CodeAnalysis.PublicApiAnalyzers">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>

<AdditionalFiles Include="$(ProjectDir)PublicAPI/$(TargetFramework)/PublicAPI.Shipped.txt" />
<AdditionalFiles Include="$(ProjectDir)PublicAPI/$(TargetFramework)/PublicAPI.Unshipped.txt" />
</ItemGroup>

</Project>
12 changes: 12 additions & 0 deletions eng/ApiCompatibility/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
### Mark Shipped Tool
========

This tool should be run after every supported release that has API changes. It will
merge the collection of PublicApi.Shipped.txt files with the PublicApi.Unshipped.txt
versions. This will take into account `*REMOVED*` elements when updating the files.

Usage:

``` cmd
mark-shipped.cmd
```
2 changes: 2 additions & 0 deletions eng/ApiCompatibility/mark-shipped.cmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
@echo off
powershell -noprofile -executionPolicy RemoteSigned -file "%~dp0\mark-shipped.ps1"
51 changes: 51 additions & 0 deletions eng/ApiCompatibility/mark-shipped.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
[CmdletBinding(PositionalBinding=$false)]
param ()

Set-StrictMode -version 2.0
$ErrorActionPreference = "Stop"

function MarkShipped([string]$dir) {
$shippedFilePath = Join-Path $dir "PublicAPI.Shipped.txt"
[string[]]$shipped = Get-Content $shippedFilePath
if ($null -eq $shipped) {
$shipped = @()
}

$unshippedFilePath = Join-Path $dir "PublicAPI.Unshipped.txt"
[string[]]$unshipped = Get-Content $unshippedFilePath
$removed = @()
$removedPrefix = "*REMOVED*";
Write-Host "Processing $dir"

foreach ($item in $unshipped) {
if ($item.Length -gt 0) {
if ($item.StartsWith($removedPrefix)) {
$item = $item.Substring($removedPrefix.Length)
$removed += $item
}
else {
$shipped += $item
}
}
}

$shipped | Sort-Object | ?{ -not $removed.Contains($_) } | Out-File $shippedFilePath -Encoding Ascii
$null | Out-File $unshippedFilePath -Encoding Ascii
}

try {
Push-Location $PSScriptRoot\..\..

foreach ($file in Get-ChildItem -re -in "PublicApi.Shipped.txt") {
$dir = Split-Path -parent $file
MarkShipped $dir
}
}
catch {
Write-Host $_
Write-Host $_.Exception
exit 1
}
finally {
Pop-Location
}
1 change: 1 addition & 0 deletions eng/packages/General.props
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
</ItemGroup>

<ItemGroup>
<PackageVersion Include="Microsoft.CodeAnalysis.PublicApiAnalyzers" Version="3.11.0-beta1.23355.1" />
<PackageVersion Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.5.22" />
<PackageVersion Include="SonarAnalyzer.CSharp" Version="8.52.0.60960" />
<PackageVersion Include="StyleCop.Analyzers.Unstable" Version="1.2.0.507" />
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@

#nullable enable
const Microsoft.Extensions.ExtraAnalyzers.FixAllProviders.SequentialFixAllProvider.DocumentScopeStr = "document" -> string!
const Microsoft.Extensions.ExtraAnalyzers.FixAllProviders.SequentialFixAllProvider.ProjectScopeStr = "project" -> string!
Microsoft.Extensions.ExtraAnalyzers.AsyncCallInsideUsingBlockAnalyzer
Microsoft.Extensions.ExtraAnalyzers.AsyncCallInsideUsingBlockAnalyzer.AsyncCallInsideUsingBlockAnalyzer() -> void
Microsoft.Extensions.ExtraAnalyzers.AsyncMethodWithoutCancellation
Microsoft.Extensions.ExtraAnalyzers.AsyncMethodWithoutCancellation.AsyncMethodWithoutCancellation() -> void
Microsoft.Extensions.ExtraAnalyzers.CallAnalysis.CallAnalyzer
Microsoft.Extensions.ExtraAnalyzers.CallAnalysis.CallAnalyzer.CallAnalyzer() -> void
Microsoft.Extensions.ExtraAnalyzers.CoalesceAnalyzer
Microsoft.Extensions.ExtraAnalyzers.CoalesceAnalyzer.CoalesceAnalyzer() -> void
Microsoft.Extensions.ExtraAnalyzers.ConditionalAccessAnalyzer
Microsoft.Extensions.ExtraAnalyzers.ConditionalAccessAnalyzer.ConditionalAccessAnalyzer() -> void
Microsoft.Extensions.ExtraAnalyzers.FixAllProviders.ISequentialFixer
Microsoft.Extensions.ExtraAnalyzers.FixAllProviders.ISequentialFixer.ApplyDiagnosticFixToSyntaxNode(Microsoft.CodeAnalysis.SyntaxNode! nodeToFix, Microsoft.CodeAnalysis.Diagnostic! diagnostic) -> Microsoft.CodeAnalysis.SyntaxNode!
Microsoft.Extensions.ExtraAnalyzers.FixAllProviders.ISequentialFixer.GetFixableSyntaxNodeFromDiagnostic(Microsoft.CodeAnalysis.SyntaxNode! documentRoot, Microsoft.CodeAnalysis.Diagnostic! diagnostic) -> Microsoft.CodeAnalysis.SyntaxNode!
Microsoft.Extensions.ExtraAnalyzers.FixAllProviders.SequentialFixAllCodeAction
Microsoft.Extensions.ExtraAnalyzers.FixAllProviders.SequentialFixAllCodeAction.SequentialFixAllCodeAction(string! fixAllTitle, Microsoft.CodeAnalysis.CodeFixes.FixAllContext! context, System.Collections.Concurrent.ConcurrentDictionary<Microsoft.CodeAnalysis.DocumentId!, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Diagnostic!>>! diagsToFixGroupedByDocId, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.DocumentId!> inScopeDocumentIds) -> void
Microsoft.Extensions.ExtraAnalyzers.FixAllProviders.SequentialFixAllProvider
Microsoft.Extensions.ExtraAnalyzers.FixAllProviders.SequentialFixAllProvider.SequentialFixAllProvider() -> void
Microsoft.Extensions.ExtraAnalyzers.LegacyLoggingFixer
Microsoft.Extensions.ExtraAnalyzers.LegacyLoggingFixer.LegacyLoggingFixer() -> void
Microsoft.Extensions.ExtraAnalyzers.MakeExeTypesInternalAnalyzer
Microsoft.Extensions.ExtraAnalyzers.MakeExeTypesInternalAnalyzer.MakeExeTypesInternalAnalyzer() -> void
Microsoft.Extensions.ExtraAnalyzers.MakeExeTypesInternalFixer
Microsoft.Extensions.ExtraAnalyzers.MakeExeTypesInternalFixer.MakeExeTypesInternalFixer() -> void
Microsoft.Extensions.ExtraAnalyzers.OptimizeArraysAnalyzer
Microsoft.Extensions.ExtraAnalyzers.OptimizeArraysAnalyzer.OptimizeArraysAnalyzer() -> void
Microsoft.Extensions.ExtraAnalyzers.StringFormatFixer
Microsoft.Extensions.ExtraAnalyzers.StringFormatFixer.StringFormatFixer() -> void
Microsoft.Extensions.ExtraAnalyzers.UsingExcessiveDictionaryLookupAnalyzer
Microsoft.Extensions.ExtraAnalyzers.UsingExcessiveDictionaryLookupAnalyzer.UsingExcessiveDictionaryLookupAnalyzer() -> void
Microsoft.Extensions.ExtraAnalyzers.UsingExcessiveDictionaryLookupFixer
Microsoft.Extensions.ExtraAnalyzers.UsingExcessiveDictionaryLookupFixer.UsingExcessiveDictionaryLookupFixer() -> void
Microsoft.Extensions.ExtraAnalyzers.UsingExcessiveSetLookupAnalyzer
Microsoft.Extensions.ExtraAnalyzers.UsingExcessiveSetLookupAnalyzer.UsingExcessiveSetLookupAnalyzer() -> void
Microsoft.Extensions.ExtraAnalyzers.UsingExcessiveSetLookupFixer
Microsoft.Extensions.ExtraAnalyzers.UsingExcessiveSetLookupFixer.UsingExcessiveSetLookupFixer() -> void
Microsoft.Extensions.ExtraAnalyzers.UsingToStringInLoggersAnalyzer
Microsoft.Extensions.ExtraAnalyzers.UsingToStringInLoggersAnalyzer.UsingToStringInLoggersAnalyzer() -> void
override Microsoft.Extensions.ExtraAnalyzers.AsyncCallInsideUsingBlockAnalyzer.Initialize(Microsoft.CodeAnalysis.Diagnostics.AnalysisContext! context) -> void
override Microsoft.Extensions.ExtraAnalyzers.AsyncCallInsideUsingBlockAnalyzer.SupportedDiagnostics.get -> System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.DiagnosticDescriptor!>
override Microsoft.Extensions.ExtraAnalyzers.AsyncMethodWithoutCancellation.Initialize(Microsoft.CodeAnalysis.Diagnostics.AnalysisContext! context) -> void
override Microsoft.Extensions.ExtraAnalyzers.AsyncMethodWithoutCancellation.SupportedDiagnostics.get -> System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.DiagnosticDescriptor!>
override Microsoft.Extensions.ExtraAnalyzers.CallAnalysis.CallAnalyzer.Initialize(Microsoft.CodeAnalysis.Diagnostics.AnalysisContext! context) -> void
override Microsoft.Extensions.ExtraAnalyzers.CallAnalysis.CallAnalyzer.SupportedDiagnostics.get -> System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.DiagnosticDescriptor!>
override Microsoft.Extensions.ExtraAnalyzers.CoalesceAnalyzer.Initialize(Microsoft.CodeAnalysis.Diagnostics.AnalysisContext! context) -> void
override Microsoft.Extensions.ExtraAnalyzers.CoalesceAnalyzer.SupportedDiagnostics.get -> System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.DiagnosticDescriptor!>
override Microsoft.Extensions.ExtraAnalyzers.ConditionalAccessAnalyzer.Initialize(Microsoft.CodeAnalysis.Diagnostics.AnalysisContext! context) -> void
override Microsoft.Extensions.ExtraAnalyzers.ConditionalAccessAnalyzer.SupportedDiagnostics.get -> System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.DiagnosticDescriptor!>
override Microsoft.Extensions.ExtraAnalyzers.FixAllProviders.SequentialFixAllCodeAction.Title.get -> string!
override Microsoft.Extensions.ExtraAnalyzers.FixAllProviders.SequentialFixAllProvider.GetFixAsync(Microsoft.CodeAnalysis.CodeFixes.FixAllContext! fixAllContext) -> System.Threading.Tasks.Task<Microsoft.CodeAnalysis.CodeActions.CodeAction?>!
override Microsoft.Extensions.ExtraAnalyzers.LegacyLoggingFixer.FixableDiagnosticIds.get -> System.Collections.Immutable.ImmutableArray<string!>
override Microsoft.Extensions.ExtraAnalyzers.LegacyLoggingFixer.GetFixAllProvider() -> Microsoft.CodeAnalysis.CodeFixes.FixAllProvider!
override Microsoft.Extensions.ExtraAnalyzers.LegacyLoggingFixer.RegisterCodeFixesAsync(Microsoft.CodeAnalysis.CodeFixes.CodeFixContext context) -> System.Threading.Tasks.Task!
override Microsoft.Extensions.ExtraAnalyzers.MakeExeTypesInternalAnalyzer.Initialize(Microsoft.CodeAnalysis.Diagnostics.AnalysisContext! context) -> void
override Microsoft.Extensions.ExtraAnalyzers.MakeExeTypesInternalAnalyzer.SupportedDiagnostics.get -> System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.DiagnosticDescriptor!>
override Microsoft.Extensions.ExtraAnalyzers.MakeExeTypesInternalFixer.FixableDiagnosticIds.get -> System.Collections.Immutable.ImmutableArray<string!>
override Microsoft.Extensions.ExtraAnalyzers.MakeExeTypesInternalFixer.GetFixAllProvider() -> Microsoft.CodeAnalysis.CodeFixes.FixAllProvider!
override Microsoft.Extensions.ExtraAnalyzers.MakeExeTypesInternalFixer.RegisterCodeFixesAsync(Microsoft.CodeAnalysis.CodeFixes.CodeFixContext context) -> System.Threading.Tasks.Task!
override Microsoft.Extensions.ExtraAnalyzers.OptimizeArraysAnalyzer.Initialize(Microsoft.CodeAnalysis.Diagnostics.AnalysisContext! context) -> void
override Microsoft.Extensions.ExtraAnalyzers.OptimizeArraysAnalyzer.SupportedDiagnostics.get -> System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.DiagnosticDescriptor!>
override Microsoft.Extensions.ExtraAnalyzers.StringFormatFixer.FixableDiagnosticIds.get -> System.Collections.Immutable.ImmutableArray<string!>
override Microsoft.Extensions.ExtraAnalyzers.StringFormatFixer.GetFixAllProvider() -> Microsoft.CodeAnalysis.CodeFixes.FixAllProvider!
override Microsoft.Extensions.ExtraAnalyzers.StringFormatFixer.RegisterCodeFixesAsync(Microsoft.CodeAnalysis.CodeFixes.CodeFixContext context) -> System.Threading.Tasks.Task!
override Microsoft.Extensions.ExtraAnalyzers.UsingExcessiveDictionaryLookupAnalyzer.Initialize(Microsoft.CodeAnalysis.Diagnostics.AnalysisContext! context) -> void
override Microsoft.Extensions.ExtraAnalyzers.UsingExcessiveDictionaryLookupAnalyzer.SupportedDiagnostics.get -> System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.DiagnosticDescriptor!>
override Microsoft.Extensions.ExtraAnalyzers.UsingExcessiveDictionaryLookupFixer.FixableDiagnosticIds.get -> System.Collections.Immutable.ImmutableArray<string!>
override Microsoft.Extensions.ExtraAnalyzers.UsingExcessiveDictionaryLookupFixer.GetFixAllProvider() -> Microsoft.CodeAnalysis.CodeFixes.FixAllProvider!
override Microsoft.Extensions.ExtraAnalyzers.UsingExcessiveDictionaryLookupFixer.RegisterCodeFixesAsync(Microsoft.CodeAnalysis.CodeFixes.CodeFixContext context) -> System.Threading.Tasks.Task!
override Microsoft.Extensions.ExtraAnalyzers.UsingExcessiveSetLookupAnalyzer.Initialize(Microsoft.CodeAnalysis.Diagnostics.AnalysisContext! context) -> void
override Microsoft.Extensions.ExtraAnalyzers.UsingExcessiveSetLookupAnalyzer.SupportedDiagnostics.get -> System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.DiagnosticDescriptor!>
override Microsoft.Extensions.ExtraAnalyzers.UsingExcessiveSetLookupFixer.FixableDiagnosticIds.get -> System.Collections.Immutable.ImmutableArray<string!>
override Microsoft.Extensions.ExtraAnalyzers.UsingExcessiveSetLookupFixer.GetFixAllProvider() -> Microsoft.CodeAnalysis.CodeFixes.FixAllProvider!
override Microsoft.Extensions.ExtraAnalyzers.UsingExcessiveSetLookupFixer.RegisterCodeFixesAsync(Microsoft.CodeAnalysis.CodeFixes.CodeFixContext context) -> System.Threading.Tasks.Task!
override Microsoft.Extensions.ExtraAnalyzers.UsingToStringInLoggersAnalyzer.Initialize(Microsoft.CodeAnalysis.Diagnostics.AnalysisContext! context) -> void
override Microsoft.Extensions.ExtraAnalyzers.UsingToStringInLoggersAnalyzer.SupportedDiagnostics.get -> System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.DiagnosticDescriptor!>
static Microsoft.Extensions.ExtraAnalyzers.FixAllProviders.SequentialFixAllProvider.GetInstance(Microsoft.Extensions.ExtraAnalyzers.FixAllProviders.ISequentialFixer! _) -> Microsoft.Extensions.ExtraAnalyzers.FixAllProviders.SequentialFixAllProvider!
Loading