Skip to content

Commit 91bd366

Browse files
authored
#201 - переменные среды (#214)
* #201 - install env package * #201 - integrate env into vm * #201 - fix env di + testing * #201 - update lex * #201 - parser refactor * #201 - refactoring * #201 - rename tests * #201 - fix * #201 - rm dead code * #201 - literal refactoring * #201 - env var node parsing * #201 - parsing tests * #201 - refactoring + tests * #201 - fix * add src props * update pull_request_template.md * #201 - fix after merge * #201 - remove env from ExecuteParams.cs * #201 - add IFrame abstraction * #201 - add EnvFrame.cs * #201 - move envframe to impl * #201 - frame context && CurrentFrame.cs * fix * #201 - frame refactoring * IDefaultValueForTypeCalculator * DefaultValueForTypeCalculator restore * #201 - fix ImplicitLiteral.cs * #201 - codegen + static analysis * #201 - return not null if no env is present * restore test * #201 - fix + tests * small refac * #201 - refac IValueFactory.cs
1 parent 31b0da6 commit 91bd366

File tree

77 files changed

+659
-444
lines changed

Some content is hidden

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

77 files changed

+659
-444
lines changed

Directory.Packages.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<Project>
22
<ItemGroup>
33
<PackageVersion Include="BenchmarkDotNet" Version="0.15.6" />
4+
<PackageVersion Include="EnvironmentAbstractions" Version="5.0.0" />
45
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="3.11.0">
56
<PrivateAssets>all</PrivateAssets>
67
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>

ExtendedJavaScriptSubset.slnx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<Solution>
22
<Folder Name="/Benchmarks/">
3-
<Project Path="benchmarks\HydraScript.Benchmarks\HydraScript.Benchmarks.csproj" Type="C#" />
3+
<Project Path="benchmarks\HydraScript.Benchmarks\HydraScript.Benchmarks.csproj" />
44
<File Path="benchmarks\Readme.md" />
55
</Folder>
66
<Folder Name="/SolutionItems/">
@@ -28,6 +28,7 @@
2828
<File Path=".github/workflows/release.yml" />
2929
</Folder>
3030
<Folder Name="/Src/">
31+
<File Path="src/Directory.Build.props" />
3132
<Project Path="src/HydraScript/HydraScript.csproj" />
3233
</Folder>
3334
<Folder Name="/Src/Application/">

src/Application/HydraScript.Application.CodeGeneration/IValueDtoConverter.cs

Lines changed: 0 additions & 9 deletions
This file was deleted.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using HydraScript.Domain.BackEnd;
2+
using HydraScript.Domain.BackEnd.Impl.Values;
3+
using HydraScript.Domain.FrontEnd.Parser.Impl.Ast.Nodes.Expressions.PrimaryExpressions;
4+
5+
namespace HydraScript.Application.CodeGeneration;
6+
7+
public interface IValueFactory
8+
{
9+
public IValue Create(ValueDto dto);
10+
11+
public Name CreateName(IdentifierReference id);
12+
13+
public Name CreateName(string id);
14+
}

src/Application/HydraScript.Application.CodeGeneration/Impl/ValueDtoConverter.cs

Lines changed: 0 additions & 18 deletions
This file was deleted.
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using HydraScript.Domain.BackEnd;
2+
using HydraScript.Domain.BackEnd.Impl.Frames;
3+
using HydraScript.Domain.BackEnd.Impl.Values;
4+
using HydraScript.Domain.FrontEnd.Parser.Impl.Ast.Nodes.Expressions.PrimaryExpressions;
5+
6+
namespace HydraScript.Application.CodeGeneration.Impl;
7+
8+
internal class ValueFactory(
9+
IFrameContext frameContext,
10+
IEnvironmentVariableProvider provider) : IValueFactory
11+
{
12+
public IValue Create(ValueDto dto) =>
13+
dto switch
14+
{
15+
{ Type: ValueDtoType.Constant, Label: not null } =>
16+
new Constant(dto.Value, dto.Label),
17+
{ Type: ValueDtoType.Name, Name: not null } =>
18+
new Name(dto.Name, CurrentFrame),
19+
{ Type: ValueDtoType.Env, Name: not null } =>
20+
new EnvName(dto.Name, EnvFrame),
21+
_ => throw new ArgumentOutOfRangeException(nameof(dto))
22+
};
23+
24+
public Name CreateName(IdentifierReference id)
25+
{
26+
var dto = id.ToValueDto();
27+
return dto switch
28+
{
29+
{ Type: ValueDtoType.Name, Name: not null } =>
30+
new Name(dto.Name, CurrentFrame),
31+
{ Type: ValueDtoType.Env, Name: not null } =>
32+
new EnvName(dto.Name, EnvFrame),
33+
_ => throw new ArgumentOutOfRangeException(nameof(dto))
34+
};
35+
}
36+
37+
public Name CreateName(string id) => new(id, CurrentFrame);
38+
39+
private CurrentFrame CurrentFrame { get; } = new(frameContext);
40+
41+
private EnvFrame EnvFrame { get; } = new(provider);
42+
}

src/Application/HydraScript.Application.CodeGeneration/ServiceCollectionExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public static class ServiceCollectionExtensions
1010
{
1111
public static IServiceCollection AddCodeGeneration(this IServiceCollection services)
1212
{
13-
services.AddSingleton<IValueDtoConverter, ValueDtoConverter>();
13+
services.AddSingleton<IValueFactory, ValueFactory>();
1414
services.AddKeyedSingleton<
1515
IVisitor<IAbstractSyntaxTreeNode, AddressedInstructions>,
1616
InstructionProvider>(CodeGeneratorType.General);

src/Application/HydraScript.Application.CodeGeneration/Visitors/ExpressionInstructionProvider.cs

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -32,21 +32,21 @@ internal class ExpressionInstructionProvider : VisitorBase<IAbstractSyntaxTreeNo
3232
IVisitor<IndexAccess, AddressedInstructions>,
3333
IVisitor<CallExpression, AddressedInstructions>
3434
{
35-
private readonly IValueDtoConverter _valueDtoConverter;
35+
private readonly IValueFactory _valueFactory;
3636

37-
public ExpressionInstructionProvider(IValueDtoConverter valueDtoConverter) =>
38-
_valueDtoConverter = valueDtoConverter;
37+
public ExpressionInstructionProvider(IValueFactory valueFactory) =>
38+
_valueFactory = valueFactory;
3939

4040
public override AddressedInstructions Visit(IAbstractSyntaxTreeNode visitable) => [];
4141

4242
public AddressedInstructions Visit(PrimaryExpression visitable) =>
43-
[new Simple(_valueDtoConverter.Convert(visitable.ToValueDto()))];
43+
[new Simple(_valueFactory.Create(visitable.ToValueDto()))];
4444

4545
public AddressedInstructions Visit(ArrayLiteral visitable)
4646
{
4747
var arraySize = visitable.Expressions.Count;
4848

49-
var arrayName = new Name(visitable.Id);
49+
var arrayName = _valueFactory.CreateName(visitable.Id);
5050
var createArray = new CreateArray(arrayName, arraySize);
5151

5252
var result = new AddressedInstructions { createArray };
@@ -60,7 +60,7 @@ public AddressedInstructions Visit(ArrayLiteral visitable)
6060
result.Add(new IndexAssignment(
6161
arrayName,
6262
index,
63-
_valueDtoConverter.Convert(primary.ToValueDto())));
63+
_valueFactory.Create(primary.ToValueDto())));
6464
else
6565
{
6666
result.AddRange(expression.Accept(This));
@@ -74,8 +74,8 @@ public AddressedInstructions Visit(ArrayLiteral visitable)
7474

7575
public AddressedInstructions Visit(ObjectLiteral visitable)
7676
{
77-
var objectId = visitable.Id;
78-
var createObject = new CreateObject(new Name(objectId));
77+
var objectId = _valueFactory.CreateName(visitable.Id);
78+
var createObject = new CreateObject(objectId);
7979

8080
var result = new AddressedInstructions { createObject };
8181

@@ -89,7 +89,7 @@ public AddressedInstructions Visit(ObjectLiteral visitable)
8989

9090
public AddressedInstructions Visit(Property visitable)
9191
{
92-
var objectId = new Name(visitable.Object.Id);
92+
var objectId = _valueFactory.CreateName(visitable.Object.Id);
9393

9494
var (id, expression) = visitable;
9595
var propertyId = new Constant(id);
@@ -98,7 +98,7 @@ public AddressedInstructions Visit(Property visitable)
9898
return [new DotAssignment(
9999
objectId,
100100
propertyId,
101-
_valueDtoConverter.Convert(primary.ToValueDto()))];
101+
_valueFactory.Create(primary.ToValueDto()))];
102102

103103
var instructions = expression.Accept(This);
104104
var last = instructions.OfType<Simple>().Last().Left!;
@@ -110,7 +110,7 @@ public AddressedInstructions Visit(Property visitable)
110110
public AddressedInstructions Visit(UnaryExpression visitable)
111111
{
112112
if (visitable.Expression is PrimaryExpression primary)
113-
return [new Simple(visitable.Operator, _valueDtoConverter.Convert(primary.ToValueDto()))];
113+
return [new Simple(visitable.Operator, _valueFactory.Create(primary.ToValueDto()))];
114114

115115
var result = visitable.Expression.Accept(This);
116116
var last = result.OfType<Simple>().Last().Left!;
@@ -122,21 +122,21 @@ public AddressedInstructions Visit(UnaryExpression visitable)
122122
public AddressedInstructions Visit(BinaryExpression visitable)
123123
{
124124
if (visitable is { Left: IdentifierReference arr, Right: PrimaryExpression primary, Operator: "::" })
125-
return [new RemoveFromArray(new Name(arr), index: _valueDtoConverter.Convert(primary.ToValueDto()))];
125+
return [new RemoveFromArray(_valueFactory.CreateName(arr), index: _valueFactory.Create(primary.ToValueDto()))];
126126

127127
var result = new AddressedInstructions();
128128
IValue left, right;
129129

130130
if (visitable.Left is PrimaryExpression primaryLeft)
131-
left = _valueDtoConverter.Convert(primaryLeft.ToValueDto());
131+
left = _valueFactory.Create(primaryLeft.ToValueDto());
132132
else
133133
{
134134
result.AddRange(visitable.Left.Accept(This));
135135
left = result.OfType<Simple>().Last().Left!;
136136
}
137137

138138
if (visitable.Right is PrimaryExpression primaryRight)
139-
right = _valueDtoConverter.Convert(primaryRight.ToValueDto());
139+
right = _valueFactory.Create(primaryRight.ToValueDto());
140140
else
141141
{
142142
result.AddRange(visitable.Right.Accept(This));
@@ -151,7 +151,7 @@ public AddressedInstructions Visit(BinaryExpression visitable)
151151
public AddressedInstructions Visit(CastAsExpression visitable)
152152
{
153153
if (visitable.Expression is PrimaryExpression primary)
154-
return [new AsString(_valueDtoConverter.Convert(primary.ToValueDto()))];
154+
return [new AsString(_valueFactory.Create(primary.ToValueDto()))];
155155

156156
var result = visitable.Expression.Accept(This);
157157
var last = result.OfType<Simple>().Last().Left!;
@@ -162,7 +162,7 @@ public AddressedInstructions Visit(CastAsExpression visitable)
162162

163163
public AddressedInstructions Visit(WithExpression visitable)
164164
{
165-
var objectId = new Name(visitable.ObjectLiteral.Id);
165+
var objectId = _valueFactory.CreateName(visitable.ObjectLiteral.Id);
166166
var createObject = new CreateObject(objectId);
167167

168168
var result = new AddressedInstructions { createObject };
@@ -187,15 +187,15 @@ public AddressedInstructions Visit(WithExpression visitable)
187187
result.AddRange(visitable.Expression is PrimaryExpression ? [] : visitable.Expression.Accept(This));
188188

189189
var copyFrom = visitable.Expression is IdentifierReference objectIdent
190-
? new Name(objectIdent)
190+
? _valueFactory.CreateName(objectIdent)
191191
: result.OfType<Simple>().Last().Left!;
192192

193193
for (var i = 0; i < visitable.ComputedCopiedProperties.Count; i++)
194194
{
195195
var property = new Constant(visitable.ComputedCopiedProperties[i]);
196196
result.Add(new DotRead(copyFrom, property));
197197
var read = result[result.End].Address.Name;
198-
result.Add(new DotAssignment(objectId, property, new Name(read)));
198+
result.Add(new DotAssignment(objectId, property, _valueFactory.CreateName(read)));
199199
}
200200

201201
return result;
@@ -210,7 +210,7 @@ public AddressedInstructions Visit(ConditionalExpression visitable)
210210
var result = new AddressedInstructions();
211211

212212
if (visitable.Test is PrimaryExpression primary)
213-
result.Add(new IfNotGoto(test: _valueDtoConverter.Convert(primary.ToValueDto()), startBlockLabel));
213+
result.Add(new IfNotGoto(test: _valueFactory.Create(primary.ToValueDto()), startBlockLabel));
214214
else
215215
{
216216
result.AddRange(visitable.Test.Accept(This));
@@ -245,7 +245,7 @@ public AddressedInstructions Visit(AssignmentExpression visitable)
245245
}
246246

247247
if (visitable.Destination.Empty())
248-
result.OfType<Simple>().Last().Left = new Name(visitable.Destination.Id);
248+
result.OfType<Simple>().Last().Left = _valueFactory.CreateName(visitable.Destination.Id);
249249
else
250250
{
251251
var last = result.OfType<Simple>().Last().Left!;
@@ -267,7 +267,7 @@ public AddressedInstructions Visit(DotAccess visitable)
267267
var right = new Constant(visitable.Property.Name);
268268

269269
if (!visitable.HasPrev() && visitable.Parent is LeftHandSideExpression lhs)
270-
return [new DotRead(new Name(lhs.Id), right)];
270+
return [new DotRead(_valueFactory.CreateName(lhs.Id), right)];
271271

272272
var result = visitable.Prev?.Accept(This) ?? [];
273273
var left = result.OfType<Simple>().Last().Left!;
@@ -283,15 +283,15 @@ public AddressedInstructions Visit(IndexAccess visitable)
283283
IValue right;
284284

285285
if (visitable.Index is PrimaryExpression primary)
286-
right = _valueDtoConverter.Convert(primary.ToValueDto());
286+
right = _valueFactory.Create(primary.ToValueDto());
287287
else
288288
{
289289
result.AddRange(visitable.Index.Accept(This));
290290
right = result.OfType<Simple>().Last().Left!;
291291
}
292292

293293
if (!visitable.HasPrev() && visitable.Parent is LeftHandSideExpression lhs)
294-
result.Add(new IndexRead(new Name(lhs.Id), right));
294+
result.Add(new IndexRead(_valueFactory.CreateName(lhs.Id), right));
295295
else
296296
{
297297
result.AddRange(visitable.Prev?.Accept(This) ?? []);
@@ -320,15 +320,17 @@ public AddressedInstructions Visit(CallExpression visitable)
320320

321321
if (methodCall)
322322
{
323-
var caller = result.Count > 0 ? result.OfType<Simple>().Last().Left! : new Name(visitable.Id);
323+
var caller = result.Count > 0
324+
? result.OfType<Simple>().Last().Left!
325+
: _valueFactory.CreateName(visitable.Id);
324326
result.Add(new PushParameter(caller));
325327
}
326328

327329
for (var i = 0; i < visitable.Parameters.Count; i++)
328330
{
329331
var expr = visitable.Parameters[i];
330332
if (expr is PrimaryExpression primary)
331-
result.Add(new PushParameter(_valueDtoConverter.Convert(primary.ToValueDto())));
333+
result.Add(new PushParameter(_valueFactory.Create(primary.ToValueDto())));
332334
else
333335
{
334336
result.AddRange(expr.Accept(This));

0 commit comments

Comments
 (0)