[
https://issues.apache.org/jira/browse/GROOVY-9472?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17508220#comment-17508220
]
Eric Milles commented on GROOVY-9472:
-------------------------------------
>> If you include the class or classes that file1 generates on the classpath
>> when compiling file2 there can be a significant difference
> Yes, this difference is the problem.
So if the compiler is invoked with a compilation unit that contains a single
source unit and a classpath for satisfying references, it is supposed to
somehow guess that some of those class files are really source units that
should be added to the compilation unit and compiled as well? Why not just
send in both source units in the first place if that is what you expect?
Breaking up the compilation process with an extra phase or a new two-phase
approach is a huge effort with many risks. And there are
idempotency/performance concerns with running resolve and transforms multiple
times. And the dependencies between transforms can be much more complex than
the builder scenario described here. Transforms can be assigned to any phase,
so after which phase should resolve be run again?
> Static import causes unresolved reference to become resolved
> ------------------------------------------------------------
>
> Key: GROOVY-9472
> URL: https://issues.apache.org/jira/browse/GROOVY-9472
> Project: Groovy
> Issue Type: Bug
> Components: Compiler, Static Type Checker
> Affects Versions: 2.5.10
> Reporter: Daniil Ovchinnikov
> Assignee: Eric Milles
> Priority: Major
> Fix For: 4.0.0
>
>
> {code:groovy|title=com/foo/Person.groovy}
> package com.foo
> @groovy.transform.builder.Builder
> class Person {
> String name
> }
> {code}
> 1.
> {code:groovy|title=Main.groovy}
> import com.foo.Person
> class Main {
> static void main(String[] args) {
> Person.PersonBuilder pb = Person.builder()
> println(pb.build())
> }
> }
> {code}
> Trying to use it without a static import yields {{unable to resolve class
> Person.PersonBuilder}}, which is another issue.
> 2. Let's add a static import
> {code:groovy|title=Main.groovy}
> import com.foo.Person
> import static com.foo.Person.PersonBuilder
> class Main {
> static void main(String[] args) {
> PersonBuilder pb = Person.builder()
> println(pb.build())
> }
> }
> {code}
> The code compiles, but fails with {{java.lang.NoClassDefFoundError:
> PersonBuilder}} when run.
> 3. Let's add {{@CompileStatic}}
> {code:groovy|title=Main.groovy}
> import com.foo.Person
> import static com.foo.Person.PersonBuilder
> import groovy.transform.CompileStatic
> @CompileStatic
> class Main {
> static void main(String[] args) {
> PersonBuilder pb = Person.builder()
> println(pb.build())
> }
> }
> {code}
> Compilation fails with:
> {{Cannot assign value of type com.foo.Person$PersonBuilder to variable of
> type PersonBuilder}} and {{Cannot find matching method PersonBuilder#build()}}
--
This message was sent by Atlassian Jira
(v8.20.1#820001)