Skip to content

Commit 74f1e13

Browse files
committed
More tinkering
1 parent a0ee1b6 commit 74f1e13

File tree

10 files changed

+89
-117
lines changed

10 files changed

+89
-117
lines changed

AutoCtor.sln

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,6 @@ EndProject
2121
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AutoCtor.Tests", "src\AutoCtor.Tests\AutoCtor.Tests.csproj", "{C8D666C8-D2F5-4A6E-928D-EAFE8F688AAC}"
2222
EndProject
2323
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AutoCtor.Attributes", "src\AutoCtor.Attributes\AutoCtor.Attributes.csproj", "{638834EA-E4D5-429E-A11E-4BFA91FD59E2}"
24-
ProjectSection(ProjectDependencies) = postProject
25-
{56918D57-9044-452E-8830-2739B3BBE9E3} = {56918D57-9044-452E-8830-2739B3BBE9E3}
26-
{ADC68ADD-629A-4A05-8869-CD1ECF2914C1} = {ADC68ADD-629A-4A05-8869-CD1ECF2914C1}
27-
EndProjectSection
2824
EndProject
2925
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AutoCtor.Roslyn3.11", "src\AutoCtor.Roslyn3.11\AutoCtor.Roslyn3.11.csproj", "{ADC68ADD-629A-4A05-8869-CD1ECF2914C1}"
3026
EndProject
Lines changed: 39 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,62 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
44
<TargetFramework>netstandard2.0</TargetFramework>
55
<RootNamespace>AutoCtor</RootNamespace>
6-
7-
<Version>0.0.0</Version>
8-
<PackageProjectUrl>https://github.com/distantcam/AutoCtor</PackageProjectUrl>
9-
10-
<GeneratePackageOnBuild Condition="$(Configuration) == 'Release'">true</GeneratePackageOnBuild>
6+
<IsPackable>true</IsPackable>
7+
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
118
</PropertyGroup>
129

1310
<PropertyGroup>
1411
<PackageId>AutoCtor</PackageId>
12+
<Version>0.0.0</Version>
1513
<Authors>Cameron MacFarland</Authors>
1614
<Description>Source Generator to automatically create a constructor with all the readonly fields set.</Description>
1715
<PackageLicenseExpression>MIT</PackageLicenseExpression>
1816
<PackageReadmeFile>readme.md</PackageReadmeFile>
1917
<PackageOutputPath>$(SolutionDir)nugets</PackageOutputPath>
18+
<PackageProjectUrl>https://github.com/distantcam/AutoCtor</PackageProjectUrl>
2019
</PropertyGroup>
2120

2221
<ItemGroup>
2322
<PackageReference Include="Microsoft.SourceLink.GitHub" PrivateAssets="all" />
2423
</ItemGroup>
2524

2625
<ItemGroup>
27-
<None Include="$(SolutionDir)\src\AutoCtor.Roslyn3.11\bin\Release\netstandard2.0\AutoCtor.dll">
28-
<Pack>true</Pack>
29-
<Visible>false</Visible>
30-
<PackagePath>analyzers/dotnet/roslyn3.11/cs</PackagePath>
31-
</None>
32-
33-
<None Include="$(SolutionDir)\src\AutoCtor.Roslyn4.0\bin\Release\netstandard2.0\AutoCtor.dll">
34-
<Pack>true</Pack>
35-
<Visible>false</Visible>
36-
<PackagePath>analyzers/dotnet/roslyn4.0/cs</PackagePath>
37-
</None>
38-
39-
<None Include="$(SolutionDir)\src\AutoCtor.Roslyn4.4\bin\Release\netstandard2.0\AutoCtor.dll">
40-
<Pack>true</Pack>
41-
<Visible>false</Visible>
42-
<PackagePath>analyzers/dotnet/roslyn4.4/cs</PackagePath>
43-
</None>
44-
45-
<None Include="$(SolutionDir)\readme.md" Pack="true" PackagePath="\" Visible="false" />
46-
<None Include="$(SolutionDir)\src\nugetfiles\AutoCtor.props" Pack="true" PackagePath="build" Visible="false" />
47-
48-
<None Include="$(SolutionDir)\src\nugetfiles\AutoCtor.targets" Pack="true" PackagePath="buildTransitive\net8.0" Visible="false" />
49-
<None Include="$(SolutionDir)\src\nugetfiles\AutoCtor.targets" Pack="true" PackagePath="buildTransitive\net462" Visible="false" />
50-
<None Include="$(SolutionDir)\src\nugetfiles\AutoCtor.targets" Pack="true" PackagePath="buildTransitive\netstandard2.0" Visible="false" />
51-
52-
<None Include="$(SolutionDir)\src\nugetfiles\AutoCtor.badcompat.targets" Pack="true" PackagePath="buildTransitive\net461\AutoCtor.targets" Visible="false" />
53-
<None Include="$(SolutionDir)\src\nugetfiles\AutoCtor.badcompat.targets" Pack="true" PackagePath="buildTransitive\netcoreapp2.0\AutoCtor.targets" Visible="false" />
26+
<ProjectReference Include="..\AutoCtor.Roslyn3.11\AutoCtor.Roslyn3.11.csproj"
27+
PrivateAssets="All" ReferenceOutputAssembly="false" />
28+
<ProjectReference Include="..\AutoCtor.Roslyn4.0\AutoCtor.Roslyn4.0.csproj"
29+
PrivateAssets="All" ReferenceOutputAssembly="false" />
30+
<ProjectReference Include="..\AutoCtor.Roslyn4.4\AutoCtor.Roslyn4.4.csproj"
31+
PrivateAssets="All" ReferenceOutputAssembly="false" />
32+
</ItemGroup>
33+
34+
<ItemGroup>
35+
<None Include="$(ArtifactsPath)\bin\AutoCtor.Roslyn3.11\$(ArtifactsPivots)\AutoCtor.dll"
36+
Pack="true" PackagePath="analyzers/dotnet/roslyn3.11/cs" Visible="false"/>
37+
38+
<None Include="$(ArtifactsPath)\bin\AutoCtor.Roslyn4.0\$(ArtifactsPivots)\AutoCtor.dll"
39+
Pack="true" PackagePath="analyzers/dotnet/roslyn4.0/cs" Visible="false"/>
40+
41+
<None Include="$(ArtifactsPath)\bin\AutoCtor.Roslyn4.4\$(ArtifactsPivots)\AutoCtor.dll"
42+
Pack="true" PackagePath="analyzers/dotnet/roslyn4.4/cs" Visible="false"/>
43+
44+
<None Include="$(SolutionDir)\readme.md"
45+
Pack="true" PackagePath="\" Visible="false" />
46+
<None Include="$(SolutionDir)\src\nugetfiles\AutoCtor.props"
47+
Pack="true" PackagePath="build" Visible="false" />
48+
49+
<None Include="$(SolutionDir)\src\nugetfiles\AutoCtor.targets"
50+
Pack="true" PackagePath="buildTransitive\net8.0" Visible="false" />
51+
<None Include="$(SolutionDir)\src\nugetfiles\AutoCtor.targets"
52+
Pack="true" PackagePath="buildTransitive\net462" Visible="false" />
53+
<None Include="$(SolutionDir)\src\nugetfiles\AutoCtor.targets"
54+
Pack="true" PackagePath="buildTransitive\netstandard2.0" Visible="false" />
55+
56+
<None Include="$(SolutionDir)\src\nugetfiles\AutoCtor.badcompat.targets"
57+
Pack="true" PackagePath="buildTransitive\net461\AutoCtor.targets" Visible="false" />
58+
<None Include="$(SolutionDir)\src\nugetfiles\AutoCtor.badcompat.targets"
59+
Pack="true" PackagePath="buildTransitive\netcoreapp2.0\AutoCtor.targets" Visible="false" />
5460
</ItemGroup>
5561

5662
</Project>

src/AutoCtor.Roslyn3.11/AutoConstructSourceGenerator.cs

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,48 @@ private sealed class SyntaxContextReceiver(CancellationToken cancellationToken)
2323

2424
public void OnVisitSyntaxNode(GeneratorSyntaxContext context)
2525
{
26-
if (context.Node is TypeDeclarationSyntax { AttributeLists.Count: > 0 })
26+
if (GeneratorUtilities.IsTypeDeclaration(context.Node, CancellationToken.None)
27+
28+
&& MemberHasAttribute(AttributeNames.AutoConstruct, context, cancellationToken)
29+
30+
&& context.SemanticModel.GetDeclaredSymbol(context.Node, cancellationToken)
31+
is INamedTypeSymbol type)
2732
{
28-
var type = Parser.GetMarkedNamedTypeSymbol(context, cancellationToken);
29-
if (type != null)
30-
(TypeModels ??= []).Add(TypeModel.Create(type));
33+
(TypeModels ??= []).Add(TypeModel.Create(type));
3134
}
32-
else if (context.Node is MethodDeclarationSyntax { AttributeLists.Count: > 0 })
35+
36+
else if (GeneratorUtilities.IsMethodDeclaration(context.Node, CancellationToken.None)
37+
38+
&& MemberHasAttribute(AttributeNames.AutoPostConstruct, context, cancellationToken)
39+
40+
&& context.SemanticModel.GetDeclaredSymbol(context.Node, cancellationToken)
41+
is IMethodSymbol method)
3342
{
34-
var method = Parser.GetMarkedMethodSymbol(context, cancellationToken);
35-
if (method != null)
36-
(MarkedMethods ??= []).Add(PostCtorModel.Create(method));
43+
(MarkedMethods ??= []).Add(PostCtorModel.Create(method));
3744
}
3845
}
46+
47+
private static bool MemberHasAttribute(
48+
string attribute,
49+
GeneratorSyntaxContext context,
50+
CancellationToken cancellationToken)
51+
{
52+
foreach (var attributeListSyntax in ((MemberDeclarationSyntax)context.Node).AttributeLists)
53+
foreach (var attributeSyntax in attributeListSyntax.Attributes)
54+
{
55+
if (context.SemanticModel.GetSymbolInfo(attributeSyntax, cancellationToken)
56+
.Symbol is not IMethodSymbol attributeSymbol)
57+
continue;
58+
59+
var attributeContainingTypeSymbol = attributeSymbol.ContainingType;
60+
var fullName = attributeContainingTypeSymbol.ToDisplayString();
61+
62+
if (fullName != attribute) continue;
63+
64+
return true;
65+
}
66+
return false;
67+
}
3968
}
4069

4170
public void Initialize(GeneratorInitializationContext context)

src/AutoCtor.Shared/AutoConstructSourceGenerator/Parser.cs

Lines changed: 0 additions & 50 deletions
This file was deleted.

src/AutoCtor.Shared/AutoCtor.Shared.projitems

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
<Compile Include="$(MSBuildThisFileDirectory)AutoConstructSourceGenerator\Tracking.cs" />
1414
<Compile Include="$(MSBuildThisFileDirectory)AutoConstructSourceGenerator\Diagnostics.cs" />
1515
<Compile Include="$(MSBuildThisFileDirectory)AutoConstructSourceGenerator\Emitter.cs" />
16-
<Compile Include="$(MSBuildThisFileDirectory)AutoConstructSourceGenerator\Parser.cs" />
1716
<Compile Include="$(MSBuildThisFileDirectory)Helpers\CodeBuilder.cs" />
1817
<Compile Include="$(MSBuildThisFileDirectory)Helpers\Extensions.cs" />
1918
<Compile Include="$(MSBuildThisFileDirectory)Helpers\GeneratorUtilities.cs" />
@@ -30,4 +29,4 @@
3029
<AdditionalFiles Include="$(MSBuildThisFileDirectory)AnalyzerReleases.Shipped.md" />
3130
<AdditionalFiles Include="$(MSBuildThisFileDirectory)AnalyzerReleases.Unshipped.md" />
3231
</ItemGroup>
33-
</Project>
32+
</Project>

src/AutoCtor.Shared/Helpers/CodeBuilder.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ internal class CodeBuilder
1818
static CodeBuilder()
1919
{
2020
var assembly = Assembly.GetAssembly(typeof(CodeBuilder));
21-
s_assemblyName = assembly.GetCustomAttribute<AssemblyTitleAttribute>().Title;
22-
s_version = assembly.GetCustomAttribute<AssemblyFileVersionAttribute>()?.Version ?? "0.0.0.0";
23-
var metadata = assembly.GetCustomAttributes<AssemblyMetadataAttribute>()?.ToDictionary(m => m.Key, m => m.Value);
21+
s_assemblyName = assembly?.GetCustomAttribute<AssemblyTitleAttribute>()?.Title ?? "Untitled";
22+
s_version = assembly?.GetCustomAttribute<AssemblyFileVersionAttribute>()?.Version ?? "0.0.0.0";
23+
var metadata = assembly?.GetCustomAttributes<AssemblyMetadataAttribute>()?.ToDictionary(m => m.Key, m => m.Value);
2424
if (metadata != null)
2525
{
2626
metadata.TryGetValue("PackageProjectUrl", out s_packageProjectUrl);

src/AutoCtor.Shared/Models/EquatableTypeSymbol.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ internal class EquatableTypeSymbol(ITypeSymbol typeSymbol)
77
public override int GetHashCode() => ToString().GetHashCode();
88

99
public override bool Equals(object? obj) =>
10-
obj is EquatableTypeSymbol other &&
11-
StringComparer.Ordinal.Equals(ToString(), other.ToString());
10+
obj is EquatableTypeSymbol other
11+
&& StringComparer.Ordinal.Equals(ToString(), other.ToString());
1212

1313
public override string ToString() => TypeSymbol.ToDisplayString(FullyQualifiedFormat);
1414

src/AutoCtor.Shared/Models/ParameterList.cs

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,22 @@
11
using System.Collections;
22
using System.Globalization;
3-
using Microsoft.CodeAnalysis;
43

54
internal class ParameterList(IEnumerable<MemberModel> fields, IEnumerable<MemberModel> properties)
65
: IEnumerable<ParameterModel>, IFormattable
76
{
8-
private readonly Dictionary<MemberModel, ParameterModel> _memberToParameterMap =
9-
fields.Concat(properties)
7+
private readonly Dictionary<MemberModel, ParameterModel> _memberToParameterMap
8+
= fields.Concat(properties)
109
.ToDictionary(m => m, m => new ParameterModel(m.FriendlyName, m.Type));
11-
1210
private readonly List<ParameterModel> _parameters = [];
1311
private readonly Dictionary<ParameterModel, string> _uniqueNames = [];
14-
private IEnumerable<ParameterModel> _postCtorParameters = [];
12+
private readonly List<ParameterModel> _postCtorParameters = [];
1513

1614
public bool HasBaseParameters => _parameters?.Any() == true;
1715

1816
public void AddParameters(IEnumerable<ParameterModel> parameters)
19-
{
20-
_parameters.AddRange(parameters);
21-
}
22-
17+
=> _parameters.AddRange(parameters);
2318
public void AddPostCtorParameters(IEnumerable<ParameterModel> parameters)
24-
{
25-
_postCtorParameters = parameters;
26-
}
19+
=> _postCtorParameters.AddRange(parameters);
2720

2821
public void MakeUniqueNames()
2922
{
@@ -47,8 +40,6 @@ public void MakeUniqueNames()
4740

4841
public string ParameterName(MemberModel f) => _uniqueNames[_memberToParameterMap[f]];
4942

50-
public IEnumerable<ParameterModel> BaseParameters() => _parameters;
51-
5243
public IEnumerator<ParameterModel> GetEnumerator() => _parameters
5344
.Concat(_memberToParameterMap.Values)
5445
.Concat(_postCtorParameters)

src/AutoCtor.Tests/ExampleTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public async Task EnsureRunsAreCachedCorrectly(CodeFileTheoryData theoryData)
8484
#endif
8585
];
8686

87-
private static DirectoryInfo? BaseDir { get; } = new DirectoryInfo(Environment.CurrentDirectory)?.Parent?.Parent?.Parent;
87+
private static DirectoryInfo? BaseDir { get; } = new DirectoryInfo(Environment.CurrentDirectory)?.Parent?.Parent;
8888

8989
private static IEnumerable<string> GetExamplesFiles(string path) => Directory.GetFiles(Path.Combine(BaseDir?.FullName ?? "", path), "*.cs").Where(e => !e.Contains(".g."));
9090

src/Directory.Build.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
77
<NoWarn>NU5128</NoWarn>
8+
<UseArtifactsOutput>true</UseArtifactsOutput>
89
</PropertyGroup>
910

1011
<ItemGroup>

0 commit comments

Comments
 (0)