Skip to content

Commit

Permalink
[json] JsonElement.Parse(str) in C#.
Browse files Browse the repository at this point in the history
  • Loading branch information
pfusik committed Feb 16, 2024
1 parent 464803d commit 16cdca9
Show file tree
Hide file tree
Showing 10 changed files with 410 additions and 128 deletions.
38 changes: 36 additions & 2 deletions AST.fu
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,8 @@ public enum FuId
RegexOptionsEnum,
RegexClass,
MatchClass,
JsonValueKindEnum,
JsonElementClass,
LockClass,
StringLength,
ArrayLength,
Expand All @@ -107,6 +109,7 @@ public enum FuId
MatchEnd,
MatchLength,
MatchValue,
JsonElementValueKind,
MathNaN,
MathNegativeInfinity,
MathPositiveInfinity,
Expand Down Expand Up @@ -198,6 +201,13 @@ public enum FuId
MatchFindStr,
MatchFindRegex,
MatchGetCapture,
JsonElementParse,
JsonElementTryParse,
JsonElementGetObject,
JsonElementGetArray,
JsonElementGetString,
JsonElementGetDouble,
JsonElementGetBoolean,
MathMethod,
MathAbs,
MathCeiling,
Expand Down Expand Up @@ -1464,12 +1474,13 @@ public class FuSystem : FuScope
set.AddMethod(VoidType, removeId, "Remove", true, FuVar.New(TypeParam0, "value"));
}

void AddDictionary!(FuId id, string name, FuId clearId, FuId containsKeyId, FuId countId, FuId removeId)
FuClass AddDictionary!(FuId id, string name, FuId clearId, FuId containsKeyId, FuId countId, FuId removeId)
{
FuClass! dict = AddCollection(id, name, 2, clearId, countId);
dict.Add(FuMethod.New(dict, FuVisibility.FinalValueType, FuCallType.Normal, VoidType, FuId.DictionaryAdd, "Add", true, FuVar.New(TypeParam0, "key")));
dict.AddMethod(BoolType, containsKeyId, "ContainsKey", false, FuVar.New(TypeParam0, "key"));
dict.AddMethod(VoidType, removeId, "Remove", true, FuVar.New(TypeParam0, "key"));
return dict;
}

static void AddEnumValue(FuEnum# enu, FuConst# value)
Expand Down Expand Up @@ -1585,7 +1596,7 @@ public class FuSystem : FuScope
stackClass.AddMethod(TypeParam0, FuId.StackPop, "Pop", true);
AddSet(FuId.HashSetClass, "HashSet", FuId.HashSetAdd, FuId.HashSetClear, FuId.HashSetContains, FuId.HashSetCount, FuId.HashSetRemove);
AddSet(FuId.SortedSetClass, "SortedSet", FuId.SortedSetAdd, FuId.SortedSetClear, FuId.SortedSetContains, FuId.SortedSetCount, FuId.SortedSetRemove);
AddDictionary(FuId.DictionaryClass, "Dictionary", FuId.DictionaryClear, FuId.DictionaryContainsKey, FuId.DictionaryCount, FuId.DictionaryRemove);
FuClass dictionaryClass = AddDictionary(FuId.DictionaryClass, "Dictionary", FuId.DictionaryClear, FuId.DictionaryContainsKey, FuId.DictionaryCount, FuId.DictionaryRemove);
AddDictionary(FuId.SortedDictionaryClass, "SortedDictionary", FuId.SortedDictionaryClear, FuId.SortedDictionaryContainsKey, FuId.SortedDictionaryCount, FuId.SortedDictionaryRemove);
AddDictionary(FuId.OrderedDictionaryClass, "OrderedDictionary", FuId.OrderedDictionaryClear, FuId.OrderedDictionaryContainsKey, FuId.OrderedDictionaryCount, FuId.OrderedDictionaryRemove);

Expand Down Expand Up @@ -1648,6 +1659,29 @@ public class FuSystem : FuScope
matchClass.Add(FuProperty.New(UIntType, FuId.MatchLength, "Length"));
matchClass.Add(FuProperty.New(StringStorageType, FuId.MatchValue, "Value"));
Add(matchClass);
FuEnum# jsonValueKindEnum = NewEnum(false);
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 });
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")));
jsonElementClass.Add(FuMethod.New(null, FuVisibility.Public, FuCallType.Normal, BoolType, FuId.JsonElementTryParse, "TryParse", true, FuVar.New(StringPtrType, "value")));
FuDynamicPtrType# jsonElementPtr = new FuDynamicPtrType { Class = jsonElementClass };
jsonElementClass.Add(FuMethod.New(null, FuVisibility.Public, FuCallType.Normal, new FuClassType { Class = dictionaryClass, TypeArg0 = StringStorageType, TypeArg1 = jsonElementPtr }, FuId.JsonElementGetObject, "GetObject", false));
jsonElementClass.Add(FuMethod.New(null, FuVisibility.Public, FuCallType.Normal, new FuClassType { Class = listClass, TypeArg0 = jsonElementPtr }, FuId.JsonElementGetArray, "GetArray", false));
jsonElementClass.Add(FuMethod.New(null, FuVisibility.Public, FuCallType.Normal, StringPtrType, FuId.JsonElementGetString, "GetString", false));
jsonElementClass.Add(FuMethod.New(null, FuVisibility.Public, FuCallType.Normal, DoubleType, FuId.JsonElementGetDouble, "GetDouble", false));
jsonElementClass.Add(FuMethod.New(null, FuVisibility.Public, FuCallType.Normal, BoolType, FuId.JsonElementGetBoolean, "GetBoolean", false));
jsonElementClass.Add(FuProperty.New(jsonValueKindEnum, FuId.JsonElementValueKind, "ValueKind"));
Add(jsonElementClass);

FuFloatingType# floatIntType = new FuFloatingType { Id = FuId.FloatIntType, Name = "float" };
FuClass# mathClass = FuClass.New(FuCallType.Static, FuId.None, "Math");
Expand Down
20 changes: 19 additions & 1 deletion GenCs.fu
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// GenCs.fu - C# code generator
//
// Copyright (C) 2011-2023 Piotr Fusik
// Copyright (C) 2011-2024 Piotr Fusik
//
// This file is part of Fusion Transpiler,
// see https://github.com/fusionlanguage/fut
Expand Down Expand Up @@ -267,6 +267,10 @@ public class GenCs : GenTyped
Include("System.Text.RegularExpressions");
Write(klass.Class.Name);
break;
case FuId.JsonElementClass:
Include("System.Text.Json");
Write("JsonElement");
break;
case FuId.LockClass:
Write("object");
break;
Expand Down Expand Up @@ -659,6 +663,20 @@ public class GenCs : GenTyped
args[0].Accept(this, FuPriority.Argument);
Write("].Value");
break;
case FuId.JsonElementParse:
obj.Accept(this, FuPriority.Assign);
Write(" = JsonDocument.Parse(");
args[0].Accept(this, FuPriority.Argument);
Write(").RootElement");
break;
case FuId.JsonElementGetObject:
Include("System.Linq");
WritePostfix(obj, ".EnumerateObject().ToDictionary(p => p.Name, p => p.Value)");
break;
case FuId.JsonElementGetArray:
Include("System.Linq");
WritePostfix(obj, ".EnumerateArray().ToList()");
break;
case FuId.MathMethod:
case FuId.MathAbs:
case FuId.MathCeiling:
Expand Down
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ CXXFLAGS = -Wall -O2
DOTNET_BASE_DIR := $(shell dotnet --info 2>/dev/null | sed -n 's/ Base Path: //p')
ifdef DOTNET_BASE_DIR
DOTNET_REF_DIR := $(shell realpath '$(DOTNET_BASE_DIR)../../packs/Microsoft.NETCore.App.Ref'/*/ref/net* | head -1)
CSC := dotnet '$(DOTNET_BASE_DIR)Roslyn/bincore/csc.dll' -nologo $(patsubst %,'-r:$(DOTNET_REF_DIR)/System.%.dll', Collections Collections.Specialized Console Linq Runtime Text.RegularExpressions Threading)
CSC := dotnet '$(DOTNET_BASE_DIR)Roslyn/bincore/csc.dll' -nologo $(patsubst %,'-r:$(DOTNET_REF_DIR)/System.%.dll', Collections Collections.Specialized Console Linq Memory Runtime Text.Json Text.RegularExpressions Threading)
endif
JAVAC = javac
TEST_CFLAGS = -Wall -Werror
Expand Down
2 changes: 1 addition & 1 deletion editors/notepad-plus-plus/Fusion.udl.xml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
<Keywords name="Folders in comment, close"></Keywords>
<Keywords name="Keywords1">abstract assert base break case class const continue default do else enum false for foreach if in internal is lock native new null override protected public resource return sealed static switch this throw throws true virtual when while</Keywords>
<Keywords name="Keywords2">bool byte double float int long short string uint ushort void</Keywords>
<Keywords name="Keywords3">Console Convert Dictionary Encoding Environment Exception HashSet List Lock Match Math OrderedDictionary Queue Regex RegexOptions SortedDictionary SortedSet Stack StringWriter TextWriter</Keywords>
<Keywords name="Keywords3">Console Convert Dictionary Encoding Environment Exception HashSet JsonElement List Lock Match Math OrderedDictionary Queue Regex RegexOptions SortedDictionary SortedSet Stack StringWriter TextWriter</Keywords>
<Keywords name="Keywords4">#elif #else #endif #if</Keywords>
<Keywords name="Keywords5"></Keywords>
<Keywords name="Keywords6"></Keywords>
Expand Down
2 changes: 1 addition & 1 deletion editors/vscode/syntaxes/fusion.tmLanguage.json
Original file line number Diff line number Diff line change
Expand Up @@ -890,7 +890,7 @@
}
},
"class-builtin": {
"match": "\\b(Console|Convert|Dictionary|Encoding|Environment|Exception|HashSet|List|Lock|Match|Math|Regex|RegexOptions|SortedDictionary|SortedSet|Stack|StringWriter|TextWriter)\\b",
"match": "\\b(Console|Convert|Dictionary|Encoding|Environment|Exception|HashSet|JsonElement|List|Lock|Match|Math|Regex|RegexOptions|SortedDictionary|SortedSet|Stack|StringWriter|TextWriter)\\b",
"captures": {
"1": {
"name": "support.class.fu"
Expand Down
82 changes: 80 additions & 2 deletions libfut.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2520,7 +2520,7 @@ FuSystem::FuSystem()
stackClass->addMethod(this->typeParam0, FuId::stackPop, "Pop", true);
addSet(FuId::hashSetClass, "HashSet", FuId::hashSetAdd, FuId::hashSetClear, FuId::hashSetContains, FuId::hashSetCount, FuId::hashSetRemove);
addSet(FuId::sortedSetClass, "SortedSet", FuId::sortedSetAdd, FuId::sortedSetClear, FuId::sortedSetContains, FuId::sortedSetCount, FuId::sortedSetRemove);
addDictionary(FuId::dictionaryClass, "Dictionary", FuId::dictionaryClear, FuId::dictionaryContainsKey, FuId::dictionaryCount, FuId::dictionaryRemove);
const FuClass * dictionaryClass = addDictionary(FuId::dictionaryClass, "Dictionary", FuId::dictionaryClear, FuId::dictionaryContainsKey, FuId::dictionaryCount, FuId::dictionaryRemove);
addDictionary(FuId::sortedDictionaryClass, "SortedDictionary", FuId::sortedDictionaryClear, FuId::sortedDictionaryContainsKey, FuId::sortedDictionaryCount, FuId::sortedDictionaryRemove);
addDictionary(FuId::orderedDictionaryClass, "OrderedDictionary", FuId::orderedDictionaryClear, FuId::orderedDictionaryContainsKey, FuId::orderedDictionaryCount, FuId::orderedDictionaryRemove);
std::shared_ptr<FuClass> textWriterClass = FuClass::new_(FuCallType::normal, FuId::textWriterClass, "TextWriter");
Expand Down Expand Up @@ -2590,6 +2590,65 @@ FuSystem::FuSystem()
matchClass->add(FuProperty::new_(this->uIntType, FuId::matchLength, "Length"));
matchClass->add(FuProperty::new_(this->stringStorageType, FuId::matchValue, "Value"));
add(matchClass);
std::shared_ptr<FuEnum> jsonValueKindEnum = newEnum(false);
jsonValueKindEnum->isPublic = true;
jsonValueKindEnum->id = FuId::jsonValueKindEnum;
jsonValueKindEnum->name = "JsonValueKind";
std::shared_ptr<FuConst> futemp9 = std::make_shared<FuConst>();
futemp9->visibility = FuVisibility::public_;
futemp9->name = "Object";
futemp9->visitStatus = FuVisitStatus::done;
addEnumValue(jsonValueKindEnum, futemp9);
std::shared_ptr<FuConst> futemp10 = std::make_shared<FuConst>();
futemp10->visibility = FuVisibility::public_;
futemp10->name = "Array";
futemp10->visitStatus = FuVisitStatus::done;
addEnumValue(jsonValueKindEnum, futemp10);
std::shared_ptr<FuConst> futemp11 = std::make_shared<FuConst>();
futemp11->visibility = FuVisibility::public_;
futemp11->name = "String";
futemp11->visitStatus = FuVisitStatus::done;
addEnumValue(jsonValueKindEnum, futemp11);
std::shared_ptr<FuConst> futemp12 = std::make_shared<FuConst>();
futemp12->visibility = FuVisibility::public_;
futemp12->name = "Number";
futemp12->visitStatus = FuVisitStatus::done;
addEnumValue(jsonValueKindEnum, futemp12);
std::shared_ptr<FuConst> futemp13 = std::make_shared<FuConst>();
futemp13->visibility = FuVisibility::public_;
futemp13->name = "True";
futemp13->visitStatus = FuVisitStatus::done;
addEnumValue(jsonValueKindEnum, futemp13);
std::shared_ptr<FuConst> futemp14 = std::make_shared<FuConst>();
futemp14->visibility = FuVisibility::public_;
futemp14->name = "False";
futemp14->visitStatus = FuVisitStatus::done;
addEnumValue(jsonValueKindEnum, futemp14);
std::shared_ptr<FuConst> futemp15 = std::make_shared<FuConst>();
futemp15->visibility = FuVisibility::public_;
futemp15->name = "Null";
futemp15->visitStatus = FuVisitStatus::done;
addEnumValue(jsonValueKindEnum, futemp15);
add(jsonValueKindEnum);
std::shared_ptr<FuClass> jsonElementClass = FuClass::new_(FuCallType::sealed, FuId::jsonElementClass, "JsonElement");
jsonElementClass->add(FuMethod::new_(nullptr, FuVisibility::public_, FuCallType::normal, this->voidType, FuId::jsonElementParse, "Parse", true, FuVar::new_(this->stringPtrType, "value")));
jsonElementClass->add(FuMethod::new_(nullptr, FuVisibility::public_, FuCallType::normal, this->boolType, FuId::jsonElementTryParse, "TryParse", true, FuVar::new_(this->stringPtrType, "value")));
std::shared_ptr<FuDynamicPtrType> jsonElementPtr = std::make_shared<FuDynamicPtrType>();
jsonElementPtr->class_ = jsonElementClass.get();
std::shared_ptr<FuClassType> futemp16 = std::make_shared<FuClassType>();
futemp16->class_ = dictionaryClass;
futemp16->typeArg0 = this->stringStorageType;
futemp16->typeArg1 = jsonElementPtr;
jsonElementClass->add(FuMethod::new_(nullptr, FuVisibility::public_, FuCallType::normal, futemp16, FuId::jsonElementGetObject, "GetObject", false));
std::shared_ptr<FuClassType> futemp17 = std::make_shared<FuClassType>();
futemp17->class_ = listClass;
futemp17->typeArg0 = jsonElementPtr;
jsonElementClass->add(FuMethod::new_(nullptr, FuVisibility::public_, FuCallType::normal, futemp17, FuId::jsonElementGetArray, "GetArray", false));
jsonElementClass->add(FuMethod::new_(nullptr, FuVisibility::public_, FuCallType::normal, this->stringPtrType, FuId::jsonElementGetString, "GetString", false));
jsonElementClass->add(FuMethod::new_(nullptr, FuVisibility::public_, FuCallType::normal, this->doubleType, FuId::jsonElementGetDouble, "GetDouble", false));
jsonElementClass->add(FuMethod::new_(nullptr, FuVisibility::public_, FuCallType::normal, this->boolType, FuId::jsonElementGetBoolean, "GetBoolean", false));
jsonElementClass->add(FuProperty::new_(jsonValueKindEnum, FuId::jsonElementValueKind, "ValueKind"));
add(jsonElementClass);
std::shared_ptr<FuFloatingType> floatIntType = std::make_shared<FuFloatingType>();
floatIntType->id = FuId::floatIntType;
floatIntType->name = "float";
Expand Down Expand Up @@ -2699,12 +2758,13 @@ void FuSystem::addSet(FuId id, std::string_view name, FuId addId, FuId clearId,
set->addMethod(this->voidType, removeId, "Remove", true, FuVar::new_(this->typeParam0, "value"));
}

void FuSystem::addDictionary(FuId id, std::string_view name, FuId clearId, FuId containsKeyId, FuId countId, FuId removeId)
const FuClass * FuSystem::addDictionary(FuId id, std::string_view name, FuId clearId, FuId containsKeyId, FuId countId, FuId removeId)
{
FuClass * dict = addCollection(id, name, 2, clearId, countId);
dict->add(FuMethod::new_(dict, FuVisibility::finalValueType, FuCallType::normal, this->voidType, FuId::dictionaryAdd, "Add", true, FuVar::new_(this->typeParam0, "key")));
dict->addMethod(this->boolType, containsKeyId, "ContainsKey", false, FuVar::new_(this->typeParam0, "key"));
dict->addMethod(this->voidType, removeId, "Remove", true, FuVar::new_(this->typeParam0, "key"));
return dict;
}

void FuSystem::addEnumValue(std::shared_ptr<FuEnum> enu, std::shared_ptr<FuConst> value)
Expand Down Expand Up @@ -15065,6 +15125,10 @@ void GenCs::writeType(const FuType * type, bool promote)
include("System.Text.RegularExpressions");
write(klass->class_->name);
break;
case FuId::jsonElementClass:
include("System.Text.Json");
write("JsonElement");
break;
case FuId::lockClass:
write("object");
break;
Expand Down Expand Up @@ -15474,6 +15538,20 @@ void GenCs::writeCallExpr(const FuExpr * obj, const FuMethod * method, const std
(*args)[0]->accept(this, FuPriority::argument);
write("].Value");
break;
case FuId::jsonElementParse:
obj->accept(this, FuPriority::assign);
write(" = JsonDocument.Parse(");
(*args)[0]->accept(this, FuPriority::argument);
write(").RootElement");
break;
case FuId::jsonElementGetObject:
include("System.Linq");
writePostfix(obj, ".EnumerateObject().ToDictionary(p => p.Name, p => p.Value)");
break;
case FuId::jsonElementGetArray:
include("System.Linq");
writePostfix(obj, ".EnumerateArray().ToList()");
break;
case FuId::mathMethod:
case FuId::mathAbs:
case FuId::mathCeiling:
Expand Down
Loading

0 comments on commit 16cdca9

Please sign in to comment.