mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
New Java parser: expression parsing fix
This commit is contained in:
@@ -271,7 +271,7 @@ public class ExpressionParser {
|
||||
|
||||
final PsiBuilder.Marker expr = parseUnary(builder);
|
||||
if (expr == null) {
|
||||
if (!typeInfo.isParameterized) {
|
||||
if (!typeInfo.isParameterized) { // cannot parse correct parenthesized expression after correct parameterized type
|
||||
typeCast.rollbackTo();
|
||||
return parsePostfix(builder);
|
||||
}
|
||||
|
||||
@@ -179,8 +179,7 @@ public class ReferenceParser {
|
||||
}
|
||||
|
||||
if (parameterList) {
|
||||
typeInfo.isParameterized = (builder.getTokenType() == JavaTokenType.LT);
|
||||
parseReferenceParameterList(builder, true, diamonds);
|
||||
typeInfo.isParameterized = parseReferenceParameterList(builder, true, diamonds);
|
||||
}
|
||||
else {
|
||||
if (!isStaticImport || builder.getTokenType() == JavaTokenType.DOT) {
|
||||
@@ -229,8 +228,7 @@ public class ReferenceParser {
|
||||
}
|
||||
|
||||
if (parameterList) {
|
||||
typeInfo.isParameterized = (builder.getTokenType() == JavaTokenType.LT);
|
||||
parseReferenceParameterList(builder, true, diamonds);
|
||||
typeInfo.isParameterized = parseReferenceParameterList(builder, true, diamonds);
|
||||
}
|
||||
else if (!isStaticImport || builder.getTokenType() == JavaTokenType.DOT) {
|
||||
emptyElement(builder, JavaElementType.REFERENCE_PARAMETER_LIST);
|
||||
@@ -241,14 +239,14 @@ public class ReferenceParser {
|
||||
return refElement;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static PsiBuilder.Marker parseReferenceParameterList(final PsiBuilder builder, final boolean wildcard, final boolean diamonds) {
|
||||
public static boolean parseReferenceParameterList(final PsiBuilder builder, final boolean wildcard, final boolean diamonds) {
|
||||
final PsiBuilder.Marker list = builder.mark();
|
||||
if (!expect(builder, JavaTokenType.LT)) {
|
||||
list.done(JavaElementType.REFERENCE_PARAMETER_LIST);
|
||||
return list;
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean isOk = true;
|
||||
while (true) {
|
||||
final PsiBuilder.Marker type = parseType(builder, true, wildcard, diamonds);
|
||||
if (type == null) {
|
||||
@@ -259,12 +257,13 @@ public class ReferenceParser {
|
||||
break;
|
||||
}
|
||||
else if (!expectOrError(builder, JavaTokenType.COMMA, JavaErrorMessages.message("expected.gt.or.comma"))) {
|
||||
isOk = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
list.done(JavaElementType.REFERENCE_PARAMETER_LIST);
|
||||
return list;
|
||||
return isOk;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
PsiJavaFile:Binary0.java
|
||||
PsiBinaryExpression:a + b
|
||||
PsiReferenceExpression:a
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:a('a')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:PLUS('+')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiReferenceExpression:b
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:b('b')
|
||||
@@ -0,0 +1,13 @@
|
||||
PsiJavaFile:Binary1.java
|
||||
PsiBinaryExpression:a < b
|
||||
PsiReferenceExpression:a
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:a('a')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:LT('<')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiReferenceExpression:b
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:b('b')
|
||||
@@ -0,0 +1,16 @@
|
||||
PsiJavaFile:Parenth3.java
|
||||
PsiParenthesizedExpression:(a < b)
|
||||
PsiJavaToken:LPARENTH('(')
|
||||
PsiBinaryExpression:a < b
|
||||
PsiReferenceExpression:a
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:a('a')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:LT('<')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiReferenceExpression:b
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:b('b')
|
||||
PsiJavaToken:RPARENTH(')')
|
||||
+4
@@ -28,6 +28,9 @@ public class ExpressionParserTest extends JavaParsingTestCase {
|
||||
public void testAssignment0() { doParserTest("a = 0"); }
|
||||
public void testAssignment1() { doParserTest("a ="); }
|
||||
|
||||
public void testBinary0() { doParserTest("a + b"); }
|
||||
public void testBinary1() { doParserTest("a < b"); }
|
||||
|
||||
public void testCond0() { doParserTest("cond ? true : false"); }
|
||||
public void testCond1() { doParserTest("cond ?"); }
|
||||
public void testCond2() { doParserTest("cond ? true"); }
|
||||
@@ -50,6 +53,7 @@ public class ExpressionParserTest extends JavaParsingTestCase {
|
||||
public void testParenth0() { doParserTest("(c)"); }
|
||||
public void testParenth1() { doParserTest("(this).f--"); }
|
||||
public void testParenth2() { doParserTest("("); }
|
||||
public void testParenth3() { doParserTest("(a < b)"); }
|
||||
|
||||
public void testNewInExprList() { doParserTest("call(new)"); }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user