[java] Fix #6234: Parser fails to parse switch expressions in super() constructor calls #6359
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Describe the PR
This PR fixes a parsing issue where the PMD Java parser failed to parse switch expressions when used inside a lambda that's passed to a
super()constructor call.The Root Cause
In
ConstructorBlock, the grammar usedLOOKAHEAD(ExplicitConstructorInvocation())which performed a full syntactic lookahead of the entire production, including theArgumentList(). When the argument list contained complex expressions like lambdas with switch expressions (usingcase X -> valuesyntax), the lookahead would fail due to the complexity of parsing nested constructs during lookahead.This caused the parser to fall back to treating
super(...)as a regular statement, wheresuperis expected to be followed by.or::(for member access or method reference), resulting in the error:The Fix
Introduced a new lightweight lookahead production
ExplicitCtorInvocLookahead()that only recognizes the structural pattern of explicit constructor invocations without parsing the full argument list:this(/super(for simple calls<TypeArgs>this(/<TypeArgs>super(for calls with type argumentsqualifier.super(/qualifier.<TypeArgs>super(for qualified super callsAlso added
PrimaryExpressionNoSuperThis()helper production to handle qualified super calls likeOuter.this.super()andnew Outer().super().Related issues
Ready?
./mvnw clean verifypasses (checked automatically by github actions)