Skip to content

Optimize level 9 breaks java 14 Type myVar = switch expressions compilation #10121

@JeffreyDevloo

Description

@JeffreyDevloo

The optimize flag for the GWT compiler changes results in compilation error of this switch expression

public class TestComposite extends Composite {
    private final TextBox textBox = new TextBox();

    public TestComposite() {
        super();
    }

    void setText(TestEnum testEnum) {
        Void ignored = switch (testEnum) {
            case A -> {
                textBox.setText("A");
                yield null;
            }
            case B -> {
                textBox.setText("B");
                yield null;
            }
        };
    }

    enum TestEnum {
        A, B
    }
}

This results in IllegalStateException("top-level switch expr") coming from the GenerateJavaScriptAST#transformExpressionStatement when running with optimize level 9.

[INFO] com.google.gwt.dev.jjs.InternalCompilerException: Unexpected error during visit.
[INFO]  at com.google.gwt.dev.jjs.ast.JVisitor.translateException(JVisitor.java:111)
[INFO]  at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:130)
[INFO]  at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:122)
[INFO]  at com.google.gwt.dev.jjs.ast.JTransformer.transform(JTransformer.java:1100)
[INFO]  at com.google.gwt.dev.jjs.ast.JTransformer.transformIntoExcludingNulls(JTransformer.java:1120)
[INFO]  at com.google.gwt.dev.jjs.impl.GenerateJavaScriptAST$GenerateJavaScriptTransformer.transformBlock(GenerateJavaScriptAST.java:583)
[INFO]  at com.google.gwt.dev.jjs.impl.GenerateJavaScriptAST$GenerateJavaScriptTransformer.transformBlock(GenerateJavaScriptAST.java:520)
[INFO]  at com.google.gwt.dev.jjs.ast.JTransformer$JRewriterVisitor.visit(JTransformer.java:647)
[INFO]  at com.google.gwt.dev.jjs.ast.JBlock.traverse(JBlock.java:93)
[INFO]  at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:127)
[INFO]  at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:122)
[INFO]  at com.google.gwt.dev.jjs.ast.JTransformer.transform(JTransformer.java:1100)
[INFO]  at com.google.gwt.dev.jjs.impl.GenerateJavaScriptAST$GenerateJavaScriptTransformer.transform(GenerateJavaScriptAST.java:2672)
[INFO]  at com.google.gwt.dev.jjs.impl.GenerateJavaScriptAST$GenerateJavaScriptTransformer.transformMethodBody(GenerateJavaScriptAST.java:833)
[INFO]  at com.google.gwt.dev.jjs.impl.GenerateJavaScriptAST$GenerateJavaScriptTransformer.transformMethodBody(GenerateJavaScriptAST.java:520)
[INFO]  at com.google.gwt.dev.jjs.ast.JTransformer$JRewriterVisitor.visit(JTransformer.java:854)
[INFO]  at com.google.gwt.dev.jjs.ast.JMethodBody.traverse(JMethodBody.java:81)
[INFO]  at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:127)
[INFO]  at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:122)
[INFO]  at com.google.gwt.dev.jjs.ast.JTransformer.transform(JTransformer.java:1100)
[INFO]  at com.google.gwt.dev.jjs.impl.GenerateJavaScriptAST$GenerateJavaScriptTransformer.transformMethod(GenerateJavaScriptAST.java:804)
[INFO]  at com.google.gwt.dev.jjs.impl.GenerateJavaScriptAST$GenerateJavaScriptTransformer.transformMethod(GenerateJavaScriptAST.java:520)
[INFO]  at com.google.gwt.dev.jjs.ast.JTransformer$JRewriterVisitor.visit(JTransformer.java:848)
[INFO]  at com.google.gwt.dev.jjs.ast.JMethod.traverse(JMethod.java:777)
[INFO]  at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:127)
[INFO]  at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:122)
[INFO]  at com.google.gwt.dev.jjs.ast.JTransformer.transform(JTransformer.java:1100)
[INFO]  at com.google.gwt.dev.jjs.impl.GenerateJavaScriptAST$GenerateJavaScriptTransformer.emitStaticMethods(GenerateJavaScriptAST.java:1869)
[INFO]  at com.google.gwt.dev.jjs.impl.GenerateJavaScriptAST$GenerateJavaScriptTransformer.transformDeclaredType(GenerateJavaScriptAST.java:647)
[INFO]  at com.google.gwt.dev.jjs.impl.GenerateJavaScriptAST$GenerateJavaScriptTransformer.transformDeclaredType(GenerateJavaScriptAST.java:520)
[INFO]  at com.google.gwt.dev.jjs.ast.JTransformer.transformClassType(JTransformer.java:95)
[INFO]  at com.google.gwt.dev.jjs.ast.JTransformer$JRewriterVisitor.visit(JTransformer.java:695)
[INFO]  at com.google.gwt.dev.jjs.ast.JClassType.traverse(JClassType.java:145)
[INFO]  at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:127)
[INFO]  at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:122)
[INFO]  at com.google.gwt.dev.jjs.ast.JTransformer.transform(JTransformer.java:1100)
[INFO]  at com.google.gwt.dev.jjs.impl.GenerateJavaScriptAST$GenerateJavaScriptTransformer.transformProgram(GenerateJavaScriptAST.java:1242)
[INFO]  at com.google.gwt.dev.jjs.impl.GenerateJavaScriptAST$GenerateJavaScriptTransformer.transformProgram(GenerateJavaScriptAST.java:520)
[INFO]  at com.google.gwt.dev.jjs.ast.JTransformer$JRewriterVisitor.visit(JTransformer.java:943)
[INFO]  at com.google.gwt.dev.jjs.ast.JProgram.traverse(JProgram.java:1248)
[INFO]  at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:127)
[INFO]  at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:122)
[INFO]  at com.google.gwt.dev.jjs.ast.JTransformer.transform(JTransformer.java:1100)
[INFO]  at com.google.gwt.dev.jjs.impl.GenerateJavaScriptAST.execImpl(GenerateJavaScriptAST.java:3171)
[INFO]  at com.google.gwt.dev.jjs.impl.GenerateJavaScriptAST.exec(GenerateJavaScriptAST.java:2944)
[INFO]  at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.compilePermutation(JavaToJavaScriptCompiler.java:380)
[INFO]  at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.compilePermutation(JavaToJavaScriptCompiler.java:274)
[INFO]  at com.google.gwt.dev.CompilePerms.compile(CompilePerms.java:198)
[INFO]  at com.google.gwt.dev.ThreadedPermutationWorkerFactory$ThreadedPermutationWorker.compile(ThreadedPermutationWorkerFactory.java:50)
[INFO]  at com.google.gwt.dev.PermutationWorkerFactory$Manager$WorkerThread.run(PermutationWorkerFactory.java:74)
[INFO]  at java.base/java.lang.Thread.run(Thread.java:1583)
[INFO] Caused by: java.lang.IllegalStateException: top-level switch expr
[INFO]  at com.google.gwt.dev.jjs.impl.GenerateJavaScriptAST$GenerateJavaScriptTransformer.transformExpressionStatement(GenerateJavaScriptAST.java:708)
[INFO]  at com.google.gwt.dev.jjs.impl.GenerateJavaScriptAST$GenerateJavaScriptTransformer.transformExpressionStatement(GenerateJavaScriptAST.java:520)
[INFO]  at com.google.gwt.dev.jjs.ast.JTransformer$JRewriterVisitor.visit(JTransformer.java:755)
[INFO]  at com.google.gwt.dev.jjs.ast.JExpressionStatement.traverse(JExpressionStatement.java:41)
[INFO]  at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:127)
[INFO]  ... 49 more
[INFO]          [ERROR] at TestComposite.java(14): switch (0)  {
[INFO]   case 0: 
[INFO]   {
[INFO]     ValueBoxBase.$setText(this$static.textBox, "A");
[INFO]     yield  null;
[INFO]   }
[INFO]   case 1: 
[INFO]   {
[INFO]     ValueBoxBase.$setText(this$static.textBox, "B");
[INFO]     yield  null;
[INFO]   }
[INFO] }
[INFO]             com.google.gwt.dev.jjs.ast.JExpressionStatement
[INFO]          [ERROR] at TestComposite.java(13): {
[INFO]   switch (0)  {
[INFO]     case 0: 
[INFO]     {
[INFO]       ValueBoxBase.$setText(this$static.textBox, "A");
[INFO]       yield  null;
[INFO]     }
[INFO]     case 1: 
[INFO]     {
[INFO]       ValueBoxBase.$setText(this$static.textBox, "B");
[INFO]       yield  null;
[INFO]     }
[INFO]   }
[INFO] }
[INFO]             com.google.gwt.dev.jjs.ast.JBlock
[INFO]          [ERROR] at TestComposite.java(13): {
[INFO]   switch (0)  {
[INFO]     case 0: 
[INFO]     {
[INFO]       ValueBoxBase.$setText(this$static.textBox, "A");
[INFO]       yield  null;
[INFO]     }
[INFO]     case 1: 
[INFO]     {
[INFO]       ValueBoxBase.$setText(this$static.textBox, "B");
[INFO]       yield  null;
[INFO]     }
[INFO]   }
[INFO] }
[INFO]             com.google.gwt.dev.jjs.ast.JMethodBody
[INFO]          [ERROR] at TestComposite.java(13): com.example.client.editor.TestComposite.$setText(Lcom/example/client/editor/TestComposite;Lcom/example/client/editor/TestComposite$TestEnum;)V
[INFO]             com.google.gwt.dev.jjs.ast.JMethod
[INFO]          [ERROR] at TestComposite.java(6): com.example.client.editor.TestComposite (extends Composite)
[INFO]             com.google.gwt.dev.jjs.ast.JClassType
[INFO]          [ERROR] at Unknown(0): <JProgram>
[INFO]             com.google.gwt.dev.jjs.ast.JProgram
[INFO]       [ERROR] Unrecoverable exception, shutting down
[INFO] com.google.gwt.core.ext.UnableToCompleteException: (see previous log entries)
[INFO]  at com.google.gwt.dev.javac.CompilationProblemReporter.logAndTranslateException(CompilationProblemReporter.java:106)
[INFO]  at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.compilePermutation(JavaToJavaScriptCompiler.java:461)
[INFO]  at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.compilePermutation(JavaToJavaScriptCompiler.java:274)
[INFO]  at com.google.gwt.dev.CompilePerms.compile(CompilePerms.java:198)
[INFO]  at com.google.gwt.dev.ThreadedPermutationWorkerFactory$ThreadedPermutationWorker.compile(ThreadedPermutationWorkerFactory.java:50)
[INFO]  at com.google.gwt.dev.PermutationWorkerFactory$Manager$WorkerThread.run(PermutationWorkerFactory.java:74)
[INFO]  at java.base/java.lang.Thread.run(Thread.java:1583)
[INFO]       [ERROR] Not all permutation were compiled , completed (0/1)

This does not occur when you have a function that returns instead of assigning it to a variable

public class TestComposite extends Composite {
    private final TextBox textBox = new TextBox();

    public TestComposite() {
        super();
    }

    Void setText(TestEnum testEnum) {
        return switch (testEnum) {
            case A -> {
                textBox.setText("A");
                yield null;
            }
            case B -> {
                textBox.setText("B");
                yield null;
            }
        };
    }

    enum TestEnum {
        A, B
    }
}


I've tested a multitude of return types and they all lead to the same exception.

If I compile using --optimize=0, the bundle is generated without any issues.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions