Skip to content

Commit 302cbf1

Browse files
Improved code formatting
1 parent e7b3025 commit 302cbf1

11 files changed

Lines changed: 122 additions & 217 deletions

File tree

src/Pure.DI.Core/Core/ApiInvocationProcessor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -923,7 +923,7 @@ private MdOverride CreateOverride(
923923
break;
924924

925925
default:
926-
valueExpression = (ExpressionSyntax)localVariableRenamingRewriter.Rewrite(semanticModel, false, true, atgSyntax.Expression);
926+
valueExpression = (ExpressionSyntax)localVariableRenamingRewriter.Rewrite(semanticModel, true, atgSyntax.Expression);
927927
break;
928928
}
929929

src/Pure.DI.Core/Core/Code/FactoryRewriter.cs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ namespace Pure.DI.Core.Code;
66
sealed class FactoryRewriter(
77
IArguments arguments,
88
ICompilations compilations,
9-
ITriviaTools triviaTools,
109
ISymbolNames symbolNames,
1110
FactoryRewriterContext ctx)
1211
: CSharpSyntaxRewriter, IFactoryRewriter
@@ -123,11 +122,11 @@ public LambdaExpressionSyntax Rewrite(CodeContext codeCtx, LambdaExpressionSynta
123122
}
124123

125124
private ExpressionStatementSyntax CreateAssignmentExpression(SyntaxNode returnBody, StatementSyntax owner) =>
126-
triviaTools.PreserveTrivia(owner, SyntaxFactory.ExpressionStatement(
125+
SyntaxFactory.ExpressionStatement(
127126
SyntaxFactory.AssignmentExpression(
128127
SyntaxKind.SimpleAssignmentExpression,
129128
SyntaxFactory.IdentifierName(ctx.VarInjection.Var.Name).WithLeadingTrivia(SyntaxFactory.Space).WithTrailingTrivia(SyntaxFactory.Space),
130-
(ExpressionSyntax)Visit(returnBody).WithLeadingTrivia(SyntaxFactory.Space))), _ctx!.RootContext.Graph.Source.Hints.IsFormatCodeEnabled);
129+
(ExpressionSyntax)Visit(returnBody).WithLeadingTrivia(SyntaxFactory.Space))).WithLeadingTrivia(owner.GetLeadingTrivia()).WithTrailingTrivia(owner.GetTrailingTrivia());
131130

132131
public override SyntaxNode VisitExpressionStatement(ExpressionStatementSyntax node)
133132
{
@@ -173,7 +172,7 @@ public override SyntaxNode VisitExpressionStatement(ExpressionStatementSyntax no
173172
newNode = SyntaxFactory.Block().AddStatements(SyntaxFactory.ExpressionStatement(expressionSyntax).WithLeadingTrivia(SyntaxFactory.LineFeed).WithTrailingTrivia(SyntaxFactory.LineFeed));
174173
}
175174

176-
return triviaTools.PreserveTrivia(node, newNode, _ctx!.RootContext.Graph.Source.Hints.IsFormatCodeEnabled);
175+
return newNode.WithLeadingTrivia(node.GetLeadingTrivia()).WithTrailingTrivia(node.GetTrailingTrivia());
177176
}
178177

179178
private bool TryInject(
@@ -192,14 +191,14 @@ private bool TryInject(
192191
case IdentifierNameSyntax identifierName:
193192
ctx.Injections.Add(new Injection(identifierName.Identifier.Text, false));
194193
{
195-
expressionSyntax = triviaTools.PreserveTrivia(invocation, InjectionMarkerExpression, _ctx!.RootContext.Graph.Source.Hints.IsFormatCodeEnabled);
194+
expressionSyntax = InjectionMarkerExpression.WithLeadingTrivia(invocation.GetLeadingTrivia()).WithTrailingTrivia(invocation.GetTrailingTrivia());
196195
return true;
197196
}
198197

199198
case DeclarationExpressionSyntax { Designation: SingleVariableDesignationSyntax singleVariableDesignationSyntax }:
200199
ctx.Injections.Add(new Injection(singleVariableDesignationSyntax.Identifier.Text, true));
201200
{
202-
expressionSyntax = triviaTools.PreserveTrivia(invocation, InjectionMarkerExpression, _ctx!.RootContext.Graph.Source.Hints.IsFormatCodeEnabled);
201+
expressionSyntax = InjectionMarkerExpression.WithLeadingTrivia(invocation.GetLeadingTrivia()).WithTrailingTrivia(invocation.GetTrailingTrivia());
203202
return true;
204203
}
205204
}
@@ -223,14 +222,14 @@ private bool TryInitialize(
223222
case IdentifierNameSyntax identifierName:
224223
ctx.Initializers.Add(new Initializer(identifierName.Identifier.Text));
225224
{
226-
expressionSyntax = triviaTools.PreserveTrivia(invocation, InitializationMarkerExpression, _ctx!.RootContext.Graph.Source.Hints.IsFormatCodeEnabled);
225+
expressionSyntax = InitializationMarkerExpression.WithLeadingTrivia(invocation.GetLeadingTrivia()).WithTrailingTrivia(invocation.GetTrailingTrivia());
227226
return true;
228227
}
229228

230229
case DeclarationExpressionSyntax { Designation: SingleVariableDesignationSyntax singleVariableDesignationSyntax }:
231230
ctx.Initializers.Add(new Initializer(singleVariableDesignationSyntax.Identifier.Text));
232231
{
233-
expressionSyntax = triviaTools.PreserveTrivia(invocation, InitializationMarkerExpression, _ctx!.RootContext.Graph.Source.Hints.IsFormatCodeEnabled);
232+
expressionSyntax = InitializationMarkerExpression.WithLeadingTrivia(invocation.GetLeadingTrivia()).WithTrailingTrivia(invocation.GetTrailingTrivia());
234233
return true;
235234
}
236235
}
@@ -239,7 +238,7 @@ private bool TryInitialize(
239238
return false;
240239
}
241240

242-
private bool TryOverride(InvocationExpressionSyntax invocation, out ExpressionSyntax? expressionSyntax)
241+
private static bool TryOverride(InvocationExpressionSyntax invocation, out ExpressionSyntax? expressionSyntax)
243242
{
244243
var value = invocation.ArgumentList.Arguments.Count > 0 ? invocation.ArgumentList.Arguments[0].Expression : null;
245244
if (value == null)
@@ -248,7 +247,7 @@ private bool TryOverride(InvocationExpressionSyntax invocation, out ExpressionSy
248247
return false;
249248
}
250249

251-
expressionSyntax = triviaTools.PreserveTrivia(invocation, OverrideMarkerExpression, _ctx!.RootContext.Graph.Source.Hints.IsFormatCodeEnabled);
250+
expressionSyntax = OverrideMarkerExpression.WithLeadingTrivia(invocation.GetLeadingTrivia()).WithTrailingTrivia(invocation.GetTrailingTrivia());
252251
return true;
253252
}
254253

src/Pure.DI.Core/Core/Code/ILocalVariableRenamingRewriter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
interface ILocalVariableRenamingRewriter
44
{
5-
SyntaxNode Rewrite(SemanticModel semanticModel, bool formatCode, bool isOverride, SyntaxNode lambda);
5+
SyntaxNode Rewrite(SemanticModel semanticModel, bool isOverride, SyntaxNode lambda);
66

77
ILocalVariableRenamingRewriter Clone();
88
}

src/Pure.DI.Core/Core/Code/ITriviaTools.cs

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

src/Pure.DI.Core/Core/Code/LocalVariableRenamingRewriter.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,24 @@ namespace Pure.DI.Core.Code;
55
using System.Collections.Concurrent;
66

77
sealed class LocalVariableRenamingRewriter(
8-
ITriviaTools triviaTools,
98
INameProvider nameProvider)
109
: CSharpSyntaxRewriter, ILocalVariableRenamingRewriter
1110
{
1211
private ConcurrentDictionary<string, string> Names { get; init; } = [];
13-
private bool _formatCode;
1412
private bool _isOverride;
1513
private bool _forcibleRename;
1614
private SemanticModel? _semanticModel;
1715

18-
public SyntaxNode Rewrite(SemanticModel semanticModel, bool formatCode, bool isOverride, SyntaxNode lambda)
16+
public SyntaxNode Rewrite(SemanticModel semanticModel, bool isOverride, SyntaxNode lambda)
1917
{
2018
_semanticModel = semanticModel;
21-
_formatCode = formatCode;
2219
_isOverride = isOverride;
2320
_forcibleRename = _isOverride;
2421
return Visit(lambda);
2522
}
2623

2724
public ILocalVariableRenamingRewriter Clone() =>
28-
new LocalVariableRenamingRewriter(triviaTools, nameProvider) { Names = new ConcurrentDictionary<string, string>(Names) };
25+
new LocalVariableRenamingRewriter(nameProvider) { Names = new ConcurrentDictionary<string, string>(Names) };
2926

3027
public override SyntaxNode? VisitVariableDeclarator(VariableDeclaratorSyntax node) =>
3128
base.VisitVariableDeclarator(node.WithIdentifier(SyntaxFactory.Identifier(GetUniqueName(node.Identifier.Text))));
@@ -69,7 +66,7 @@ public override SyntaxToken VisitToken(SyntaxToken token)
6966
&& token.Parent is {} parent
7067
&& (_semanticModel?.SyntaxTree != parent.SyntaxTree || _semanticModel.GetSymbolInfo(parent).Symbol is ILocalSymbol))
7168
{
72-
token = triviaTools.PreserveTrivia(token, SyntaxFactory.Identifier(newName), _formatCode);
69+
token = SyntaxFactory.Identifier(newName).WithLeadingTrivia(token.LeadingTrivia).WithTrailingTrivia(token.TrailingTrivia);
7370
}
7471

7572
return base.VisitToken(token);

src/Pure.DI.Core/Core/Code/RootBuilder.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,7 @@ private void BuildCode(CodeContext parentCtx)
381381

382382
// Rewrites syntax tree
383383
var finishLabel = $"{var.Declaration.Name}Finish";
384-
var factoryExpression = (LambdaExpressionSyntax)factory.Source.LocalVariableRenamingRewriter.Clone().Rewrite(setup.SemanticModel, setup.Hints.IsFormatCodeEnabled, false, originalLambda);
384+
var factoryExpression = (LambdaExpressionSyntax)factory.Source.LocalVariableRenamingRewriter.Clone().Rewrite(setup.SemanticModel, false, originalLambda);
385385
var injections = new List<FactoryRewriter.Injection>();
386386
var inits = new List<FactoryRewriter.Initializer>();
387387
var factoryRewriter = factoryRewriterFactory(new FactoryRewriterContext(factory, varInjection, finishLabel, injections, inits));
@@ -843,13 +843,13 @@ private void FinishSingleInstanceCheck(CodeContext ctx)
843843
}
844844

845845
lines.DecIndent();
846+
lines.AppendLine(BlockFinish);
846847
if (ctx.IsLockRequired)
847848
{
848849
lines.DecIndent();
849850
lines.DecIndent();
850851
}
851852

852-
lines.AppendLine(BlockFinish);
853853
lines.AppendLine();
854854
}
855855

src/Pure.DI.Core/Core/Code/TriviaTools.cs

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

src/Pure.DI.Core/Generator.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@ private void Setup() => DI.Setup()
104104
.Bind(Type).To<LifetimesValidatorVisitor>()
105105
.Bind(Type).To<CyclicDependencyValidatorVisitor>()
106106
.Bind().To<LifetimeAnalyzer>()
107-
.Bind().To<TriviaTools>()
108107
.Bind().To<InstanceDpProvider>()
109108
.Bind().To<Injections>()
110109
.Bind().To<NameFormatter>()

src/Pure.DI.Core/Strings.zh.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,4 +163,7 @@
163163
<data name="Error_UnhandledError" xml:space="preserve">
164164
<value>发生未处理的错误。</value>
165165
</data>
166+
<data name="Error_TypeCannotBeInferred" xml:space="preserve">
167+
<value>无法确定类型。请尝试明确指定。</value>
168+
</data>
166169
</root>

tests/Pure.DI.IntegrationTests/ShroedingersCatTests.cs

Lines changed: 103 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,21 +67,25 @@ internal partial class Composition
6767
{
6868
void Setup()
6969
{
70-
// FormatCode = On
7170
DI.Setup(nameof(Composition))
7271
#additionalCalls#
7372
// Models a random subatomic event that may or may not occur
7473
.Bind<Random>().As(Singleton).To(_ =>
7574
{
76-
var i = 0;
77-
i++;
78-
return new Random();
75+
var i = 0;
76+
i++;
77+
if (i == 0)
78+
{
79+
i++;
80+
}
81+
82+
return new Random();
7983
})
8084
// Represents a quantum superposition of 2 states: Alive or Dead
8185
.Bind<State>().To(ctx =>
8286
{
83-
ctx.Inject<Random>(out var random);
84-
return (State)random.Next(2);
87+
ctx.Inject<Random>(out var random);
88+
return (State)random.Next(2);
8589
})
8690
.Bind<ICat>().To<ShroedingersCat>()
8791
// Represents a cardboard box with any content
@@ -119,4 +123,97 @@ public static void Main()
119123
var lines = result.GeneratedCode.Split(Environment.NewLine);
120124
lines.Count(i => i.Contains(" = new Random();")).ShouldBe(1, result);
121125
}
126+
127+
[Fact]
128+
public async Task SimpleShroedingersCatScenario()
129+
{
130+
// Given
131+
// When
132+
var result = await """
133+
using System;
134+
using Pure.DI;
135+
using static Pure.DI.Lifetime;
136+
137+
namespace Sample
138+
{
139+
// Let's create an abstraction
140+
141+
interface IBox<out T> { T Content { get; } }
142+
143+
enum State { Alive, Dead }
144+
145+
interface ICat { State State { get; } }
146+
147+
// Here is our implementation
148+
149+
class CardboardBox<T> : IBox<T>
150+
{
151+
public CardboardBox(T content, Random rnd) => Content = content;
152+
153+
public T Content { get; }
154+
155+
public override string ToString() => $"[{Content}]";
156+
}
157+
158+
class ShroedingersCat : ICat
159+
{
160+
// Represents the superposition of the states
161+
private readonly Lazy<State> _superposition;
162+
163+
public ShroedingersCat(Lazy<State> superposition, Random rnd) => _superposition = superposition;
164+
165+
// The decoherence of the superposition at the time of observation via an irreversible process
166+
public State State => _superposition.Value;
167+
168+
public override string ToString() => $"{State} cat";
169+
}
170+
171+
// Let's glue all together
172+
173+
internal partial class Composition
174+
{
175+
void Setup()
176+
{
177+
DI.Setup(nameof(Composition))
178+
// Models a random subatomic event that may or may not occur
179+
.Bind<Random>().As(Singleton).To<Random>()
180+
// Represents a quantum superposition of 2 states: Alive or Dead
181+
.Bind<State>().To(ctx =>
182+
{
183+
ctx.Inject<Random>(out var random);
184+
return (State)random.Next(2);
185+
})
186+
.Bind<ICat>().To<ShroedingersCat>()
187+
// Represents a cardboard box with any content
188+
.Bind<IBox<TT>>().To<CardboardBox<TT>>()
189+
// Composition Root
190+
.Root<Program>("Root");
191+
}
192+
}
193+
194+
public class Program
195+
{
196+
IBox<ICat> _box;
197+
198+
internal Program(IBox<ICat> box) => _box = box;
199+
200+
private void Run() => Console.WriteLine(_box);
201+
202+
public static void Main()
203+
{
204+
var composition = new Composition();
205+
composition.Root.Run();
206+
Console.WriteLine(composition);
207+
}
208+
}
209+
}
210+
""".RunAsync(new Options
211+
{
212+
LanguageVersion = LanguageVersion.CSharp9
213+
});
214+
215+
// Then
216+
result.Success.ShouldBeTrue(result);
217+
(result.StdOut.Contains("[Dead cat]") || result.StdOut.Contains("[Alive cat]")).ShouldBeTrue(result);
218+
}
122219
}

0 commit comments

Comments
 (0)