Will Java ever allow comments to nest?

Pavel Rappo pavel.rappo at oracle.com
Thu Jul 2 14:15:27 UTC 2020


> On 1 Jul 2020, at 21:49, Pavel Rappo <pavel.rappo at oracle.com> wrote:
> 
> Hello,
> 
> JLS specifies that comments do not nest [1]. For example, the below source will not compile
> 
>    $ cat CommentsDoNotNest.java 
>    public class CommentsDoNotNest {
>        /* /* */ */
>    }
> 
>    $ javac CommentsDoNotNest.java 
>    CommentsDoNotNest.java:2: error: illegal start of type
>        /* /* */ */
>                 ^
>    1 error
> 
> Some modern languages allow comments to nest. For example, Swift, F#, and Haskell do that. Why doesn't Java do that? Will Java ever do that?
> 
> I can see cases where nesting would be useful:
> 
> 1. Commenting out long blocks of code that possibly contain `/* ... */` comments.
> 2. Having a character sequence resembling a comment terminator `*/`, for example, in a regex or a glob pattern.

Scratch that. Item 2 has nothing to do with nesting; it's just a standalone `*/`

    $ cat CommentsDoNotNest2.java
    public class CommentsDoNotNest {
        /* The result of "/home/".matches(".*/") is true. */
    }

    $ javac CommentsDoNotNest2.java
    CommentsDoNotNest2.java:2: error: unclosed string literal
        /* The result of "/home/".matches(".*/") is true. */
                                              ^
    CommentsDoNotNest2.java:4: error: reached end of file while parsing
    2 errors

A solution to this is to hide `*/` from the compiler. Depending on the context this can be done differently. If this is a regular comment I could choose between these:

    a. // The result of "/home/".matches(".*/") is true.
    b. /* The result of "/home/".matches(".*" + "/") is true. */

If this is a doc comment I could use HTML entities or tags of the Standard doclet:

    c. /** The result of "/home/".matches(".*/") is true. */
    d. /** The result of "/home/".matches(".*/") is true. */
    e. /** The result of "/home/".matches(".{@literal *}/") is true. */

The problem with [c], [d], and [e], however, is that they make a comment less WYSIWYG. The less a doc comment diverts from WYSIWYG the better: if a doc comment uses a lot of markup, I will need a browser to render that (for example, to copy-paste a snippet into my code).

While experimenting with comments I found that IntelliJ IDEA thinks that these are valid comments:

    /* \u002a/ */
    /* *\u002f */

These comments are invalid for the same reason this is not a valid string literal:

    "Hello,\u000Aworld"

JLS specifies that the compiler translates Unicode escapes as the first step of lexical translation, 2 steps before comments are discarded:

    https://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html

I filed a bug against IDEA:

    https://youtrack.jetbrains.com/issue/IDEA-245018

-Pavel

> 3. Having a `/* ... */` comment within a doc comment `/** ... */`. This is typically used in doc comments of language modeling APIs and, admittedly, is a niche case.
> 
> All of the above can be done today, albeit with much friction.
> 
> Thanks,
> -Pavel
> 
> [1] https://docs.oracle.com/javase/specs/jls/se14/html/jls-3.html#jls-3.7
> 



More information about the discuss mailing list