Better recovery for parameters without type

This commit is contained in:
Nikolay Krasko
2012-09-18 14:43:21 +04:00
parent f7da4f681c
commit 7c41ec517f
3 changed files with 49 additions and 5 deletions
@@ -980,8 +980,7 @@ public class JetParsing extends AbstractJetParsing {
expect(IDENTIFIER, "Expecting parameter name", TokenSet.create(RPAR, COLON, LBRACE, EQ)); expect(IDENTIFIER, "Expecting parameter name", TokenSet.create(RPAR, COLON, LBRACE, EQ));
if (at(COLON)) { if (at(COLON)) {
advance(); advance(); // COLON
parseTypeRef(); parseTypeRef();
} }
setterParameter.done(VALUE_PARAMETER); setterParameter.done(VALUE_PARAMETER);
@@ -1730,20 +1729,23 @@ public class JetParsing extends AbstractJetParsing {
private boolean parseFunctionParameterRest() { private boolean parseFunctionParameterRest() {
expect(IDENTIFIER, "Parameter name expected", PARAMETER_NAME_RECOVERY_SET); expect(IDENTIFIER, "Parameter name expected", PARAMETER_NAME_RECOVERY_SET);
boolean noErrors = true;
if (at(COLON)) { if (at(COLON)) {
advance(); // COLON advance(); // COLON
parseTypeRef(); parseTypeRef();
} }
else { else {
error("Parameters must have type annotation"); errorWithRecovery("Parameters must have type annotation", PARAMETER_NAME_RECOVERY_SET);
return false; noErrors = false;
} }
if (at(EQ)) { if (at(EQ)) {
advance(); // EQ advance(); // EQ
myExpressionParsing.parseExpression(); myExpressionParsing.parseExpression();
} }
return true;
return noErrors;
} }
/* /*
@@ -0,0 +1 @@
class Test(val a = 12, val b : Int = 13)
@@ -0,0 +1,41 @@
JetFile: ValueParameterNoTypeRecovery.jet
NAMESPACE_HEADER
<empty list>
CLASS
PsiElement(class)('class')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('Test')
TYPE_PARAMETER_LIST
<empty list>
VALUE_PARAMETER_LIST
PsiElement(LPAR)('(')
VALUE_PARAMETER
PsiElement(val)('val')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('a')
PsiErrorElement:Parameters must have type annotation
<empty list>
PsiWhiteSpace(' ')
PsiElement(EQ)('=')
PsiWhiteSpace(' ')
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('12')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
VALUE_PARAMETER
PsiElement(val)('val')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('b')
PsiWhiteSpace(' ')
PsiElement(COLON)(':')
PsiWhiteSpace(' ')
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('Int')
PsiWhiteSpace(' ')
PsiElement(EQ)('=')
PsiWhiteSpace(' ')
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('13')
PsiElement(RPAR)(')')