From 329fb9d61987ee8044602a2b22240db92e1965a3 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Mon, 16 May 2016 18:39:02 +0300 Subject: [PATCH] Introduce 'coroutine'/'suspend' modifiers --- .../java/sam/SingleAbstractMethodUtils.java | 2 + .../SignaturesPropagationData.java | 1 + .../impl/LocalVariableAccessorDescriptor.kt | 3 +- .../org/jetbrains/kotlin/lexer/KtTokens.java | 8 ++- .../kotlin/resolve/DescriptorResolver.java | 2 + .../resolve/FunctionDescriptorResolver.kt | 2 + .../kotlin/resolve/ModifiersChecker.kt | 2 + .../resolve/calls/tasks/dynamicCalls.kt | 1 + .../resolve/functionTypeResolveUtils.kt | 1 + .../descriptors/LazyScriptClassMemberScope.kt | 1 + .../ControlStructureTypingUtils.java | 3 +- .../resolve/calls/tasks/synthesizedInvokes.kt | 2 +- .../serialization/DescriptorSerializer.java | 4 +- .../compiledKotlin/coroutines/Basic.kt | 9 +++ .../compiledKotlin/coroutines/Basic.txt | 9 +++ compiler/testData/psi/SoftKeywords.kt | 4 ++ compiler/testData/psi/SoftKeywords.txt | 16 +++++- .../jvm/compiler/LoadJavaTestGenerated.java | 15 +++++ .../LoadKotlinWithTypeTableTestGenerated.java | 15 +++++ ...mRuntimeDescriptorLoaderTestGenerated.java | 15 +++++ .../kotlin/load/java/descriptors/util.kt | 1 + .../descriptors/LazyJavaClassMemberScope.kt | 1 + .../java/lazy/descriptors/LazyJavaScope.kt | 3 +- .../functions/FunctionInvokeDescriptor.kt | 1 + .../descriptors/FunctionDescriptor.java | 2 + .../descriptors/ValueParameterDescriptor.kt | 2 + .../impl/FunctionDescriptorImpl.java | 12 ++++ .../impl/PropertyAccessorDescriptorImpl.java | 5 ++ .../impl/PropertySetterDescriptorImpl.java | 1 + .../impl/ValueParameterDescriptorImpl.kt | 3 +- .../kotlin/renderer/DescriptorRendererImpl.kt | 8 +++ .../kotlin/resolve/DescriptorFactory.java | 1 + .../ErrorSimpleFunctionDescriptorImpl.java | 5 ++ .../jetbrains/kotlin/serialization/Flags.java | 10 +++- .../deserialization/MemberDeserializer.kt | 2 + .../DeserializedMemberDescriptor.kt | 2 + .../stubBuilder/CallableClsStubBuilder.kt | 2 +- .../stubBuilder/TypeClsStubBuilder.kt | 3 + .../decompiler/stubBuilder/flags/flags.kt | 1 + .../testData/keywords/AfterClassProperty.kt | 1 + .../testData/keywords/AfterClasses.kt | 1 + .../testData/keywords/AfterFuns.kt | 1 + .../keywords/GlobalPropertyAccessors.kt | 1 + .../keywords/InAnnotationClassScope.kt | 1 + .../testData/keywords/InClassBeforeFun.kt | 1 + .../testData/keywords/InClassScope.kt | 1 + .../testData/keywords/InEnumScope2.kt | 1 + .../testData/keywords/InInterfaceScope.kt | 1 + .../keywords/InMemberFunParametersList.kt | 1 + .../testData/keywords/InObjectScope.kt | 1 + .../InPrimaryConstructorParametersList.kt | 2 +- .../keywords/InTopFunParametersList.kt | 1 + .../keywords/InTopScopeAfterPackage.kt | 1 + .../testData/keywords/PropertyAccessors.kt | 1 + .../testData/keywords/PropertyAccessors2.kt | 1 + .../testData/keywords/PropertySetter.kt | 1 + .../testData/keywords/TopScope.kt | 1 + .../ChangeMemberFunctionSignatureFix.kt | 2 +- .../decompiledText/Modifiers/Modifiers.kt | 2 +- .../stubBuilder/Modifiers/Modifiers.kt | 6 +- .../stubBuilder/Modifiers/Modifiers.txt | 56 +++++++++++++++++++ .../stubs/ResolveByStubTestGenerated.java | 15 +++++ 62 files changed, 263 insertions(+), 17 deletions(-) create mode 100644 compiler/testData/loadJava/compiledKotlin/coroutines/Basic.kt create mode 100644 compiler/testData/loadJava/compiledKotlin/coroutines/Basic.txt diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SingleAbstractMethodUtils.java b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SingleAbstractMethodUtils.java index f7d474b730e..44b25ba587f 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SingleAbstractMethodUtils.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SingleAbstractMethodUtils.java @@ -135,6 +135,7 @@ public class SingleAbstractMethodUtils { /* declaresDefaultValue = */ false, /* isCrossinline = */ false, /* isNoinline = */ false, + /* isCoroutine = */ false, null, SourceElement.NO_SOURCE); KotlinType returnType = typeParameters.substitutor.substitute(samInterface.getDefaultType(), Variance.OUT_VARIANCE); @@ -250,6 +251,7 @@ public class SingleAbstractMethodUtils { /* declaresDefaultValue = */ false, /* isCrossinline = */ false, /* isNoinline = */ false, + /* isCoroutine = */ false, null, SourceElement.NO_SOURCE ); valueParameters.add(newParam); diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/kotlinSignature/SignaturesPropagationData.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/kotlinSignature/SignaturesPropagationData.java index e484611b83a..279d28e3816 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/kotlinSignature/SignaturesPropagationData.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/kotlinSignature/SignaturesPropagationData.java @@ -175,6 +175,7 @@ public class SignaturesPropagationData { originalParam.declaresDefaultValue(), originalParam.isCrossinline(), originalParam.isNoinline(), + originalParam.isCoroutine(), varargCheckResult.isVararg ? DescriptorUtilsKt.getBuiltIns(originalParam).getArrayElementType(altType) : null, SourceElement.NO_SOURCE )); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/LocalVariableAccessorDescriptor.kt b/compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/LocalVariableAccessorDescriptor.kt index 26c41901a12..6171b4ccc32 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/LocalVariableAccessorDescriptor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/LocalVariableAccessorDescriptor.kt @@ -46,6 +46,7 @@ sealed class LocalVariableAccessorDescriptor( } private fun createValueParameter(name: Name, type: KotlinType): ValueParameterDescriptorImpl { - return ValueParameterDescriptorImpl(this, null, 0, Annotations.EMPTY, name, type, false, false, false, null, SourceElement.NO_SOURCE) + return ValueParameterDescriptorImpl(this, null, 0, Annotations.EMPTY, name, type, + false, false, false, false, null, SourceElement.NO_SOURCE) } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/lexer/KtTokens.java b/compiler/frontend/src/org/jetbrains/kotlin/lexer/KtTokens.java index fbd40901ab2..1b9be2c2646 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/lexer/KtTokens.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/lexer/KtTokens.java @@ -187,6 +187,9 @@ public interface KtTokens { KtModifierKeywordToken CONST_KEYWORD = KtModifierKeywordToken.softKeywordModifier("const"); + KtModifierKeywordToken COROUTINE_KEYWORD = KtModifierKeywordToken.softKeywordModifier("coroutine"); + KtModifierKeywordToken SUSPEND_KEYWORD = KtModifierKeywordToken.softKeywordModifier("suspend"); + TokenSet KEYWORDS = TokenSet.create(PACKAGE_KEYWORD, AS_KEYWORD, TYPE_ALIAS_KEYWORD, CLASS_KEYWORD, INTERFACE_KEYWORD, THIS_KEYWORD, SUPER_KEYWORD, VAL_KEYWORD, VAR_KEYWORD, FUN_KEYWORD, FOR_KEYWORD, NULL_KEYWORD, @@ -207,7 +210,8 @@ public interface KtTokens { DELEGATE_KEYWORD, LATEINIT_KEYWORD, DATA_KEYWORD, INLINE_KEYWORD, NOINLINE_KEYWORD, TAILREC_KEYWORD, EXTERNAL_KEYWORD, - ANNOTATION_KEYWORD, CROSSINLINE_KEYWORD, CONST_KEYWORD, OPERATOR_KEYWORD, INFIX_KEYWORD + ANNOTATION_KEYWORD, CROSSINLINE_KEYWORD, CONST_KEYWORD, OPERATOR_KEYWORD, INFIX_KEYWORD, + COROUTINE_KEYWORD, SUSPEND_KEYWORD ); /* @@ -221,7 +225,7 @@ public interface KtTokens { PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD, OUT_KEYWORD, IN_KEYWORD, FINAL_KEYWORD, VARARG_KEYWORD, REIFIED_KEYWORD, COMPANION_KEYWORD, SEALED_KEYWORD, LATEINIT_KEYWORD, DATA_KEYWORD, INLINE_KEYWORD, NOINLINE_KEYWORD, TAILREC_KEYWORD, EXTERNAL_KEYWORD, ANNOTATION_KEYWORD, CROSSINLINE_KEYWORD, - CONST_KEYWORD, OPERATOR_KEYWORD, INFIX_KEYWORD + CONST_KEYWORD, OPERATOR_KEYWORD, INFIX_KEYWORD, COROUTINE_KEYWORD, SUSPEND_KEYWORD }; TokenSet MODIFIER_KEYWORDS = TokenSet.create(MODIFIER_KEYWORDS_ARRAY); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java index 6de55600d06..d6550da949a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java @@ -286,6 +286,7 @@ public class DescriptorResolver { declaresDefaultValue, parameter.isCrossinline(), parameter.isNoinline(), + parameter.isCoroutine(), parameter.getVarargElementType(), parameter.getSource()); parameterDescriptors.add(parameterDescriptor); if (declaresDefaultValue) { @@ -376,6 +377,7 @@ public class DescriptorResolver { valueParameter.hasDefaultValue(), valueParameter.hasModifier(CROSSINLINE_KEYWORD), valueParameter.hasModifier(NOINLINE_KEYWORD), + valueParameter.hasModifier(COROUTINE_KEYWORD), varargElementType, KotlinSourceElementKt.toSourceElement(valueParameter) ); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt index bca93c1367c..02076601808 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt @@ -179,6 +179,7 @@ class FunctionDescriptorResolver( functionDescriptor.isExternal = function.hasModifier(KtTokens.EXTERNAL_KEYWORD) functionDescriptor.isInline = function.hasModifier(KtTokens.INLINE_KEYWORD) functionDescriptor.isTailrec = function.hasModifier(KtTokens.TAILREC_KEYWORD) + functionDescriptor.isSuspend = function.hasModifier(KtTokens.SUSPEND_KEYWORD) receiverType?.let { ForceResolveUtil.forceResolveAllContents(it.annotations) } for (valueParameterDescriptor in valueParameterDescriptors) { ForceResolveUtil.forceResolveAllContents(valueParameterDescriptor.type.annotations) @@ -200,6 +201,7 @@ class FunctionDescriptorResolver( val it = ValueParameterDescriptorImpl(functionDescriptor, null, 0, Annotations.EMPTY, Name.identifier("it"), valueParameterDescriptor.type, valueParameterDescriptor.declaresDefaultValue(), valueParameterDescriptor.isCrossinline, valueParameterDescriptor.isNoinline, + valueParameterDescriptor.isCoroutine, valueParameterDescriptor.varargElementType, SourceElement.NO_SOURCE) trace.record(BindingContext.AUTO_CREATED_IT, it) return listOf(it) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt index 02bb23d2d0b..37edcac40f8 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt @@ -79,7 +79,9 @@ object ModifierCheckerCore { DATA_KEYWORD to EnumSet.of(CLASS_ONLY, INNER_CLASS, LOCAL_CLASS), INLINE_KEYWORD to EnumSet.of(FUNCTION), NOINLINE_KEYWORD to EnumSet.of(VALUE_PARAMETER), + COROUTINE_KEYWORD to EnumSet.of(VALUE_PARAMETER), TAILREC_KEYWORD to EnumSet.of(FUNCTION), + SUSPEND_KEYWORD to EnumSet.of(FUNCTION), EXTERNAL_KEYWORD to EnumSet.of(FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER), ANNOTATION_KEYWORD to EnumSet.of(ANNOTATION_CLASS), CROSSINLINE_KEYWORD to EnumSet.of(VALUE_PARAMETER), diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/dynamicCalls.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/dynamicCalls.kt index 313c9d31ca1..1c7fa569251 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/dynamicCalls.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/dynamicCalls.kt @@ -164,6 +164,7 @@ class DynamicCallableDescriptors(builtIns: KotlinBuiltIns) { /* declaresDefaultValue = */ false, /* isCrossinline = */ false, /* isNoinline = */ false, + /* isCoroutine = */ false, varargElementType, SourceElement.NO_SOURCE )) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/functionTypeResolveUtils.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/functionTypeResolveUtils.kt index 0afff5a9345..4b1b0f6d3fc 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/functionTypeResolveUtils.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/functionTypeResolveUtils.kt @@ -42,6 +42,7 @@ internal fun createValueParametersForInvokeInFunctionType( /* declaresDefaultValue = */ false, /* isCrossinline = */ false, /* isNoinline = */ false, + /* isCoroutine = */ false, null, SourceElement.NO_SOURCE ) } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt index 7bbe8b7c32d..7bbea638fb0 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt @@ -59,6 +59,7 @@ class LazyScriptClassMemberScope( /* declaresDefaultValue = */ false, /* isCrossinline = */ false, /* isNoinline = */ false, + /* isCoroutine = */ false, null, SourceElement.NO_SOURCE ) } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingUtils.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingUtils.java index b878bfa15f8..7df7fd7788d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingUtils.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingUtils.java @@ -162,6 +162,7 @@ public class ControlStructureTypingUtils { /* declaresDefaultValue = */ false, /* isCrossinline = */ false, /* isNoinline = */ false, + /* isCoroutine = */ false, null, SourceElement.NO_SOURCE ); valueParameters.add(valueParameter); @@ -473,7 +474,7 @@ public class ControlStructureTypingUtils { } }; } - + private abstract static class ThrowingOnErrorTracingStrategy implements TracingStrategy { private final String debugName; diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tasks/synthesizedInvokes.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tasks/synthesizedInvokes.kt index c3323909153..6c4e18340b6 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tasks/synthesizedInvokes.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tasks/synthesizedInvokes.kt @@ -76,7 +76,7 @@ private fun createSynthesizedFunctionWithFirstParameterAsReceiver(descriptor: Fu original.valueParameters.drop(1).map { p -> ValueParameterDescriptorImpl( result, null, p.index - 1, p.annotations, Name.identifier("p${p.index + 1}"), p.type, - p.declaresDefaultValue(), p.isCrossinline, p.isNoinline, p.varargElementType, p.source + p.declaresDefaultValue(), p.isCrossinline, p.isNoinline, p.isCoroutine, p.varargElementType, p.source ) }, original.returnType, diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java index 2be493bf10b..e3efb39564d 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java @@ -295,7 +295,7 @@ public class DescriptorSerializer { int flags = Flags.getFunctionFlags( hasAnnotations(descriptor), descriptor.getVisibility(), descriptor.getModality(), descriptor.getKind(), descriptor.isOperator(), descriptor.isInfix(), descriptor.isInline(), descriptor.isTailrec(), - descriptor.isExternal() + descriptor.isExternal(), descriptor.isSuspend() ); if (flags != builder.getFlags()) { builder.setFlags(flags); @@ -419,7 +419,7 @@ public class DescriptorSerializer { ProtoBuf.ValueParameter.Builder builder = ProtoBuf.ValueParameter.newBuilder(); int flags = Flags.getValueParameterFlags(hasAnnotations(descriptor), descriptor.declaresDefaultValue(), - descriptor.isCrossinline(), descriptor.isNoinline()); + descriptor.isCrossinline(), descriptor.isNoinline(), descriptor.isCoroutine()); if (flags != builder.getFlags()) { builder.setFlags(flags); } diff --git a/compiler/testData/loadJava/compiledKotlin/coroutines/Basic.kt b/compiler/testData/loadJava/compiledKotlin/coroutines/Basic.kt new file mode 100644 index 00000000000..7b6377309a6 --- /dev/null +++ b/compiler/testData/loadJava/compiledKotlin/coroutines/Basic.kt @@ -0,0 +1,9 @@ +package test +class Controller { + suspend fun suspendFun(x: Continuation) {} + operator fun handleResult(x: Int, y: Continuation) {} +} + +fun builder(coroutine c: Controller.() -> Continuation) { + +} diff --git a/compiler/testData/loadJava/compiledKotlin/coroutines/Basic.txt b/compiler/testData/loadJava/compiledKotlin/coroutines/Basic.txt new file mode 100644 index 00000000000..6d25db4408e --- /dev/null +++ b/compiler/testData/loadJava/compiledKotlin/coroutines/Basic.txt @@ -0,0 +1,9 @@ +package test + +public fun builder(/*0*/ coroutine c: test.Controller.() -> kotlin.coroutines.Continuation): kotlin.Unit + +public final class Controller { + /*primary*/ public constructor Controller() + public final operator fun handleResult(/*0*/ x: kotlin.Int, /*1*/ y: kotlin.coroutines.Continuation): kotlin.Unit + public final suspend fun suspendFun(/*0*/ x: kotlin.coroutines.Continuation): kotlin.Unit +} diff --git a/compiler/testData/psi/SoftKeywords.kt b/compiler/testData/psi/SoftKeywords.kt index 2c43a406401..fded29646c5 100644 --- a/compiler/testData/psi/SoftKeywords.kt +++ b/compiler/testData/psi/SoftKeywords.kt @@ -16,6 +16,8 @@ public internal in out +suspend +coroutine class Bar Boolean): Collection override fun toString() = "Lazy scope for $ownerDescriptor" - + override fun printScopeStructure(p: Printer) { p.println(javaClass.simpleName, " {") p.pushIndent() diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionInvokeDescriptor.kt b/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionInvokeDescriptor.kt index 49aae57fd61..67a86787b66 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionInvokeDescriptor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionInvokeDescriptor.kt @@ -101,6 +101,7 @@ class FunctionInvokeDescriptor private constructor( /* declaresDefaultValue = */ false, /* isCrossinline = */ false, /* isNoinline = */ false, + /* isCoroutine = */ false, /* varargElementType = */ null, SourceElement.NO_SOURCE ) diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java index ae50e6c901b..2e3add97bac 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java @@ -80,6 +80,8 @@ public interface FunctionDescriptor extends CallableMemberDescriptor { boolean isHiddenForResolutionEverywhereBesideSupercalls(); + boolean isSuspend(); + @NotNull CopyBuilder newCopyBuilder(); diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ValueParameterDescriptor.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ValueParameterDescriptor.kt index 55d6c3b0a91..ec2dd46c99c 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ValueParameterDescriptor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ValueParameterDescriptor.kt @@ -54,4 +54,6 @@ interface ValueParameterDescriptor : VariableDescriptor, ParameterDescriptor { val isCrossinline: Boolean val isNoinline: Boolean + + val isCoroutine: Boolean } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java index f1d291be6fd..2fd3954b431 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java @@ -48,6 +48,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo // 2. isHiddenForResolutionEverywhereBesideSupercalls propagates to it's overrides descriptors while isHiddenToOvercomeSignatureClash does not private boolean isHiddenToOvercomeSignatureClash = false; private boolean isHiddenForResolutionEverywhereBesideSupercalls = false; + private boolean isSuspend = false; private boolean hasStableParameterNames = true; private boolean hasSynthesizedParameterNames = false; private Collection overriddenFunctions = null; @@ -139,6 +140,10 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo isHiddenForResolutionEverywhereBesideSupercalls = hiddenForResolutionEverywhereBesideSupercalls; } + public void setSuspend(boolean suspend) { + isSuspend = suspend; + } + public void setReturnType(@NotNull KotlinType unsubstitutedReturnType) { if (this.unsubstitutedReturnType != null) { // TODO: uncomment and fix tests @@ -235,6 +240,11 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo return isTailrec; } + @Override + public boolean isSuspend() { + return isSuspend; + } + @Override public boolean isHiddenToOvercomeSignatureClash() { return isHiddenToOvercomeSignatureClash; @@ -599,6 +609,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo substitutedDescriptor.setExternal(isExternal); substitutedDescriptor.setInline(isInline); substitutedDescriptor.setTailrec(isTailrec); + substitutedDescriptor.setSuspend(isSuspend); substitutedDescriptor.setHasStableParameterNames(hasStableParameterNames); substitutedDescriptor.setHasSynthesizedParameterNames(hasSynthesizedParameterNames); substitutedDescriptor.setHiddenToOvercomeSignatureClash(configuration.isHiddenToOvercomeSignatureClash); @@ -685,6 +696,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo unsubstitutedValueParameter.declaresDefaultValue(), unsubstitutedValueParameter.isCrossinline(), unsubstitutedValueParameter.isNoinline(), + unsubstitutedValueParameter.isCoroutine(), substituteVarargElementType, SourceElement.NO_SOURCE ) diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyAccessorDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyAccessorDescriptorImpl.java index df1b2b4d6c3..91affbb6117 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyAccessorDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyAccessorDescriptorImpl.java @@ -94,6 +94,11 @@ public abstract class PropertyAccessorDescriptorImpl extends DeclarationDescript return false; } + @Override + public boolean isSuspend() { + return false; + } + @NotNull @Override public FunctionDescriptor substitute(@NotNull TypeSubstitutor substitutor) { diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertySetterDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertySetterDescriptorImpl.java index 6bcc5863500..776789a99ca 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertySetterDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertySetterDescriptorImpl.java @@ -70,6 +70,7 @@ public class PropertySetterDescriptorImpl extends PropertyAccessorDescriptorImpl /* declaresDefaultValue = */ false, /* isCrossinline = */ false, /* isNoinline = */ false, + /* isCoroutine = */ false, null, SourceElement.NO_SOURCE ); } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ValueParameterDescriptorImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ValueParameterDescriptorImpl.kt index 96ea1411b6a..b59a427c00e 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ValueParameterDescriptorImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ValueParameterDescriptorImpl.kt @@ -32,6 +32,7 @@ class ValueParameterDescriptorImpl( private val declaresDefaultValue: Boolean, override val isCrossinline: Boolean, override val isNoinline: Boolean, + override val isCoroutine: Boolean, override val varargElementType: KotlinType?, source: SourceElement ) : VariableDescriptorImpl(containingDeclaration, annotations, name, outType, source), ValueParameterDescriptor { @@ -61,7 +62,7 @@ class ValueParameterDescriptorImpl( override fun copy(newOwner: CallableDescriptor, newName: Name): ValueParameterDescriptor { return ValueParameterDescriptorImpl( newOwner, null, index, annotations, newName, type, declaresDefaultValue(), - isCrossinline, isNoinline, varargElementType, SourceElement.NO_SOURCE + isCrossinline, isNoinline, isCoroutine, varargElementType, SourceElement.NO_SOURCE ) } diff --git a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt index 4bb6bbf9fcb..ffbbcdb0824 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt @@ -498,6 +498,9 @@ internal class DescriptorRendererImpl( if (functionDescriptor.isTailrec) { builder.append("tailrec ") } + if (functionDescriptor.isSuspend) { + builder.append("suspend ") + } } override fun render(declarationDescriptor: DeclarationDescriptor): String { @@ -724,10 +727,15 @@ internal class DescriptorRendererImpl( if (valueParameter.isCrossinline) { builder.append("crossinline ") } + if (valueParameter.isNoinline) { builder.append("noinline ") } + if (valueParameter.isCoroutine) { + builder.append("coroutine ") + } + renderVariable(valueParameter, includeName, builder, topLevel) val withDefaultValue = renderDefaultValues && (if (debugMode) valueParameter.declaresDefaultValue() else valueParameter.hasDefaultValue()) diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorFactory.java b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorFactory.java index ee6bb1a370d..a857fc52930 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorFactory.java +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorFactory.java @@ -140,6 +140,7 @@ public class DescriptorFactory { /* declaresDefaultValue = */ false, /* isCrossinline = */ false, /* isNoinline = */ false, + /* isCoroutine = */ false, null, enumClass.getSource() ); diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/error/ErrorSimpleFunctionDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/types/error/ErrorSimpleFunctionDescriptorImpl.java index 3b7c79c93d0..26924aa49f6 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/error/ErrorSimpleFunctionDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/error/ErrorSimpleFunctionDescriptorImpl.java @@ -185,6 +185,11 @@ public class ErrorSimpleFunctionDescriptorImpl extends SimpleFunctionDescriptorI }; } + @Override + public boolean isSuspend() { + return false; + } + @Override public void setOverriddenDescriptors(@NotNull Collection overriddenDescriptors) { // nop diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/Flags.java b/core/deserialization/src/org/jetbrains/kotlin/serialization/Flags.java index 5b754b50064..82e7b3fd522 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/Flags.java +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/Flags.java @@ -51,6 +51,7 @@ public class Flags { public static final BooleanFlagField IS_INLINE = FlagField.booleanAfter(IS_INFIX); public static final BooleanFlagField IS_TAILREC = FlagField.booleanAfter(IS_INLINE); public static final BooleanFlagField IS_EXTERNAL_FUNCTION = FlagField.booleanAfter(IS_TAILREC); + public static final BooleanFlagField IS_SUSPEND = FlagField.booleanAfter(IS_EXTERNAL_FUNCTION); // Properties @@ -66,6 +67,7 @@ public class Flags { public static final BooleanFlagField DECLARES_DEFAULT_VALUE = FlagField.booleanAfter(HAS_ANNOTATIONS); public static final BooleanFlagField IS_CROSSINLINE = FlagField.booleanAfter(DECLARES_DEFAULT_VALUE); public static final BooleanFlagField IS_NOINLINE = FlagField.booleanAfter(IS_CROSSINLINE); + public static final BooleanFlagField IS_COROUTINE = FlagField.booleanAfter(IS_NOINLINE); // Accessors @@ -132,7 +134,8 @@ public class Flags { boolean isInfix, boolean isInline, boolean isTailrec, - boolean isExternal + boolean isExternal, + boolean isSuspend ) { return HAS_ANNOTATIONS.toFlags(hasAnnotations) | VISIBILITY.toFlags(visibility(visibility)) @@ -143,6 +146,7 @@ public class Flags { | IS_INLINE.toFlags(isInline) | IS_TAILREC.toFlags(isTailrec) | IS_EXTERNAL_FUNCTION.toFlags(isExternal) + | IS_SUSPEND.toFlags(isSuspend) ; } @@ -243,12 +247,14 @@ public class Flags { boolean hasAnnotations, boolean declaresDefaultValue, boolean isCrossinline, - boolean isNoinline + boolean isNoinline, + boolean isCoroutine ) { return HAS_ANNOTATIONS.toFlags(hasAnnotations) | DECLARES_DEFAULT_VALUE.toFlags(declaresDefaultValue) | IS_CROSSINLINE.toFlags(isCrossinline) | IS_NOINLINE.toFlags(isNoinline) + | IS_COROUTINE.toFlags(isCoroutine) ; } diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt index 98fe2ad26f4..380c6a74ac1 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt @@ -164,6 +164,7 @@ class MemberDeserializer(private val c: DeserializationContext) { function.isExternal = Flags.IS_EXTERNAL_FUNCTION.get(flags) function.isInline = Flags.IS_INLINE.get(flags) function.isTailrec = Flags.IS_TAILREC.get(flags) + function.isSuspend = Flags.IS_SUSPEND.get(flags) return function } @@ -252,6 +253,7 @@ class MemberDeserializer(private val c: DeserializationContext) { Flags.DECLARES_DEFAULT_VALUE.get(flags), Flags.IS_CROSSINLINE.get(flags), Flags.IS_NOINLINE.get(flags), + Flags.IS_COROUTINE.get(flags), proto.varargElementType(c.typeTable)?.let { c.typeDeserializer.type(it) }, SourceElement.NO_SOURCE ) diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberDescriptor.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberDescriptor.kt index 7082f4a0efa..12f4c07e62e 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberDescriptor.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberDescriptor.kt @@ -134,6 +134,8 @@ class DeserializedConstructorDescriptor( override fun isInline(): Boolean = false override fun isTailrec(): Boolean = false + + override fun isSuspend(): Boolean = false } class DeserializedTypeAliasDescriptor( diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/CallableClsStubBuilder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/CallableClsStubBuilder.kt index 64d6128bff3..002d2630b41 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/CallableClsStubBuilder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/CallableClsStubBuilder.kt @@ -130,7 +130,7 @@ private class FunctionClsStubBuilder( val modalityModifier = if (isTopLevel) listOf() else listOf(MODALITY) val modifierListStubImpl = createModifierListStubForDeclaration( callableStub, functionProto.flags, - listOf(VISIBILITY, OPERATOR, INFIX, EXTERNAL_FUN, INLINE, TAILREC) + modalityModifier + listOf(VISIBILITY, OPERATOR, INFIX, EXTERNAL_FUN, INLINE, TAILREC, SUSPEND) + modalityModifier ) val annotationIds = c.components.annotationLoader.loadCallableAnnotations( diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/TypeClsStubBuilder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/TypeClsStubBuilder.kt index 338f510b06b..fa195205b93 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/TypeClsStubBuilder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/TypeClsStubBuilder.kt @@ -171,6 +171,9 @@ class TypeClsStubBuilder(private val c: ClsStubBuilderContext) { if (varargElementType != null) { modifiers.add(KtTokens.VARARG_KEYWORD) } if (Flags.IS_CROSSINLINE.get(valueParameterProto.flags)) { modifiers.add(KtTokens.CROSSINLINE_KEYWORD) } if (Flags.IS_NOINLINE.get(valueParameterProto.flags)) { modifiers.add(KtTokens.NOINLINE_KEYWORD) } + if (Flags.IS_COROUTINE.get(valueParameterProto.flags)) { + modifiers.add(KtTokens.COROUTINE_KEYWORD) + } val modifierList = createModifierListStub(parameterStub, modifiers) val parameterAnnotations = c.components.annotationLoader.loadValueParameterAnnotations( diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/flags/flags.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/flags/flags.kt index fcb61499ea5..a7c7d098db7 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/flags/flags.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/flags/flags.kt @@ -60,6 +60,7 @@ val DATA = createBooleanFlagToModifier(Flags.IS_DATA, KtTokens.DATA_KEYWORD) val EXTERNAL_FUN = createBooleanFlagToModifier(Flags.IS_EXTERNAL_FUNCTION, KtTokens.EXTERNAL_KEYWORD) val INLINE = createBooleanFlagToModifier(Flags.IS_INLINE, KtTokens.INLINE_KEYWORD) val TAILREC = createBooleanFlagToModifier(Flags.IS_TAILREC, KtTokens.TAILREC_KEYWORD) +val SUSPEND = createBooleanFlagToModifier(Flags.IS_SUSPEND, KtTokens.SUSPEND_KEYWORD) private fun createBooleanFlagToModifier( flagField: Flags.BooleanFlagField, ktModifierKeywordToken: KtModifierKeywordToken diff --git a/idea/idea-completion/testData/keywords/AfterClassProperty.kt b/idea/idea-completion/testData/keywords/AfterClassProperty.kt index 8ef1cc41281..881f97ac64d 100644 --- a/idea/idea-completion/testData/keywords/AfterClassProperty.kt +++ b/idea/idea-completion/testData/keywords/AfterClassProperty.kt @@ -40,4 +40,5 @@ class MouseMovedEventArgs // EXIST: external // EXIST: annotation class // EXIST: const +// EXIST: suspend // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/AfterClasses.kt b/idea/idea-completion/testData/keywords/AfterClasses.kt index 6b906e958da..101ee4cc54d 100644 --- a/idea/idea-completion/testData/keywords/AfterClasses.kt +++ b/idea/idea-completion/testData/keywords/AfterClasses.kt @@ -34,4 +34,5 @@ class B { // EXIST: external // EXIST: annotation class // EXIST: const +// EXIST: suspend // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/AfterFuns.kt b/idea/idea-completion/testData/keywords/AfterFuns.kt index abfdced4bb6..11f029cfd46 100644 --- a/idea/idea-completion/testData/keywords/AfterFuns.kt +++ b/idea/idea-completion/testData/keywords/AfterFuns.kt @@ -39,4 +39,5 @@ class A { // EXIST: external // EXIST: annotation class // EXIST: const +// EXIST: suspend // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/GlobalPropertyAccessors.kt b/idea/idea-completion/testData/keywords/GlobalPropertyAccessors.kt index 1c3a43e3ba2..4b142976f63 100644 --- a/idea/idea-completion/testData/keywords/GlobalPropertyAccessors.kt +++ b/idea/idea-completion/testData/keywords/GlobalPropertyAccessors.kt @@ -38,4 +38,5 @@ var a : Int // EXIST: external // EXIST: annotation class // EXIST: const +// EXIST: suspend // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/InAnnotationClassScope.kt b/idea/idea-completion/testData/keywords/InAnnotationClassScope.kt index 4c14f0b9128..127955bba89 100644 --- a/idea/idea-completion/testData/keywords/InAnnotationClassScope.kt +++ b/idea/idea-completion/testData/keywords/InAnnotationClassScope.kt @@ -25,4 +25,5 @@ annotation class Test { // EXIST: external // EXIST: annotation class // EXIST: const +// EXIST: suspend // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/InClassBeforeFun.kt b/idea/idea-completion/testData/keywords/InClassBeforeFun.kt index fb25362dd60..61b35e4d3b7 100644 --- a/idea/idea-completion/testData/keywords/InClassBeforeFun.kt +++ b/idea/idea-completion/testData/keywords/InClassBeforeFun.kt @@ -37,4 +37,5 @@ public class Test { // EXIST: external // EXIST: annotation class // EXIST: const +// EXIST: suspend // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/InClassScope.kt b/idea/idea-completion/testData/keywords/InClassScope.kt index a84d06d9349..67049bb2c7e 100644 --- a/idea/idea-completion/testData/keywords/InClassScope.kt +++ b/idea/idea-completion/testData/keywords/InClassScope.kt @@ -31,4 +31,5 @@ class TestClass { // EXIST: external // EXIST: annotation class // EXIST: const +// EXIST: suspend // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/InEnumScope2.kt b/idea/idea-completion/testData/keywords/InEnumScope2.kt index a7e7b02a134..e57d4f76704 100644 --- a/idea/idea-completion/testData/keywords/InEnumScope2.kt +++ b/idea/idea-completion/testData/keywords/InEnumScope2.kt @@ -25,6 +25,7 @@ enum class Test { // EXIST: external // EXIST: annotation class // EXIST: const +// EXIST: suspend // EXIST: fun /* TODO: items below are not valid here */ diff --git a/idea/idea-completion/testData/keywords/InInterfaceScope.kt b/idea/idea-completion/testData/keywords/InInterfaceScope.kt index 6e007a8970d..312f8c1df5f 100644 --- a/idea/idea-completion/testData/keywords/InInterfaceScope.kt +++ b/idea/idea-completion/testData/keywords/InInterfaceScope.kt @@ -27,4 +27,5 @@ interface Test { // EXIST: external // EXIST: annotation class // EXIST: const +// EXIST: suspend // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/InMemberFunParametersList.kt b/idea/idea-completion/testData/keywords/InMemberFunParametersList.kt index 55b75405dc2..8a46f946a43 100644 --- a/idea/idea-completion/testData/keywords/InMemberFunParametersList.kt +++ b/idea/idea-completion/testData/keywords/InMemberFunParametersList.kt @@ -8,6 +8,7 @@ class TestSample() { // EXIST: vararg // EXIST: noinline // EXIST: crossinline +// EXIST: coroutine /* TODO: val&var are not correct */ // EXIST: val // EXIST: var diff --git a/idea/idea-completion/testData/keywords/InObjectScope.kt b/idea/idea-completion/testData/keywords/InObjectScope.kt index 20b87c033cd..ca8f756e124 100644 --- a/idea/idea-completion/testData/keywords/InObjectScope.kt +++ b/idea/idea-completion/testData/keywords/InObjectScope.kt @@ -28,4 +28,5 @@ object Test { // EXIST: external // EXIST: annotation class // EXIST: const +// EXIST: suspend // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/InPrimaryConstructorParametersList.kt b/idea/idea-completion/testData/keywords/InPrimaryConstructorParametersList.kt index 89f3e7c7d3f..0f5c3cfe189 100644 --- a/idea/idea-completion/testData/keywords/InPrimaryConstructorParametersList.kt +++ b/idea/idea-completion/testData/keywords/InPrimaryConstructorParametersList.kt @@ -14,7 +14,7 @@ class TestSample() // EXIST: private // EXIST: protected // EXIST: internal - +// EXIST: coroutine /* TODO: keywords below should not be here*/ // EXIST: abstract // EXIST: const diff --git a/idea/idea-completion/testData/keywords/InTopFunParametersList.kt b/idea/idea-completion/testData/keywords/InTopFunParametersList.kt index edff43a024a..38480d5921d 100644 --- a/idea/idea-completion/testData/keywords/InTopFunParametersList.kt +++ b/idea/idea-completion/testData/keywords/InTopFunParametersList.kt @@ -5,6 +5,7 @@ fun test() { // EXIST: vararg // EXIST: noinline // EXIST: crossinline +// EXIST: coroutine /* TODO: they all are not correct */ // EXIST: val // EXIST: var diff --git a/idea/idea-completion/testData/keywords/InTopScopeAfterPackage.kt b/idea/idea-completion/testData/keywords/InTopScopeAfterPackage.kt index a586b395277..089af7852b7 100644 --- a/idea/idea-completion/testData/keywords/InTopScopeAfterPackage.kt +++ b/idea/idea-completion/testData/keywords/InTopScopeAfterPackage.kt @@ -25,4 +25,5 @@ package Test // EXIST: external // EXIST: annotation class // EXIST: const +// EXIST: suspend // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/PropertyAccessors.kt b/idea/idea-completion/testData/keywords/PropertyAccessors.kt index dc1721d1845..b1dc91758cb 100644 --- a/idea/idea-completion/testData/keywords/PropertyAccessors.kt +++ b/idea/idea-completion/testData/keywords/PropertyAccessors.kt @@ -39,4 +39,5 @@ class Some { // EXIST: external // EXIST: annotation class // EXIST: const +// EXIST: suspend // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/PropertyAccessors2.kt b/idea/idea-completion/testData/keywords/PropertyAccessors2.kt index 38bc31b70f3..eb95815694f 100644 --- a/idea/idea-completion/testData/keywords/PropertyAccessors2.kt +++ b/idea/idea-completion/testData/keywords/PropertyAccessors2.kt @@ -39,4 +39,5 @@ class Some { // EXIST: external // EXIST: annotation class // EXIST: const +// EXIST: suspend // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/PropertySetter.kt b/idea/idea-completion/testData/keywords/PropertySetter.kt index 74be60183c6..8e7c007db38 100644 --- a/idea/idea-completion/testData/keywords/PropertySetter.kt +++ b/idea/idea-completion/testData/keywords/PropertySetter.kt @@ -37,4 +37,5 @@ class Some { // EXIST: external // EXIST: annotation class // EXIST: const +// EXIST: suspend // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/TopScope.kt b/idea/idea-completion/testData/keywords/TopScope.kt index 0881897ad95..ee53e3ce4f4 100644 --- a/idea/idea-completion/testData/keywords/TopScope.kt +++ b/idea/idea-completion/testData/keywords/TopScope.kt @@ -24,4 +24,5 @@ // EXIST: external // EXIST: annotation class // EXIST: const +// EXIST: suspend // NOTHING_ELSE diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeMemberFunctionSignatureFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeMemberFunctionSignatureFix.kt index 4660c85ffea..4de4f0254a8 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeMemberFunctionSignatureFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeMemberFunctionSignatureFix.kt @@ -206,7 +206,7 @@ class ChangeMemberFunctionSignatureFix private constructor( ValueParameterDescriptorImpl( descriptor, null, index, parameter.annotations, parameter.name, parameter.returnType!!, parameter.declaresDefaultValue(), - parameter.isCrossinline, parameter.isNoinline, parameter.varargElementType, SourceElement.NO_SOURCE + parameter.isCrossinline, parameter.isNoinline, parameter.isCoroutine, parameter.varargElementType, SourceElement.NO_SOURCE ) } diff --git a/idea/testData/decompiler/decompiledText/Modifiers/Modifiers.kt b/idea/testData/decompiler/decompiledText/Modifiers/Modifiers.kt index 46f5123a019..5f181e8a291 100644 --- a/idea/testData/decompiler/decompiledText/Modifiers/Modifiers.kt +++ b/idea/testData/decompiler/decompiledText/Modifiers/Modifiers.kt @@ -9,4 +9,4 @@ data class Modifiers(val x: Int) { inline fun inlined(crossinline arg1: ()->Unit, noinline arg2: ()->Unit): Unit {} } -annotation class Ann \ No newline at end of file +annotation class Ann diff --git a/idea/testData/decompiler/stubBuilder/Modifiers/Modifiers.kt b/idea/testData/decompiler/stubBuilder/Modifiers/Modifiers.kt index a04edc441a3..9b7adf9f946 100644 --- a/idea/testData/decompiler/stubBuilder/Modifiers/Modifiers.kt +++ b/idea/testData/decompiler/stubBuilder/Modifiers/Modifiers.kt @@ -17,4 +17,8 @@ data class Modifiers(val x: Int) { override operator fun equals(other: Any?) = false annotation class Ann -} \ No newline at end of file + + suspend fun suspend(x: Continuation) {} + + fun builder(coroutine c: Any.() -> Continuation) {} +} diff --git a/idea/testData/decompiler/stubBuilder/Modifiers/Modifiers.txt b/idea/testData/decompiler/stubBuilder/Modifiers/Modifiers.txt index 1a899b54957..ecdc95f1f0b 100644 --- a/idea/testData/decompiler/stubBuilder/Modifiers/Modifiers.txt +++ b/idea/testData/decompiler/stubBuilder/Modifiers/Modifiers.txt @@ -28,6 +28,39 @@ PsiJetFileStubImpl[package=test] USER_TYPE: REFERENCE_EXPRESSION:[referencedName=kotlin] REFERENCE_EXPRESSION:[referencedName=Int] + FUN:[fqName=test.Modifiers.builder, hasBlockBody=true, hasBody=true, hasTypeParameterListBeforeFunctionName=false, isExtension=false, isTopLevel=false, name=builder] + MODIFIER_LIST:[public final] + VALUE_PARAMETER_LIST: + VALUE_PARAMETER:[fqName=null, hasDefaultValue=false, hasValOrVar=false, isMutable=false, name=c] + MODIFIER_LIST:[coroutine] + TYPE_REFERENCE: + FUNCTION_TYPE: + FUNCTION_TYPE_RECEIVER: + TYPE_REFERENCE: + USER_TYPE: + USER_TYPE: + REFERENCE_EXPRESSION:[referencedName=kotlin] + REFERENCE_EXPRESSION:[referencedName=Any] + VALUE_PARAMETER_LIST: + TYPE_REFERENCE: + USER_TYPE: + USER_TYPE: + USER_TYPE: + REFERENCE_EXPRESSION:[referencedName=kotlin] + REFERENCE_EXPRESSION:[referencedName=coroutines] + REFERENCE_EXPRESSION:[referencedName=Continuation] + TYPE_ARGUMENT_LIST: + TYPE_PROJECTION:[projectionKind=NONE] + TYPE_REFERENCE: + USER_TYPE: + USER_TYPE: + REFERENCE_EXPRESSION:[referencedName=kotlin] + REFERENCE_EXPRESSION:[referencedName=Unit] + TYPE_REFERENCE: + USER_TYPE: + USER_TYPE: + REFERENCE_EXPRESSION:[referencedName=kotlin] + REFERENCE_EXPRESSION:[referencedName=Unit] FUN:[fqName=test.Modifiers.component1, hasBlockBody=true, hasBody=true, hasTypeParameterListBeforeFunctionName=false, isExtension=false, isTopLevel=false, name=component1] MODIFIER_LIST:[public final operator] VALUE_PARAMETER_LIST: @@ -107,6 +140,29 @@ PsiJetFileStubImpl[package=test] USER_TYPE: REFERENCE_EXPRESSION:[referencedName=kotlin] REFERENCE_EXPRESSION:[referencedName=Long] + FUN:[fqName=test.Modifiers.suspend, hasBlockBody=true, hasBody=true, hasTypeParameterListBeforeFunctionName=false, isExtension=false, isTopLevel=false, name=suspend] + MODIFIER_LIST:[public final suspend] + VALUE_PARAMETER_LIST: + VALUE_PARAMETER:[fqName=null, hasDefaultValue=false, hasValOrVar=false, isMutable=false, name=x] + TYPE_REFERENCE: + USER_TYPE: + USER_TYPE: + USER_TYPE: + REFERENCE_EXPRESSION:[referencedName=kotlin] + REFERENCE_EXPRESSION:[referencedName=coroutines] + REFERENCE_EXPRESSION:[referencedName=Continuation] + TYPE_ARGUMENT_LIST: + TYPE_PROJECTION:[projectionKind=NONE] + TYPE_REFERENCE: + USER_TYPE: + USER_TYPE: + REFERENCE_EXPRESSION:[referencedName=kotlin] + REFERENCE_EXPRESSION:[referencedName=Int] + TYPE_REFERENCE: + USER_TYPE: + USER_TYPE: + REFERENCE_EXPRESSION:[referencedName=kotlin] + REFERENCE_EXPRESSION:[referencedName=Unit] CLASS:[fqName=test.Modifiers.Ann, isEnumEntry=false, isInterface=false, isLocal=false, isTopLevel=false, name=Ann, superNames=[Annotation]] MODIFIER_LIST:[public final annotation] PRIMARY_CONSTRUCTOR: diff --git a/idea/tests/org/jetbrains/kotlin/idea/stubs/ResolveByStubTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/stubs/ResolveByStubTestGenerated.java index 38460c7a16b..6785477bf95 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/stubs/ResolveByStubTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/stubs/ResolveByStubTestGenerated.java @@ -1037,6 +1037,21 @@ public class ResolveByStubTestGenerated extends AbstractResolveByStubTest { } } + @TestMetadata("compiler/testData/loadJava/compiledKotlin/coroutines") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Coroutines extends AbstractResolveByStubTest { + public void testAllFilesPresentInCoroutines() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/loadJava/compiledKotlin/coroutines"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("Basic.kt") + public void testBasic() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/coroutines/Basic.kt"); + doTest(fileName); + } + } + @TestMetadata("compiler/testData/loadJava/compiledKotlin/dataClass") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)