summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPiotr Fusik <piotr@fusion-lang.org>2024-02-27 17:47:09 +0100
committerPiotr Fusik <piotr@fusion-lang.org>2024-02-27 17:47:09 +0100
commit4123ee2e295f8c20695c716d89c3cf6bccbc6165 (patch)
treef58619dcd94e463e67adf89a9a6ddf5fec3b1205
parent236c914b43e69a0574904dad119ed5ba27ffc2e9 (diff)
[json] GetArray and GetDouble in D.
#140
-rw-r--r--GenD.fu21
-rw-r--r--libfut.cpp24
-rw-r--r--libfut.cs20
-rw-r--r--libfut.hpp1
-rw-r--r--libfut.js24
-rw-r--r--test/JsonElement.fu2
6 files changed, 67 insertions, 25 deletions
diff --git a/GenD.fu b/GenD.fu
index d69d056..76ff285 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 b70c96c..4d5c7f1 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<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");
diff --git a/libfut.cs b/libfut.cs
index 4c2d82d..8b6849c 100644
--- a/libfut.cs
+++ b/libfut.cs
@@ -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");
diff --git a/libfut.hpp b/libfut.hpp
index 5a952e8..b266255 100644
--- a/libfut.hpp
+++ b/libfut.hpp
@@ -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);
diff --git a/libfut.js b/libfut.js
index 600ff1b..ceb4585 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 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;