hg: lambda/lambda/langtools: Conformance fix: adjust parsing of '_' as an identifier

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Tue Jan 8 11:50:20 PST 2013


Thanks again - I'm working on a patch that should address all those cases.

Maurizio

On 08/01/13 19:36, bitter_fox wrote:
> Hi, Maurizio.
>
> I think there are some problems on _ for lambda parameters, as a Type 
> and a name.
>
> 1. javac considers a legal lambda as a illegal lambda in several 
> situations.
>
> For example:
>
> public class Main
> {
>     class _ {}
>
>     interface F
>     {
>         void m(_ arg);
>     }
>
>     public static void main(String[] args)
>     {
>         F f = (_ arg) -> {}; /* legal explicit lambda */
>     }
> }
>
> Lambda expression for f is a legal explicit lambda(_ is a Type and arg 
> is a parameter name). However, javac considers it as a implicit lambda 
> and `_' as a lambda parameter name and makes a compiler error.
>
> Maybe you forgot to add analyzation for UNDERSCORE (IDENT | 
> UNDERSCORE) -> explicit lambda.
>
> --- a/src/share/classes/com/sun/tools/javac/parser/JavacParser.java 
> Tue Jan 08 13:31:41 2013 +0100
> +++ b/src/share/classes/com/sun/tools/javac/parser/JavacParser.java 
> Wed Jan 09 03:32:57 2013 +0900
> @@ -1385,18 +1385,13 @@
>                              return ParensResult.PARENS;
>                      }
>                  case IDENTIFIER:
> +                case UNDERSCORE:
>                      if (peekToken(lookahead, IDENTIFIER) ||
>                              peekToken(lookahead, UNDERSCORE)) {
> -                        // Identifier, Identifier/'_' -> explicit lambda
> +                        // Identifier/'_', Identifier/'_' -> explicit 
> lambda
>                          return ParensResult.EXPLICIT_LAMBDA;
>                      } else if (peekToken(lookahead, RPAREN, ARROW)) {
> -                        // Identifier, ')' '->' -> implicit lambda
> -                        return ParensResult.IMPLICIT_LAMBDA;
> -                    }
> -                    break;
> -                case UNDERSCORE:
> -                    if (peekToken(lookahead, RPAREN, ARROW)) {
> -                        // '_', ')' '->' -> implicit lambda
> +                        // Identifier/'_', ')' '->' -> implicit lambda
>                          return ParensResult.IMPLICIT_LAMBDA;
>                      }
>                      break;
>
> 2. JavacParser misses _ for the second and the following explicit 
> lambda parameter names.
>
> For example:
>
> public class Main
> {
>     interface F
>     {
>         void m(int n1, int n2);
>     }
>
>     public static void main(String[] args)
>     {
>         F f = (int n, int _) -> {}; /* illegal explicit lambda */
>     }
> }
>
> `_' is used for the second lambda parameter name. However, javac 
> accepts it.
>
> Maybe you didn't call formalParameter with `lambdaParameters' for the 
> second and the following explicit lambda parameters.
>
> --- a/src/share/classes/com/sun/tools/javac/parser/JavacParser.java 
> Tue Jan 08 13:31:41 2013 +0100
> +++ b/src/share/classes/com/sun/tools/javac/parser/JavacParser.java 
> Wed Jan 09 03:22:59 2013 +0900
> @@ -3241,7 +3236,7 @@
>              params.append(lastParam = formalParameter(lambdaParameters));
>              while ((lastParam.mods.flags & Flags.VARARGS) == 0 && 
> token.kind == COMMA) {
>                  nextToken();
> -                params.append(lastParam = formalParameter());
> +                params.append(lastParam = 
> formalParameter(lambdaParameters));
>              }
>          }
>          accept(RPAREN);
>
> Regards,
> bitter_fox
>
>
> 2013/1/9 Maurizio Cimadamore <maurizio.cimadamore at oracle.com 
> <mailto:maurizio.cimadamore at oracle.com>>
>
>     Thanks!
>
>     Maurizio
>
>
>     On 08/01/13 17:46, bitter_fox wrote:
>>     Hi, Maurizio.
>>
>>     Maybe you forgot to add code for javac to retain `_' packages.
>>     Your commit makes a compiler error for a legal package declaration:
>>
>>     package _;
>>
>>     I think there is the same problem for `assert' packages.
>>
>>     ---
>>     a/src/share/classes/com/sun/tools/javac/parser/JavacParser.java
>>     Tue Jan 08 15:24:05 2013 +0100
>>     +++
>>     b/src/share/classes/com/sun/tools/javac/parser/JavacParser.java
>>     Wed Jan 09 01:33:39 2013 +0900
>>     @@ -2701,7 +2701,7 @@
>>                  mods = modifiersOpt(true);
>>
>>              if (token.kind == PACKAGE) {
>>     -            if (peekToken(IDENTIFIER)) {
>>     +            if (peekToken(IDENTIFIER) | peekToken(UNDERSCORE)) {
>>                      seenPackage = true;
>>                      if (mods != null) {
>>                          checkNoMods(mods.flags);
>>
>>     Regards,
>>     bitter_fox
>>
>>     2013/1/8 <maurizio.cimadamore at oracle.com
>>     <mailto:maurizio.cimadamore at oracle.com>>
>>
>>         Changeset: 2e8ccb7ba243
>>         Author:    mcimadamore
>>         Date:      2013-01-08 13:31 +0100
>>         URL:
>>         http://hg.openjdk.java.net/lambda/lambda/langtools/rev/2e8ccb7ba243
>>
>>         Conformance fix: adjust parsing of '_' as an identifier
>>         *) '_' cannot be used as a lambda parameter name
>>         *) use of '_' as an identifier will cause compile-time warnings
>>
>>         ! src/share/classes/com/sun/tools/javac/parser/JavacParser.java
>>         ! src/share/classes/com/sun/tools/javac/parser/Tokens.java
>>         !
>>         src/share/classes/com/sun/tools/javac/resources/compiler.properties
>>         ! test/tools/javac/diags/examples.not-yet.txt
>>         ! test/tools/javac/lambda/LambdaParserTest.java
>>         + test/tools/javac/lambda/WarnUnderscoreAsIdent.java
>>         + test/tools/javac/lambda/WarnUnderscoreAsIdent.out
>>
>>
>>
>
>



More information about the lambda-dev mailing list