On Mon, Mar 14, 2016 at 5:21 PM, Alex Buckley <alex.buck...@oracle.com>
wrote:

> The JLS doesn't know what the string "module-info.class" means or what a
> "JAR root" is.


Of course. Though that wasn't my ultimate point; I was merely illustrating
(philosophically) why having "package" in module-info.java is nonsensical
syntax. A "package" statement doesn't mean anything useful in the context
of specifying module configuration. As far as I am aware, the module syntax
is meant to standalone in the file, but please correct me if you have other
intentions for the syntax. If you can also declare types, then a "package"
statement begins to make more sense -- but it would seem like a clumsy way
of doing things, which I wouldn't advocate (or allow syntactically).

Cheers,
Paul


> In 3/14/2016 9:08 AM, Paul Benedict wrote:
>
>> Alex, you wrote: "The JLS doesn't prevent javac from rejecting a package
>> declaration or an import declaration in a file called module-info.java."
>>
>> It seems that a package declaration, in this context, should be
>> prohibited syntax because module-info.class is always in the JAR root
>> which has no package.
>>
>> Cheers,
>> Paul
>>
>> On Wed, Mar 9, 2016 at 4:02 PM, Alex Buckley <alex.buck...@oracle.com
>> <mailto:alex.buck...@oracle.com>> wrote:
>>
>>     The JLS doesn't prevent javac from rejecting a package declaration
>>     or an import declaration in a file called module-info.java.
>>
>>     In fact, since a package declaration or import declaration must be
>>     followed by a type declaration, and since a type declaration cannot
>>     use a hyphen, javac is free to take the optional rule from JLS 7.6
>>     -- filename must align with type declaration -- and develop it
>>     further: rejecting a package declaration or import declaration in
>>     module-info.java because the filename cannot possibly align with any
>>     type declaration.
>>
>>     I can't speak to what a particular EA build of javac is doing with a
>>     particular option. javac options are irrelevant to the JLS. If a
>>     compiler accepts the Java language circa SE 9, then a module
>>     declaration is a valid compilation unit. What's the name of the file
>>     containing such a compilation unit? Anything the compiler likes.
>>
>>     Alex
>>
>>     On 3/9/2016 5:14 AM, Georgiy Rakov wrote:
>>
>>         Hi Alex,
>>
>>         if I understand correctly you mean about following assertions
>>         from JLS 7.6:
>>
>>              If and only if packages are stored in a file system (ยง7.2
>>
>>         <
>> http://docs.oracle.com/javase/specs/jls/se8/html/jls-7.html#jls-7.2>),
>>              the host system may choose to enforce the restriction that
>>         it is a
>>              compile-time error if a type is not found in a file under a
>>         name
>>              composed of the type name plus an extension (such as
>> |.java|or
>>              |.jav|) if either of the following is true:
>>
>>                *
>>
>>                  The type is referred to by code in other compilation
>>         units of
>>                  the package in which the type is declared.
>>
>>                *
>>
>>                  The type is declared |public|(and therefore is
>> potentially
>>                  accessible from code in other packages).
>>
>>         Literally these assertion doesn't make presented behavior
>>         corresponding
>>         to spec because the declared type is neither public nor being
>>         referred
>>         to from other sources being compiled.
>>
>>         Nevertheless following sources doesn't compile either despite
>>         the fact
>>         that no types are declared there at all.
>>         Namely when only package is specified:
>>
>>              mod\module-info.java:
>>              module mod {
>>                   exports pkg;
>>              }
>>
>>              mod\pkg\module-info.java:
>>              package pkg;
>>
>>         then compiling it by following command line with javac from [2]:
>>
>>              javac -modulesourcepath . mod\module-info.java
>>         mod\pkg\module-info.java
>>
>>         causes following output:
>>
>>              mod\pkg\module-info.java:1: error: expected 'module
>>              package pkg;
>>              ^
>>              1 error
>>
>>         When only import statment is specified:
>>
>>              mod\module-info.java:
>>              module mod {
>>                   exports pkg;
>>              }
>>
>>              mod\pkg\module-info.java:
>>              import java.util.List;
>>
>>         then compiling it by following command line with javac from [2]:
>>
>>              javac -modulesourcepath . mod\module-info.java
>>         mod\pkg\module-info.java
>>
>>         causes following output:
>>
>>              mod\pkg\module-info.java:1: error: expected 'module'
>>              import java.util.List;
>>              ^
>>              1 error
>>
>>         Please see minimized test cases attached in tests23.zip. In order
>> to
>>         reproduce, please:
>>
>>         1. Unzip the attached archive to some dir on Windows machined, say
>>         directory A;
>>         2. Rename A\test2\test_bat to A\test2\test.bat and
>>         A\test3\test_bat to
>>         A\test3\test.bat;
>>         3. Modify these two test.bat files by changing JDK_HOME variable
>> to
>>         point to your jigsaw JDK 9 installation directory;
>>         4. Run test.bat files in turn.
>>
>>         BTW: javac behavior [2] currently differs depending on whether
>>         sources
>>         are compiled "in module" mode or not. By "module mode" I mean
>>         specifying
>>         modulesourcepath option. For instance without modulesourcepath
>>         option
>>         module declarations are not recognized as valid grammar while
>> import
>>         declarations contained within module-info.java compile
>> successfully.
>>         This can be seen by experimenting with test3 from the attached
>>         testcases. Now javac from [2] even can throw exception in
>>         "non-module"
>>         mode, please see https://bugs.openjdk.java.net/browse/JDK-8150733
>> .
>>
>>         Could you please tell if spec will specify somehow two modes of
>>         processing java-sources, now it [1] doesn't.
>>
>>         [1] http://cr.openjdk.java.net/~mr/jigsaw/spec/lang-vm.html
>>         [2]
>>
>> http://download.java.net/java/jigsaw/archive/106/binaries/jigsaw-jdk-9-ea+106_windows-x86_bin.zip
>>
>>         Thanks,
>>         Georgiy.
>>
>>         On 26.02.2016 21:26, Alex Buckley wrote:
>>
>>             On 2/26/2016 8:37 AM, Georgiy Rakov wrote:
>>
>>                 current spec [1] now contains following assertions
>>                 related to grammar:
>>
>>                      A compilation unit (JLS 7.3) may contain a module
>>                 declaration, in
>>                      which case the filename of the compilation unit is
>>                 typically
>>                      |module-info.java|.
>>
>>                      CompilationUnit:
>>                         [PackageDeclaration] {ImportDeclaration}
>>                 {TypeDeclaration}
>>                         ModuleDeclaration
>>
>>                 These assertions allows to specify any of import,
>>                 package or type
>>                 declarations in any compilation unit, for instance
>>                 module-info.java is
>>                 allowed to contain any of the mentioned declarations.
>>                 However currently
>>                 javac in the latest jigsaw build [2] reports an error on
>>                 such cases
>>                 provided they are compiled in module mode. For example
>>                 if we have
>>                 following directory structure:
>>
>>                      mod\module-info.java:
>>                      module mod {
>>                           exports pkg;
>>                      }
>>
>>                      mod\pkg\module-info.java:
>>                      package pkg;
>>
>>                      class C {
>>                      }
>>
>>                 then compiling it by following command line with javac
>>                 from [2]:
>>
>>                      javac -modulesourcepath . mod\module-info.java
>>                 mod\pkg\module-info.java
>>
>>                 causes following output:
>>
>>                      mod\pkg\module-info.java:1: error: expected 'module'
>>                      package pkg;
>>                      ^
>>                      1 error
>>
>>
>>             javac is merely choosing to implement the rule at the end of
>>             JLS 7.6
>>             that a type declaration (optionally preceded by package/import
>>             declarations) must be provided in a suitably named file.
>>
>>             Perhaps I should say "a variant of the rule" because 7.6 as
>>             written
>>             concerns a public type and your example has a package-access
>>             type.
>>             Still, bottom line, javac is free to require that a
>>             compilation unit
>>             which starts with a package declaration _must not_ be in a
>>             file called
>>             foo-bar.java -- the hyphen indicates a name that can't
>>             possibly align
>>             with the type declared in the compilation unit.
>>
>>             The error message for mod\pkg\module-info.java could be a
>>             bit more
>>             helpful, but that's a quality-of-implementation detail.
>>
>>             Conversely, a compilation unit that contains a module
>>             declaration
>>             _may_ be in a file called module-info.java, or in a file
>> called
>>             foo-bar.java, or in a file called mod_decl.JAV. The
>>             "typically" in [1]
>>             is meant to indicate that the sub-clause on filename is
>>             non-normative.
>>             This is akin to how a compilation unit that contains a
>>             package-access
>>             type declaration for class C _may_ be in a file D.java.
>>
>>             Alex
>>
>>
>>
>>

Reply via email to