Skip to content

Commit 1748d7c

Browse files
committed
#201 - literal refactoring
1 parent 36689e0 commit 1748d7c

File tree

4 files changed

+34
-39
lines changed

4 files changed

+34
-39
lines changed

src/Domain/HydraScript.Domain.FrontEnd/Parser/Impl/Ast/Nodes/Expressions/PrimaryExpressions/Literal.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,20 @@ public Literal(
2323

2424
public override ValueDto ToValueDto() =>
2525
ValueDto.ConstantDto(_value, _label);
26+
27+
public static Literal String(string value, string? segment = null, string? label = null) =>
28+
new(new TypeIdentValue(new IdentifierReference(name: "string")), value, segment ?? "(1, 1)-(1, 1)", label);
29+
30+
public static Literal Number(double value, string? segment = null) =>
31+
new(new TypeIdentValue(new IdentifierReference(name: "number")), value, segment ?? "(1, 1)-(1, 1)");
32+
33+
public static Literal Boolean(bool value, string? segment = null) =>
34+
new(new TypeIdentValue(new IdentifierReference(name: "boolean")), value, segment ?? "(1, 1)-(1, 1)");
35+
36+
public static Literal Null(string? segment = null) =>
37+
new(
38+
new TypeIdentValue(new IdentifierReference(name: "null")),
39+
value: null,
40+
segment ?? "(1, 1)-(1, 1)",
41+
label: "null");
2642
}

src/Domain/HydraScript.Domain.FrontEnd/Parser/Impl/TopDownParser.cs

Lines changed: 15 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ private FunctionDeclaration FunctionDeclaration()
353353
else if (CurrentIs("Assign"))
354354
{
355355
Expect("Assign");
356-
var value = Literal();
356+
var value = LiteralNode();
357357
indexOfFirstDefaultArgument = args.Count < indexOfFirstDefaultArgument
358358
? args.Count
359359
: indexOfFirstDefaultArgument;
@@ -711,11 +711,11 @@ private Expression MultiplicativeExpression()
711711
}
712712

713713
/// <summary>
714-
/// UnaryExpression -> LeftHandSideExpression | ('-'|'!'|'~'|'$') UnaryExpression
714+
/// UnaryExpression -> LeftHandSideExpression | ('-'|'!'|'~') UnaryExpression
715715
/// </summary>
716716
private Expression UnaryExpression()
717717
{
718-
if (CurrentIsUnaryOperator())
718+
if (CurrentIsUnaryOperator(expectEnv: false))
719719
{
720720
var op = Expect("Operator");
721721
return new UnaryExpression(op.Value, UnaryExpression())
@@ -761,7 +761,7 @@ private Expression PrimaryExpression()
761761

762762
if (CurrentIsLiteral())
763763
{
764-
return Literal();
764+
return LiteralNode();
765765
}
766766

767767
if (CurrentIs("LeftCurl"))
@@ -784,52 +784,35 @@ private Expression PrimaryExpression()
784784
/// "StringLiteral"
785785
/// "BooleanLiteral"
786786
/// </summary>
787-
private Literal Literal()
787+
private Literal LiteralNode()
788788
{
789789
var segment = _tokens.Current.Segment;
790790
if (CurrentIs("StringLiteral"))
791791
{
792792
var str = Expect("StringLiteral");
793-
return new Literal(
794-
new TypeIdentValue(
795-
TypeId: new IdentifierReference(name: "string")
796-
{Segment = str.Segment}),
793+
return Literal.String(
797794
value: Regex.Unescape(str.Value.Trim('"')),
798795
segment,
799796
label: str.Value
800797
.Replace(@"\", @"\\")
801798
.Replace(@"""", @"\"""));
802799
}
803800

801+
if (CurrentIs("NullLiteral"))
802+
{
803+
Expect("NullLiteral");
804+
return Literal.Null(segment);
805+
}
806+
804807
return _tokens.Current.Type.Tag switch
805808
{
806-
"NullLiteral" => new Literal(
807-
new TypeIdentValue(
808-
TypeId: new IdentifierReference(name: "null")
809-
{ Segment = _tokens.Current.Segment }),
810-
Expect("NullLiteral").Value == "null" ? null : string.Empty,
811-
segment,
812-
label: "null"),
813-
"IntegerLiteral" => new Literal(
814-
new TypeIdentValue(
815-
TypeId: new IdentifierReference(name: "number")
816-
{ Segment = _tokens.Current.Segment }),
817-
value: double.Parse(Expect("IntegerLiteral").Value),
818-
segment),
819-
"FloatLiteral" => new Literal(
820-
new TypeIdentValue(
821-
TypeId: new IdentifierReference(name: "number")
822-
{ Segment = _tokens.Current.Segment }),
809+
"IntegerLiteral" => Literal.Number(value: double.Parse(Expect("IntegerLiteral").Value), segment),
810+
"FloatLiteral" => Literal.Number(
823811
value: double.Parse(
824812
Expect("FloatLiteral").Value,
825813
CultureInfo.InvariantCulture),
826814
segment),
827-
"BooleanLiteral" => new Literal(
828-
new TypeIdentValue(
829-
TypeId: new IdentifierReference(name: "boolean")
830-
{ Segment = _tokens.Current.Segment }),
831-
value: bool.Parse(Expect("BooleanLiteral").Value),
832-
segment),
815+
"BooleanLiteral" => Literal.Boolean(value: bool.Parse(Expect("BooleanLiteral").Value), segment),
833816
_ => throw new ParserException("There are no more supported literals")
834817
};
835818
}

tests/HydraScript.UnitTests/Application/ReturnAnalyzerTests.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ public void Visit_FunctionWithMissingReturn_CodePathEndedWithReturnIsFalse()
2727
new BlockStatement([
2828
new IfStatement(
2929
new IdentifierReference("b"),
30-
new ReturnStatement(
31-
new Literal(new TypeIdentValue(new IdentifierReference("number")), 1, "segment")))
30+
new ReturnStatement(Literal.Number(1)))
3231
]),
3332
indexOfFirstDefaultArgument: int.MaxValue);
3433

tests/HydraScript.UnitTests/Application/WithExpressionData.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using HydraScript.Domain.BackEnd.Impl.Values;
55
using HydraScript.Domain.FrontEnd.Parser;
66
using HydraScript.Domain.FrontEnd.Parser.Impl.Ast;
7-
using HydraScript.Domain.FrontEnd.Parser.Impl.Ast.Nodes.Declarations;
87
using HydraScript.Domain.FrontEnd.Parser.Impl.Ast.Nodes.Expressions;
98
using HydraScript.Domain.FrontEnd.Parser.Impl.Ast.Nodes.Expressions.ComplexLiterals;
109
using HydraScript.Domain.FrontEnd.Parser.Impl.Ast.Nodes.Expressions.PrimaryExpressions;
@@ -24,8 +23,7 @@ public WithExpressionData()
2423
new ObjectLiteral([
2524
new Property(
2625
new IdentifierReference("x"),
27-
new Literal(new TypeIdentValue(new IdentifierReference("number")), 1,
28-
"(1, 15)-(1, 16)"))
26+
Literal.Number(1, "(1, 15)-(1, 16)"))
2927
]),
3028
new ObjectLiteral([])))),
3129
[
@@ -44,8 +42,7 @@ public WithExpressionData()
4442
new ObjectLiteral([
4543
new Property(
4644
new IdentifierReference("x"),
47-
new Literal(new TypeIdentValue(new IdentifierReference("number")), 1,
48-
"(1, 15)-(1, 16)"))
45+
Literal.Number(1, "(1, 15)-(1, 16)"))
4946
]))
5047
{
5148
ComputedCopiedProperties = []

0 commit comments

Comments
 (0)