New Java parser (incomplete methods parsing fixed)

This commit is contained in:
Roman Shevchenko
2010-08-12 20:52:08 +04:00
parent 64f94033fb
commit 87b0c2b795
4 changed files with 73 additions and 7 deletions
@@ -414,13 +414,7 @@ public class DeclarationParser {
}
final IElementType tokenType = builder.getTokenType();
if (tokenType == JavaTokenType.SEMICOLON) {
builder.advanceLexer();
}
else if (tokenType == JavaTokenType.LBRACE) {
StatementParser.parseCodeBlock(builder);
}
else {
if (tokenType != JavaTokenType.SEMICOLON && tokenType != JavaTokenType.LBRACE) {
final PsiBuilder.Marker error = builder.mark();
// heuristic: going to next line obviously means method signature is over, starting new method (actually, another one completion hack)
final CharSequence text = builder.getOriginalText();
@@ -436,6 +430,12 @@ public class DeclarationParser {
error.error(JavaErrorMessages.message("expected.lbrace.or.semicolon"));
}
if (!expect(builder, JavaTokenType.SEMICOLON)) {
if (builder.getTokenType() == JavaTokenType.LBRACE) {
StatementParser.parseCodeBlock(builder);
}
}
declaration.done(anno ? JavaElementType.ANNOTATION_METHOD : JavaElementType.METHOD);
return declaration;
}
@@ -0,0 +1,5 @@
class C {
public Object fa(int toDelete) sdfskdlfabcdavcd {
return null;
}
}
@@ -0,0 +1,60 @@
PsiJavaFile:Errors3.java
PsiImportList
<empty list>
PsiClass:C
PsiModifierList:
<empty list>
PsiKeyword:class('class')
PsiWhiteSpace(' ')
PsiIdentifier:C('C')
PsiTypeParameterList
<empty list>
PsiReferenceList
<empty list>
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:LBRACE('{')
PsiWhiteSpace('\n ')
PsiMethod:fa
PsiModifierList:public
PsiKeyword:public('public')
PsiTypeParameterList
<empty list>
PsiWhiteSpace(' ')
PsiTypeElement:Object
PsiJavaCodeReferenceElement:Object
PsiIdentifier:Object('Object')
PsiReferenceParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:fa('fa')
PsiParameterList:(int toDelete)
PsiJavaToken:LPARENTH('(')
PsiParameter:toDelete
PsiModifierList:
<empty list>
PsiTypeElement:int
PsiKeyword:int('int')
PsiWhiteSpace(' ')
PsiIdentifier:toDelete('toDelete')
PsiJavaToken:RPARENTH(')')
PsiReferenceList
<empty list>
PsiWhiteSpace(' ')
PsiErrorElement:'{' or ';' expected
PsiIdentifier:sdfskdlfabcdavcd('sdfskdlfabcdavcd')
PsiWhiteSpace(' ')
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace('\n ')
PsiReturnStatement
PsiKeyword:return('return')
PsiWhiteSpace(' ')
PsiLiteralExpression:null
PsiJavaToken:NULL_KEYWORD('null')
PsiJavaToken:SEMICOLON(';')
PsiWhiteSpace('\n ')
PsiJavaToken:RBRACE('}')
PsiWhiteSpace('\n')
PsiJavaToken:RBRACE('}')
@@ -40,4 +40,5 @@ public class ClassParsingTest extends JavaParsingTestCase {
public void testErrors0() { doTest(true); }
public void testErrors1() { doTest(true); }
public void testErrors2() { doTest(true); }
public void testErrors3() { doTest(true); }
}