New Java parser: expression parsing fix

This commit is contained in:
Roman Shevchenko
2010-10-02 19:13:08 +04:00
parent b4850c0cd1
commit 5f9dbd8444
6 changed files with 54 additions and 9 deletions
@@ -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(')')
@@ -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)"); }