diff options
author | Piotr Fusik <piotr@fusion-lang.org> | 2024-02-27 17:47:09 +0100 |
---|---|---|
committer | Piotr Fusik <piotr@fusion-lang.org> | 2024-02-27 17:47:09 +0100 |
commit | 4123ee2e295f8c20695c716d89c3cf6bccbc6165 (patch) | |
tree | f58619dcd94e463e67adf89a9a6ddf5fec3b1205 | |
parent | 236c914b43e69a0574904dad119ed5ba27ffc2e9 (diff) |
[json] GetArray and GetDouble in D.
#140
-rw-r--r-- | GenD.fu | 21 | ||||
-rw-r--r-- | libfut.cpp | 24 | ||||
-rw-r--r-- | libfut.cs | 20 | ||||
-rw-r--r-- | libfut.hpp | 1 | ||||
-rw-r--r-- | libfut.js | 24 | ||||
-rw-r--r-- | test/JsonElement.fu | 2 |
6 files changed, 67 insertions, 25 deletions
@@ -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"); @@ -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<const FuClassType *>(list->getElementType().get())) && json->class_->id == FuId::jsonElementClass; +} + bool GenD::isStructPtr(const FuType * type) { const FuClassType * ptr; - return (ptr = dynamic_cast<const FuClassType *>(type)) && (ptr->class_->id == FuId::listClass || ptr->class_->id == FuId::stackClass || ptr->class_->id == FuId::queueClass); + return (ptr = dynamic_cast<const FuClassType *>(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"); @@ -16697,7 +16697,9 @@ namespace Fusion 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 @@ namespace Fusion 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 @@ namespace Fusion WritePostfix(obj, ".str"); break; case FuId.JsonElementGetDouble: - WritePostfix(obj, ".floating"); + WritePostfix(obj, ".get!double"); break; case FuId.JsonElementGetBoolean: WritePostfix(obj, ".boolean"); @@ -2458,6 +2458,7 @@ private: 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); @@ -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 a01198c..8118434 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<JsonElement#> list = json.GetArray(); //FAIL: d TODO + List<JsonElement#> list = json.GetArray(); if (list.Count != 2 || list[0].GetDouble() != 5 || !list[1].IsBoolean()) return false; |