Skip to content

Commit 9fc9636

Browse files
committed
Merge branch 'generator-experiment'
# Conflicts: # rewrite-csharp/src/main/java/org/openrewrite/csharp/RoslynRecipe.java # rewrite-csharp/src/test/java/org/openrewrite/csharp/recipes/AvoidConstantArraysAsArgumentsTest.java # rewrite-csharp/src/test/java/org/openrewrite/csharp/tree/CsModelGeneratorTest.java
2 parents 193b800 + 2b7309c commit 9fc9636

File tree

126 files changed

+8605
-1083
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

126 files changed

+8605
-1083
lines changed

.claude/settings.local.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
"permissions": {
33
"allow": [
44
"Bash(python:*)",
5-
"Bash(./gradlew:*)"
5+
"Bash(./gradlew:*)",
6+
"Bash(powershell:*)",
7+
"Read(/C:\\projects\\openrewrite\\rewrite-csharp\\rewrite-csharp\\src\\main\\java\\org\\openrewrite\\csharp/**)"
68
],
79
"deny": []
810
}

Rewrite/.run/Tests - CSharp.run.xml

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
<component name="ProjectRunConfigurationManager">
22
<configuration default="false" name="Tests - CSharp" type="DotNetProject" factoryName=".NET Project" folderName="Test">
3-
<option name="EXE_PATH" value="$PROJECT_DIR$/tests/Rewrite.CSharp.Tests/bin/Debug/Rewrite.CSharp.Tests.exe" />
3+
<option name="EXE_PATH" value="$PROJECT_DIR$/tests/Rewrite.CSharp.Tests/bin/Debug/net9.0/Rewrite.CSharp.Tests.dll" />
44
<option name="PROGRAM_PARAMETERS" value="--test-parameter RenderLST=false" />
5-
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/tests/Rewrite.CSharp.Tests/bin/Debug" />
5+
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/tests/Rewrite.CSharp.Tests/bin/Debug/net9.0" />
66
<option name="PASS_PARENT_ENVS" value="1" />
77
<option name="USE_EXTERNAL_CONSOLE" value="0" />
8+
<option name="ENV_FILE_PATHS" value="" />
9+
<option name="REDIRECT_INPUT_PATH" value="" />
10+
<option name="PTY_MODE" value="Auto" />
811
<option name="USE_MONO" value="0" />
912
<option name="RUNTIME_ARGUMENTS" value="" />
13+
<option name="AUTO_ATTACH_CHILDREN" value="0" />
14+
<option name="MIXED_MODE_DEBUG" value="0" />
1015
<option name="PROJECT_PATH" value="$PROJECT_DIR$/tests/Rewrite.CSharp.Tests/Rewrite.CSharp.Tests.csproj" />
1116
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
1217
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
1318
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
14-
<option name="PROJECT_KIND" value="DotNetCore" />
15-
<option name="PROJECT_TFM" value="net8.0" />
19+
<option name="PROJECT_KIND" value="StaticMethod" />
20+
<option name="PROJECT_TFM" value="net9.0" />
1621
<method v="2">
1722
<option name="Build" />
1823
</method>

Rewrite/.run/Tests - MSBuild.run.xml

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
<component name="ProjectRunConfigurationManager">
22
<configuration default="false" name="Tests - MSBuild" type="DotNetProject" factoryName=".NET Project" folderName="Test">
3-
<option name="EXE_PATH" value="$PROJECT_DIR$/tests/Rewrite.MSBuild.Tests/bin/Debug/Rewrite.MSBuild.Tests.exe" />
3+
<option name="EXE_PATH" value="$PROJECT_DIR$/tests/Rewrite.MSBuild.Tests/bin/Debug/net9.0/Rewrite.MSBuild.Tests.exe" />
44
<option name="PROGRAM_PARAMETERS" value="" />
5-
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/tests/Rewrite.MSBuild.Tests/bin/Debug" />
5+
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/tests/Rewrite.MSBuild.Tests/bin/Debug/net9.0" />
66
<option name="PASS_PARENT_ENVS" value="1" />
77
<option name="USE_EXTERNAL_CONSOLE" value="0" />
8+
<option name="ENV_FILE_PATHS" value="" />
9+
<option name="REDIRECT_INPUT_PATH" value="" />
10+
<option name="PTY_MODE" value="Auto" />
811
<option name="USE_MONO" value="0" />
912
<option name="RUNTIME_ARGUMENTS" value="" />
13+
<option name="AUTO_ATTACH_CHILDREN" value="0" />
14+
<option name="MIXED_MODE_DEBUG" value="0" />
1015
<option name="PROJECT_PATH" value="$PROJECT_DIR$/tests/Rewrite.MSBuild.Tests/Rewrite.MSBuild.Tests.csproj" />
1116
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
1217
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
1318
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
1419
<option name="PROJECT_KIND" value="DotNetCore" />
15-
<option name="PROJECT_TFM" value="net8.0" />
20+
<option name="PROJECT_TFM" value="net9.0" />
1621
<method v="2">
1722
<option name="Build" />
1823
</method>

Rewrite/Directory.Build.props

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
<Project>
22
<PropertyGroup>
3-
<TargetFramework>net9.0</TargetFramework>
3+
<!-- <TargetFrameworks>net8.0;net9.0</TargetFrameworks>-->
4+
<!-- <TargetFramework>net9.0</TargetFramework>-->
5+
<TargetFrameworks>net8.0;net9.0</TargetFrameworks>
46
<Nullable>enable</Nullable>
57
<ImplicitUsings>enable</ImplicitUsings>
68
</PropertyGroup>
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
using Microsoft.CodeAnalysis;
2+
3+
namespace Rewrite.Analyzers.Analyzers;
4+
5+
/// <summary>
6+
/// Contains definitions of diagnostics which can be raised by Lombok.NET.
7+
/// </summary>
8+
public static class DiagnosticDescriptors
9+
{
10+
/// <summary>
11+
/// Raised when a type is not partial although it should be.
12+
/// </summary>
13+
public static readonly DiagnosticDescriptor TypeMustBePartial = new(
14+
"LOM001",
15+
"Type must be partial",
16+
"The type '{0}' must be partial in order to generate code for it",
17+
"Usage",
18+
DiagnosticSeverity.Error,
19+
true
20+
);
21+
22+
/// <summary>
23+
/// Raised when a type is within another type although it should not be.
24+
/// </summary>
25+
public static readonly DiagnosticDescriptor TypeMustBeNonNested = new(
26+
"LOM002",
27+
"Type must be non-nested",
28+
"The type '{0}' must be non-nested in order to generate code for it",
29+
"Usage",
30+
DiagnosticSeverity.Error,
31+
true
32+
);
33+
34+
/// <summary>
35+
/// Raised when a type is not within a namespace although it should be.
36+
/// </summary>
37+
public static readonly DiagnosticDescriptor TypeMustHaveNamespace = new(
38+
"LOM003",
39+
"Type must have namespace",
40+
"The type '{0}' must be in a namespace in order to generate code for it",
41+
"Usage",
42+
DiagnosticSeverity.Error,
43+
true
44+
);
45+
46+
/// <summary>
47+
/// Raised when a method is not within a class or a struct although it should be, or if it is a local function.
48+
/// </summary>
49+
public static readonly DiagnosticDescriptor MethodMustBeInPartialClassOrStruct = new(
50+
"LOM004",
51+
"Method must be inside partial class or struct",
52+
"The method '{0}' must be inside a partial class or a struct and cannot be a local function",
53+
"Usage",
54+
DiagnosticSeverity.Error,
55+
true
56+
);
57+
58+
/// <summary>
59+
/// Raised when a field is not within a class or a struct although it should be.
60+
/// </summary>
61+
public static readonly DiagnosticDescriptor PropertyFieldMustBeInClassOrStruct = new(
62+
"LOM005",
63+
"Field must be inside class or struct",
64+
"The field '{0}' must be inside a class or a struct",
65+
"Usage",
66+
DiagnosticSeverity.Error,
67+
true
68+
);
69+
70+
/// <summary>
71+
/// Raised when invalid JSON is encountered.
72+
/// </summary>
73+
public static readonly DiagnosticDescriptor InvalidJson = new(
74+
"LOM006",
75+
"Invalid JSON",
76+
"Unable to generate code, since the JSON input is invalid",
77+
"Usage",
78+
DiagnosticSeverity.Error,
79+
true
80+
);
81+
82+
/// <summary>
83+
/// Raised when a type is file-local.
84+
/// </summary>
85+
public static readonly DiagnosticDescriptor TypeCannotBeFileLocal = new(
86+
"LOM007",
87+
"Type cannot be file-local",
88+
"The type '{0}' must not be file-local in order to generate code for it",
89+
"Usage",
90+
DiagnosticSeverity.Error,
91+
true
92+
);
93+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
using System.Collections.Immutable;
2+
using Microsoft.CodeAnalysis;
3+
using Microsoft.CodeAnalysis.CodeActions;
4+
using Microsoft.CodeAnalysis.CodeFixes;
5+
using Microsoft.CodeAnalysis.CSharp;
6+
using Microsoft.CodeAnalysis.CSharp.Syntax;
7+
8+
namespace Rewrite.Analyzers.Analyzers;
9+
10+
/// <summary>
11+
/// Code fix for types which need to be partial. Simply adds the partial modifier to the type declaration.
12+
/// </summary>
13+
[ExportCodeFixProvider(LanguageNames.CSharp)]
14+
public sealed class MustBePartialCodeFix : CodeFixProvider
15+
{
16+
private static readonly string TriggeringDiagnosticId = DiagnosticDescriptors.TypeMustBePartial.Id;
17+
18+
/// <summary>
19+
/// Registers the code fix.
20+
/// </summary>
21+
/// <param name="context">The context of registration.</param>
22+
public override async Task RegisterCodeFixesAsync(CodeFixContext context)
23+
{
24+
var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken);
25+
if (root?.FindNode(context.Span) is not TypeDeclarationSyntax typeDeclaration)
26+
{
27+
return;
28+
}
29+
30+
var newDeclaration = typeDeclaration.AddModifiers(SyntaxFactory.Token(SyntaxKind.PartialKeyword));
31+
var newRoot = root.ReplaceNode(typeDeclaration, newDeclaration);
32+
33+
var codeFix = CodeAction.Create(
34+
$"Make '{typeDeclaration.Identifier.Text}' partial",
35+
token => Task.FromResult(context.Document.WithSyntaxRoot(newRoot)),
36+
TriggeringDiagnosticId
37+
);
38+
39+
context.RegisterCodeFix(codeFix, context.Diagnostics);
40+
}
41+
42+
/// <summary>
43+
/// Supplies a fix all provider.
44+
/// </summary>
45+
/// <returns>A batch fixer.</returns>
46+
public override FixAllProvider GetFixAllProvider() => WellKnownFixAllProviders.BatchFixer;
47+
48+
/// <summary>
49+
/// Diagnostics which can be fixed by this analyzer.
50+
/// </summary>
51+
public override ImmutableArray<string> FixableDiagnosticIds { get; } = ImmutableArray.Create(TriggeringDiagnosticId);
52+
}

Rewrite/src/Rewrite.Analyzers/Authoring/CommonHelpers.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using System.Diagnostics;
22

3-
namespace MyProject.Analyzers.Authoring;
3+
namespace Rewrite.Analyzers.Authoring;
44

55

66
internal static class CommonHelpers

Rewrite/src/Rewrite.Analyzers/Authoring/Extensions.SourceGenerator.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
using Microsoft.CodeAnalysis;
2-
using Microsoft.CodeAnalysis.CSharp;
3-
using Microsoft.CodeAnalysis.CSharp.Syntax;
4-
using static Microsoft.CodeAnalysis.CSharp.SyntaxKind;
5-
namespace MyProject.Analyzers.Authoring;
1+
namespace Rewrite.Analyzers.Authoring;
62

73
public static partial class Extensions
84
{

Rewrite/src/Rewrite.Analyzers/Authoring/Extensions.Syntax.cs

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
using Microsoft.CodeAnalysis.CSharp;
44
using Microsoft.CodeAnalysis.CSharp.Syntax;
55
using static Microsoft.CodeAnalysis.CSharp.SyntaxKind;
6-
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
7-
namespace MyProject.Analyzers.Authoring;
6+
7+
namespace Rewrite.Analyzers.Authoring;
88

99
public static partial class Extensions
1010
{
@@ -32,23 +32,7 @@ public static bool InheritsFrom(this INamedTypeSymbol symbol, string type)
3232
}
3333

3434

35-
public static bool HasAttribute(this SyntaxList<AttributeListSyntax> attributes, string name)
36-
{
37-
string fullname, shortname;
38-
var attrLen = "Attribute".Length;
39-
if (name.EndsWith("Attribute"))
40-
{
41-
fullname = name;
42-
shortname = name.Remove(name.Length - attrLen, attrLen);
43-
}
44-
else
45-
{
46-
fullname = name + "Attribute";
47-
shortname = name;
48-
}
4935

50-
return attributes.Any(al => al.Attributes.Any(a => a.Name.ToString() == shortname || a.Name.ToString() == fullname));
51-
}
5236
/// <summary>
5337
/// Generates a filename-safe string for a TypeDeclarationSyntax, including namespace, nesting, and generic arity.
5438
/// Example: Namespace.Outer`1.Inner`2.g.cs

Rewrite/src/Rewrite.Analyzers/Authoring/Extensions.Templating.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
using System.Text;
22
using System.Text.RegularExpressions;
33
using Microsoft.CodeAnalysis;
4-
using Microsoft.CodeAnalysis.CSharp;
54
using Microsoft.CodeAnalysis.CSharp.Syntax;
65
using Microsoft.CodeAnalysis.Text;
76

8-
namespace MyProject.Analyzers.Authoring;
7+
namespace Rewrite.Analyzers.Authoring;
98

109
[PublicAPI]
1110
public static partial class Extensions

0 commit comments

Comments
 (0)