Skip to content

Commit

Permalink
[json] D WIP.
Browse files Browse the repository at this point in the history
  • Loading branch information
pfusik committed Feb 19, 2024
1 parent 988360b commit 2b4f421
Show file tree
Hide file tree
Showing 7 changed files with 390 additions and 145 deletions.
21 changes: 14 additions & 7 deletions AST.fu
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,13 @@ public enum FuId
MatchEnd,
MatchLength,
MatchValue,
JsonValueKindObject,
JsonValueKindArray,
JsonValueKindString,
JsonValueKindNumber,
JsonValueKindTrue,
JsonValueKindFalse,
JsonValueKindNull,
JsonElementValueKind,
MathNaN,
MathNegativeInfinity,
Expand Down Expand Up @@ -1667,13 +1674,13 @@ public class FuSystem : FuScope
jsonValueKindEnum.IsPublic = true;
jsonValueKindEnum.Id = FuId.JsonValueKindEnum;
jsonValueKindEnum.Name = "JsonValueKind";
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Name = "Object", VisitStatus = FuVisitStatus.Done });
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Name = "Array", VisitStatus = FuVisitStatus.Done });
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Name = "String", VisitStatus = FuVisitStatus.Done });
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Name = "Number", VisitStatus = FuVisitStatus.Done });
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Name = "True", VisitStatus = FuVisitStatus.Done });
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Name = "False", VisitStatus = FuVisitStatus.Done });
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Name = "Null", VisitStatus = FuVisitStatus.Done });
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Id = FuId.JsonValueKindObject, Name = "Object", VisitStatus = FuVisitStatus.Done });
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Id = FuId.JsonValueKindArray, Name = "Array", VisitStatus = FuVisitStatus.Done });
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Id = FuId.JsonValueKindString, Name = "String", VisitStatus = FuVisitStatus.Done });
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Id = FuId.JsonValueKindNumber, Name = "Number", VisitStatus = FuVisitStatus.Done });
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Id = FuId.JsonValueKindTrue, Name = "True", VisitStatus = FuVisitStatus.Done });
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Id = FuId.JsonValueKindFalse, Name = "False", VisitStatus = FuVisitStatus.Done });
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Id = FuId.JsonValueKindNull, Name = "Null", VisitStatus = FuVisitStatus.Done });
Add(jsonValueKindEnum);
FuClass# jsonElementClass = FuClass.New(FuCallType.Sealed, FuId.JsonElementClass, "JsonElement");
jsonElementClass.Add(FuMethod.New(null, FuVisibility.Public, FuCallType.Normal, VoidType, FuId.JsonElementParse, "Parse", true, FuVar.New(StringPtrType, "value")));
Expand Down
54 changes: 53 additions & 1 deletion GenD.fu
Original file line number Diff line number Diff line change
Expand Up @@ -477,6 +477,10 @@ public class GenD : GenCCppD
Include("std.regex");
Write("Captures!string");
break;
case FuId.JsonElementClass:
Include("std.json");
Write("JSONValue");
break;
case FuId.LockClass:
Write("Object");
break;
Expand All @@ -486,7 +490,12 @@ public class GenD : GenCCppD
}
break;
default:
Write(type.Name);
if (type.Id == FuId.JsonValueKindEnum) {
Include("std.json");
Write("JSONType");
}
else
Write(type.Name);
break;
}
}
Expand Down Expand Up @@ -689,6 +698,30 @@ public class GenD : GenCCppD
case FuId.MatchValue:
WritePostfix(expr.Left, ".hit");
break;
case FuId.JsonElementValueKind:
WritePostfix(expr.Left, ".type");
break;
case FuId.JsonValueKindObject:
Write("JSONType.object");
break;
case FuId.JsonValueKindArray:
Write("JSONType.array");
break;
case FuId.JsonValueKindString:
Write("JSONType.string");
break;
case FuId.JsonValueKindNumber:
Write("JSONType.float_");
break;
case FuId.JsonValueKindTrue:
Write("JSONType.true_");
break;
case FuId.JsonValueKindFalse:
Write("JSONType.false_");
break;
case FuId.JsonValueKindNull:
Write("JSONType.null_");
break;
case FuId.MathNaN:
Write("double.nan");
break;
Expand Down Expand Up @@ -1088,6 +1121,25 @@ public class GenD : GenCCppD
case FuId.MatchGetCapture:
WriteIndexing(obj, args[0]);
break;
case FuId.JsonElementParse:
obj.Accept(this, FuPriority.Assign);
WriteCall(" = parseJSON", args[0]);
break;
case FuId.JsonElementGetObject:
WritePostfix(obj, ".object");
break;
case FuId.JsonElementGetArray:
WritePostfix(obj, ".array");
break;
case FuId.JsonElementGetString:
WritePostfix(obj, ".str");
break;
case FuId.JsonElementGetDouble:
WritePostfix(obj, ".floating");
break;
case FuId.JsonElementGetBoolean:
WritePostfix(obj, ".boolean");
break;
case FuId.MathMethod:
case FuId.MathAbs:
case FuId.MathIsFinite:
Expand Down
64 changes: 62 additions & 2 deletions libfut.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2599,36 +2599,43 @@ FuSystem::FuSystem()
jsonValueKindEnum->name = "JsonValueKind";
std::shared_ptr<FuConst> futemp9 = std::make_shared<FuConst>();
futemp9->visibility = FuVisibility::public_;
futemp9->id = FuId::jsonValueKindObject;
futemp9->name = "Object";
futemp9->visitStatus = FuVisitStatus::done;
addEnumValue(jsonValueKindEnum, futemp9);
std::shared_ptr<FuConst> futemp10 = std::make_shared<FuConst>();
futemp10->visibility = FuVisibility::public_;
futemp10->id = FuId::jsonValueKindArray;
futemp10->name = "Array";
futemp10->visitStatus = FuVisitStatus::done;
addEnumValue(jsonValueKindEnum, futemp10);
std::shared_ptr<FuConst> futemp11 = std::make_shared<FuConst>();
futemp11->visibility = FuVisibility::public_;
futemp11->id = FuId::jsonValueKindString;
futemp11->name = "String";
futemp11->visitStatus = FuVisitStatus::done;
addEnumValue(jsonValueKindEnum, futemp11);
std::shared_ptr<FuConst> futemp12 = std::make_shared<FuConst>();
futemp12->visibility = FuVisibility::public_;
futemp12->id = FuId::jsonValueKindNumber;
futemp12->name = "Number";
futemp12->visitStatus = FuVisitStatus::done;
addEnumValue(jsonValueKindEnum, futemp12);
std::shared_ptr<FuConst> futemp13 = std::make_shared<FuConst>();
futemp13->visibility = FuVisibility::public_;
futemp13->id = FuId::jsonValueKindTrue;
futemp13->name = "True";
futemp13->visitStatus = FuVisitStatus::done;
addEnumValue(jsonValueKindEnum, futemp13);
std::shared_ptr<FuConst> futemp14 = std::make_shared<FuConst>();
futemp14->visibility = FuVisibility::public_;
futemp14->id = FuId::jsonValueKindFalse;
futemp14->name = "False";
futemp14->visitStatus = FuVisitStatus::done;
addEnumValue(jsonValueKindEnum, futemp14);
std::shared_ptr<FuConst> futemp15 = std::make_shared<FuConst>();
futemp15->visibility = FuVisibility::public_;
futemp15->id = FuId::jsonValueKindNull;
futemp15->name = "Null";
futemp15->visitStatus = FuVisitStatus::done;
addEnumValue(jsonValueKindEnum, futemp15);
Expand Down Expand Up @@ -16167,6 +16174,10 @@ void GenD::writeType(const FuType * type, bool promote)
include("std.regex");
write("Captures!string");
break;
case FuId::jsonElementClass:
include("std.json");
write("JSONValue");
break;
case FuId::lockClass:
write("Object");
break;
Expand All @@ -16175,8 +16186,14 @@ void GenD::writeType(const FuType * type, bool promote)
break;
}
}
else
write(type->name);
else {
if (type->id == FuId::jsonValueKindEnum) {
include("std.json");
write("JSONType");
}
else
write(type->name);
}
}

void GenD::writeTypeAndName(const FuNamedValue * value)
Expand Down Expand Up @@ -16377,6 +16394,30 @@ void GenD::visitSymbolReference(const FuSymbolReference * expr, FuPriority paren
case FuId::matchValue:
writePostfix(expr->left.get(), ".hit");
break;
case FuId::jsonElementValueKind:
writePostfix(expr->left.get(), ".type");
break;
case FuId::jsonValueKindObject:
write("JSONType.object");
break;
case FuId::jsonValueKindArray:
write("JSONType.array");
break;
case FuId::jsonValueKindString:
write("JSONType.string");
break;
case FuId::jsonValueKindNumber:
write("JSONType.float_");
break;
case FuId::jsonValueKindTrue:
write("JSONType.true_");
break;
case FuId::jsonValueKindFalse:
write("JSONType.false_");
break;
case FuId::jsonValueKindNull:
write("JSONType.null_");
break;
case FuId::mathNaN:
write("double.nan");
break;
Expand Down Expand Up @@ -16773,6 +16814,25 @@ void GenD::writeCallExpr(const FuExpr * obj, const FuMethod * method, const std:
case FuId::matchGetCapture:
writeIndexing(obj, (*args)[0].get());
break;
case FuId::jsonElementParse:
obj->accept(this, FuPriority::assign);
writeCall(" = parseJSON", (*args)[0].get());
break;
case FuId::jsonElementGetObject:
writePostfix(obj, ".object");
break;
case FuId::jsonElementGetArray:
writePostfix(obj, ".array");
break;
case FuId::jsonElementGetString:
writePostfix(obj, ".str");
break;
case FuId::jsonElementGetDouble:
writePostfix(obj, ".floating");
break;
case FuId::jsonElementGetBoolean:
writePostfix(obj, ".boolean");
break;
case FuId::mathMethod:
case FuId::mathAbs:
case FuId::mathIsFinite:
Expand Down
75 changes: 67 additions & 8 deletions libfut.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1328,6 +1328,13 @@ public enum FuId
MatchEnd,
MatchLength,
MatchValue,
JsonValueKindObject,
JsonValueKindArray,
JsonValueKindString,
JsonValueKindNumber,
JsonValueKindTrue,
JsonValueKindFalse,
JsonValueKindNull,
JsonElementValueKind,
MathNaN,
MathNegativeInfinity,
Expand Down Expand Up @@ -3124,13 +3131,13 @@ internal FuSystem()
jsonValueKindEnum.IsPublic = true;
jsonValueKindEnum.Id = FuId.JsonValueKindEnum;
jsonValueKindEnum.Name = "JsonValueKind";
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Name = "Object", VisitStatus = FuVisitStatus.Done });
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Name = "Array", VisitStatus = FuVisitStatus.Done });
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Name = "String", VisitStatus = FuVisitStatus.Done });
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Name = "Number", VisitStatus = FuVisitStatus.Done });
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Name = "True", VisitStatus = FuVisitStatus.Done });
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Name = "False", VisitStatus = FuVisitStatus.Done });
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Name = "Null", VisitStatus = FuVisitStatus.Done });
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Id = FuId.JsonValueKindObject, Name = "Object", VisitStatus = FuVisitStatus.Done });
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Id = FuId.JsonValueKindArray, Name = "Array", VisitStatus = FuVisitStatus.Done });
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Id = FuId.JsonValueKindString, Name = "String", VisitStatus = FuVisitStatus.Done });
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Id = FuId.JsonValueKindNumber, Name = "Number", VisitStatus = FuVisitStatus.Done });
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Id = FuId.JsonValueKindTrue, Name = "True", VisitStatus = FuVisitStatus.Done });
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Id = FuId.JsonValueKindFalse, Name = "False", VisitStatus = FuVisitStatus.Done });
AddEnumValue(jsonValueKindEnum, new FuConst { Visibility = FuVisibility.Public, Id = FuId.JsonValueKindNull, Name = "Null", VisitStatus = FuVisitStatus.Done });
Add(jsonValueKindEnum);
FuClass jsonElementClass = FuClass.New(FuCallType.Sealed, FuId.JsonElementClass, "JsonElement");
jsonElementClass.Add(FuMethod.New(null, FuVisibility.Public, FuCallType.Normal, this.VoidType, FuId.JsonElementParse, "Parse", true, FuVar.New(this.StringPtrType, "value")));
Expand Down Expand Up @@ -16724,6 +16731,10 @@ protected override void WriteType(FuType type, bool promote)
Include("std.regex");
Write("Captures!string");
break;
case FuId.JsonElementClass:
Include("std.json");
Write("JSONValue");
break;
case FuId.LockClass:
Write("Object");
break;
Expand All @@ -16733,7 +16744,12 @@ protected override void WriteType(FuType type, bool promote)
}
break;
default:
Write(type.Name);
if (type.Id == FuId.JsonValueKindEnum) {
Include("std.json");
Write("JSONType");
}
else
Write(type.Name);
break;
}
}
Expand Down Expand Up @@ -16936,6 +16952,30 @@ internal override void VisitSymbolReference(FuSymbolReference expr, FuPriority p
case FuId.MatchValue:
WritePostfix(expr.Left, ".hit");
break;
case FuId.JsonElementValueKind:
WritePostfix(expr.Left, ".type");
break;
case FuId.JsonValueKindObject:
Write("JSONType.object");
break;
case FuId.JsonValueKindArray:
Write("JSONType.array");
break;
case FuId.JsonValueKindString:
Write("JSONType.string");
break;
case FuId.JsonValueKindNumber:
Write("JSONType.float_");
break;
case FuId.JsonValueKindTrue:
Write("JSONType.true_");
break;
case FuId.JsonValueKindFalse:
Write("JSONType.false_");
break;
case FuId.JsonValueKindNull:
Write("JSONType.null_");
break;
case FuId.MathNaN:
Write("double.nan");
break;
Expand Down Expand Up @@ -17332,6 +17372,25 @@ protected override void WriteCallExpr(FuExpr obj, FuMethod method, List<FuExpr>
case FuId.MatchGetCapture:
WriteIndexing(obj, args[0]);
break;
case FuId.JsonElementParse:
obj.Accept(this, FuPriority.Assign);
WriteCall(" = parseJSON", args[0]);
break;
case FuId.JsonElementGetObject:
WritePostfix(obj, ".object");
break;
case FuId.JsonElementGetArray:
WritePostfix(obj, ".array");
break;
case FuId.JsonElementGetString:
WritePostfix(obj, ".str");
break;
case FuId.JsonElementGetDouble:
WritePostfix(obj, ".floating");
break;
case FuId.JsonElementGetBoolean:
WritePostfix(obj, ".boolean");
break;
case FuId.MathMethod:
case FuId.MathAbs:
case FuId.MathIsFinite:
Expand Down
7 changes: 7 additions & 0 deletions libfut.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,13 @@ enum class FuId
matchEnd,
matchLength,
matchValue,
jsonValueKindObject,
jsonValueKindArray,
jsonValueKindString,
jsonValueKindNumber,
jsonValueKindTrue,
jsonValueKindFalse,
jsonValueKindNull,
jsonElementValueKind,
mathNaN,
mathNegativeInfinity,
Expand Down
Loading

0 comments on commit 2b4f421

Please sign in to comment.