diff --git a/transpiler/src/main/java/org/jsweet/transpiler/Java2TypeScriptTranslator.java b/transpiler/src/main/java/org/jsweet/transpiler/Java2TypeScriptTranslator.java index 750ac0ef..e6f8b6ed 100644 --- a/transpiler/src/main/java/org/jsweet/transpiler/Java2TypeScriptTranslator.java +++ b/transpiler/src/main/java/org/jsweet/transpiler/Java2TypeScriptTranslator.java @@ -3425,9 +3425,10 @@ public class Java2TypeScriptTranslator extends AbstractTreePrinter { if (isDefinitionScope) { print("var "); } else { - if (!isLazyInitialized(varDecl.sym) && (varDecl.sym.getModifiers().contains(Modifier.FINAL) - || (!globals && constAnalyzer != null - && !constAnalyzer.getModifiedVariables().contains(varDecl.sym)))) { + if (!isLazyInitialized(varDecl.sym) && ((!globals && constAnalyzer != null + && !constAnalyzer.getModifiedVariables().contains(varDecl.sym)) + || (globals && varDecl.sym.getModifiers().contains(Modifier.FINAL) + && varDecl.init != null))) { print("const "); } else { print(VAR_DECL_KEYWORD + " "); 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 2da9c932..227f9628 100644 --- a/transpiler/src/test/java/org/jsweet/test/transpiler/SyntaxTests.java +++ b/transpiler/src/test/java/org/jsweet/test/transpiler/SyntaxTests.java @@ -160,13 +160,15 @@ public class SyntaxTests extends AbstractTest { 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); + Assert.assertTrue(generatedCode.contains("const explicitFinalString")); + Assert.assertTrue(generatedCode.contains("let explicitFinalStringWithDeferredAssignment")); + Assert.assertFalse(generatedCode.contains("const explicitFinalStringWithDeferredAssignment")); + Assert.assertTrue(generatedCode.contains("const implicitFinalString")); + Assert.assertTrue(generatedCode.contains("let notFinalString")); 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); + Assert.assertTrue(generatedCode.contains("const explicitFinalGlobal")); + Assert.assertTrue(generatedCode.contains("let implicitFinalGlobal")); + Assert.assertTrue(generatedCode.contains("let notFinalGlobal")); } @Test diff --git a/transpiler/src/test/java/source/syntax/FinalVariables.java b/transpiler/src/test/java/source/syntax/FinalVariables.java index 6fe7a03b..fcdc64c3 100644 --- a/transpiler/src/test/java/source/syntax/FinalVariables.java +++ b/transpiler/src/test/java/source/syntax/FinalVariables.java @@ -111,6 +111,21 @@ public class FinalVariables { }); } + public void explicitFinalWithDeferredAssignment(boolean condition) { + final String explicitFinalStringWithDeferredAssignment; + if(condition) { + explicitFinalStringWithDeferredAssignment = "1"; + } else { + explicitFinalStringWithDeferredAssignment = "2"; + } + handler(new ANonFunctionalInterface() { + @Override + public void m() { + System.out.println(explicitFinalStringWithDeferredAssignment); + } + }); + } + void implicitFinal() { String implicitFinalString = "abc"; handler(new ANonFunctionalInterface() {