@@ -764,26 +764,26 @@ public JCExpression parseExpression() {
764764 */
765765
766766 public JCPattern parsePattern (int pos , JCModifiers mods , JCExpression parsedType , boolean inInstanceOf ) {
767+ JCPattern pattern ;
767768 if (token .kind == LPAREN && parsedType == null ) {
768769 int startPos = token .pos ;
769770 accept (LPAREN );
770771 JCPattern p = parsePattern (token .pos , null , null , false );
771772 accept (RPAREN );
772- return toP (F .at (startPos ).ParenthesizedPattern (p ));
773+ pattern = toP (F .at (startPos ).ParenthesizedPattern (p ));
773774 } else {
774- JCPattern pattern ;
775775 JCExpression e = parsedType == null ? term (EXPR | TYPE | NOLAMBDA ) : parsedType ;
776776 mods = mods != null ? mods : F .at (token .pos ).Modifiers (0 );
777777 JCVariableDecl var = toP (F .at (token .pos ).VarDef (mods , ident (), e , null ));
778778 pattern = toP (F .at (pos ).BindingPattern (var ));
779- if (!inInstanceOf && token .kind == AMPAMP ) {
780- checkSourceLevel (Feature .PATTERN_SWITCH );
781- nextToken ();
782- JCExpression guard = term (EXPR | NOLAMBDA );
783- pattern = F .at (pos ).GuardPattern (pattern , guard );
784- }
785- return pattern ;
786779 }
780+ if (!inInstanceOf && token .kind == AMPAMP ) {
781+ checkSourceLevel (Feature .PATTERN_SWITCH );
782+ nextToken ();
783+ JCExpression guard = term (EXPR | NOLAMBDA );
784+ pattern = F .at (pos ).GuardPattern (pattern , guard );
785+ }
786+ return pattern ;
787787 }
788788
789789 /**
@@ -1694,12 +1694,16 @@ boolean isUnboundMemberRef() {
16941694 * method reference or a binary expression. To disambiguate, look for a
16951695 * matching '>' and see if the subsequent terminal is either '.' or '::'.
16961696 */
1697- @ SuppressWarnings ("fallthrough" )
16981697 ParensResult analyzeParens () {
1698+ return analyzeParens (0 );
1699+ }
1700+
1701+ @ SuppressWarnings ("fallthrough" )
1702+ ParensResult analyzeParens (int startLookahead ) {
16991703 int depth = 0 ;
17001704 boolean type = false ;
17011705 ParensResult defaultResult = ParensResult .PARENS ;
1702- outer : for (int lookahead = 0 ; ; lookahead ++) {
1706+ outer : for (int lookahead = startLookahead ; ; lookahead ++) {
17031707 TokenKind tk = S .token (lookahead ).kind ;
17041708 switch (tk ) {
17051709 case COMMA :
@@ -1725,7 +1729,7 @@ ParensResult analyzeParens() {
17251729 }
17261730 break ;
17271731 case LPAREN :
1728- if (lookahead != 0 ) {
1732+ if (lookahead != startLookahead ) {
17291733 // '(' in a non-starting position -> parens
17301734 return ParensResult .PARENS ;
17311735 } else if (peekToken (lookahead , RPAREN )) {
@@ -3065,15 +3069,12 @@ private JCCaseLabel parseCaseLabel() {
30653069 } else {
30663070 if (token .kind == LPAREN ) {
30673071 int lookahead = 0 ;
3068- Token ahead ;
3069- while ((ahead = S .token (lookahead )).kind != EOF && ahead .kind != RPAREN && ahead .kind != AMPAMP ) {
3072+ while (S .token (lookahead + 1 ).kind == LPAREN ) {
30703073 lookahead ++;
30713074 }
3072- Token twoBack ;
3073- boolean pattern = S .token (lookahead - 1 ).kind == IDENTIFIER &&
3074- ((twoBack = S .token (lookahead - 2 )).kind == IDENTIFIER ||
3075- twoBack .kind == GT || twoBack .kind == GTGT || twoBack .kind == GTGTGT );
3075+ boolean pattern = analyzeParens (lookahead ) == ParensResult .EXPLICIT_LAMBDA ;
30763076 if (pattern ) {
3077+ checkSourceLevel (token .pos , Feature .PATTERN_SWITCH );
30773078 return parsePattern (token .pos , null , null , false );
30783079 } else {
30793080 return term (EXPR | TYPE | NOLAMBDA );
0 commit comments