Skip to content

Commit

Permalink
[list] Add/Insert object/array storage in C#, JavaScript, Python and …
Browse files Browse the repository at this point in the history
  • Loading branch information
pfusik committed Oct 23, 2020
1 parent c67f5fb commit 2ef5c3b
Show file tree
Hide file tree
Showing 8 changed files with 63 additions and 37 deletions.
39 changes: 39 additions & 0 deletions GenBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -904,6 +904,45 @@ protected virtual void WriteMemberOp(CiExpr left, CiSymbolReference symbol)

protected abstract void WriteCharAt(CiBinaryExpr expr);

protected virtual void WriteNotPromoted(CiType type, CiExpr expr)
{
expr.Accept(this, CiPriority.Statement);
}

protected bool WriteListAddInsert(CiExpr obj, CiMethod method, CiExpr[] args, string add, string insert, string insertSeparator)
{
if (obj.Type is CiListType list) {
int i;
switch (method.Name) {
case "Add":
obj.Accept(this, CiPriority.Primary);
Write('.');
Write(add);
Write('(');
i = 0;
break;
case "Insert":
obj.Accept(this, CiPriority.Primary);
Write('.');
Write(insert);
Write('(');
args[0].Accept(this, CiPriority.Statement);
Write(insertSeparator);
i = 1;
break;
default:
return false;
}
if (method.Parameters.Count == i)
WriteNewStorage(list.ElementType);
else
WriteNotPromoted(list.ElementType, args[i]);
Write(')');
return true;
}
return false;
}

static RegexOptions GetRegexOptions(CiExpr expr)
{
switch (expr) {
Expand Down
3 changes: 3 additions & 0 deletions GenCs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -432,6 +432,9 @@ protected override void WriteCall(CiExpr obj, CiMethod method, CiExpr[] args, Ci
Write(((CiArrayStorageType) obj.Type).Length);
Write(')');
}
else if (WriteListAddInsert(obj, method, args, "Add", "Insert", ", ")) {
// done
}
else if (obj.Type is CiDictionaryType dict && method.Name == "Add") {
obj.Accept(this, CiPriority.Primary);
Write(".Add(");
Expand Down
23 changes: 3 additions & 20 deletions GenJava.cs
Original file line number Diff line number Diff line change
Expand Up @@ -449,7 +449,7 @@ public override CiExpr Visit(CiSymbolReference expr, CiPriority parent)
return expr;
}

void WriteNotPromoted(CiType type, CiExpr expr)
protected override void WriteNotPromoted(CiType type, CiExpr expr)
{
if (type is CiIntegerType elementType
&& IsNarrower(GetIntegerTypeCode(elementType, false), GetIntegerTypeCode((CiIntegerType) expr.Type, true)))
Expand Down Expand Up @@ -525,25 +525,8 @@ protected override void WriteCall(CiExpr obj, CiMethod method, CiExpr[] args, Ci
WriteNotPromoted(array.ElementType, args[0]);
Write(')');
}
else if (obj.Type is CiListType list && method.Name == "Add") {
obj.Accept(this, CiPriority.Primary);
Write(".add(");
if (method.Parameters.Count == 0)
WriteNewStorage(list.ElementType);
else
WriteNotPromoted(list.ElementType, args[0]);
Write(')');
}
else if (obj.Type is CiListType list2 && method.Name == "Insert") {
obj.Accept(this, CiPriority.Primary);
Write(".add(");
args[0].Accept(this, CiPriority.Statement);
Write(", ");
if (method.Parameters.Count == 1)
WriteNewStorage(list2.ElementType);
else
WriteNotPromoted(list2.ElementType, args[1]);
Write(')');
else if (WriteListAddInsert(obj, method, args, "add", "add", ", ")) {
// done
}
else if (method == CiSystem.ListRemoveRange) {
obj.Accept(this, CiPriority.Primary);
Expand Down
11 changes: 2 additions & 9 deletions GenJs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -457,13 +457,8 @@ protected override void WriteCall(CiExpr obj, CiMethod method, CiExpr[] args, Ci
Write(".length = 0");
}
}
else if (obj.Type is CiListType && method.Name == "Insert") {
obj.Accept(this, CiPriority.Primary);
Write(".splice(");
args[0].Accept(this, CiPriority.Statement);
Write(", 0, ");
args[1].Accept(this, CiPriority.Statement);
Write(')');
else if (WriteListAddInsert(obj, method, args, "push", "splice", ", 0, ")) {
// done
}
else if (method == CiSystem.ListRemoveAt) {
obj.Accept(this, CiPriority.Primary);
Expand Down Expand Up @@ -606,8 +601,6 @@ protected override void WriteCall(CiExpr obj, CiMethod method, CiExpr[] args, Ci
Write("trunc");
else if (method == CiSystem.StringContains)
Write("includes");
else if (obj.Type is CiListType && method.Name == "Add")
Write("push");
else if (obj.Type is CiDictionaryType && method.Name == "ContainsKey")
Write("hasOwnProperty");
else
Expand Down
5 changes: 3 additions & 2 deletions GenPy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -570,6 +570,9 @@ protected override void WriteCall(CiExpr obj, CiMethod method, CiExpr[] args, Ci
Write("[:] = ");
WriteNewArray(array.ElementType, args[0], array.LengthExpr);
}
else if (WriteListAddInsert(obj, method, args, "append", "insert", ", ")) {
// done
}
else if (obj.Type is CiDictionaryType dict && method.Name == "Add") {
obj.Accept(this, CiPriority.Primary);
Write('[');
Expand Down Expand Up @@ -685,8 +688,6 @@ protected override void WriteCall(CiExpr obj, CiMethod method, CiExpr[] args, Ci
Write("startswith");
else if (method == CiSystem.StringEndsWith)
Write("endswith");
else if (obj.Type is CiListType && method.Name == "Add")
Write("append");
else
WriteName(method);
WriteArgsInParentheses(method, args);
Expand Down
15 changes: 11 additions & 4 deletions GenSwift.cs
Original file line number Diff line number Diff line change
Expand Up @@ -450,11 +450,20 @@ protected override void WriteCall(CiExpr obj, CiMethod method, CiExpr[] args, Ci
WriteAdd(args[0], args[3]); // TODO: side effect
Write(']');
}
else if (obj.Type is CiListType list && method.Name == "Insert") {
else if (obj.Type is CiListType list && method.Name == "Add") {
obj.Accept(this, CiPriority.Primary);
Write(".append(");
if (method.Parameters.Count == 0)
WriteNewStorage(list.ElementType);
else
args[0].Accept(this, CiPriority.Statement);
Write(')');
}
else if (obj.Type is CiListType list2 && method.Name == "Insert") {
obj.Accept(this, CiPriority.Primary);
Write(".insert(");
if (method.Parameters.Count == 1)
WriteNewStorage(list.ElementType);
WriteNewStorage(list2.ElementType);
else
args[1].Accept(this, CiPriority.Statement);
Write(", at: ");
Expand Down Expand Up @@ -551,8 +560,6 @@ protected override void WriteCall(CiExpr obj, CiMethod method, CiExpr[] args, Ci
WriteMemberOp(obj, null);
if (method == CiSystem.CollectionClear)
Write("removeAll");
else if (obj.Type is CiListType && method.Name == "Add")
Write("append");
else
WriteName(method);
WriteArgsInParentheses(method, args);
Expand Down
2 changes: 1 addition & 1 deletion test/LibListArrayStg.ci
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ public static class Test
public static bool Run()
{
List<int[2]>() list; //FAIL: c cl
int[]! p = list.Add(); //FAIL: cs java js py swift
int[]! p = list.Add(); //FAIL: cs java js py swift TODO
p[0] = 100;
p[1] = 200;
list.Clear();
Expand Down
2 changes: 1 addition & 1 deletion test/LibListObjectStg.ci
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ public class Test
public static bool Run()
{
List<Test()>() list; //FAIL: c cl
Test! t = list.Add(); //FAIL: cs java js py swift
Test! t = list.Add(); //FAIL: cs java js py swift TODO
t.Foo = 0;
list.Clear();
t = list.Add();
Expand Down

0 comments on commit 2ef5c3b

Please sign in to comment.