Skip to content

Commit

Permalink
chore: 尝试优化生成器效率
Browse files Browse the repository at this point in the history
  • Loading branch information
stratosblue committed Nov 23, 2024
1 parent 6abd883 commit 7c11520
Show file tree
Hide file tree
Showing 8 changed files with 74 additions and 36 deletions.
20 changes: 2 additions & 18 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ dotnet_style_qualification_for_property = false:silent
dotnet_style_qualification_for_method = false:silent
dotnet_style_qualification_for_event = false:silent
dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent
indent_size = 4
tab_width = 4
indent_size = 2
tab_width = 2
dotnet_style_operator_placement_when_wrapping = beginning_of_line

# c# 文件
Expand Down Expand Up @@ -300,19 +300,3 @@ dotnet_naming_style.以_为前缀.required_prefix = _
dotnet_naming_style.以_为前缀.required_suffix =
dotnet_naming_style.以_为前缀.word_separator =
dotnet_naming_style.以_为前缀.capitalization = camel_case

[*.csproj]
indent_size = 2
tab_width = 2

[*.props]
indent_size = 2
tab_width = 2

[*.targets]
indent_size = 2
tab_width = 2

[*.json]
indent_size = 2
tab_width = 2
2 changes: 1 addition & 1 deletion package.props
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Project>
<PropertyGroup>
<Version>1.3.3</Version>
<Version>1.3.4</Version>

<Description>A message driven distributed asynchronous workflow framework. 消息驱动的分布式异步工作流程处理框架。</Description>

Expand Down
1 change: 1 addition & 0 deletions src/FluentWorkflow.Core/Implement/WorkflowContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ public abstract class WorkflowContext
public WorkflowFlag Flag
{
get => _flag ??= this.GetEnum<WorkflowFlag>(FluentWorkflowConstants.ContextKeys.WorkflowFlag, WorkflowFlag.None).Value;
[EditorBrowsable(EditorBrowsableState.Advanced)]
set
{
ThrowIfStarted();
Expand Down
2 changes: 2 additions & 0 deletions src/FluentWorkflow.Core/Implement/WorkflowContextMetadata.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Collections.Immutable;
using System.ComponentModel;
using System.Text.Json.Serialization;
using FluentWorkflow.Interface;

Expand Down Expand Up @@ -71,6 +72,7 @@ private string GetRequiredKey(string key)
WorkflowFlag IWorkflowContext.Flag
{
get => Values.TryGetValue(FluentWorkflowConstants.ContextKeys.WorkflowFlag, out var valueString) ? Enum.Parse<WorkflowFlag>(valueString) : WorkflowFlag.None;
[EditorBrowsable(EditorBrowsableState.Advanced)]
set => throw new InvalidOperationException();
}

Expand Down
2 changes: 1 addition & 1 deletion src/FluentWorkflow.Core/Interface/IWorkflowContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public interface IWorkflowContext
/// <summary>
/// 工作流程标识
/// </summary>
public WorkflowFlag Flag { get; set; }
public WorkflowFlag Flag { get; [EditorBrowsable(EditorBrowsableState.Advanced)] set; }

/// <summary>
/// 父工作流程上下文
Expand Down
20 changes: 11 additions & 9 deletions src/FluentWorkflow.Generator/FluentWorkflowSourceGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@ public class FluentWorkflowSourceGenerator : IIncrementalGenerator

public void Initialize(IncrementalGeneratorInitializationContext context)
{
var declarationsProvider = context.SyntaxProvider.CreateSyntaxProvider(FilterContextSyntaxNode, TransformContextSyntaxNode);
var declarationsProvider = context.SyntaxProvider.CreateSyntaxProvider(FilterContextSyntaxNode, TransformContextSyntaxNode)
.Collect()
.SelectMany((items, _) => items.Distinct())
.WithComparer(WorkflowDescriptorEqualityComparer.Shared);

var compilationPropertiesProvider = context.AnalyzerConfigOptionsProvider.Select((configOptions, token) =>
{
Expand All @@ -23,7 +26,7 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
if (configOptions.GlobalOptions.TryGetValue("build_property.FluentWorkflowGeneratorAdditional", out var generatorAdditionalValues)
&& !string.IsNullOrWhiteSpace(generatorAdditionalValues))
{
foreach (var generatorAdditionalValue in generatorAdditionalValues.Split(new[] { ',', ';', ' ', '\t' }))
foreach (var generatorAdditionalValue in generatorAdditionalValues.Split([',', ';', ' ', '\t']))
{
if (Enum.TryParse<GeneratorAdditional>(generatorAdditionalValue, out var value))
{
Expand All @@ -34,11 +37,8 @@ public void Initialize(IncrementalGeneratorInitializationContext context)

configOptions.GlobalOptions.TryGetValue("build_property.rootnamespace", out var rootNameSpace);

return new CompilationProperties()
{
RootNameSpace = rootNameSpace ?? string.Empty,
GeneratorAdditionals = generatorAdditionals,
};
return new CompilationProperties(RootNameSpace: rootNameSpace ?? string.Empty,
GeneratorAdditionals: generatorAdditionals.ToList());
});

context.RegisterSourceOutput(declarationsProvider.Combine(compilationPropertiesProvider),
Expand Down Expand Up @@ -117,6 +117,7 @@ private static bool FilterContextSyntaxNode(SyntaxNode syntaxNode, CancellationT
{
if (syntaxNode is ClassDeclarationSyntax classDeclarationSyntax
&& classDeclarationSyntax.AttributeLists.Count == 0
&& classDeclarationSyntax.Modifiers.Any(SyntaxKind.PartialKeyword)
&& !classDeclarationSyntax.Modifiers.Any(SyntaxKind.AbstractKeyword)
&& IsBaseOnIWorkflowDirectly(classDeclarationSyntax))
{
Expand All @@ -127,7 +128,8 @@ private static bool FilterContextSyntaxNode(SyntaxNode syntaxNode, CancellationT
static bool IsBaseOnIWorkflowDirectly(ClassDeclarationSyntax classDeclarationSyntax)
{
var types = classDeclarationSyntax.BaseList?.Types;
if (types is null)
if (types is null
|| types.Value.Count == 0)
{
return false;
}
Expand All @@ -144,7 +146,7 @@ private static WorkflowDescriptor TransformContextSyntaxNode(GeneratorSyntaxCont
var workflowName = classDeclarationSyntax.Identifier.ValueText;
var nameSpace = typeSymbol.ContainingNamespace.ToDisplayString();

return new(classDeclarationSyntax, typeSymbol, workflowName, nameSpace);
return new(classDeclarationSyntax, workflowName, nameSpace);
}

#endregion filter
Expand Down
22 changes: 21 additions & 1 deletion src/FluentWorkflow.Generator/Model/CompilationProperties.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,23 @@
namespace FluentWorkflow.Generator.Model;

internal record struct CompilationProperties(string RootNameSpace, HashSet<GeneratorAdditional> GeneratorAdditionals);
internal record struct CompilationProperties(string RootNameSpace, IReadOnlyList<GeneratorAdditional> GeneratorAdditionals)
: IEquatable<CompilationProperties>
{
private readonly IReadOnlyList<GeneratorAdditional> _orderedGeneratorAdditionals = GeneratorAdditionals.OrderBy(static m => (int)m).ToList();

public override readonly int GetHashCode()
{
var hashCode = RootNameSpace.GetHashCode();
foreach (var generatorAdditional in _orderedGeneratorAdditionals)
{
hashCode &= generatorAdditional.GetHashCode();
}
return hashCode;
}

public readonly bool Equals(CompilationProperties other)
{
return RootNameSpace.Equals(other.RootNameSpace)
&& Enumerable.SequenceEqual(_orderedGeneratorAdditionals, other._orderedGeneratorAdditionals);
}
}
41 changes: 35 additions & 6 deletions src/FluentWorkflow.Generator/Model/WorkflowDescriptor.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,38 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.CSharp.Syntax;

namespace FluentWorkflow.Generator.Model;

record struct WorkflowDescriptor(ClassDeclarationSyntax DeclarationSyntax,
INamedTypeSymbol TypeSymbol,
string Name,
string NameSpace);
internal record struct WorkflowDescriptor(ClassDeclarationSyntax DeclarationSyntax, string Name, string NameSpace)
: IEquatable<WorkflowDescriptor>
{
/// <inheritdoc/>
public override readonly int GetHashCode()
{
//认为名称和命名空间相同则相同?
return Name.GetHashCode() & NameSpace.GetHashCode();
}

/// <inheritdoc/>
public readonly bool Equals(WorkflowDescriptor other)
{
return string.Equals(Name, other.Name, StringComparison.Ordinal)
&& string.Equals(NameSpace, other.NameSpace, StringComparison.Ordinal);
}
}

internal sealed class WorkflowDescriptorEqualityComparer : IEqualityComparer<WorkflowDescriptor>
{
#region Public 属性

public static WorkflowDescriptorEqualityComparer Shared { get; } = new();

#endregion Public 属性

#region Public 方法

public bool Equals(WorkflowDescriptor x, WorkflowDescriptor y) => x.Equals(y);

public int GetHashCode(WorkflowDescriptor obj) => obj.GetHashCode();

#endregion Public 方法
}

0 comments on commit 7c11520

Please sign in to comment.