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:
committed by
Stanislav Erokhin
parent
eec96f1954
commit
a3338b2230
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+3
-2
@@ -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
|
||||||
Vendored
+2
-1
@@ -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
@@ -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
@@ -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
@@ -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 ')'
|
||||||
|
|||||||
Reference in New Issue
Block a user