From 53ceebc01ac563f9207dcc4457b01472871ef144 Mon Sep 17 00:00:00 2001 From: Renaud Pawlak Date: Sun, 14 Jun 2020 16:59:56 +0200 Subject: [PATCH] fix const variables in global scope + tests for const variables --- .../org/jsweet/transpiler/ConstAnalyzer.java | 9 +------- .../transpiler/Java2TypeScriptTranslator.java | 2 +- .../jsweet/test/transpiler/SyntaxTests.java | 23 +++++++++++++++++++ .../java/source/syntax/FinalVariables.java | 15 ++++++------ .../java/source/syntax/GlobalsInvocation.java | 10 ++++++++ 5 files changed, 43 insertions(+), 16 deletions(-) diff --git a/transpiler/src/main/java/org/jsweet/transpiler/ConstAnalyzer.java b/transpiler/src/main/java/org/jsweet/transpiler/ConstAnalyzer.java index b451a17f..d5d61bdd 100644 --- a/transpiler/src/main/java/org/jsweet/transpiler/ConstAnalyzer.java +++ b/transpiler/src/main/java/org/jsweet/transpiler/ConstAnalyzer.java @@ -19,7 +19,6 @@ package org.jsweet.transpiler; import java.util.HashSet; -import java.util.List; import java.util.Set; import javax.lang.model.element.ElementKind; @@ -30,7 +29,6 @@ import com.sun.tools.javac.code.Symbol.VarSymbol; import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.JCTree.JCAssign; import com.sun.tools.javac.tree.JCTree.JCAssignOp; -import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; import com.sun.tools.javac.tree.JCTree.JCIdent; import com.sun.tools.javac.tree.JCTree.JCUnary; @@ -75,6 +73,7 @@ public class ConstAnalyzer extends AbstractTreeScanner { @Override public void visitAssignop(JCAssignOp assignOp) { registerModification(assignOp.lhs); + super.visitAssignop(assignOp); } @Override @@ -90,10 +89,4 @@ public class ConstAnalyzer extends AbstractTreeScanner { super.visitUnary(unary); } - public void process(List compilationUnits) { - for (JCCompilationUnit compilationUnit : compilationUnits) { - scan(compilationUnit); - } - } - } diff --git a/transpiler/src/main/java/org/jsweet/transpiler/Java2TypeScriptTranslator.java b/transpiler/src/main/java/org/jsweet/transpiler/Java2TypeScriptTranslator.java index f3cec5c1..8bd405ae 100644 --- a/transpiler/src/main/java/org/jsweet/transpiler/Java2TypeScriptTranslator.java +++ b/transpiler/src/main/java/org/jsweet/transpiler/Java2TypeScriptTranslator.java @@ -3424,7 +3424,7 @@ public class Java2TypeScriptTranslator extends AbstractTreePrinter { if (isDefinitionScope) { print("var "); } else { - if (varDecl.sym.getModifiers().contains(Modifier.FINAL) || (constAnalyzer != null + if (varDecl.sym.getModifiers().contains(Modifier.FINAL) || (!globals && constAnalyzer != null && !constAnalyzer.getModifiedVariables().contains(varDecl.sym))) { print("const "); } else { diff --git a/transpiler/src/test/java/org/jsweet/test/transpiler/SyntaxTests.java b/transpiler/src/test/java/org/jsweet/test/transpiler/SyntaxTests.java index d8f3f41e..2da9c932 100644 --- a/transpiler/src/test/java/org/jsweet/test/transpiler/SyntaxTests.java +++ b/transpiler/src/test/java/org/jsweet/test/transpiler/SyntaxTests.java @@ -22,16 +22,22 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import java.io.IOException; import java.util.regex.Pattern; import org.apache.commons.io.FileUtils; +import org.jsweet.test.transpiler.util.TranspilerTestRunner; +import org.jsweet.transpiler.JSweetContext; +import org.jsweet.transpiler.JSweetFactory; import org.jsweet.transpiler.JSweetProblem; import org.jsweet.transpiler.ModuleKind; import org.jsweet.transpiler.SourceFile; +import org.jsweet.transpiler.extension.PrinterAdapter; import org.jsweet.transpiler.util.EvaluationResult; import org.junit.Assert; import org.junit.Test; +import source.extension.ToBeSorted; import source.syntax.AnnotationQualifiedNames; import source.syntax.Casts; import source.syntax.DocComments; @@ -146,6 +152,23 @@ public class SyntaxTests extends AbstractTest { }, getSourceFile(FinalVariables.class)); } + @Test + public void testConstVariables() throws IOException { + SourceFile f1 = getSourceFile(FinalVariables.class); + SourceFile f2 = getSourceFile(GlobalsInvocation.class); + transpilerTest().transpile(logHandler -> { + logHandler.assertNoProblems(); + }, f1, f2); + String generatedCode = FileUtils.readFileToString(f1.getTsFile()); + Assert.assertTrue(generatedCode.indexOf("const explicitFinalString") > -1); + Assert.assertTrue(generatedCode.indexOf("const implicitFinalString") > -1); + Assert.assertTrue(generatedCode.indexOf("let notFinalString") > -1); + generatedCode = FileUtils.readFileToString(f2.getTsFile()); + Assert.assertTrue(generatedCode.indexOf("const explicitFinalGlobal") > -1); + Assert.assertTrue(generatedCode.indexOf("let implicitFinalGlobal") > -1); + Assert.assertTrue(generatedCode.indexOf("let notFinalGlobal") > -1); + } + @Test public void testFinalVariablesRuntime() { try { diff --git a/transpiler/src/test/java/source/syntax/FinalVariables.java b/transpiler/src/test/java/source/syntax/FinalVariables.java index 8c4cfb2f..6fe7a03b 100644 --- a/transpiler/src/test/java/source/syntax/FinalVariables.java +++ b/transpiler/src/test/java/source/syntax/FinalVariables.java @@ -102,29 +102,29 @@ public class FinalVariables { } void explicitFinal() { - final String s = "abc"; + final String explicitFinalString = "abc"; handler(new ANonFunctionalInterface() { @Override public void m() { - System.out.println(s); + System.out.println(explicitFinalString); } }); } void implicitFinal() { - String s = "abc"; + String implicitFinalString = "abc"; handler(new ANonFunctionalInterface() { @Override public void m() { - System.out.println(s); + System.out.println(implicitFinalString); } }); } String notFinal() { - String s = "abc"; - s = "bcd"; - return s; + String notFinalString = "abc"; + notFinalString = "bcd"; + return notFinalString; } } @@ -143,3 +143,4 @@ interface Callback { interface ANonFunctionalInterface { void m(); } + diff --git a/transpiler/src/test/java/source/syntax/GlobalsInvocation.java b/transpiler/src/test/java/source/syntax/GlobalsInvocation.java index 58c8546e..b3c034a4 100644 --- a/transpiler/src/test/java/source/syntax/GlobalsInvocation.java +++ b/transpiler/src/test/java/source/syntax/GlobalsInvocation.java @@ -50,4 +50,14 @@ class Globals { }); } public static void m() {}; + + public final static int explicitFinalGlobal = 1; + public static int implicitFinalGlobal = 1; + public static int notFinalGlobal = 1; + + public static void init() { + notFinalGlobal = 1; + } + + }