diff options
author | Piotr Fusik <piotr@fusion-lang.org> | 2024-02-28 09:34:49 +0100 |
---|---|---|
committer | Piotr Fusik <piotr@fusion-lang.org> | 2024-02-28 09:34:49 +0100 |
commit | a7cb0c714a85f117922a3d885ff1bbda0bc9f1e9 (patch) | |
tree | c43ef906e8879c8f6d3dffa93aeb480566ac525d | |
parent | 990a165c519f2c598f69f9e9c9e48a09e34e7c45 (diff) |
[json] Swift.
#140
-rw-r--r-- | GenSwift.fu | 63 | ||||
-rw-r--r-- | libfut.cpp | 63 | ||||
-rw-r--r-- | libfut.cs | 63 | ||||
-rw-r--r-- | libfut.hpp | 2 | ||||
-rw-r--r-- | libfut.js | 63 | ||||
-rw-r--r-- | test/JsonElement.fu | 2 |
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"); @@ -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"); @@ -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"); @@ -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); @@ -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; |