Allow only 'out' modifier for value parameter modifiers in functional type

(comments also mention 'lazy' and 'ref'; these value parameter modifiers are unsupported, anyway).
This commit is contained in:
Dmitry Petrov
2016-12-15 10:55:05 +03:00
committed by Stanislav Erokhin
parent eec96f1954
commit a3338b2230
7 changed files with 55 additions and 7 deletions
@@ -232,6 +232,7 @@ public interface KtTokens {
TokenSet TYPE_MODIFIER_KEYWORDS = TokenSet.create(SUSPEND_KEYWORD); TokenSet TYPE_MODIFIER_KEYWORDS = TokenSet.create(SUSPEND_KEYWORD);
TokenSet TYPE_ARGUMENT_MODIFIER_KEYWORDS = TokenSet.create(IN_KEYWORD, OUT_KEYWORD); TokenSet TYPE_ARGUMENT_MODIFIER_KEYWORDS = TokenSet.create(IN_KEYWORD, OUT_KEYWORD);
TokenSet RESERVED_VALUE_PARAMETER_MODIFIER_KEYWORDS = TokenSet.create(OUT_KEYWORD); // lazy, out, ref
TokenSet VISIBILITY_MODIFIERS = TokenSet.create(PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD); TokenSet VISIBILITY_MODIFIERS = TokenSet.create(PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD);
@@ -461,6 +461,10 @@ public class KotlinParsing extends AbstractKotlinParsing {
return doParseModifierList(tokenConsumer, MODIFIER_KEYWORDS, annotationParsingMode, noModifiersBefore); return doParseModifierList(tokenConsumer, MODIFIER_KEYWORDS, annotationParsingMode, noModifiersBefore);
} }
private boolean parseValueParameterModifierList() {
return doParseModifierList(null, RESERVED_VALUE_PARAMETER_MODIFIER_KEYWORDS, DEFAULT, NO_MODIFIER_BEFORE_FOR_VALUE_PARAMETER);
}
private boolean parseTypeModifierList() { private boolean parseTypeModifierList() {
return doParseModifierList(null, TYPE_MODIFIER_KEYWORDS, DEFAULT, TokenSet.EMPTY); return doParseModifierList(null, TYPE_MODIFIER_KEYWORDS, DEFAULT, TokenSet.EMPTY);
} }
@@ -2192,7 +2196,7 @@ public class KotlinParsing extends AbstractKotlinParsing {
if (isFunctionTypeContents) { if (isFunctionTypeContents) {
if (!tryParseValueParameter(typeRequired)) { if (!tryParseValueParameter(typeRequired)) {
PsiBuilder.Marker valueParameter = mark(); PsiBuilder.Marker valueParameter = mark();
parseModifierList(DEFAULT, NO_MODIFIER_BEFORE_FOR_VALUE_PARAMETER); // lazy, out, ref parseValueParameterModifierList(); // lazy, out, ref
parseTypeRef(); parseTypeRef();
closeDeclarationWithCommentBinders(valueParameter, VALUE_PARAMETER, false); closeDeclarationWithCommentBinders(valueParameter, VALUE_PARAMETER, false);
} }
@@ -13,5 +13,6 @@ typealias Test6 = <!WRONG_MODIFIER_TARGET!>suspend<!> List<() -> Unit>
typealias Test7 = <!WRONG_MODIFIER_TARGET!>suspend<!> SAM typealias Test7 = <!WRONG_MODIFIER_TARGET!>suspend<!> SAM
typealias Test8 = SuspendFunction0<Unit> typealias Test8 = SuspendFunction0<Unit>
typealias Test9 = suspend (() -> Unit) -> Unit typealias Test9 = suspend (() -> Unit) -> Unit
typealias Test10 = suspend (<!UNSUPPORTED!>suspend<!> () -> Unit) -> Unit typealias Test10 = suspend (suspend () -> Unit) -> Unit
typealias Test11 = suspend () -> (suspend () -> Unit) typealias Test11 = suspend () -> (suspend () -> Unit)
typealias Test12 = suspend (suspend (() -> Unit)) -> Unit
@@ -8,8 +8,9 @@ public interface SAM {
} }
public typealias Action = () -> kotlin.Unit public typealias Action = () -> kotlin.Unit
public typealias Test1 = suspend () -> kotlin.Unit public typealias Test1 = suspend () -> kotlin.Unit
public typealias Test10 = suspend (() -> kotlin.Unit) -> kotlin.Unit public typealias Test10 = suspend (suspend () -> kotlin.Unit) -> kotlin.Unit
public typealias Test11 = suspend () -> suspend () -> kotlin.Unit public typealias Test11 = suspend () -> suspend () -> kotlin.Unit
public typealias Test12 = suspend (suspend () -> kotlin.Unit) -> kotlin.Unit
public typealias Test2 = suspend kotlin.Int.(kotlin.String) -> kotlin.Unit public typealias Test2 = suspend kotlin.Int.(kotlin.String) -> kotlin.Unit
public typealias Test3 = () -> kotlin.Unit public typealias Test3 = () -> kotlin.Unit
public typealias Test4 = Action public typealias Test4 = Action
+1
View File
@@ -14,6 +14,7 @@ val p11: suspend @a a
val p12: @a suspend a val p12: @a suspend a
val p13: @a suspend @a a val p13: @a suspend @a a
val p14: @[a] suspend @[a] a val p14: @[a] suspend @[a] a
val p15: suspend (suspend (() -> Unit)) -> Unit
@a fun @a a.f1() {} @a fun @a a.f1() {}
fun (@a a.(a) -> a).f2() {} fun (@a a.(a) -> a).f2() {}
+40
View File
@@ -479,6 +479,46 @@ JetFile: TypeModifiers.kt
USER_TYPE USER_TYPE
REFERENCE_EXPRESSION REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('a') PsiElement(IDENTIFIER)('a')
PsiWhiteSpace('\n')
PROPERTY
PsiElement(val)('val')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('p15')
PsiElement(COLON)(':')
PsiWhiteSpace(' ')
TYPE_REFERENCE
MODIFIER_LIST
PsiElement(suspend)('suspend')
PsiWhiteSpace(' ')
FUNCTION_TYPE
VALUE_PARAMETER_LIST
PsiElement(LPAR)('(')
VALUE_PARAMETER
TYPE_REFERENCE
MODIFIER_LIST
PsiElement(suspend)('suspend')
PsiWhiteSpace(' ')
PsiElement(LPAR)('(')
FUNCTION_TYPE
VALUE_PARAMETER_LIST
PsiElement(LPAR)('(')
PsiElement(RPAR)(')')
PsiWhiteSpace(' ')
PsiElement(ARROW)('->')
PsiWhiteSpace(' ')
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('Unit')
PsiElement(RPAR)(')')
PsiElement(RPAR)(')')
PsiWhiteSpace(' ')
PsiElement(ARROW)('->')
PsiWhiteSpace(' ')
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('Unit')
PsiWhiteSpace('\n\n') PsiWhiteSpace('\n\n')
FUN FUN
MODIFIER_LIST MODIFIER_LIST
+3 -3
View File
@@ -80,10 +80,10 @@ JetFile: TypeModifiers_ERR.kt
VALUE_PARAMETER_LIST VALUE_PARAMETER_LIST
PsiElement(LPAR)('(') PsiElement(LPAR)('(')
VALUE_PARAMETER VALUE_PARAMETER
MODIFIER_LIST
PsiElement(suspend)('suspend')
PsiWhiteSpace(' ')
TYPE_REFERENCE TYPE_REFERENCE
MODIFIER_LIST
PsiElement(suspend)('suspend')
PsiWhiteSpace(' ')
PsiErrorElement:Type expected PsiErrorElement:Type expected
PsiElement(ARROW)('->') PsiElement(ARROW)('->')
PsiErrorElement:Expecting comma or ')' PsiErrorElement:Expecting comma or ')'