allow variable intializer substitution

This commit is contained in:
Renaud Pawlak 2020-02-04 14:36:06 +01:00
parent 8a3fd1a387
commit beef1b6731
5 changed files with 41 additions and 5 deletions

View File

@ -2693,11 +2693,11 @@ public class Java2TypeScriptTranslator extends AbstractTreePrinter {
} else if (var.init == null) { } else if (var.init == null) {
if (doesMemberNameRequireQuotes(name)) { if (doesMemberNameRequireQuotes(name)) {
printIndent().print("if(").print("this['").print(name).print("']").print("===undefined) ") printIndent().print("if(").print("this['").print(name).print("']").print("===undefined) ")
.print("this['").print(name).print("'] = ").print(Util.getTypeInitialValue(var.type)).print(";") .print("this['").print(name).print("'] = ").print(getAdapter().getVariableInitialValue(var.sym)).print(";")
.println(); .println();
} else { } else {
printIndent().print("if(").print("this.").print(name).print("===undefined) this.").print(name) printIndent().print("if(").print("this.").print(name).print("===undefined) this.").print(name)
.print(" = ").print(Util.getTypeInitialValue(var.type)).print(";").println(); .print(" = ").print(getAdapter().getVariableInitialValue(var.sym)).print(";").println();
} }
} }
} }
@ -2863,7 +2863,7 @@ public class Java2TypeScriptTranslator extends AbstractTreePrinter {
name = context.getFieldNameMapping(field.sym); name = context.getFieldNameMapping(field.sym);
} }
printIndent().print("if(").print("this.").print(name).print("===undefined) ").print("this.") printIndent().print("if(").print("this.").print(name).print("===undefined) ").print("this.")
.print(name).print(" = ").print(Util.getTypeInitialValue(field.type)).print(";").println(); .print(name).print(" = ").print(getAdapter().getVariableInitialValue(field.sym)).print(";").println();
} }
} }
} }
@ -3340,7 +3340,7 @@ public class Java2TypeScriptTranslator extends AbstractTreePrinter {
// var initialization is not allowed in definition // var initialization is not allowed in definition
if (!isDefinitionScope && !(ambient || (isTopLevelScope() && isDefinitionScope)) if (!isDefinitionScope && !(ambient || (isTopLevelScope() && isDefinitionScope))
&& varDecl.sym.isStatic() && varDecl.init == null) { && varDecl.sym.isStatic() && varDecl.init == null) {
print(" = ").print(Util.getTypeInitialValue(varDecl.sym.type)); print(" = ").print(getAdapter().getVariableInitialValue(varDecl.sym));
} }
} }
} }

View File

@ -32,6 +32,7 @@ import javax.lang.model.element.Name;
import javax.lang.model.element.PackageElement; import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement; import javax.lang.model.element.TypeElement;
import javax.lang.model.element.TypeParameterElement; import javax.lang.model.element.TypeParameterElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.DeclaredType; import javax.lang.model.type.DeclaredType;
import javax.lang.model.type.TypeMirror; import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.Types; import javax.lang.model.util.Types;
@ -740,7 +741,19 @@ public class PrinterAdapter {
*/ */
public boolean substituteVariableAccess(VariableAccessElement variableAccess) { public boolean substituteVariableAccess(VariableAccessElement variableAccess) {
return parentAdapter == null ? false : parentAdapter.substituteVariableAccess(variableAccess); return parentAdapter == null ? false : parentAdapter.substituteVariableAccess(variableAccess);
}
/**
* Called if the initializer of a variable is undefined (in order to force a
* default value).
*
* @param variable
* the variable to return an initializer for
* @return an initializer expression, null to keep undefined
*/
public String getVariableInitialValue(VariableElement variable) {
return parentAdapter == null ? util().getTypeInitialValue(variable.asType())
: parentAdapter.getVariableInitialValue(variable);
} }
/** /**

View File

@ -106,4 +106,9 @@ public interface Util {
*/ */
String getRelativePath(String fromPath, String toPath); String getRelativePath(String fromPath, String toPath);
/**
* Returns the literal for a given type initial value.
*/
String getTypeInitialValue(TypeMirror type);
} }

View File

@ -23,6 +23,7 @@ import java.util.List;
import javax.lang.model.element.Element; import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement; import javax.lang.model.element.TypeElement;
import javax.lang.model.type.DeclaredType; import javax.lang.model.type.DeclaredType;
import javax.lang.model.type.TypeKind;
import javax.lang.model.type.TypeMirror; import javax.lang.model.type.TypeMirror;
import org.jsweet.transpiler.JSweetContext; import org.jsweet.transpiler.JSweetContext;
@ -180,5 +181,22 @@ public class UtilSupport implements Util {
public String getRelativePath(String fromPath, String toPath) { public String getRelativePath(String fromPath, String toPath) {
return org.jsweet.transpiler.util.Util.getRelativePath(fromPath, toPath); return org.jsweet.transpiler.util.Util.getRelativePath(fromPath, toPath);
} }
@Override
public String getTypeInitialValue(TypeMirror type) {
if (type == null) {
return "null";
}
if (isNumber(type)) {
return "0";
} else if (type.getKind() == TypeKind.BOOLEAN) {
return "false";
} else if (type.getKind() == TypeKind.VOID) {
return null;
} else {
return "null";
}
}
} }

View File

@ -1288,7 +1288,7 @@ public class Util {
/** /**
* Returns the literal for a given type inital value. * Returns the literal for a given type inital value.
*/ */
public static String getTypeInitialValue(Type type) { public static String getTypeInitialValue(TypeMirror type) {
if (type == null) { if (type == null) {
return "null"; return "null";
} }