New Java parser (work in progress)

This commit is contained in:
Roman Shevchenko
2010-07-30 20:26:27 +04:00
parent cf6f089bd0
commit 2a0f9ec378
21 changed files with 403 additions and 9 deletions
@@ -473,14 +473,47 @@ public class StatementParser {
@NotNull
private static PsiBuilder.Marker parseDoWhileStatement(final PsiBuilder builder) {
// todo: implement
throw new UnsupportedOperationException(builder.toString());
final PsiBuilder.Marker statement = builder.mark();
builder.advanceLexer();
final PsiBuilder.Marker body = parseStatement(builder);
if (body == null) {
error(builder, JavaErrorMessages.message("expected.statement"));
statement.done(JavaElementType.DO_WHILE_STATEMENT);
return statement;
}
if (!expect(builder, JavaTokenType.WHILE_KEYWORD)) {
error(builder, JavaErrorMessages.message("expected.while"));
statement.done(JavaElementType.DO_WHILE_STATEMENT);
return statement;
}
if (parseExpressionInParenth(builder)) {
semicolon(builder);
}
statement.done(JavaElementType.DO_WHILE_STATEMENT);
return statement;
}
@NotNull
private static PsiBuilder.Marker parseSwitchStatement(final PsiBuilder builder) {
// todo: implement
throw new UnsupportedOperationException(builder.toString());
final PsiBuilder.Marker statement = builder.mark();
builder.advanceLexer();
if (!parseExpressionInParenth(builder)) {
statement.done(JavaElementType.SWITCH_STATEMENT);
return statement;
}
final PsiBuilder.Marker body = parseCodeBlock(builder);
if (body == null) {
error(builder, JavaErrorMessages.message("expected.lbrace"));
}
statement.done(JavaElementType.SWITCH_STATEMENT);
return statement;
}
@NotNull
@@ -503,8 +536,14 @@ public class StatementParser {
@NotNull
private static PsiBuilder.Marker parseReturnStatement(final PsiBuilder builder) {
// todo: implement
throw new UnsupportedOperationException(builder.toString());
final PsiBuilder.Marker statement = builder.mark();
builder.advanceLexer();
ExpressionParser.parse(builder);
semicolon(builder);
statement.done(JavaElementType.RETURN_STATEMENT);
return statement;
}
@NotNull
@@ -0,0 +1,10 @@
PsiJavaFile:DoIncomplete0.java
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiDoWhileStatement
PsiKeyword:do('do')
PsiErrorElement:Statement expected
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,21 @@
PsiJavaFile:DoIncomplete1.java
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiDoWhileStatement
PsiKeyword:do('do')
PsiWhiteSpace(' ')
PsiExpressionStatement
PsiMethodCallExpression:foo()
PsiReferenceExpression:foo
PsiReferenceParameterList
<empty list>
PsiIdentifier:foo('foo')
PsiExpressionList
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiJavaToken:SEMICOLON(';')
PsiErrorElement:'while' expected
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,23 @@
PsiJavaFile:DoIncomplete2.java
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiDoWhileStatement
PsiKeyword:do('do')
PsiWhiteSpace(' ')
PsiExpressionStatement
PsiMethodCallExpression:foo()
PsiReferenceExpression:foo
PsiReferenceParameterList
<empty list>
PsiIdentifier:foo('foo')
PsiExpressionList
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace(' ')
PsiKeyword:while('while')
PsiErrorElement:'(' expected
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,24 @@
PsiJavaFile:DoIncomplete3.java
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiDoWhileStatement
PsiKeyword:do('do')
PsiWhiteSpace(' ')
PsiExpressionStatement
PsiMethodCallExpression:foo()
PsiReferenceExpression:foo
PsiReferenceParameterList
<empty list>
PsiIdentifier:foo('foo')
PsiExpressionList
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace(' ')
PsiKeyword:while('while')
PsiJavaToken:LPARENTH('(')
PsiErrorElement:Expression expected
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,26 @@
PsiJavaFile:DoIncomplete4.java
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiDoWhileStatement
PsiKeyword:do('do')
PsiWhiteSpace(' ')
PsiExpressionStatement
PsiMethodCallExpression:foo()
PsiReferenceExpression:foo
PsiReferenceParameterList
<empty list>
PsiIdentifier:foo('foo')
PsiExpressionList
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace(' ')
PsiKeyword:while('while')
PsiJavaToken:LPARENTH('(')
PsiErrorElement:Expression expected
<empty list>
PsiJavaToken:RPARENTH(')')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,35 @@
PsiJavaFile:DoIncomplete5.java
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiDoWhileStatement
PsiKeyword:do('do')
PsiWhiteSpace(' ')
PsiExpressionStatement
PsiMethodCallExpression:foo()
PsiReferenceExpression:foo
PsiReferenceParameterList
<empty list>
PsiIdentifier:foo('foo')
PsiExpressionList
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace(' ')
PsiKeyword:while('while')
PsiJavaToken:LPARENTH('(')
PsiErrorElement:Expression expected
<empty list>
PsiWhiteSpace('\n ')
PsiExpressionStatement
PsiMethodCallExpression:g()
PsiReferenceExpression:g
PsiReferenceParameterList
<empty list>
PsiIdentifier:g('g')
PsiExpressionList
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,29 @@
PsiJavaFile:DoIncomplete6.java
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiDoWhileStatement
PsiKeyword:do('do')
PsiWhiteSpace(' ')
PsiExpressionStatement
PsiMethodCallExpression:foo()
PsiReferenceExpression:foo
PsiReferenceParameterList
<empty list>
PsiIdentifier:foo('foo')
PsiExpressionList
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace(' ')
PsiKeyword:while('while')
PsiJavaToken:LPARENTH('(')
PsiReferenceExpression:cond
PsiReferenceParameterList
<empty list>
PsiIdentifier:cond('cond')
PsiJavaToken:RPARENTH(')')
PsiErrorElement:';' expected
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,18 @@
PsiJavaFile:DoNormal.java
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiDoWhileStatement
PsiKeyword:do('do')
PsiBlockStatement
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiJavaToken:RBRACE('}')
PsiKeyword:while('while')
PsiJavaToken:LPARENTH('(')
PsiLiteralExpression:true
PsiJavaToken:TRUE_KEYWORD('true')
PsiJavaToken:RPARENTH(')')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,10 @@
PsiJavaFile:ReturnIncomplete0.java
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiReturnStatement
PsiKeyword:return('return')
PsiErrorElement:';' expected
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,15 @@
PsiJavaFile:ReturnIncomplete1.java
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiReturnStatement
PsiKeyword:return('return')
PsiWhiteSpace(' ')
PsiReferenceExpression:a
PsiReferenceParameterList
<empty list>
PsiIdentifier:a('a')
PsiErrorElement:';' expected
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,9 @@
PsiJavaFile:ReturnNoResult.java
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiReturnStatement
PsiKeyword:return('return')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,12 @@
PsiJavaFile:ReturnWithResult.java
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiReturnStatement
PsiKeyword:return('return')
PsiWhiteSpace(' ')
PsiLiteralExpression:10
PsiJavaToken:INTEGER_LITERAL('10')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,10 @@
PsiJavaFile:SwitchIncomplete0.java
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiSwitchStatement
PsiKeyword:switch('switch')
PsiErrorElement:'(' expected
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,11 @@
PsiJavaFile:SwitchIncomplete1.java
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiSwitchStatement
PsiKeyword:switch('switch')
PsiJavaToken:LPARENTH('(')
PsiErrorElement:Expression expected
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,15 @@
PsiJavaFile:SwitchIncomplete2.java
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiSwitchStatement
PsiKeyword:switch('switch')
PsiJavaToken:LPARENTH('(')
PsiReferenceExpression:o
PsiReferenceParameterList
<empty list>
PsiIdentifier:o('o')
PsiErrorElement:')' expected
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,16 @@
PsiJavaFile:SwitchIncomplete3.java
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiSwitchStatement
PsiKeyword:switch('switch')
PsiJavaToken:LPARENTH('(')
PsiReferenceExpression:o
PsiReferenceParameterList
<empty list>
PsiIdentifier:o('o')
PsiJavaToken:RPARENTH(')')
PsiErrorElement:'{' expected
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,15 @@
PsiJavaFile:SwitchIncomplete4.java
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiSwitchStatement
PsiKeyword:switch('switch')
PsiJavaToken:LPARENTH('(')
PsiErrorElement:Expression expected
<empty list>
PsiJavaToken:RPARENTH(')')
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,22 @@
PsiJavaFile:SwitchIncomplete5.java
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiSwitchStatement
PsiKeyword:switch('switch')
PsiJavaToken:LPARENTH('(')
PsiErrorElement:Expression expected
<empty list>
PsiWhiteSpace('\n ')
PsiExpressionStatement
PsiMethodCallExpression:foo()
PsiReferenceExpression:foo
PsiReferenceParameterList
<empty list>
PsiIdentifier:foo('foo')
PsiExpressionList
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -0,0 +1,17 @@
PsiJavaFile:SwitchNormal.java
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiSwitchStatement
PsiKeyword:switch('switch')
PsiJavaToken:LPARENTH('(')
PsiReferenceExpression:o
PsiReferenceParameterList
<empty list>
PsiIdentifier:o('o')
PsiJavaToken:RPARENTH(')')
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -36,7 +36,14 @@ public class StatementParserTest extends JavaParsingTestCase {
public void testLocalVar() { doParserTest("{ List<Integer> list; }"); }
public void testFor() { doParserTest("{ for(Iterator<String> it = null; it.hasNext();) { String s = it.next(); } }"); }
//DoWhileParsingTest
public void testDoNormal() { doParserTest("{ do{}while(true); }"); }
public void testDoIncomplete0() { doParserTest("{ do }"); }
public void testDoIncomplete1() { doParserTest("{ do foo(); }"); }
public void testDoIncomplete2() { doParserTest("{ do foo(); while }"); }
public void testDoIncomplete3() { doParserTest("{ do foo(); while( }"); }
public void testDoIncomplete4() { doParserTest("{ do foo(); while(); }"); }
public void testDoIncomplete5() { doParserTest("{ do foo(); while(\n g(); }"); }
public void testDoIncomplete6() { doParserTest("{ do foo(); while(cond) }"); }
public void testForNormal0() { doParserTest("{ for(int i = 0; i < 10; i++)\n ; }"); }
public void testForNormal1() { doParserTest("{ for( ; ; ) foo(); }"); }
@@ -64,8 +71,18 @@ public class StatementParserTest extends JavaParsingTestCase {
public void testLabelSimple() { doParserTest("{ Loop:\n while(true) ; }"); }
//ReturnParsingTest
//SwitchParsingTest
public void testReturnNoResult() { doParserTest("{ return; }"); }
public void testReturnWithResult() { doParserTest("{ return 10; }"); }
public void testReturnIncomplete0() { doParserTest("{ return }"); }
public void testReturnIncomplete1() { doParserTest("{ return a }"); }
public void testSwitchNormal() { doParserTest("{ switch(o){} }"); }
public void testSwitchIncomplete0() { doParserTest("{ switch }"); }
public void testSwitchIncomplete1() { doParserTest("{ switch( }"); }
public void testSwitchIncomplete2() { doParserTest("{ switch(o }"); }
public void testSwitchIncomplete3() { doParserTest("{ switch(o) }"); }
public void testSwitchIncomplete4() { doParserTest("{ switch(){} }"); }
public void testSwitchIncomplete5() { doParserTest("{ switch(\n foo(); }"); }
public void testSyncNormal() { doParserTest("{ synchronized(o){} }"); }
public void testSyncIncomplete0() { doParserTest("{ synchronized }"); }