diff --git a/compiler/frontend/src/org/jetbrains/kotlin/lexer/KtTokens.java b/compiler/frontend/src/org/jetbrains/kotlin/lexer/KtTokens.java index a2a224c4fcd..66878e19b31 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/lexer/KtTokens.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/lexer/KtTokens.java @@ -232,6 +232,7 @@ public interface KtTokens { TokenSet TYPE_MODIFIER_KEYWORDS = TokenSet.create(SUSPEND_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); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/parsing/KotlinParsing.java b/compiler/frontend/src/org/jetbrains/kotlin/parsing/KotlinParsing.java index 56cb6064fe5..f5a6905a9b5 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/parsing/KotlinParsing.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/parsing/KotlinParsing.java @@ -461,6 +461,10 @@ public class KotlinParsing extends AbstractKotlinParsing { 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() { return doParseModifierList(null, TYPE_MODIFIER_KEYWORDS, DEFAULT, TokenSet.EMPTY); } @@ -2192,7 +2196,7 @@ public class KotlinParsing extends AbstractKotlinParsing { if (isFunctionTypeContents) { if (!tryParseValueParameter(typeRequired)) { PsiBuilder.Marker valueParameter = mark(); - parseModifierList(DEFAULT, NO_MODIFIER_BEFORE_FOR_VALUE_PARAMETER); // lazy, out, ref + parseValueParameterModifierList(); // lazy, out, ref parseTypeRef(); closeDeclarationWithCommentBinders(valueParameter, VALUE_PARAMETER, false); } diff --git a/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/modifierApplicability.kt b/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/modifierApplicability.kt index 4d655274266..ff57cf96d2a 100644 --- a/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/modifierApplicability.kt +++ b/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/modifierApplicability.kt @@ -13,5 +13,6 @@ typealias Test6 = suspend List<() -> Unit> typealias Test7 = suspend SAM typealias Test8 = SuspendFunction0 typealias Test9 = suspend (() -> Unit) -> Unit -typealias Test10 = suspend (suspend () -> Unit) -> Unit -typealias Test11 = suspend () -> (suspend () -> Unit) \ No newline at end of file +typealias Test10 = suspend (suspend () -> Unit) -> Unit +typealias Test11 = suspend () -> (suspend () -> Unit) +typealias Test12 = suspend (suspend (() -> Unit)) -> Unit \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/modifierApplicability.txt b/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/modifierApplicability.txt index c9be1175676..f03b58e2e40 100644 --- a/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/modifierApplicability.txt +++ b/compiler/testData/diagnostics/tests/coroutines/suspendFunctionType/modifierApplicability.txt @@ -8,8 +8,9 @@ public interface SAM { } public typealias Action = () -> 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 Test12 = suspend (suspend () -> kotlin.Unit) -> kotlin.Unit public typealias Test2 = suspend kotlin.Int.(kotlin.String) -> kotlin.Unit public typealias Test3 = () -> kotlin.Unit public typealias Test4 = Action diff --git a/compiler/testData/psi/TypeModifiers.kt b/compiler/testData/psi/TypeModifiers.kt index 93284a8342b..e86c2096cab 100644 --- a/compiler/testData/psi/TypeModifiers.kt +++ b/compiler/testData/psi/TypeModifiers.kt @@ -14,6 +14,7 @@ val p11: suspend @a a val p12: @a suspend a val p13: @a suspend @a a val p14: @[a] suspend @[a] a +val p15: suspend (suspend (() -> Unit)) -> Unit @a fun @a a.f1() {} fun (@a a.(a) -> a).f2() {} diff --git a/compiler/testData/psi/TypeModifiers.txt b/compiler/testData/psi/TypeModifiers.txt index 6ae01c6494b..71fafa70579 100644 --- a/compiler/testData/psi/TypeModifiers.txt +++ b/compiler/testData/psi/TypeModifiers.txt @@ -479,6 +479,46 @@ JetFile: TypeModifiers.kt USER_TYPE REFERENCE_EXPRESSION 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') FUN MODIFIER_LIST diff --git a/compiler/testData/psi/TypeModifiers_ERR.txt b/compiler/testData/psi/TypeModifiers_ERR.txt index da41428c7fe..ec2f5ab0a69 100644 --- a/compiler/testData/psi/TypeModifiers_ERR.txt +++ b/compiler/testData/psi/TypeModifiers_ERR.txt @@ -80,10 +80,10 @@ JetFile: TypeModifiers_ERR.kt VALUE_PARAMETER_LIST PsiElement(LPAR)('(') VALUE_PARAMETER - MODIFIER_LIST - PsiElement(suspend)('suspend') - PsiWhiteSpace(' ') TYPE_REFERENCE + MODIFIER_LIST + PsiElement(suspend)('suspend') + PsiWhiteSpace(' ') PsiErrorElement:Type expected PsiElement(ARROW)('->') PsiErrorElement:Expecting comma or ')'