Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 18 additions & 2 deletions org.eclipse.jdt.core.compiler.batch/grammar/java.g
Original file line number Diff line number Diff line change
Expand Up @@ -1751,7 +1751,6 @@ PrimaryNoNewArray -> ArrayAccess
-- Start of rules for JSR 335
-----------------------------------------------------------------------

PrimaryNoNewArray -> LambdaExpression
PrimaryNoNewArray -> ReferenceExpression
/:$readableName Expression:/

Expand Down Expand Up @@ -2083,6 +2082,17 @@ CastExpression ::= BeginIntersectionCast PushLPAREN CastNameAndBounds PushRPARE
/.$putCase consumeCastExpressionLL1WithBounds(); $break ./
CastExpression ::= PushLPAREN Name Dims AdditionalBoundsListOpt PushRPAREN InsideCastExpression UnaryExpressionNotPlusMinus
/.$putCase consumeCastExpressionWithNameArray(); $break ./
--------
CastExpression ::= PushLPAREN Name OnlyTypeArgumentsForCastExpression Dimsopt AdditionalBoundsListOpt PushRPAREN InsideCastExpression LambdaExpression
/.$putCase consumeCastExpressionWithGenericsArray(); $break ./
CastExpression ::= PushLPAREN Name OnlyTypeArgumentsForCastExpression '.' ClassOrInterfaceType Dimsopt AdditionalBoundsListOpt PushRPAREN InsideCastExpressionWithQualifiedGenerics LambdaExpression
/.$putCase consumeCastExpressionWithQualifiedGenericsArray(); $break ./
CastExpression ::= PushLPAREN Name PushRPAREN InsideCastExpressionLL1 LambdaExpression
/.$putCase consumeCastExpressionLL1(); $break ./
CastExpression ::= BeginIntersectionCast PushLPAREN CastNameAndBounds PushRPAREN InsideCastExpressionLL1WithBounds LambdaExpression
/.$putCase consumeCastExpressionLL1WithBounds(); $break ./
CastExpression ::= PushLPAREN Name Dims AdditionalBoundsListOpt PushRPAREN InsideCastExpression LambdaExpression
/.$putCase consumeCastExpressionWithNameArray(); $break ./
/:$readableName CastExpression:/

AdditionalBoundsListOpt ::= $empty
Expand Down Expand Up @@ -2188,14 +2198,16 @@ ConditionalOrExpression ::= ConditionalOrExpression '||' ConditionalAndExpressio
ConditionalExpression -> ConditionalOrExpression
ConditionalExpression ::= ConditionalOrExpression '?' Expression ':' ConditionalExpression
/.$putCase consumeConditionalExpression(OperatorIds.QUESTIONCOLON) ; $break ./
ConditionalExpression ::= ConditionalOrExpression '?' Expression ':' LambdaExpression
/.$putCase consumeConditionalExpression(OperatorIds.QUESTIONCOLON) ; $break ./
/:$readableName Expression:/

AssignmentExpression -> ConditionalExpression
AssignmentExpression -> Assignment
/:$readableName Expression:/
/:$recovery_template Identifier:/

Assignment ::= PostfixExpression AssignmentOperator AssignmentExpression
Assignment ::= PostfixExpression AssignmentOperator Expression
/.$putCase consumeAssignment(); $break ./
/:$readableName Assignment:/

Expand Down Expand Up @@ -2238,6 +2250,8 @@ AssignmentOperator ::= '|='
-- has been reduced.
Expression ::= AssignmentExpression
/.$putCase consumeExpression(); $break ./
Expression ::= LambdaExpression
/.$putCase consumeExpression(); $break ./
/:$readableName Expression:/
/:$recovery_template Identifier:/

Expand Down Expand Up @@ -2843,6 +2857,7 @@ AssignmentExpression_NotName -> Assignment
/:$readableName Expression:/

Expression_NotName -> AssignmentExpression_NotName
Expression_NotName -> LambdaExpression
/:$readableName Expression:/
-----------------------------------------------
-- 1.5 features : end of generics
Expand Down Expand Up @@ -3119,3 +3134,4 @@ UNDERSCORE ::= '_'

$end
-- need a carriage return after the $end

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -22,20 +22,20 @@ public interface ParserBasicInformation {

ERROR_SYMBOL = 138,
MAX_NAME_LENGTH = 41,
NUM_STATES = 1223,
NUM_STATES = 1194,

NT_OFFSET = 138,
SCOPE_UBOUND = 310,
SCOPE_SIZE = 311,
LA_STATE_OFFSET = 17648,
SCOPE_UBOUND = 320,
SCOPE_SIZE = 321,
LA_STATE_OFFSET = 17560,
MAX_LA = 1,
NUM_RULES = 926,
NUM_RULES = 933,
NUM_TERMINALS = 138,
NUM_NON_TERMINALS = 425,
NUM_SYMBOLS = 563,
START_STATE = 1015,
EOFT_SYMBOL = 39,
EOLT_SYMBOL = 39,
ACCEPT_ACTION = 17647,
ERROR_ACTION = 17648;
START_STATE = 1486,
EOFT_SYMBOL = 63,
EOLT_SYMBOL = 63,
ACCEPT_ACTION = 17559,
ERROR_ACTION = 17560;
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,87 +44,87 @@ public enum TerminalToken {
TokenNameCOMMENT_MARKDOWN(1005),

// BEGIN_AUTOGENERATED_REGION
TokenNameIdentifier(22),
TokenNameabstract(43),
TokenNameassert(81),
TokenNameIdentifier(12),
TokenNameabstract(41),
TokenNameassert(79),
TokenNameboolean(104),
TokenNamebreak(82),
TokenNamebreak(80),
TokenNamebyte(105),
TokenNamecase(106),
TokenNamecatch(107),
TokenNamechar(108),
TokenNameclass(71),
TokenNamecontinue(83),
TokenNameclass(68),
TokenNamecontinue(81),
TokenNameconst(136),
TokenNamedefault(77),
TokenNamedo(84),
TokenNamedefault(74),
TokenNamedo(82),
TokenNamedouble(109),
TokenNameelse(119),
TokenNameenum(75),
TokenNameelse(118),
TokenNameenum(71),
TokenNameextends(92),
TokenNamefalse(53),
TokenNamefinal(44),
TokenNamefalse(51),
TokenNamefinal(42),
TokenNamefinally(117),
TokenNamefloat(110),
TokenNamefor(85),
TokenNamefor(83),
TokenNamegoto(137),
TokenNameif(86),
TokenNameif(84),
TokenNameimplements(132),
TokenNameimport(111),
TokenNameinstanceof(17),
TokenNameinstanceof(18),
TokenNameint(112),
TokenNameinterface(72),
TokenNameinterface(69),
TokenNamelong(113),
TokenNamenative(45),
TokenNamenew(38),
TokenNamenon_sealed(46),
TokenNamenull(54),
TokenNamenative(43),
TokenNamenew(37),
TokenNamenon_sealed(44),
TokenNamenull(52),
TokenNamepackage(91),
TokenNameprivate(47),
TokenNameprotected(48),
TokenNamepublic(49),
TokenNamereturn(87),
TokenNameprivate(45),
TokenNameprotected(46),
TokenNamepublic(47),
TokenNamereturn(85),
TokenNameshort(114),
TokenNamestatic(40),
TokenNamestrictfp(50),
TokenNamesuper(35),
TokenNameswitch(65),
TokenNamesynchronized(41),
TokenNamethis(36),
TokenNamethrow(79),
TokenNamethrows(120),
TokenNametransient(51),
TokenNametrue(55),
TokenNametry(88),
TokenNamestatic(38),
TokenNamestrictfp(48),
TokenNamesuper(33),
TokenNameswitch(62),
TokenNamesynchronized(39),
TokenNamethis(34),
TokenNamethrow(77),
TokenNamethrows(119),
TokenNametransient(49),
TokenNametrue(53),
TokenNametry(86),
TokenNamevoid(115),
TokenNamevolatile(52),
TokenNamewhile(80),
TokenNamevolatile(50),
TokenNamewhile(78),
TokenNamemodule(116),
TokenNameopen(121),
TokenNamerequires(122),
TokenNameopen(120),
TokenNamerequires(121),
TokenNametransitive(127),
TokenNameexports(123),
TokenNameopens(124),
TokenNameexports(122),
TokenNameopens(123),
TokenNameto(133),
TokenNameuses(125),
TokenNameprovides(126),
TokenNameuses(124),
TokenNameprovides(125),
TokenNamewith(134),
TokenNameIntegerLiteral(56),
TokenNameLongLiteral(57),
TokenNameFloatingPointLiteral(58),
TokenNameDoubleLiteral(59),
TokenNameCharacterLiteral(60),
TokenNameStringLiteral(61),
TokenNameTextBlock(62),
TokenNameIntegerLiteral(54),
TokenNameLongLiteral(55),
TokenNameFloatingPointLiteral(56),
TokenNameDoubleLiteral(57),
TokenNameCharacterLiteral(58),
TokenNameStringLiteral(59),
TokenNameTextBlock(60),
TokenNamePLUS_PLUS(2),
TokenNameMINUS_MINUS(3),
TokenNameEQUAL_EQUAL(19),
TokenNameLESS_EQUAL(12),
TokenNameGREATER_EQUAL(13),
TokenNameNOT_EQUAL(20),
TokenNameLEFT_SHIFT(18),
TokenNameRIGHT_SHIFT(14),
TokenNameUNSIGNED_RIGHT_SHIFT(16),
TokenNameEQUAL_EQUAL(21),
TokenNameLESS_EQUAL(14),
TokenNameGREATER_EQUAL(15),
TokenNameNOT_EQUAL(22),
TokenNameLEFT_SHIFT(19),
TokenNameRIGHT_SHIFT(13),
TokenNameUNSIGNED_RIGHT_SHIFT(17),
TokenNamePLUS_EQUAL(93),
TokenNameMINUS_EQUAL(94),
TokenNameMULTIPLY_EQUAL(95),
Expand All @@ -140,47 +140,47 @@ public enum TerminalToken {
TokenNameAND_AND(30),
TokenNamePLUS(4),
TokenNameMINUS(5),
TokenNameNOT(67),
TokenNameREMAINDER(9),
TokenNameXOR(25),
TokenNameAND(21),
TokenNameMULTIPLY(8),
TokenNameNOT(64),
TokenNameREMAINDER(10),
TokenNameXOR(27),
TokenNameAND(23),
TokenNameMULTIPLY(9),
TokenNameOR(28),
TokenNameTWIDDLE(68),
TokenNameDIVIDE(10),
TokenNameGREATER(15),
TokenNameLESS(11),
TokenNameLPAREN(23),
TokenNameRPAREN(24),
TokenNameLBRACE(63),
TokenNameRBRACE(33),
TokenNameTWIDDLE(65),
TokenNameDIVIDE(11),
TokenNameGREATER(16),
TokenNameLESS(7),
TokenNameLPAREN(20),
TokenNameRPAREN(25),
TokenNameLBRACE(61),
TokenNameRBRACE(35),
TokenNameLBRACKET(6),
TokenNameRBRACKET(70),
TokenNameRBRACKET(73),
TokenNameSEMICOLON(26),
TokenNameQUESTION(29),
TokenNameCOLON(66),
TokenNameCOLON(70),
TokenNameCOMMA(32),
TokenNameDOT(1),
TokenNameEQUAL(78),
TokenNameAT(37),
TokenNameEQUAL(76),
TokenNameAT(36),
TokenNameELLIPSIS(128),
TokenNameARROW(118),
TokenNameCOLON_COLON(7),
TokenNameBeginLambda(64),
TokenNameBeginIntersectionCast(69),
TokenNameBeginTypeArguments(89),
TokenNameElidedSemicolonAndRightBrace(73),
TokenNameAT308(27),
TokenNameARROW(126),
TokenNameCOLON_COLON(8),
TokenNameBeginLambda(75),
TokenNameBeginIntersectionCast(67),
TokenNameBeginTypeArguments(87),
TokenNameElidedSemicolonAndRightBrace(88),
TokenNameAT308(24),
TokenNameAT308DOTDOTDOT(135),
TokenNameCaseArrow(74),
TokenNameCaseArrow(89),
TokenNameRestrictedIdentifierYield(90),
TokenNameRestrictedIdentifierrecord(76),
TokenNameRestrictedIdentifiersealed(42),
TokenNameRestrictedIdentifierrecord(72),
TokenNameRestrictedIdentifiersealed(40),
TokenNameRestrictedIdentifierpermits(129),
TokenNameBeginCasePattern(130),
TokenNameRestrictedIdentifierWhen(131),
TokenNameUNDERSCORE(34),
TokenNameEOF(39),
TokenNameUNDERSCORE(66),
TokenNameEOF(63),
TokenNameERROR(138);

// END_AUTOGENERATED_REGION
Expand Down
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -106,13 +106,8 @@ public void test003() {
"----------\n" +
"1. ERROR in X.java (at line 10)\n" +
" Object p = (int & I & J) () -> {};\n" +
" ^^^\n" +
"Base types are not allowed in intersection cast operator\n" +
"----------\n" +
"2. ERROR in X.java (at line 10)\n" +
" Object p = (int & I & J) () -> {};\n" +
" ^^^^^\n" +
"The target type of this expression must be a functional interface\n" +
" ^^^^^^^^^^^^^\n" +
"Syntax error on token(s), misplaced construct(s)\n" +
"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=399773, [1.8][compiler] Cast expression should allow for additional bounds to form intersection types
Expand Down Expand Up @@ -613,8 +608,8 @@ public void test021() {
"----------\n" +
"1. ERROR in X.java (at line 6)\n" +
" return \"Hello\" + () -> {};\n" +
" ^^^^^\n" +
"The target type of this expression must be a functional interface\n" +
" ^\n" +
"Syntax error on token \"+\", invalid AssignmentOperator\n" +
"----------\n" +
"2. ERROR in X.java (at line 9)\n" +
" return \"Hello\" + (I)(() -> {});\n" +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8989,6 +8989,30 @@ public static void main(String[] args) {
},
"class X$A");
}
public void testLambdaAsAssignmentRHS() {
this.runConformTest(
new String[] {
"X.java",
"""
import java.util.function.Consumer;

public class X {
Consumer<Boolean> xx;
void foo() {
this.xx = (f) -> { System.out.println(f); };
this.xx.accept(true);
this.xx.accept(false);
this.xx.accept(true);
}
public static void main(String [] args) {
new X().foo();
}
}
""",
},
"true\nfalse\ntrue"
);
}
public static Class testClass() {
return LambdaExpressionsTest.class;
}
Expand Down
Loading
Loading