diff --git a/GenD.fu b/GenD.fu index d69d0564..76ff2857 100644 --- a/GenD.fu +++ b/GenD.fu @@ -362,8 +362,11 @@ public class GenD : GenCCppD return false; } + static bool IsJsonElementList(FuClassType list) => list.GetElementType() is FuClassType json && json.Class.Id == FuId.JsonElementClass; + static bool IsStructPtr(FuType type) => type is FuClassType ptr - && (ptr.Class.Id == FuId.ListClass || ptr.Class.Id == FuId.StackClass || ptr.Class.Id == FuId.QueueClass); + && (ptr.Class.Id == FuId.ListClass || ptr.Class.Id == FuId.StackClass || ptr.Class.Id == FuId.QueueClass) + && !IsJsonElementList(ptr); void WriteElementType!(FuType type) { @@ -420,10 +423,16 @@ public class GenD : GenCCppD break; case FuId.ListClass: case FuId.StackClass: - Include("std.container.array"); - Write("Array!("); - WriteElementType(klass.GetElementType()); - WriteChar(')'); + if (IsJsonElementList(klass)) { + Include("std.json"); + Write("JSONValue[]"); + } + else { + Include("std.container.array"); + Write("Array!("); + WriteElementType(klass.GetElementType()); + WriteChar(')'); + } break; case FuId.QueueClass: Include("std.container.dlist"); @@ -1138,7 +1147,7 @@ public class GenD : GenCCppD WritePostfix(obj, ".str"); break; case FuId.JsonElementGetDouble: - WritePostfix(obj, ".floating"); + WritePostfix(obj, ".get!double"); break; case FuId.JsonElementGetBoolean: WritePostfix(obj, ".boolean"); diff --git a/libfut.cpp b/libfut.cpp index b70c96cf..4d5c7f13 100644 --- a/libfut.cpp +++ b/libfut.cpp @@ -16098,10 +16098,16 @@ bool GenD::isTransitiveConst(const FuClassType * array) return false; } +bool GenD::isJsonElementList(const FuClassType * list) +{ + const FuClassType * json; + return (json = dynamic_cast(list->getElementType().get())) && json->class_->id == FuId::jsonElementClass; +} + bool GenD::isStructPtr(const FuType * type) { const FuClassType * ptr; - return (ptr = dynamic_cast(type)) && (ptr->class_->id == FuId::listClass || ptr->class_->id == FuId::stackClass || ptr->class_->id == FuId::queueClass); + return (ptr = dynamic_cast(type)) && (ptr->class_->id == FuId::listClass || ptr->class_->id == FuId::stackClass || ptr->class_->id == FuId::queueClass) && !isJsonElementList(ptr); } void GenD::writeElementType(const FuType * type) @@ -16158,10 +16164,16 @@ void GenD::writeType(const FuType * type, bool promote) break; case FuId::listClass: case FuId::stackClass: - include("std.container.array"); - write("Array!("); - writeElementType(klass->getElementType().get()); - writeChar(')'); + if (isJsonElementList(klass)) { + include("std.json"); + write("JSONValue[]"); + } + else { + include("std.container.array"); + write("Array!("); + writeElementType(klass->getElementType().get()); + writeChar(')'); + } break; case FuId::queueClass: include("std.container.dlist"); @@ -16871,7 +16883,7 @@ void GenD::writeCallExpr(const FuExpr * obj, const FuMethod * method, const std: writePostfix(obj, ".str"); break; case FuId::jsonElementGetDouble: - writePostfix(obj, ".floating"); + writePostfix(obj, ".get!double"); break; case FuId::jsonElementGetBoolean: writePostfix(obj, ".boolean"); diff --git a/libfut.cs b/libfut.cs index 4c2d82dd..8b6849c2 100644 --- a/libfut.cs +++ b/libfut.cs @@ -16697,7 +16697,9 @@ static bool IsTransitiveConst(FuClassType array) return false; } - static bool IsStructPtr(FuType type) => type is FuClassType ptr && (ptr.Class.Id == FuId.ListClass || ptr.Class.Id == FuId.StackClass || ptr.Class.Id == FuId.QueueClass); + static bool IsJsonElementList(FuClassType list) => list.GetElementType() is FuClassType json && json.Class.Id == FuId.JsonElementClass; + + static bool IsStructPtr(FuType type) => type is FuClassType ptr && (ptr.Class.Id == FuId.ListClass || ptr.Class.Id == FuId.StackClass || ptr.Class.Id == FuId.QueueClass) && !IsJsonElementList(ptr); void WriteElementType(FuType type) { @@ -16754,10 +16756,16 @@ protected override void WriteType(FuType type, bool promote) break; case FuId.ListClass: case FuId.StackClass: - Include("std.container.array"); - Write("Array!("); - WriteElementType(klass.GetElementType()); - WriteChar(')'); + if (IsJsonElementList(klass)) { + Include("std.json"); + Write("JSONValue[]"); + } + else { + Include("std.container.array"); + Write("Array!("); + WriteElementType(klass.GetElementType()); + WriteChar(')'); + } break; case FuId.QueueClass: Include("std.container.dlist"); @@ -17469,7 +17477,7 @@ protected override void WriteCallExpr(FuExpr obj, FuMethod method, List WritePostfix(obj, ".str"); break; case FuId.JsonElementGetDouble: - WritePostfix(obj, ".floating"); + WritePostfix(obj, ".get!double"); break; case FuId.JsonElementGetBoolean: WritePostfix(obj, ".boolean"); diff --git a/libfut.hpp b/libfut.hpp index 5a952e83..b2662555 100644 --- a/libfut.hpp +++ b/libfut.hpp @@ -2458,6 +2458,7 @@ class GenD : public GenCCppD void writeCallType(FuCallType callType, std::string_view sealedString); static bool isCreateWithNew(const FuType * type); static bool isTransitiveConst(const FuClassType * array); + static bool isJsonElementList(const FuClassType * list); static bool isStructPtr(const FuType * type); void writeElementType(const FuType * type); void writeStaticInitializer(const FuType * type); diff --git a/libfut.js b/libfut.js index 600ff1b5..ceb4585f 100644 --- a/libfut.js +++ b/libfut.js @@ -17168,10 +17168,16 @@ export class GenD extends GenCCppD return false; } + static #isJsonElementList(list) + { + let json; + return (json = list.getElementType()) instanceof FuClassType && json.class.id == FuId.JSON_ELEMENT_CLASS; + } + static #isStructPtr(type) { let ptr; - return (ptr = type) instanceof FuClassType && (ptr.class.id == FuId.LIST_CLASS || ptr.class.id == FuId.STACK_CLASS || ptr.class.id == FuId.QUEUE_CLASS); + return (ptr = type) instanceof FuClassType && (ptr.class.id == FuId.LIST_CLASS || ptr.class.id == FuId.STACK_CLASS || ptr.class.id == FuId.QUEUE_CLASS) && !GenD.#isJsonElementList(ptr); } #writeElementType(type) @@ -17230,10 +17236,16 @@ export class GenD extends GenCCppD break; case FuId.LIST_CLASS: case FuId.STACK_CLASS: - this.include("std.container.array"); - this.write("Array!("); - this.#writeElementType(klass.getElementType()); - this.writeChar(41); + if (GenD.#isJsonElementList(klass)) { + this.include("std.json"); + this.write("JSONValue[]"); + } + else { + this.include("std.container.array"); + this.write("Array!("); + this.#writeElementType(klass.getElementType()); + this.writeChar(41); + } break; case FuId.QUEUE_CLASS: this.include("std.container.dlist"); @@ -17952,7 +17964,7 @@ export class GenD extends GenCCppD this.writePostfix(obj, ".str"); break; case FuId.JSON_ELEMENT_GET_DOUBLE: - this.writePostfix(obj, ".floating"); + this.writePostfix(obj, ".get!double"); break; case FuId.JSON_ELEMENT_GET_BOOLEAN: this.writePostfix(obj, ".boolean"); diff --git a/test/JsonElement.fu b/test/JsonElement.fu index a01198c6..81184341 100644 --- a/test/JsonElement.fu +++ b/test/JsonElement.fu @@ -22,7 +22,7 @@ public static class Test json = JsonElement.Parse("[ 5, true ]"); if (!json.IsArray()) return false; - List list = json.GetArray(); //FAIL: d TODO + List list = json.GetArray(); if (list.Count != 2 || list[0].GetDouble() != 5 || !list[1].IsBoolean()) return false;