Skip to content

Commit bb9d108

Browse files
authored
Features/cs1503 codefix (#8)
* wip * wip * wip * wip * wip * wip * wip * refactoring + Resharper templates * wip * refactoring * refactoring * wip * more tests * working feature * readme update
1 parent 6c5f6a2 commit bb9d108

18 files changed

+1175
-4
lines changed

Amusoft.CodeAnalysis.Analyzers.sln

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ EndProject
1212
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{50B70690-33A5-41F0-91E3-04EACE0F2E48}"
1313
ProjectSection(SolutionItems) = preProject
1414
NuGet.config = NuGet.config
15+
README.md = README.md
1516
EndProjectSection
1617
EndProject
1718
Global
Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
2+
<s:String x:Key="/Default/CodeStyle/FileHeader/FileHeaderText/@EntryValue">Copyright $CREATED_YEAR$ Andreas Müller&#xD;
3+
This file is a part of Amusoft.CodeAnalysis.Analyzers and is licensed under Apache 2.0&#xD;
4+
See https://github.com/taori/Amusoft.CodeAnalysis.Analyzers/blob/master/LICENSE for details</s:String>
5+
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=21CCC48EE521CF46B74D3A0C28EEFF1E/@KeyIndexDefined">True</s:Boolean>
6+
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=21CCC48EE521CF46B74D3A0C28EEFF1E/Description/@EntryValue">&amp;CodeFixTest</s:String>
7+
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=21CCC48EE521CF46B74D3A0C28EEFF1E/Field/=CLASS/Expression/@EntryValue">getAlphaNumericFileNameWithoutExtension()</s:String>
8+
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=21CCC48EE521CF46B74D3A0C28EEFF1E/Field/=CLASS/InitialRange/@EntryValue">-1</s:Int64>
9+
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=21CCC48EE521CF46B74D3A0C28EEFF1E/Field/=FixerProviderType/@KeyIndexDefined">True</s:Boolean>
10+
11+
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=21CCC48EE521CF46B74D3A0C28EEFF1E/Field/=FixerProviderType/Order/@EntryValue">3</s:Int64>
12+
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=21CCC48EE521CF46B74D3A0C28EEFF1E/Field/=HEADER/InitialRange/@EntryValue">-1</s:Int64>
13+
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=21CCC48EE521CF46B74D3A0C28EEFF1E/Field/=NAMESPACE/Expression/@EntryValue">fileDefaultNamespace()</s:String>
14+
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=21CCC48EE521CF46B74D3A0C28EEFF1E/Field/=NAMESPACE/InitialRange/@EntryValue">-1</s:Int64>
15+
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=21CCC48EE521CF46B74D3A0C28EEFF1E/Text/@EntryValue">$HEADER$using System.Threading.Tasks;&#xD;
16+
using Microsoft.CodeAnalysis.CSharp.Testing.MSTest;&#xD;
17+
using Microsoft.CodeAnalysis.Testing;&#xD;
18+
using Microsoft.VisualStudio.TestTools.UnitTesting;&#xD;
19+
using static Microsoft.CodeAnalysis.Testing.DiagnosticResult;&#xD;
20+
using Verifier = Microsoft.CodeAnalysis.CSharp.Testing.MSTest.CodeFixVerifier&lt;Microsoft.CodeAnalysis.Testing.EmptyDiagnosticAnalyzer, $FixerProviderType$&gt;;&#xD;
21+
&#xD;
22+
namespace $NAMESPACE$&#xD;
23+
{&#xD;
24+
[TestClass]&#xD;
25+
public class $CLASS$&#xD;
26+
{&#xD;
27+
[TestMethod]&#xD;
28+
public async Task EmptySourceNoAction()&#xD;
29+
{&#xD;
30+
await Verifier.VerifyCodeFixAsync(string.Empty, string.Empty);&#xD;
31+
}&#xD;
32+
&#xD;
33+
[TestMethod]&#xD;
34+
public async Task DiagnosticAtObjectCreationExpression()&#xD;
35+
{&#xD;
36+
$END$&#xD;
37+
var test = @"&#xD;
38+
using System;&#xD;
39+
using System.Collections.Generic;&#xD;
40+
using System.Linq;&#xD;
41+
using System.Text;&#xD;
42+
using System.Threading.Tasks;&#xD;
43+
using System.Diagnostics;&#xD;
44+
&#xD;
45+
namespace ConsoleApplication1&#xD;
46+
{&#xD;
47+
class TypeName&#xD;
48+
{&#xD;
49+
TypeName()&#xD;
50+
{&#xD;
51+
var action = new Func&lt;int, string&gt;(TestMethod);&#xD;
52+
}&#xD;
53+
&#xD;
54+
private int TestMethod(int arg)&#xD;
55+
{&#xD;
56+
throw new NotImplementedException();&#xD;
57+
}&#xD;
58+
}&#xD;
59+
}";&#xD;
60+
&#xD;
61+
&#xD;
62+
var fixtest = @"&#xD;
63+
using System;&#xD;
64+
using System.Collections.Generic;&#xD;
65+
using System.Linq;&#xD;
66+
using System.Text;&#xD;
67+
using System.Threading.Tasks;&#xD;
68+
using System.Diagnostics;&#xD;
69+
&#xD;
70+
namespace ConsoleApplication1&#xD;
71+
{&#xD;
72+
class TypeName&#xD;
73+
{&#xD;
74+
TypeName()&#xD;
75+
{&#xD;
76+
var action = new Func&lt;int, string&gt;(TestMethod);&#xD;
77+
}&#xD;
78+
&#xD;
79+
private string TestMethod(int arg)&#xD;
80+
{&#xD;
81+
throw new NotImplementedException();&#xD;
82+
}&#xD;
83+
}&#xD;
84+
}";&#xD;
85+
var diagnostics = new[]&#xD;
86+
{&#xD;
87+
CompilerError("CS0407").WithLocation(15, 48),&#xD;
88+
};&#xD;
89+
&#xD;
90+
await Verifier.VerifyCodeFixAsync(test, diagnostics, fixtest);&#xD;
91+
}&#xD;
92+
}&#xD;
93+
}</s:String>
94+
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=21CCC48EE521CF46B74D3A0C28EEFF1E/Reformat/@EntryValue">True</s:Boolean>
95+
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=21CCC48EE521CF46B74D3A0C28EEFF1E/ShortenQualifiedReferences/@EntryValue">True</s:Boolean>
96+
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=21CCC48EE521CF46B74D3A0C28EEFF1E/CustomProperties/=FileName/@EntryIndexedValue">CodeFixTest</s:String>
97+
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=21CCC48EE521CF46B74D3A0C28EEFF1E/CustomProperties/=Extension/@EntryIndexedValue">cs</s:String>
98+
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=21CCC48EE521CF46B74D3A0C28EEFF1E/CustomProperties/=ValidateFileName/@EntryIndexedValue">True</s:String>
99+
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=21CCC48EE521CF46B74D3A0C28EEFF1E/Applicability/=File/@EntryIndexedValue">True</s:Boolean>
100+
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=21CCC48EE521CF46B74D3A0C28EEFF1E/Scope/=E8F0594528C33E45BBFEC6CFE851095D/@KeyIndexDefined">True</s:Boolean>
101+
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=21CCC48EE521CF46B74D3A0C28EEFF1E/Scope/=E8F0594528C33E45BBFEC6CFE851095D/Type/@EntryValue">InCSharpProjectFile</s:String>
102+
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=21CCC48EE521CF46B74D3A0C28EEFF1E/Field/=HEADER/@KeyIndexDefined">True</s:Boolean>
103+
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=21CCC48EE521CF46B74D3A0C28EEFF1E/Field/=HEADER/Expression/@EntryValue">fileheader()</s:String>
104+
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=21CCC48EE521CF46B74D3A0C28EEFF1E/Field/=HEADER/Order/@EntryValue">0</s:Int64>
105+
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=21CCC48EE521CF46B74D3A0C28EEFF1E/Field/=NAMESPACE/@KeyIndexDefined">True</s:Boolean>
106+
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=21CCC48EE521CF46B74D3A0C28EEFF1E/Field/=NAMESPACE/Order/@EntryValue">1</s:Int64>
107+
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=21CCC48EE521CF46B74D3A0C28EEFF1E/Field/=CLASS/@KeyIndexDefined">True</s:Boolean>
108+
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=21CCC48EE521CF46B74D3A0C28EEFF1E/Field/=CLASS/Order/@EntryValue">2</s:Int64>
109+
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=EF22B9F0D1F98943AB7B20E28E6E8504/@KeyIndexDefined">True</s:Boolean>
110+
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=EF22B9F0D1F98943AB7B20E28E6E8504/Applicability/=File/@EntryIndexedValue">True</s:Boolean>
111+
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=EF22B9F0D1F98943AB7B20E28E6E8504/CustomProperties/=Extension/@EntryIndexedValue">cs</s:String>
112+
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=EF22B9F0D1F98943AB7B20E28E6E8504/CustomProperties/=FileName/@EntryIndexedValue">CodeFix</s:String>
113+
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=EF22B9F0D1F98943AB7B20E28E6E8504/CustomProperties/=ValidateFileName/@EntryIndexedValue">True</s:String>
114+
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=EF22B9F0D1F98943AB7B20E28E6E8504/Description/@EntryValue">&amp;CodeFix</s:String>
115+
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=EF22B9F0D1F98943AB7B20E28E6E8504/Field/=CLASS/@KeyIndexDefined">True</s:Boolean>
116+
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=EF22B9F0D1F98943AB7B20E28E6E8504/Field/=CLASS/Expression/@EntryValue">getAlphaNumericFileNameWithoutExtension()</s:String>
117+
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=EF22B9F0D1F98943AB7B20E28E6E8504/Field/=CLASS/InitialRange/@EntryValue">-1</s:Int64>
118+
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=EF22B9F0D1F98943AB7B20E28E6E8504/Field/=CLASS/Order/@EntryValue">2</s:Int64>
119+
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=EF22B9F0D1F98943AB7B20E28E6E8504/Field/=diagnosticId/@KeyIndexDefined">True</s:Boolean>
120+
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=EF22B9F0D1F98943AB7B20E28E6E8504/Field/=diagnosticId/InitialRange/@EntryValue">1</s:Int64>
121+
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=EF22B9F0D1F98943AB7B20E28E6E8504/Field/=diagnosticId/Order/@EntryValue">3</s:Int64>
122+
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=EF22B9F0D1F98943AB7B20E28E6E8504/Field/=HEADER/@KeyIndexDefined">True</s:Boolean>
123+
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=EF22B9F0D1F98943AB7B20E28E6E8504/Field/=HEADER/Expression/@EntryValue">fileheader()</s:String>
124+
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=EF22B9F0D1F98943AB7B20E28E6E8504/Field/=HEADER/InitialRange/@EntryValue">-1</s:Int64>
125+
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=EF22B9F0D1F98943AB7B20E28E6E8504/Field/=HEADER/Order/@EntryValue">0</s:Int64>
126+
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=EF22B9F0D1F98943AB7B20E28E6E8504/Field/=NAMESPACE/@KeyIndexDefined">True</s:Boolean>
127+
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=EF22B9F0D1F98943AB7B20E28E6E8504/Field/=NAMESPACE/Expression/@EntryValue">fileDefaultNamespace()</s:String>
128+
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=EF22B9F0D1F98943AB7B20E28E6E8504/Field/=NAMESPACE/InitialRange/@EntryValue">-1</s:Int64>
129+
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=EF22B9F0D1F98943AB7B20E28E6E8504/Field/=NAMESPACE/Order/@EntryValue">1</s:Int64>
130+
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=EF22B9F0D1F98943AB7B20E28E6E8504/Reformat/@EntryValue">True</s:Boolean>
131+
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=EF22B9F0D1F98943AB7B20E28E6E8504/Scope/=E8F0594528C33E45BBFEC6CFE851095D/@KeyIndexDefined">True</s:Boolean>
132+
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=EF22B9F0D1F98943AB7B20E28E6E8504/Scope/=E8F0594528C33E45BBFEC6CFE851095D/Type/@EntryValue">InCSharpProjectFile</s:String>
133+
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=EF22B9F0D1F98943AB7B20E28E6E8504/ShortenQualifiedReferences/@EntryValue">True</s:Boolean>
134+
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=EF22B9F0D1F98943AB7B20E28E6E8504/Text/@EntryValue">$HEADER$using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;&#xD;
135+
using System.Composition;&#xD;
136+
using System.Linq;&#xD;
137+
using System.Threading;&#xD;
138+
using System.Threading.Tasks;&#xD;
139+
using Amusoft.CodeAnalysis.Analyzers.Shared;&#xD;
140+
using Microsoft.CodeAnalysis;&#xD;
141+
using Microsoft.CodeAnalysis.CodeFixes;&#xD;
142+
using Microsoft.CodeAnalysis.CSharp;&#xD;
143+
using Microsoft.CodeAnalysis.CSharp.Syntax;&#xD;
144+
using Microsoft.CodeAnalysis.Formatting;&#xD;
145+
using Microsoft.CodeAnalysis.Simplification;&#xD;
146+
&#xD;
147+
namespace $NAMESPACE$&#xD;
148+
{&#xD;
149+
[ExportCodeFixProvider(LanguageNames.CSharp, Name = "$diagnosticId$-$CLASS$"), Shared]&#xD;
150+
public class $CLASS$ : Amusoft.CodeAnalysis.Analyzers.Shared.CodeFixProviderBase&#xD;
151+
{&#xD;
152+
/// &lt;inheritdoc /&gt;&#xD;
153+
protected override string DiagnosticId { get; } = "$diagnosticId$";&#xD;
154+
&#xD;
155+
/// &lt;inheritdoc /&gt;&#xD;
156+
protected override string GetEquivalenceKey(SyntaxNode rootNode)&#xD;
157+
{&#xD;
158+
return "$diagnosticId$-$CLASS$";&#xD;
159+
}&#xD;
160+
&#xD;
161+
/// &lt;inheritdoc /&gt;&#xD;
162+
protected override string GetTitle(SyntaxNode rootNode)&#xD;
163+
{&#xD;
164+
var member = GetAnnotationValue(rootNode, MemberAnnotation);&#xD;
165+
var typeName = GetAnnotationValue(rootNode, TypeAnnotation);&#xD;
166+
return string.Format(Resources.$SELSTART$MessageFormat_$diagnosticId$_$CLASS$$SELEND$, member, typeName);&#xD;
167+
}&#xD;
168+
&#xD;
169+
/// &lt;inheritdoc /&gt;&#xD;
170+
protected override async Task&lt;SyntaxNode&gt; FixedDiagnosticAsync(SyntaxNode rootNode, SyntaxNode diagnosticNode, CodeFixContext context,&#xD;
171+
CancellationToken cancellationToken)&#xD;
172+
{&#xD;
173+
return rootNode;&#xD;
174+
}&#xD;
175+
}&#xD;
176+
}</s:String></wpf:ResourceDictionary>

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@
1010
|---|---|
1111
|[Download](https://marketplace.visualstudio.com/items?itemName=Amusoft.Amusoft-CodeAnalysis-Analyzers)|[Download](https://github.com/taori/Amusoft.CodeAnalysis.Analyzers/releases/latest)|
1212

13+
## Codefixes
14+
15+
- CS0407
16+
- CS0123
17+
1318
## References
1419
- [Repository docs](https://github.com/taori/Amusoft.CodeAnalysis.Analyzers/tree/master/docs)
1520
- [Features](https://github.com/taori/Amusoft.CodeAnalysis.Analyzers/tree/master/docs/FEATURES.md)

src/Amusoft.CodeAnalysis.Analyzers.Test/Amusoft.CodeAnalysis.Analyzers.Test.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
</PropertyGroup>
66

77
<ItemGroup>
8-
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Analyzer.Testing.XUnit" Version="1.0.1-beta1.20059.2" />
9-
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.CodeFix.Testing.XUnit" Version="1.0.1-beta1.20059.2" />
8+
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Analyzer.Testing.MSTest" Version="1.0.1-beta1.20059.2" />
9+
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.CodeFix.Testing.MSTest" Version="1.0.1-beta1.20059.2" />
1010
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="2.4.0" />
1111
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
1212
<PackageReference Include="MSTest.TestAdapter" Version="1.1.18" />

src/Amusoft.CodeAnalysis.Analyzers.Test/Helpers/DiagnosticVerifier.Helper.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,11 @@ protected static Diagnostic[] GetSortedDiagnosticsFromDocuments(DiagnosticAnalyz
5757
var diagnostics = new List<Diagnostic>();
5858
foreach (var project in projects)
5959
{
60-
var compilationWithAnalyzers = project.GetCompilationAsync().Result.WithAnalyzers(ImmutableArray.Create(analyzer));
60+
var analyzers = analyzer == null
61+
? ImmutableArray<DiagnosticAnalyzer>.Empty
62+
: ImmutableArray.Create(analyzer);
63+
64+
var compilationWithAnalyzers = project.GetCompilationAsync().Result.WithAnalyzers(analyzers);
6165
var diags = compilationWithAnalyzers.GetAnalyzerDiagnosticsAsync().Result;
6266
foreach (var diag in diags)
6367
{

0 commit comments

Comments
 (0)