Skip to content

Commit 09aa5be

Browse files
committed
Merge remote-tracking branch 'DotNetAnalyzers/stabilization'
2 parents 773bbeb + cbec141 commit 09aa5be

9 files changed

Lines changed: 148 additions & 15 deletions

File tree

StyleCop.Analyzers/Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
<ItemGroup>
4545
<PackageReference Include="AsyncUsageAnalyzers" Version="1.0.0-alpha003" PrivateAssets="all" />
4646
<PackageReference Include="DotNetAnalyzers.DocumentationAnalyzers" Version="1.0.0-beta.46" PrivateAssets="all" />
47-
<PackageReference Include="StyleCop.Analyzers" Version="1.1.1-rc.101" PrivateAssets="all" />
47+
<PackageReference Include="StyleCop.Analyzers" Version="1.1.1-rc.108" PrivateAssets="all" />
4848
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.CodeStyle" Version="2.11.0-beta2-63603-03" PrivateAssets="all" />
4949
</ItemGroup>
5050

StyleCop.Analyzers/StyleCop.Analyzers.CodeFixes/ReadabilityRules/SA1103CodeFixProvider.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,11 @@ private static ImmutableArray<SyntaxNode> CreateQueryNodeList(QueryExpressionSyn
153153
private static void ProcessQueryBody(QueryBodySyntax body, List<SyntaxNode> queryNodes)
154154
{
155155
queryNodes.AddRange(body.Clauses);
156-
queryNodes.Add(body.SelectOrGroup);
156+
157+
if (!body.SelectOrGroup.IsMissing)
158+
{
159+
queryNodes.Add(body.SelectOrGroup);
160+
}
157161

158162
if (body.Continuation != null)
159163
{

StyleCop.Analyzers/StyleCop.Analyzers.CodeFixes/ReadabilityRules/SA1134CodeFixProvider.cs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,23 @@ public override FixAllProvider GetFixAllProvider()
3333
}
3434

3535
/// <inheritdoc/>
36-
public override Task RegisterCodeFixesAsync(CodeFixContext context)
36+
public override async Task RegisterCodeFixesAsync(CodeFixContext context)
3737
{
38+
var syntaxRoot = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false);
39+
3840
foreach (var diagnostic in context.Diagnostics)
3941
{
40-
context.RegisterCodeFix(
41-
CodeAction.Create(
42-
ReadabilityResources.SA1134CodeFix,
43-
cancellationToken => GetTransformedDocumentAsync(context.Document, diagnostic, cancellationToken),
44-
nameof(SA1134CodeFixProvider)),
45-
diagnostic);
42+
// Do not offer the code fix if the error is found at an invalid node (like IncompleteMemberSyntax)
43+
if (syntaxRoot.FindNode(diagnostic.Location.SourceSpan) is AttributeListSyntax)
44+
{
45+
context.RegisterCodeFix(
46+
CodeAction.Create(
47+
ReadabilityResources.SA1134CodeFix,
48+
cancellationToken => GetTransformedDocumentAsync(context.Document, diagnostic, cancellationToken),
49+
nameof(SA1134CodeFixProvider)),
50+
diagnostic);
51+
}
4652
}
47-
48-
return SpecializedTasks.CompletedTask;
4953
}
5054

5155
private static async Task<Document> GetTransformedDocumentAsync(Document document, Diagnostic diagnostic, CancellationToken cancellationToken)

StyleCop.Analyzers/StyleCop.Analyzers.CodeFixes/StyleCop.Analyzers.Metadata.nuspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<title>$id$</title>
77
<authors>Sam Harwell et. al.</authors>
88
<owners>Sam Harwell</owners>
9-
<licenseUrl>https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/$GitCommitIdShort$/LICENSE</licenseUrl>
9+
<license type="expression">Apache-2.0</license>
1010
<projectUrl>https://github.com/DotNetAnalyzers/StyleCopAnalyzers</projectUrl>
1111
<requireLicenseAcceptance>false</requireLicenseAcceptance>
1212
<description>An implementation of StyleCop's rules using Roslyn analyzers and code fixes</description>

StyleCop.Analyzers/StyleCop.Analyzers.CodeFixes/StyleCop.Analyzers.nuspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<title>$id$</title>
77
<authors>Sam Harwell et. al.</authors>
88
<owners>Sam Harwell</owners>
9-
<licenseUrl>https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/$GitCommitIdShort$/LICENSE</licenseUrl>
9+
<license type="expression">Apache-2.0</license>
1010
<projectUrl>https://github.com/DotNetAnalyzers/StyleCopAnalyzers</projectUrl>
1111
<requireLicenseAcceptance>false</requireLicenseAcceptance>
1212
<description>An implementation of StyleCop's rules using Roslyn analyzers and code fixes</description>

StyleCop.Analyzers/StyleCop.Analyzers.Test/ReadabilityRules/SA1103UnitTests.cs

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ namespace StyleCop.Analyzers.Test.ReadabilityRules
55
{
66
using System.Threading;
77
using System.Threading.Tasks;
8+
using Microsoft.CodeAnalysis;
89
using Microsoft.CodeAnalysis.Testing;
910
using StyleCop.Analyzers.ReadabilityRules;
10-
using TestHelper;
1111
using Xunit;
1212
using static StyleCop.Analyzers.Test.Verifiers.StyleCopCodeFixVerifier<
1313
StyleCop.Analyzers.ReadabilityRules.SA110xQueryClauses,
@@ -365,5 +365,91 @@ public void TestMethod()
365365

366366
await VerifyCSharpFixAsync(testCode, expectedDiagnostics, fixedTestCode, CancellationToken.None).ConfigureAwait(false);
367367
}
368+
369+
[Fact]
370+
[WorkItem(2888, "https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/2888")]
371+
public async Task TestQueryExpressionWithMissingSelectAsync()
372+
{
373+
var testCode = @"namespace TestNamespace
374+
{
375+
using System.Linq;
376+
377+
public class TestClass
378+
{
379+
private int[] testArray = { 1, 2, 3, 4, 5 };
380+
381+
public void TestMethod()
382+
{
383+
var x = from element in testArray
384+
where element > 1;
385+
}
386+
}
387+
}
388+
";
389+
390+
var expectedDiagnostics = new DiagnosticResult("CS0742", DiagnosticSeverity.Error).WithLocation(12, 38).WithMessage("A query body must end with a select clause or a group clause");
391+
await VerifyCSharpFixAsync(testCode, expectedDiagnostics, testCode, CancellationToken.None).ConfigureAwait(false);
392+
}
393+
394+
[Fact]
395+
[WorkItem(2888, "https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/2888")]
396+
public async Task TestQueryExpressionWithMissingSelect2Async()
397+
{
398+
var testCode = @"namespace TestNamespace
399+
{
400+
using System.Linq;
401+
402+
public class TestClass
403+
{
404+
private int[] testArray = { 1, 2, 3, 4, 5 };
405+
406+
public void TestMethod()
407+
{
408+
var x = from element in testArray where element < 3
409+
where element > 1;
410+
}
411+
}
412+
}
413+
";
414+
var fixedTestCode = @"namespace TestNamespace
415+
{
416+
using System.Linq;
417+
418+
public class TestClass
419+
{
420+
private int[] testArray = { 1, 2, 3, 4, 5 };
421+
422+
public void TestMethod()
423+
{
424+
var x = from element in testArray
425+
where element < 3
426+
where element > 1;
427+
}
428+
}
429+
}
430+
";
431+
432+
await new CSharpTest
433+
{
434+
TestState =
435+
{
436+
Sources = { testCode },
437+
ExpectedDiagnostics =
438+
{
439+
Diagnostic(SA110xQueryClauses.SA1103Descriptor).WithLocation(11, 21),
440+
new DiagnosticResult("CS0742", DiagnosticSeverity.Error).WithLocation(12, 38).WithMessage("A query body must end with a select clause or a group clause"),
441+
},
442+
},
443+
FixedState =
444+
{
445+
Sources = { fixedTestCode },
446+
ExpectedDiagnostics =
447+
{
448+
new DiagnosticResult("CS0742", DiagnosticSeverity.Error).WithLocation(13, 38).WithMessage("A query body must end with a select clause or a group clause"),
449+
},
450+
},
451+
CodeFixIndex = 1,
452+
}.RunAsync(CancellationToken.None).ConfigureAwait(false);
453+
}
368454
}
369455
}

StyleCop.Analyzers/StyleCop.Analyzers.Test/ReadabilityRules/SA1134UnitTests.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,5 +409,35 @@ public class TestClass<[Test(""Test1"")][Test(""Test2"")]T>
409409

410410
await VerifyCSharpDiagnosticAsync(testCode, DiagnosticResult.EmptyDiagnosticResults, CancellationToken.None).ConfigureAwait(false);
411411
}
412+
413+
/// <summary>
414+
/// Verifies that passing an invalid member syntax into the codefix will not change the code.
415+
/// </summary>
416+
/// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns>
417+
[Fact]
418+
[WorkItem(2894, "https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/2894")]
419+
public async Task VerifyInvalidMemberSyntaxInCodeFixAsync()
420+
{
421+
string testCode = @"class Program
422+
{
423+
static void Main(string[] args)
424+
{
425+
{
426+
}[;]
427+
}
428+
}
429+
";
430+
431+
DiagnosticResult[] expected =
432+
{
433+
DiagnosticResult.CompilerError("CS1513").WithLocation(6, 10),
434+
Diagnostic().WithLocation(6, 10),
435+
DiagnosticResult.CompilerError("CS1001").WithLocation(6, 11),
436+
DiagnosticResult.CompilerError("CS1001").WithLocation(6, 11),
437+
DiagnosticResult.CompilerError("CS1022").WithLocation(8, 1),
438+
};
439+
440+
await VerifyCSharpFixAsync(testCode, expected, testCode, CancellationToken.None).ConfigureAwait(false);
441+
}
412442
}
413443
}

StyleCop.Analyzers/StyleCop.Analyzers/ReadabilityRules/SA110xQueryClauses.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,11 @@ private static void HandleSelectOrGroup(SelectOrGroupClauseSyntax selectOrGroup,
218218
{
219219
case SyntaxKind.SelectClause:
220220
var selectClause = (SelectClauseSyntax)selectOrGroup;
221-
tokensToCheck.Add(selectClause.SelectKeyword);
221+
if (!selectClause.IsMissing)
222+
{
223+
tokensToCheck.Add(selectClause.SelectKeyword);
224+
}
225+
222226
break;
223227
case SyntaxKind.GroupClause:
224228
var groupClause = (GroupClauseSyntax)selectOrGroup;

global.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"sdk": {
3+
"version": "2.1.504"
4+
}
5+
}

0 commit comments

Comments
 (0)