Compilation (still) depends on order of imports

Liam Miller-Cushon cushon at google.com
Tue Mar 17 18:38:07 UTC 2015


Great, thanks Jan.

I'm curious what the resolution will be. The only solution that occurs to
me is to make a pass over all of the imports and ignore any that can't be
processed, and then keep retrying until a fixed point is reached. But
that's unsatisfying for a variety of reasons.

On Mon, Mar 16, 2015 at 1:05 PM, Jan Lahoda <jan.lahoda at oracle.com> wrote:

> Thanks Liam, I can reproduce now. I've filled:
> https://bugs.openjdk.java.net/browse/JDK-8075274
>
> Thanks,
>    Jan
>
>
> On 16.3.2015 16:23, Liam Miller-Cushon wrote:
>
>> Hi Jan,
>>
>> I see the same behaviour with JDK 9 b54. I've included a more verbose
>> version of the repro below. Sorry if I'm missing something obvious.
>>
>> One additional bit of weirdness is that the order of the source files
>> passed to javac matters: the issue occurs for "P/Outer.java P/Q/C.java
>> P/Q/D.java" but not "P/Q/C.java P/Q/D.java P/Outer.java".
>>
>> Here's the repro:
>>
>> $ ~/jdk/jdk1.9.0/bin/java -version
>> java version "1.9.0-ea"
>> Java(TM) SE Runtime Environment (build 1.9.0-ea-b54)
>> Java HotSpot(TM) 64-Bit Server VM (build 1.9.0-ea-b54, mixed mode)
>>
>> $ for f in $(find . -name "*.java"); do echo "=== $f ==="; cat $f; done
>> === ./P/Q/C.java ===
>> package P.Q;
>>
>> public class C extends D {
>> }
>> === ./P/Q/D.java ===
>> package P.Q;
>>
>> public class D {
>>    public interface I {
>>    }
>> }
>> === ./P/Outer.java ===
>> package P;
>>
>> import static P.Outer.Nested.*;
>> import static P.Q.C.*;
>>
>> public class Outer {
>>    public static class Nested implements I {
>>    }
>> }
>>
>> $ ~/jdk/jdk1.9.0/bin/javac P/Outer.java P/Q/C.java P/Q/D.java
>> P/Outer.java:7: error: cannot find symbol
>>    public static class Nested implements I {
>>                                          ^
>>    symbol:   class I
>>    location: class Outer
>> 1 error
>>
>> # Now, flip the order of the two imports in P.Outer
>>
>> $ for f in $(find . -name "*.java"); do echo "=== $f ==="; cat $f; done
>> === ./P/Q/C.java ===
>> package P.Q;
>>
>> public class C extends D {
>> }
>> === ./P/Q/D.java ===
>> package P.Q;
>>
>> public class D {
>>    public interface I {
>>    }
>> }
>> === ./P/Outer.java ===
>> package P;
>>
>> import static P.Q.C.*;
>> import static P.Outer.Nested.*;
>>
>> public class Outer {
>>    public static class Nested implements I {
>>    }
>> }
>>
>> $ ~/jdk/jdk1.9.0/bin/javac P/Outer.java P/Q/C.java P/Q/D.java
>>
>> # ... compiles cleanly
>>
>>
>>
>> On Mon, Mar 16, 2015 at 1:08 AM, Jan Lahoda <jan.lahoda at oracle.com
>> <mailto:jan.lahoda at oracle.com>> wrote:
>>
>>     Hi Liam,
>>
>>     Thanks for the report. I am afraid I was not able to reproduce. I
>>     tried on:
>>     $ javac -fullversion
>>     javac full version "1.9.0-ea-b54"
>>
>>     and on a custom build from jdk9/dev/langtools, tip:
>>     $ hg tip
>>     changeset:   2850:32a2e7249884
>>     tag:         tip
>>     parent:      2849:75cedc6db8c2
>>     parent:      2848:f5a1cb1309ae
>>     user:        lana
>>     date:        Thu Mar 12 21:13:42 2015 -0700
>>     summary:     Merge
>>
>>     Is there something special I need to do? Could you please try on JDK
>>     9 b54?
>>
>>     Thanks,
>>          Jan
>>
>>
>>     On 15.3.2015 23:00, Liam Miller-Cushon wrote:
>>
>>         I think I found a bug related to JEP 216. With javac9-dev @
>>         r2850, the
>>         following program fails to compile unless the order of imports
>>         is reversed.
>>
>>         It looks like the current implementation isn't lazy enough to
>>         handle the
>>         dependency between the two on-demand imports if 'I' is inherited
>>         into
>>         'C'. If 'I' is declared directly in 'C' then it works.
>>
>>         {{{
>>         package P;
>>
>>         import static P.Outer.Nested.*;
>>         import static P.Q.C.*;
>>
>>         public class Outer {
>>             public static class Nested implements I {
>>             }
>>         }
>>
>>         package P.Q;
>>
>>         public class C extends D {
>>         }
>>
>>         package P.Q;
>>
>>         public class D {
>>             public interface I {
>>             }
>>         }
>>         }}}
>>
>>         $ javac P/Outer.java P/Q/D.java P/Q/C.java
>>         P/Outer.java:7: error: cannot find symbol
>>             public static class Nested implements I {
>>                                                   ^
>>             symbol:   class I
>>             location: class Outer
>>         1 error
>>
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20150317/2b735dd2/attachment-0001.html>


More information about the compiler-dev mailing list