[
https://issues.apache.org/jira/browse/GROOVY-9807?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Eric Milles updated GROOVY-9807:
--------------------------------
Fix Version/s: 2.5.16
> Static compile of dynamically generated code produces different output in a
> top-level class and a nested class
> --------------------------------------------------------------------------------------------------------------
>
> Key: GROOVY-9807
> URL: https://issues.apache.org/jira/browse/GROOVY-9807
> Project: Groovy
> Issue Type: Bug
> Components: Static compilation
> Affects Versions: 3.0.6
> Environment: openjdk version "1.8.0_242"
> OpenJDK Runtime Environment (build 1.8.0_242-8u242-b08-0ubuntu3~18.04-b08)
> OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)
> Reporter: Lyuben Atanasov
> Assignee: Eric Milles
> Priority: Critical
> Fix For: 4.0.0-alpha-3, 2.5.16, 3.0.10
>
> Time Spent: 1h 20m
> Remaining Estimate: 0h
>
> I have encountered an issue when trying to generate code, containing chained
> method calls, at runtime (without source code) and compiling using
> CompileStatic.
> What I am trying to achieve is produce code similar to:
> {code:java}
> public StringBuilder test() {
> StringBuilder sb = new StringBuilder().append("testString");
> return sb;
> }
> {code}
> I create the appropriate AST nodes, statements, expressions, etc.
> Everything works fine if I add a method like the one shown in a top-level
> class (the class is also dynamically generated at runtime). However, if I try
> to add the exact same method to a nested class, it seems like the groovy
> compiler gets somehow confused and, judging by the decompiler output,
> produces something like:
> {code:java}
> public StringBuilder test() {
> StringBuilder sb =
> ((StringBuilder)((Closure)this).getThisObject()).append("testString");
> return sb;
> }
> {code}
> Naturally, this does not work.
> Here's how I try to generate the method:
> {code:java}
> ClassNode topLevelClass = ClassHelper.make(
> "com.example.groovycompiler.test.TopLevelClass");
> InnerClassNode nestedClass = new InnerClassNode(
> topLevelClass,
> "com.example.groovycompiler.test.TopLevelClass$NestedClass",
> Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC,
> ClassHelper.OBJECT_TYPE);
> ClassNode stringBuilderClass = ClassHelper.make(StringBuilder.class);
> nestedClass.addMethod(
> "test",
> Opcodes.ACC_PUBLIC,
> stringBuilderClass,
> Parameter.EMPTY_ARRAY,
> ClassNode.EMPTY_ARRAY,
> block(
> declS(
> varX("sb", stringBuilderClass),
> callX(ctorX(stringBuilderClass), "append",
> args(constX("testString")))),
> returnS(
> varX("sb", stringBuilderClass))
> )
> );
> {code}
> Perhaps I am missing something, in which case I will be very happy to receive
> some pointers.
> I have created a github repo with a maven project containing a unit test that
> demonstrates the issue:
> https://github.com/l-atanasov/groovy-static-compile-issue
> Note, that I have extended the CompilationUnit a little to allow to run the
> static compiler without source.
> Also, if I am not using the static compiler, everything works as expected.
> Update: reformatted code for readability
--
This message was sent by Atlassian Jira
(v8.20.1#820001)