mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[java] enhanced 'switch' statements: parser fix (IDEA-196643)
This commit is contained in:
@@ -4,6 +4,7 @@ package com.intellij.lang.java.parser;
|
||||
import com.intellij.codeInsight.daemon.JavaErrorMessages;
|
||||
import com.intellij.lang.PsiBuilder;
|
||||
import com.intellij.lang.WhitespacesBinders;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.psi.JavaTokenType;
|
||||
import com.intellij.psi.TokenType;
|
||||
import com.intellij.psi.impl.source.tree.ElementType;
|
||||
@@ -52,17 +53,30 @@ public class ExpressionParser {
|
||||
private static final TokenSet TYPE_START = TokenSet.orSet(
|
||||
ElementType.PRIMITIVE_TYPE_BIT_SET, TokenSet.create(JavaTokenType.IDENTIFIER, JavaTokenType.AT));
|
||||
|
||||
private static final Key<Boolean> CASE_LABEL = Key.create("java.parser.case.label.expr");
|
||||
|
||||
private final JavaParser myParser;
|
||||
|
||||
public ExpressionParser(@NotNull final JavaParser javaParser) {
|
||||
public ExpressionParser(@NotNull JavaParser javaParser) {
|
||||
myParser = javaParser;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public PsiBuilder.Marker parse(final PsiBuilder builder) {
|
||||
public PsiBuilder.Marker parse(PsiBuilder builder) {
|
||||
return parseAssignment(builder);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public PsiBuilder.Marker parseCaseLabel(PsiBuilder builder) {
|
||||
CASE_LABEL.set(builder, Boolean.TRUE);
|
||||
try {
|
||||
return parseAssignment(builder);
|
||||
}
|
||||
finally {
|
||||
CASE_LABEL.set(builder, null);
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private PsiBuilder.Marker parseAssignment(final PsiBuilder builder) {
|
||||
final PsiBuilder.Marker left = parseConditional(builder);
|
||||
@@ -491,9 +505,11 @@ public class ExpressionParser {
|
||||
}
|
||||
|
||||
if (tokenType == JavaTokenType.LPARENTH) {
|
||||
final PsiBuilder.Marker lambda = parseLambdaAfterParenth(builder);
|
||||
if (lambda != null) {
|
||||
return lambda;
|
||||
if (CASE_LABEL.get(builder) != Boolean.TRUE) {
|
||||
final PsiBuilder.Marker lambda = parseLambdaAfterParenth(builder);
|
||||
if (lambda != null) {
|
||||
return lambda;
|
||||
}
|
||||
}
|
||||
|
||||
final PsiBuilder.Marker parenth = builder.mark();
|
||||
@@ -541,7 +557,7 @@ public class ExpressionParser {
|
||||
builder.remapCurrentToken(tokenType = JavaTokenType.IDENTIFIER);
|
||||
}
|
||||
if (tokenType == JavaTokenType.IDENTIFIER) {
|
||||
if (builder.lookAhead(1) == JavaTokenType.ARROW) {
|
||||
if (CASE_LABEL.get(builder) != Boolean.TRUE && builder.lookAhead(1) == JavaTokenType.ARROW) {
|
||||
return parseLambdaExpression(builder, false);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user