summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPiotr Fusik <fox@scene.pl>2022-01-24 12:06:32 +0100
committerPiotr Fusik <fox@scene.pl>2022-01-24 12:06:32 +0100
commite1073915f95c702e578d823d06891d9d6666f58d (patch)
tree7feeb55755b1c480c63425c2aa1450d8edaf9e00
parent67b898b44fd1e3d4234cbcbada55ef8fd9ec0378 (diff)
[cleanup] VisitLiteral*.
-rw-r--r--CiResolver.cs23
-rw-r--r--CiTree.cs38
-rw-r--r--GenBase.cs118
-rw-r--r--GenC.cs49
-rw-r--r--GenCCpp.cs6
-rw-r--r--GenCl.cs2
-rw-r--r--GenCpp.cs15
-rw-r--r--GenCs.cs10
-rw-r--r--GenJava.cs24
-rw-r--r--GenJs.cs14
-rw-r--r--GenPy.cs36
-rw-r--r--GenPySwift.cs2
-rw-r--r--GenSwift.cs17
13 files changed, 210 insertions, 144 deletions
diff --git a/CiResolver.cs b/CiResolver.cs
index fc4c8f4..e94d3fa 100644
--- a/CiResolver.cs
+++ b/CiResolver.cs
@@ -307,9 +307,28 @@ public class CiResolver : CiVisitor
return expr;
}
- public override CiExpr Visit(CiLiteral expr, CiPriority parent)
+ public override void VisitLiteralLong(long value)
+ {
+ }
+
+ public override void VisitLiteralDouble(double value)
+ {
+ }
+
+ public override void VisitLiteralString(string value)
+ {
+ }
+
+ public override void VisitLiteralNull()
+ {
+ }
+
+ public override void VisitLiteralFalse()
+ {
+ }
+
+ public override void VisitLiteralTrue()
{
- return expr;
}
public override CiExpr Visit(CiInterpolatedString expr, CiPriority parent)
diff --git a/CiTree.cs b/CiTree.cs
index 5048dd6..dbec8d9 100644
--- a/CiTree.cs
+++ b/CiTree.cs
@@ -69,7 +69,12 @@ public abstract class CiVisitor
{
public abstract CiExpr Visit(CiCollection expr, CiPriority parent);
public abstract CiExpr Visit(CiVar expr, CiPriority parent);
- public abstract CiExpr Visit(CiLiteral expr, CiPriority parent);
+ public abstract void VisitLiteralLong(long value);
+ public abstract void VisitLiteralDouble(double value);
+ public abstract void VisitLiteralString(string value);
+ public abstract void VisitLiteralNull();
+ public abstract void VisitLiteralFalse();
+ public abstract void VisitLiteralTrue();
public abstract CiExpr Visit(CiInterpolatedString expr, CiPriority parent);
public abstract CiExpr Visit(CiSymbolReference expr, CiPriority parent);
public abstract CiExpr Visit(CiPrefixExpr expr, CiPriority parent);
@@ -360,7 +365,6 @@ public abstract class CiLiteral : CiExpr
public static readonly CiLiteralFalse False = new CiLiteralFalse();
public static readonly CiLiteralTrue True = new CiLiteralTrue();
- public override CiExpr Accept(CiVisitor visitor, CiPriority parent) => visitor.Visit(this, parent);
public override string ToString() => this.Value.ToString();
}
@@ -372,6 +376,11 @@ public class CiLiteralLong : CiLiteral
public CiLiteralLong(long value) : base(value)
{
}
+ public override CiExpr Accept(CiVisitor visitor, CiPriority parent)
+ {
+ visitor.VisitLiteralLong((long) this.Value);
+ return this;
+ }
}
public class CiLiteralDouble : CiLiteral
@@ -379,6 +388,11 @@ public class CiLiteralDouble : CiLiteral
public CiLiteralDouble(double value) : base(value)
{
}
+ public override CiExpr Accept(CiVisitor visitor, CiPriority parent)
+ {
+ visitor.VisitLiteralDouble((double) this.Value);
+ return this;
+ }
}
public class CiLiteralString : CiLiteral
@@ -386,6 +400,11 @@ public class CiLiteralString : CiLiteral
public CiLiteralString(string value) : base(value)
{
}
+ public override CiExpr Accept(CiVisitor visitor, CiPriority parent)
+ {
+ visitor.VisitLiteralString((string) this.Value);
+ return this;
+ }
}
public class CiLiteralNull : CiLiteral
@@ -393,6 +412,11 @@ public class CiLiteralNull : CiLiteral
public CiLiteralNull() : base(null)
{
}
+ public override CiExpr Accept(CiVisitor visitor, CiPriority parent)
+ {
+ visitor.VisitLiteralNull();
+ return this;
+ }
public override string ToString() => "null";
}
@@ -408,6 +432,11 @@ public class CiLiteralFalse : CiLiteralBool
public CiLiteralFalse() : base(false)
{
}
+ public override CiExpr Accept(CiVisitor visitor, CiPriority parent)
+ {
+ visitor.VisitLiteralFalse();
+ return this;
+ }
}
public class CiLiteralTrue : CiLiteralBool
@@ -415,6 +444,11 @@ public class CiLiteralTrue : CiLiteralBool
public CiLiteralTrue() : base(true)
{
}
+ public override CiExpr Accept(CiVisitor visitor, CiPriority parent)
+ {
+ visitor.VisitLiteralTrue();
+ return this;
+ }
}
public class CiImplicitEnumValue : CiExpr
diff --git a/GenBase.cs b/GenBase.cs
index d9ff09c..c831773 100644
--- a/GenBase.cs
+++ b/GenBase.cs
@@ -68,7 +68,7 @@ public abstract class GenBase : CiVisitor
this.Writer.Write(s);
}
- protected void Write(long i)
+ public override void VisitLiteralLong(long i)
{
this.Writer.Write(i);
}
@@ -359,10 +359,50 @@ public abstract class GenBase : CiVisitor
{
for (int i = 0; i < array.Length; i++) {
WriteComma(i);
- Write(array[i]);
+ VisitLiteralLong(array[i]);
}
}
+ public override void VisitLiteralDouble(double value)
+ {
+ string s = value.ToString("R", CultureInfo.InvariantCulture);
+ Write(s);
+ foreach (char c in s) {
+ switch (c) {
+ case '-':
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ break;
+ default:
+ return;
+ }
+ }
+ Write(".0"); // it looked like an integer
+ }
+
+ public override void VisitLiteralNull()
+ {
+ Write("null");
+ }
+
+ public override void VisitLiteralFalse()
+ {
+ Write("false");
+ }
+
+ public override void VisitLiteralTrue()
+ {
+ Write("true");
+ }
+
protected void WriteEscapedChar(char c, bool quoted = true)
{
switch (c) {
@@ -379,58 +419,40 @@ public abstract class GenBase : CiVisitor
}
}
- protected virtual void WriteLiteral(object value)
+ public override void VisitLiteralString(string value)
+ {
+ Write('"');
+ foreach (char c in value)
+ WriteEscapedChar(c);
+ Write('"');
+ }
+
+ protected void WriteLiteral(object value)
{
switch (value) {
case null:
- Write("null");
+ VisitLiteralNull();
break;
case long l:
- Write(l);
+ VisitLiteralLong(l);
break;
case bool b:
- Write(b ? "true" : "false");
+ if (b)
+ VisitLiteralTrue();
+ else
+ VisitLiteralFalse();
break;
case string s:
- Write('"');
- foreach (char c in s)
- WriteEscapedChar(c);
- Write('"');
+ VisitLiteralString(s);
break;
case double d:
- string s2 = d.ToString("R", CultureInfo.InvariantCulture);
- Write(s2);
- foreach (char c in s2) {
- switch (c) {
- case '-':
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- break;
- default:
- return;
- }
- }
- Write(".0"); // it looked like an integer
+ VisitLiteralDouble(d);
break;
default:
throw new NotImplementedException(value.GetType().Name);
}
}
- public override CiExpr Visit(CiLiteral expr, CiPriority parent)
- {
- WriteLiteral(expr.Value);
- return expr;
- }
-
protected abstract void WriteName(CiSymbol symbol);
protected virtual TypeCode GetIntegerTypeCode(CiIntegerType integer, bool promote)
@@ -511,10 +533,10 @@ public abstract class GenBase : CiVisitor
protected virtual void WritePrintfWidth(CiInterpolatedPart part)
{
if (part.WidthExpr != null)
- Write(part.Width);
+ VisitLiteralLong(part.Width);
if (part.Precision >= 0) {
Write('.');
- Write(part.Precision);
+ VisitLiteralLong(part.Precision);
}
}
@@ -633,16 +655,16 @@ public abstract class GenBase : CiVisitor
WriteCoercedInternal(type, expr, parent);
}
- protected virtual void WriteCoercedLiteral(CiType type, object value)
+ protected virtual void WriteCoercedLiteral(CiType type, CiLiteral literal)
{
- WriteLiteral(value);
+ WriteLiteral(literal.Value);
}
protected void WriteCoercedLiterals(CiType type, CiExpr[] exprs)
{
for (int i = 0; i < exprs.Length; i++) {
WriteComma(i);
- WriteCoercedLiteral(type, ((CiLiteral) exprs[i]).Value);
+ WriteCoercedLiteral(type, (CiLiteral) exprs[i]);
}
}
@@ -787,13 +809,13 @@ public abstract class GenBase : CiVisitor
Write("for (");
Write(intString);
Write(" _i");
- Write(nesting);
+ VisitLiteralLong(nesting);
Write(" = 0; _i");
- Write(nesting);
+ VisitLiteralLong(nesting);
Write(" < ");
- Write(count);
+ VisitLiteralLong(count);
Write("; _i");
- Write(nesting);
+ VisitLiteralLong(nesting);
Write("++) ");
OpenBlock();
}
@@ -803,7 +825,7 @@ public abstract class GenBase : CiVisitor
WriteLocalName(def, CiPriority.Primary);
for (int i = 0; i < nesting; i++) {
Write("[_i");
- Write(i);
+ VisitLiteralLong(i);
Write(']');
}
}
@@ -887,7 +909,7 @@ public abstract class GenBase : CiVisitor
return;
}
if (right is CiLiteral rightLiteral) {
- Write(leftValue + (long) rightLiteral.Value);
+ VisitLiteralLong(leftValue + (long) rightLiteral.Value);
return;
}
}
diff --git a/GenC.cs b/GenC.cs
index c297147..1d7821f 100644
--- a/GenC.cs
+++ b/GenC.cs
@@ -80,12 +80,9 @@ public class GenC : GenCCpp
Include("stdbool.h");
}
- protected override void WriteLiteral(object value)
+ public override void VisitLiteralNull()
{
- if (value == null)
- Write("NULL");
- else
- base.WriteLiteral(value);
+ Write("NULL");
}
protected override void WritePrintfWidth(CiInterpolatedPart part)
@@ -267,7 +264,7 @@ public class GenC : GenCCpp
Write("CiMatch_GetPos(");
expr.Left.Accept(this, CiPriority.Argument);
Write(", ");
- Write(which);
+ VisitLiteralLong(which);
Write(')');
}
@@ -427,7 +424,7 @@ public class GenC : GenCCpp
while (type is CiArrayType array) {
if (type is CiArrayStorageType arrayStorage) {
Write('[');
- Write(arrayStorage.Length);
+ VisitLiteralLong(arrayStorage.Length);
Write(']');
}
else if (array.ElementType is CiArrayStorageType)
@@ -686,7 +683,7 @@ public class GenC : GenCCpp
int id = this.CurrentTemporaries.IndexOf(type);
if (id < 0) {
id = this.CurrentTemporaries.Count;
- WriteDefinition(type, () => { Write("citemp"); Write(id); }, false, true);
+ WriteDefinition(type, () => { Write("citemp"); VisitLiteralLong(id); }, false, true);
if (assign) {
Write(" = ");
if (expr != null)
@@ -699,7 +696,7 @@ public class GenC : GenCCpp
}
else if (assign) {
Write("citemp");
- Write(id);
+ VisitLiteralLong(id);
Write(" = ");
if (expr != null)
WriteCoerced(type, expr, CiPriority.Argument);
@@ -1024,7 +1021,7 @@ public class GenC : GenCCpp
int tempId = this.CurrentTemporaries.IndexOf(expr);
if (tempId >= 0) {
Write("citemp");
- Write(tempId);
+ VisitLiteralLong(tempId);
}
else
expr.Accept(this, CiPriority.Primary);
@@ -1074,9 +1071,9 @@ public class GenC : GenCCpp
Write("memcmp(");
WriteArrayPtrAdd(ptr, offset);
Write(", ");
- WriteLiteral(literal);
+ VisitLiteralString(literal);
Write(", ");
- Write(literal.Length);
+ VisitLiteralLong(literal.Length);
Write(')');
Write(GetEqOp(not));
Write('0');
@@ -1111,7 +1108,7 @@ public class GenC : GenCCpp
Write('(');
lengthExpr.Accept(this, CiPriority.Equality);
Write(" != ");
- Write(rightValue.Length);
+ VisitLiteralLong(rightValue.Length);
Write(" || ");
WriteSubstringEqual(cast, ptr, offset, rightValue, CiPriority.CondOr, true);
if (parent > CiPriority.CondOr)
@@ -1122,7 +1119,7 @@ public class GenC : GenCCpp
Write('(');
lengthExpr.Accept(this, CiPriority.Equality);
Write(" == ");
- Write(rightValue.Length);
+ VisitLiteralLong(rightValue.Length);
Write(" && ");
WriteSubstringEqual(cast, ptr, offset, rightValue, CiPriority.CondAnd, false);
if (parent > CiPriority.CondAnd || parent == CiPriority.CondOr)
@@ -1169,7 +1166,7 @@ public class GenC : GenCCpp
{
Write("for (int _i = 0; _i < ");
if (args.Length == 1)
- Write(((CiArrayStorageType) obj.Type).Length);
+ VisitLiteralLong(((CiArrayStorageType) obj.Type).Length);
else
args[2].Accept(this, CiPriority.Rel); // FIXME: side effect in every iteration
WriteLine("; _i++)");
@@ -1192,7 +1189,7 @@ public class GenC : GenCCpp
if (elementType is CiClass klass && NeedsConstructor(klass)) {
WriteName(klass);
Write("_Construct(&citemp");
- Write(id);
+ VisitLiteralLong(id);
WriteLine(");");
}
Write(function);
@@ -1203,7 +1200,7 @@ public class GenC : GenCCpp
args[0].Accept(this, CiPriority.Argument);
}
Write(", citemp");
- Write(id);
+ VisitLiteralLong(id);
Write(')');
this.CurrentTemporaries[id] = elementType;
}
@@ -1427,7 +1424,7 @@ public class GenC : GenCCpp
WriteArrayPtrAdd(obj, args[1]);
Write(", ");
if (args.Length == 1)
- Write(((CiArrayStorageType) array).Length);
+ VisitLiteralLong(((CiArrayStorageType) array).Length);
else
args[2].Accept(this, CiPriority.Primary);
WriteSizeofCompare(array);
@@ -1484,7 +1481,7 @@ public class GenC : GenCCpp
Write("qsort(");
WriteArrayPtr(obj, CiPriority.Argument);
Write(", ");
- Write(arrayStorage.Length);
+ VisitLiteralLong(arrayStorage.Length);
Write(", sizeof(");
Write(typeCode);
Write(')');
@@ -1856,13 +1853,13 @@ public class GenC : GenCCpp
int nesting = 0;
while (type is CiArrayStorageType array) {
Write("for (int _i");
- Write(nesting);
+ VisitLiteralLong(nesting);
Write(" = ");
- Write(array.Length - 1);
+ VisitLiteralLong(array.Length - 1);
Write("; _i");
- Write(nesting);
+ VisitLiteralLong(nesting);
Write(" >= 0; _i");
- Write(nesting);
+ VisitLiteralLong(nesting);
WriteLine("--)");
this.Indent++;
nesting++;
@@ -1895,7 +1892,7 @@ public class GenC : GenCCpp
WriteLocalName(symbol, CiPriority.Primary);
for (int i = 0; i < nesting; i++) {
Write("[_i");
- Write(i);
+ VisitLiteralLong(i);
Write(']');
}
if (type is CiListType)
@@ -2053,7 +2050,7 @@ public class GenC : GenCCpp
Write(" = 0; ");
WriteCamelCaseNotKeyword(element);
Write(" < ");
- Write(array.Length);
+ VisitLiteralLong(array.Length);
Write("; ");
WriteCamelCaseNotKeyword(element);
Write("++)");
@@ -2945,7 +2942,7 @@ public class GenC : GenCCpp
Write(' ');
WriteResource(name, -1);
Write('[');
- Write(resources[name].Length);
+ VisitLiteralLong(resources[name].Length);
WriteLine("] = {");
Write('\t');
Write(resources[name]);
diff --git a/GenCCpp.cs b/GenCCpp.cs
index 6aa29d4..d9b2568 100644
--- a/GenCCpp.cs
+++ b/GenCCpp.cs
@@ -1,6 +1,6 @@
// GenCCpp.cs - C/C++ code generator
//
-// Copyright (C) 2011-2021 Piotr Fusik
+// Copyright (C) 2011-2022 Piotr Fusik
//
// This file is part of CiTo, see https://github.com/pfusik/cito
//
@@ -242,7 +242,7 @@ public abstract class GenCCpp : GenTyped
int gotoId = this.StringSwitchesWithGoto.IndexOf(switchStatement);
if (gotoId >= 0) {
Write("goto ciafterswitch");
- Write(gotoId);
+ VisitLiteralLong(gotoId);
WriteLine(';');
return;
}
@@ -304,7 +304,7 @@ public abstract class GenCCpp : GenTyped
}
if (gotoId >= 0) {
Write("ciafterswitch");
- Write(gotoId);
+ VisitLiteralLong(gotoId);
WriteLine(": ;");
}
}
diff --git a/GenCl.cs b/GenCl.cs
index 47b7249..166d76e 100644
--- a/GenCl.cs
+++ b/GenCl.cs
@@ -112,7 +112,7 @@ public class GenCl : GenC
}
WriteArrayPtrAdd(ptr, offset);
Write(", ");
- WriteLiteral(literal);
+ VisitLiteralString(literal);
Write(')');
}
diff --git a/GenCpp.cs b/GenCpp.cs
index bfde597..b412ecb 100644
--- a/GenCpp.cs
+++ b/GenCpp.cs
@@ -44,12 +44,9 @@ public class GenCpp : GenCCpp
Include("cmath");
}
- protected override void WriteLiteral(object value)
+ public override void VisitLiteralNull()
{
- if (value == null)
- Write("nullptr");
- else
- base.WriteLiteral(value);
+ Write("nullptr");
}
public override CiExpr Visit(CiInterpolatedString expr, CiPriority parent)
@@ -253,7 +250,7 @@ public class GenCpp : GenCCpp
Write("std::array<");
Write(arrayStorage.ElementType, false);
Write(", ");
- Write(arrayStorage.Length);
+ VisitLiteralLong(arrayStorage.Length);
Write('>');
break;
case CiListType list:
@@ -524,7 +521,7 @@ public class GenCpp : GenCCpp
if (part.Prefix.Length > 0) {
Write(" << ");
- WriteLiteral(part.Prefix);
+ VisitLiteralString(part.Prefix);
}
Write(" << ");
@@ -543,7 +540,7 @@ public class GenCpp : GenCCpp
WriteStringLiteralWithNewLine(interpolated.Suffix);
return;
}
- WriteLiteral(interpolated.Suffix);
+ VisitLiteralString(interpolated.Suffix);
}
}
else {
@@ -1292,7 +1289,7 @@ public class GenCpp : GenCCpp
Include("array");
Include("cstdint");
Write("const std::array<uint8_t, ");
- Write(resources[name].Length);
+ VisitLiteralLong(resources[name].Length);
Write("> ");
WriteResource(name, -1);
if (define) {
diff --git a/GenCs.cs b/GenCs.cs
index 09c4b83..841cf64 100644
--- a/GenCs.cs
+++ b/GenCs.cs
@@ -270,9 +270,9 @@ public class GenCs : GenTyped
}
}
- protected override void WriteCoercedLiteral(CiType type, object value)
+ protected override void WriteCoercedLiteral(CiType type, CiLiteral literal)
{
- WriteLiteral(value);
+ WriteLiteral(literal.Value);
if (type == CiSystem.FloatType)
Write('f');
}
@@ -286,13 +286,13 @@ public class GenCs : GenTyped
part.Argument.Accept(this, CiPriority.Argument);
if (part.WidthExpr != null) {
Write(',');
- Write(part.Width);
+ VisitLiteralLong(part.Width);
}
if (part.Format != ' ') {
Write(':');
Write(part.Format);
if (part.Precision >= 0)
- Write(part.Precision);
+ VisitLiteralLong(part.Precision);
}
Write('}');
}
@@ -507,7 +507,7 @@ public class GenCs : GenTyped
Write(", ");
if (args.Length == 1) {
Write("0, ");
- Write(((CiArrayStorageType) obj.Type).Length);
+ VisitLiteralLong(((CiArrayStorageType) obj.Type).Length);
}
else {
args[1].Accept(this, CiPriority.Argument);
diff --git a/GenJava.cs b/GenJava.cs
index 5351730..299c5fb 100644
--- a/GenJava.cs
+++ b/GenJava.cs
@@ -29,10 +29,10 @@ public class GenJava : GenTyped
{
string OutputDirectory;
- protected override void WriteLiteral(object value)
+ public override void VisitLiteralLong(long value)
{
- base.WriteLiteral(value);
- if (value is long l && l != (int) l)
+ base.VisitLiteralLong(value);
+ if (value != (int) value)
Write('L');
}
@@ -42,7 +42,7 @@ public class GenJava : GenTyped
if (part.WidthExpr != null)
throw new NotImplementedException("Cannot format integer with both width and precision");
Write('0');
- Write(part.Precision);
+ VisitLiteralLong(part.Precision);
}
else
base.WritePrintfWidth(part);
@@ -371,9 +371,9 @@ public class GenJava : GenTyped
protected override void WriteResource(string name, int length)
{
Write("CiResource.getByteArray(");
- WriteLiteral(name);
+ VisitLiteralString(name);
Write(", ");
- Write(length);
+ VisitLiteralLong(length);
Write(')');
}
@@ -435,7 +435,7 @@ public class GenJava : GenTyped
Write('(');
WriteIndexingInternal(leftBinary); // omit "& 0xff"
Write(GetEqOp(not));
- Write((sbyte) l);
+ VisitLiteralLong((sbyte) l);
if (parent > CiPriority.Equality)
Write(')');
}
@@ -448,12 +448,12 @@ public class GenJava : GenTyped
return type is CiRangeType range && range.Min >= 0 && range.Max > sbyte.MaxValue && range.Max <= byte.MaxValue;
}
- protected override void WriteCoercedLiteral(CiType type, object value)
+ protected override void WriteCoercedLiteral(CiType type, CiLiteral literal)
{
if (IsUnsignedByte(type))
- Write((sbyte) (long) value);
+ VisitLiteralLong((sbyte) (long) literal.Value);
else {
- WriteLiteral(value);
+ WriteLiteral(literal.Value);
if (type == CiSystem.FloatType)
Write('f');
}
@@ -467,7 +467,7 @@ public class GenJava : GenTyped
Write('(');
base.WriteIndexing(leftBinary, CiPriority.And);
Write(" & ");
- Write(0xff & (long) rightLiteral.Value);
+ VisitLiteralLong(0xff & (long) rightLiteral.Value);
if (parent > CiPriority.CondAnd && parent != CiPriority.And)
Write(')');
}
@@ -863,7 +863,7 @@ public class GenJava : GenTyped
WriteUppercaseWithUnderscores(konst.Name);
Write(" = ");
if (konst.Value is CiImplicitEnumValue imp)
- Write(imp.Value);
+ VisitLiteralLong(imp.Value);
else
konst.Value.Accept(this, CiPriority.Argument);
WriteLine(';');
diff --git a/GenJs.cs b/GenJs.cs
index 448118b..2e328b6 100644
--- a/GenJs.cs
+++ b/GenJs.cs
@@ -180,20 +180,20 @@ public class GenJs : GenBase
case 'E':
Write(".toExponential(");
if (part.Precision >= 0)
- Write(part.Precision);
+ VisitLiteralLong(part.Precision);
Write(").toUpperCase()");
break;
case 'e':
Write(".toExponential(");
if (part.Precision >= 0)
- Write(part.Precision);
+ VisitLiteralLong(part.Precision);
Write(')');
break;
case 'F':
case 'f':
Write(".toFixed(");
if (part.Precision >= 0)
- Write(part.Precision);
+ VisitLiteralLong(part.Precision);
Write(')');
break;
case 'X':
@@ -208,18 +208,18 @@ public class GenJs : GenBase
}
if (part.Precision >= 0 && "DdXx".IndexOf(part.Format) >= 0) {
Write(".padStart(");
- Write(part.Precision);
+ VisitLiteralLong(part.Precision);
Write(", \"0\")");
}
}
if (part.Width > 0) {
Write(".padStart(");
- Write(part.Width);
+ VisitLiteralLong(part.Width);
Write(')');
}
else if (part.Width < 0) {
Write(".padEnd(");
- Write(-part.Width);
+ VisitLiteralLong(-part.Width);
Write(')');
}
}
@@ -728,7 +728,7 @@ public class GenJs : GenBase
Write(konst.Documentation);
WriteUppercaseWithUnderscores(konst.Name);
Write(" : ");
- Write(konst.Value.IntValue);
+ VisitLiteralLong(konst.Value.IntValue);
}
WriteLine();
CloseBlock();
diff --git a/GenPy.cs b/GenPy.cs
index 921337f..eee9ec8 100644
--- a/GenPy.cs
+++ b/GenPy.cs
@@ -84,19 +84,19 @@ public class GenPy : GenPySwift
WriteLine("\"\"\"");
}
- protected override void WriteLiteral(object value)
+ public override void VisitLiteralNull()
{
- switch (value) {
- case null:
- Write("None");
- break;
- case bool b:
- Write(b ? "True" : "False");
- break;
- default:
- base.WriteLiteral(value);
- break;
- }
+ Write("None");
+ }
+
+ public override void VisitLiteralFalse()
+ {
+ Write("False");
+ }
+
+ public override void VisitLiteralTrue()
+ {
+ Write("True");
}
void WriteNameNotKeyword(string name)
@@ -223,16 +223,16 @@ public class GenPy : GenPySwift
if (part.Width >= 0) {
if (!(part.Argument.Type is CiNumericType))
Write('>');
- Write(part.Width);
+ VisitLiteralLong(part.Width);
}
else {
Write('<');
- Write(-part.Width);
+ VisitLiteralLong(-part.Width);
}
}
if (part.Precision >= 0) {
Write(part.Argument.Type is CiIntegerType ? '0' : '.');
- Write(part.Precision);
+ VisitLiteralLong(part.Precision);
}
if (part.Format != ' ' && part.Format != 'D')
Write(part.Format);
@@ -855,7 +855,7 @@ public class GenPy : GenPySwift
void WriteInclusiveLimit(CiExpr limit, int increment, string incrementString)
{
if (limit is CiLiteral literal)
- Write((long) literal.Value + increment);
+ VisitLiteralLong((long) literal.Value + increment);
else {
limit.Accept(this, CiPriority.Add);
Write(incrementString);
@@ -885,7 +885,7 @@ public class GenPy : GenPySwift
}
if (rangeStep != 1) {
Write(", ");
- Write(rangeStep);
+ VisitLiteralLong(rangeStep);
}
Write(')');
}
@@ -1020,7 +1020,7 @@ public class GenPy : GenPySwift
foreach (CiConst konst in enu) {
WriteUppercaseWithUnderscores(konst.Name);
Write(" = ");
- Write(konst.Value.IntValue);
+ VisitLiteralLong(konst.Value.IntValue);
WriteLine();
Write(konst.Documentation);
}
diff --git a/GenPySwift.cs b/GenPySwift.cs
index 5439038..c6a38f8 100644
--- a/GenPySwift.cs
+++ b/GenPySwift.cs
@@ -266,7 +266,7 @@ public abstract class GenPySwift : GenBase
void OpenWhileTrue()
{
Write("while ");
- WriteLiteral(true);
+ VisitLiteralTrue();
OpenChild();
}
diff --git a/GenSwift.cs b/GenSwift.cs
index 02b9d52..5adf5de 100644
--- a/GenSwift.cs
+++ b/GenSwift.cs
@@ -310,12 +310,9 @@ public class GenSwift : GenPySwift
}
}
- protected override void WriteLiteral(object value)
+ public override void VisitLiteralNull()
{
- if (value == null)
- Write("nil");
- else
- base.WriteLiteral(value);
+ Write("nil");
}
void WriteInterpolatedLiteral(string s)
@@ -518,7 +515,7 @@ public class GenSwift : GenPySwift
else if (obj.Type is CiArrayStorageType arrayStorage && method == CiSystem.CollectionSortAll) {
obj.Accept(this, CiPriority.Primary);
Write("[0..<");
- Write(arrayStorage.Length);
+ VisitLiteralLong(arrayStorage.Length);
Write("].sort()");
}
else if (method == CiSystem.CollectionSortPart) {
@@ -751,7 +748,7 @@ public class GenSwift : GenPySwift
Write("](repeating: ");
WriteDefaultValue(array.ElementType);
Write(", count: ");
- Write(array.Length);
+ VisitLiteralLong(array.Length);
Write(')');
}
}
@@ -1119,7 +1116,7 @@ public class GenSwift : GenPySwift
throw new NotImplementedException(cond.Op.ToString());
}
Write(", by: ");
- Write(rangeStep);
+ VisitLiteralLong(rangeStep);
Write(')');
}
}
@@ -1245,7 +1242,7 @@ public class GenSwift : GenPySwift
Write("[]");
else {
Write("rawValue: ");
- Write(i);
+ VisitLiteralLong(i);
}
WriteLine(')');
}
@@ -1272,7 +1269,7 @@ public class GenSwift : GenPySwift
WriteName(konst);
if (!(konst.Value is CiImplicitEnumValue)) {
Write(" = ");
- Write(i);
+ VisitLiteralLong(i);
}
valueToConst.Add(i, konst);
}