Skip to content

Commit

Permalink
[json] GetArray and GetDouble in D.
Browse files Browse the repository at this point in the history
  • Loading branch information
pfusik committed Feb 27, 2024
1 parent 236c914 commit 4123ee2
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 25 deletions.
21 changes: 15 additions & 6 deletions GenD.fu
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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");
Expand Down
24 changes: 18 additions & 6 deletions libfut.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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");
Expand Down
20 changes: 14 additions & 6 deletions libfut.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -17469,7 +17477,7 @@ protected override void WriteCallExpr(FuExpr obj, FuMethod method, List<FuExpr>
WritePostfix(obj, ".str");
break;
case FuId.JsonElementGetDouble:
WritePostfix(obj, ".floating");
WritePostfix(obj, ".get!double");
break;
case FuId.JsonElementGetBoolean:
WritePostfix(obj, ".boolean");
Expand Down
1 change: 1 addition & 0 deletions libfut.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
24 changes: 18 additions & 6 deletions libfut.js
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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");
Expand Down
2 changes: 1 addition & 1 deletion test/JsonElement.fu
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down

0 comments on commit 4123ee2

Please sign in to comment.