summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPiotr Fusik <piotr@fusion-lang.org>2024-02-28 09:34:49 +0100
committerPiotr Fusik <piotr@fusion-lang.org>2024-02-28 09:34:49 +0100
commita7cb0c714a85f117922a3d885ff1bbda0bc9f1e9 (patch)
treec43ef906e8879c8f6d3dffa93aeb480566ac525d
parent990a165c519f2c598f69f9e9c9e48a09e34e7c45 (diff)
[json] Swift.
#140
-rw-r--r--GenSwift.fu63
-rw-r--r--libfut.cpp63
-rw-r--r--libfut.cs63
-rw-r--r--libfut.hpp2
-rw-r--r--libfut.js63
-rw-r--r--test/JsonElement.fu2
6 files changed, 255 insertions, 1 deletions
diff --git a/GenSwift.fu b/GenSwift.fu
index ae276de..b309266 100644
--- a/GenSwift.fu
+++ b/GenSwift.fu
@@ -232,6 +232,9 @@ public class GenSwift : GenPySwift
case FuId.OrderedDictionaryClass:
NotSupported(klass, "OrderedDictionary");
break;
+ case FuId.JsonElementClass:
+ Write("Any");
+ break;
case FuId.LockClass:
Include("Foundation");
Write("NSRecursiveLock");
@@ -432,6 +435,28 @@ public class GenSwift : GenPySwift
return true;
}
+ void WriteJsonElementIs!(FuExpr obj, string name, FuPriority parent)
+ {
+ if (parent > FuPriority.Equality)
+ WriteChar('(');
+ obj.Accept(this, FuPriority.Equality);
+ Write(" is ");
+ Write(name);
+ if (parent > FuPriority.Equality)
+ WriteChar(')');
+ }
+
+ void WriteJsonElementGet!(FuExpr obj, string name, FuPriority parent)
+ {
+ if (parent > FuPriority.Equality)
+ WriteChar('(');
+ obj.Accept(this, FuPriority.Equality); // FIXME?
+ Write(" as! ");
+ Write(name);
+ if (parent > FuPriority.Equality)
+ WriteChar(')');
+ }
+
protected override void WriteCallExpr!(FuExpr? obj, FuMethod method, List<FuExpr#> args, FuPriority parent)
{
switch (method.Id) {
@@ -730,6 +755,44 @@ public class GenSwift : GenPySwift
WriteUnwrapped(args[0], FuPriority.Argument, false);
WriteChar(']');
break;
+ case FuId.JsonElementParse:
+ Include("Foundation");
+ Write("try! JSONSerialization.jsonObject(with: ");
+ WritePostfix(args[0], ".data(using: .utf8)!, options: .fragmentsAllowed)");
+ break;
+ case FuId.JsonElementIsObject:
+ WriteJsonElementIs(obj, "[String: Any]", parent);
+ break;
+ case FuId.JsonElementIsArray:
+ WriteJsonElementIs(obj, "[Any]", parent);
+ break;
+ case FuId.JsonElementIsString:
+ WriteJsonElementIs(obj, "String", parent);
+ break;
+ case FuId.JsonElementIsNumber:
+ WriteJsonElementIs(obj, "Double", parent);
+ break;
+ case FuId.JsonElementIsBoolean:
+ WriteJsonElementIs(obj, "Bool", parent);
+ break;
+ case FuId.JsonElementIsNull:
+ WriteJsonElementIs(obj, "NSNull", parent);
+ break;
+ case FuId.JsonElementGetObject:
+ WriteJsonElementGet(obj, "[String: Any]", parent);
+ break;
+ case FuId.JsonElementGetArray:
+ WriteJsonElementGet(obj, "[Any]", parent);
+ break;
+ case FuId.JsonElementGetString:
+ WriteJsonElementGet(obj, "String", parent);
+ break;
+ case FuId.JsonElementGetDouble:
+ WriteJsonElementGet(obj, "Double", parent);
+ break;
+ case FuId.JsonElementGetBoolean:
+ WriteJsonElementGet(obj, "Bool", parent);
+ break;
case FuId.MathMethod:
case FuId.MathLog2:
Include("Foundation");
diff --git a/libfut.cpp b/libfut.cpp
index c33e34a..f413ff0 100644
--- a/libfut.cpp
+++ b/libfut.cpp
@@ -20865,6 +20865,9 @@ void GenSwift::writeClassName(const FuClassType * klass)
case FuId::orderedDictionaryClass:
notSupported(klass, "OrderedDictionary");
break;
+ case FuId::jsonElementClass:
+ write("Any");
+ break;
case FuId::lockClass:
include("Foundation");
write("NSRecursiveLock");
@@ -21069,6 +21072,28 @@ bool GenSwift::addVar(std::string_view name)
return true;
}
+void GenSwift::writeJsonElementIs(const FuExpr * obj, std::string_view name, FuPriority parent)
+{
+ if (parent > FuPriority::equality)
+ writeChar('(');
+ obj->accept(this, FuPriority::equality);
+ write(" is ");
+ write(name);
+ if (parent > FuPriority::equality)
+ writeChar(')');
+}
+
+void GenSwift::writeJsonElementGet(const FuExpr * obj, std::string_view name, FuPriority parent)
+{
+ if (parent > FuPriority::equality)
+ writeChar('(');
+ obj->accept(this, FuPriority::equality);
+ write(" as! ");
+ write(name);
+ if (parent > FuPriority::equality)
+ writeChar(')');
+}
+
void GenSwift::writeCallExpr(const FuExpr * obj, const FuMethod * method, const std::vector<std::shared_ptr<FuExpr>> * args, FuPriority parent)
{
switch (method->id) {
@@ -21375,6 +21400,44 @@ void GenSwift::writeCallExpr(const FuExpr * obj, const FuMethod * method, const
writeUnwrapped((*args)[0].get(), FuPriority::argument, false);
writeChar(']');
break;
+ case FuId::jsonElementParse:
+ include("Foundation");
+ write("try! JSONSerialization.jsonObject(with: ");
+ writePostfix((*args)[0].get(), ".data(using: .utf8)!, options: .fragmentsAllowed)");
+ break;
+ case FuId::jsonElementIsObject:
+ writeJsonElementIs(obj, "[String: Any]", parent);
+ break;
+ case FuId::jsonElementIsArray:
+ writeJsonElementIs(obj, "[Any]", parent);
+ break;
+ case FuId::jsonElementIsString:
+ writeJsonElementIs(obj, "String", parent);
+ break;
+ case FuId::jsonElementIsNumber:
+ writeJsonElementIs(obj, "Double", parent);
+ break;
+ case FuId::jsonElementIsBoolean:
+ writeJsonElementIs(obj, "Bool", parent);
+ break;
+ case FuId::jsonElementIsNull:
+ writeJsonElementIs(obj, "NSNull", parent);
+ break;
+ case FuId::jsonElementGetObject:
+ writeJsonElementGet(obj, "[String: Any]", parent);
+ break;
+ case FuId::jsonElementGetArray:
+ writeJsonElementGet(obj, "[Any]", parent);
+ break;
+ case FuId::jsonElementGetString:
+ writeJsonElementGet(obj, "String", parent);
+ break;
+ case FuId::jsonElementGetDouble:
+ writeJsonElementGet(obj, "Double", parent);
+ break;
+ case FuId::jsonElementGetBoolean:
+ writeJsonElementGet(obj, "Bool", parent);
+ break;
case FuId::mathMethod:
case FuId::mathLog2:
include("Foundation");
diff --git a/libfut.cs b/libfut.cs
index 3207e6b..d1da391 100644
--- a/libfut.cs
+++ b/libfut.cs
@@ -21668,6 +21668,9 @@ namespace Fusion
case FuId.OrderedDictionaryClass:
NotSupported(klass, "OrderedDictionary");
break;
+ case FuId.JsonElementClass:
+ Write("Any");
+ break;
case FuId.LockClass:
Include("Foundation");
Write("NSRecursiveLock");
@@ -21867,6 +21870,28 @@ namespace Fusion
return true;
}
+ void WriteJsonElementIs(FuExpr obj, string name, FuPriority parent)
+ {
+ if (parent > FuPriority.Equality)
+ WriteChar('(');
+ obj.Accept(this, FuPriority.Equality);
+ Write(" is ");
+ Write(name);
+ if (parent > FuPriority.Equality)
+ WriteChar(')');
+ }
+
+ void WriteJsonElementGet(FuExpr obj, string name, FuPriority parent)
+ {
+ if (parent > FuPriority.Equality)
+ WriteChar('(');
+ obj.Accept(this, FuPriority.Equality);
+ Write(" as! ");
+ Write(name);
+ if (parent > FuPriority.Equality)
+ WriteChar(')');
+ }
+
protected override void WriteCallExpr(FuExpr obj, FuMethod method, List<FuExpr> args, FuPriority parent)
{
switch (method.Id) {
@@ -22163,6 +22188,44 @@ namespace Fusion
WriteUnwrapped(args[0], FuPriority.Argument, false);
WriteChar(']');
break;
+ case FuId.JsonElementParse:
+ Include("Foundation");
+ Write("try! JSONSerialization.jsonObject(with: ");
+ WritePostfix(args[0], ".data(using: .utf8)!, options: .fragmentsAllowed)");
+ break;
+ case FuId.JsonElementIsObject:
+ WriteJsonElementIs(obj, "[String: Any]", parent);
+ break;
+ case FuId.JsonElementIsArray:
+ WriteJsonElementIs(obj, "[Any]", parent);
+ break;
+ case FuId.JsonElementIsString:
+ WriteJsonElementIs(obj, "String", parent);
+ break;
+ case FuId.JsonElementIsNumber:
+ WriteJsonElementIs(obj, "Double", parent);
+ break;
+ case FuId.JsonElementIsBoolean:
+ WriteJsonElementIs(obj, "Bool", parent);
+ break;
+ case FuId.JsonElementIsNull:
+ WriteJsonElementIs(obj, "NSNull", parent);
+ break;
+ case FuId.JsonElementGetObject:
+ WriteJsonElementGet(obj, "[String: Any]", parent);
+ break;
+ case FuId.JsonElementGetArray:
+ WriteJsonElementGet(obj, "[Any]", parent);
+ break;
+ case FuId.JsonElementGetString:
+ WriteJsonElementGet(obj, "String", parent);
+ break;
+ case FuId.JsonElementGetDouble:
+ WriteJsonElementGet(obj, "Double", parent);
+ break;
+ case FuId.JsonElementGetBoolean:
+ WriteJsonElementGet(obj, "Bool", parent);
+ break;
case FuId.MathMethod:
case FuId.MathLog2:
Include("Foundation");
diff --git a/libfut.hpp b/libfut.hpp
index 5382970..58050b0 100644
--- a/libfut.hpp
+++ b/libfut.hpp
@@ -2788,6 +2788,8 @@ private:
void writeStringContains(const FuExpr * obj, std::string_view name, const std::vector<std::shared_ptr<FuExpr>> * args);
void writeRange(const FuExpr * startIndex, const FuExpr * length);
bool addVar(std::string_view name);
+ void writeJsonElementIs(const FuExpr * obj, std::string_view name, FuPriority parent);
+ void writeJsonElementGet(const FuExpr * obj, std::string_view name, FuPriority parent);
void writeDefaultValue(const FuType * type);
void writeEnumFlagsAnd(const FuExpr * left, std::string_view method, std::string_view notMethod, const FuExpr * right);
const FuExpr * writeAssignNested(const FuBinaryExpr * expr);
diff --git a/libfut.js b/libfut.js
index 242ffb7..86122ff 100644
--- a/libfut.js
+++ b/libfut.js
@@ -22221,6 +22221,9 @@ export class GenSwift extends GenPySwift
case FuId.ORDERED_DICTIONARY_CLASS:
this.notSupported(klass, "OrderedDictionary");
break;
+ case FuId.JSON_ELEMENT_CLASS:
+ this.write("Any");
+ break;
case FuId.LOCK_CLASS:
this.include("Foundation");
this.write("NSRecursiveLock");
@@ -22427,6 +22430,28 @@ export class GenSwift extends GenPySwift
return true;
}
+ #writeJsonElementIs(obj, name, parent)
+ {
+ if (parent > FuPriority.EQUALITY)
+ this.writeChar(40);
+ obj.accept(this, FuPriority.EQUALITY);
+ this.write(" is ");
+ this.write(name);
+ if (parent > FuPriority.EQUALITY)
+ this.writeChar(41);
+ }
+
+ #writeJsonElementGet(obj, name, parent)
+ {
+ if (parent > FuPriority.EQUALITY)
+ this.writeChar(40);
+ obj.accept(this, FuPriority.EQUALITY);
+ this.write(" as! ");
+ this.write(name);
+ if (parent > FuPriority.EQUALITY)
+ this.writeChar(41);
+ }
+
writeCallExpr(obj, method, args, parent)
{
switch (method.id) {
@@ -22725,6 +22750,44 @@ export class GenSwift extends GenPySwift
this.#writeUnwrapped(args[0], FuPriority.ARGUMENT, false);
this.writeChar(93);
break;
+ case FuId.JSON_ELEMENT_PARSE:
+ this.include("Foundation");
+ this.write("try! JSONSerialization.jsonObject(with: ");
+ this.writePostfix(args[0], ".data(using: .utf8)!, options: .fragmentsAllowed)");
+ break;
+ case FuId.JSON_ELEMENT_IS_OBJECT:
+ this.#writeJsonElementIs(obj, "[String: Any]", parent);
+ break;
+ case FuId.JSON_ELEMENT_IS_ARRAY:
+ this.#writeJsonElementIs(obj, "[Any]", parent);
+ break;
+ case FuId.JSON_ELEMENT_IS_STRING:
+ this.#writeJsonElementIs(obj, "String", parent);
+ break;
+ case FuId.JSON_ELEMENT_IS_NUMBER:
+ this.#writeJsonElementIs(obj, "Double", parent);
+ break;
+ case FuId.JSON_ELEMENT_IS_BOOLEAN:
+ this.#writeJsonElementIs(obj, "Bool", parent);
+ break;
+ case FuId.JSON_ELEMENT_IS_NULL:
+ this.#writeJsonElementIs(obj, "NSNull", parent);
+ break;
+ case FuId.JSON_ELEMENT_GET_OBJECT:
+ this.#writeJsonElementGet(obj, "[String: Any]", parent);
+ break;
+ case FuId.JSON_ELEMENT_GET_ARRAY:
+ this.#writeJsonElementGet(obj, "[Any]", parent);
+ break;
+ case FuId.JSON_ELEMENT_GET_STRING:
+ this.#writeJsonElementGet(obj, "String", parent);
+ break;
+ case FuId.JSON_ELEMENT_GET_DOUBLE:
+ this.#writeJsonElementGet(obj, "Double", parent);
+ break;
+ case FuId.JSON_ELEMENT_GET_BOOLEAN:
+ this.#writeJsonElementGet(obj, "Bool", parent);
+ break;
case FuId.MATH_METHOD:
case FuId.MATH_LOG2:
this.include("Foundation");
diff --git a/test/JsonElement.fu b/test/JsonElement.fu
index 9393be3..41ea03c 100644
--- a/test/JsonElement.fu
+++ b/test/JsonElement.fu
@@ -352,7 +352,7 @@ public static class Test
{
public static bool Run()
{
- JsonElement# json; //FAIL: c java swift TODO; cl
+ JsonElement# json; //FAIL: c java TODO; cl
json = JsonElement.Parse("\"foo\"");
if (!json.IsString() || json.GetString() != "foo")
return false;