diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForConstructorDescriptor.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForConstructorDescriptor.kt index f51981ca83f..0268c16e4e8 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForConstructorDescriptor.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForConstructorDescriptor.kt @@ -47,7 +47,8 @@ public class AccessorForConstructorDescriptor( copyValueParameters(calleeDescriptor), calleeDescriptor.returnType, Modality.FINAL, - Visibilities.INTERNAL + Visibilities.INTERNAL, + false ) } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForFunctionDescriptor.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForFunctionDescriptor.java index 8258740a6e0..2f8611bda38 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForFunctionDescriptor.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForFunctionDescriptor.java @@ -47,7 +47,8 @@ public class AccessorForFunctionDescriptor extends AbstractAccessorForFunctionDe copyValueParameters(descriptor), descriptor.getReturnType(), Modality.FINAL, - Visibilities.INTERNAL); + Visibilities.INTERNAL, + descriptor.isOperator()); } @NotNull diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java index 5a746f63682..79ad912e5a7 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java @@ -197,8 +197,8 @@ public class ClosureCodegen extends MemberCodegen { descriptorForBridges .initialize(null, erasedInterfaceFunction.getDispatchReceiverParameter(), erasedInterfaceFunction.getTypeParameters(), - erasedInterfaceFunction.getValueParameters(), erasedInterfaceFunction.getReturnType(), Modality.OPEN, - erasedInterfaceFunction.getVisibility()); + erasedInterfaceFunction.getValueParameters(), erasedInterfaceFunction.getReturnType(), + Modality.OPEN, erasedInterfaceFunction.getVisibility(), false); descriptorForBridges.addOverriddenDescriptor(erasedInterfaceFunction); functionCodegen.generateBridges(descriptorForBridges); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java index edec5aa6376..fc11a66e425 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java @@ -337,7 +337,7 @@ public abstract class MemberCodegenemptyList(), Collections.emptyList(), DescriptorUtilPackage.getModule(descriptor).getBuiltIns().getUnitType(), - null, Visibilities.PRIVATE); + null, Visibilities.PRIVATE, false); this.clInit = new ExpressionCodegen(mv, new FrameMap(), Type.VOID_TYPE, context.intoFunction(clInit), state, this); } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt index 16d4e4e52d7..478bed30c0d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt @@ -150,7 +150,7 @@ public class PropertyReferenceCodegen( SourceElement.NO_SOURCE ) fakeDescriptor.initialize(null, classDescriptor.getThisAsReceiverParameter(), emptyList(), emptyList(), - classDescriptor.builtIns.getAnyType(), Modality.OPEN, Visibilities.PUBLIC) + classDescriptor.builtIns.getAnyType(), Modality.OPEN, Visibilities.PUBLIC, false) val fakeCodegen = ExpressionCodegen( this, FrameMap(), OBJECT_TYPE, context.intoFunction(fakeDescriptor), state, this@PropertyReferenceCodegen diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java index 1b4d0e4a853..99bcbe669bc 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java @@ -162,8 +162,8 @@ public class SamWrapperCodegen { descriptorForBridges .initialize(null, originalInterfaceErased.getDispatchReceiverParameter(), originalInterfaceErased.getTypeParameters(), - originalInterfaceErased.getValueParameters(), originalInterfaceErased.getReturnType(), Modality.OPEN, - originalInterfaceErased.getVisibility()); + originalInterfaceErased.getValueParameters(), originalInterfaceErased.getReturnType(), + Modality.OPEN, originalInterfaceErased.getVisibility(), false); descriptorForBridges.addOverriddenDescriptor(originalInterfaceErased); codegen.generateBridges(descriptorForBridges); 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 09f39989947..983b6558565 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 @@ -170,7 +170,8 @@ public class SingleAbstractMethodUtils { Arrays.asList(parameter), returnType, Modality.FINAL, - samInterface.getVisibility() + samInterface.getVisibility(), + false ); return result; @@ -206,7 +207,8 @@ public class SingleAbstractMethodUtils { valueParameters, returnType, Modality.FINAL, - original.getVisibility() + original.getVisibility(), + false ); } }); 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 2d237af8478..c8dd055d8e2 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 @@ -116,7 +116,8 @@ public class SignaturesPropagationData { autoValueParameters, autoReturnType, Modality.OPEN, - Visibilities.PUBLIC + Visibilities.PUBLIC, + false ); return autoMethodDescriptor; } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt index a444fa5cb97..611f2acd85e 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt @@ -128,7 +128,7 @@ class SamAdapterFunctionsScope(storageManager: StorageManager) : JetScope by Jet val visibility = syntheticExtensionVisibility(sourceFunction) - descriptor.initialize(receiverType, null, typeParameters, valueParameters, returnType, Modality.FINAL, visibility) + descriptor.initialize(receiverType, null, typeParameters, valueParameters, returnType, Modality.FINAL, visibility, false) return descriptor } @@ -148,6 +148,7 @@ class SamAdapterFunctionsScope(storageManager: StorageManager) : JetScope by Jet newOwner: DeclarationDescriptor, newModality: Modality, newVisibility: Visibility, + newIsOperator: Boolean, original: FunctionDescriptor?, copyOverrides: Boolean, kind: CallableMemberDescriptor.Kind, @@ -156,7 +157,7 @@ class SamAdapterFunctionsScope(storageManager: StorageManager) : JetScope by Jet newReturnType: JetType ): FunctionDescriptor? { val descriptor = super.doSubstitute( - originalSubstitutor, newOwner, newModality, newVisibility, original, + originalSubstitutor, newOwner, newModality, newVisibility, newIsOperator, original, copyOverrides, kind, newValueParameterDescriptors, newExtensionReceiverParameterType, newReturnType) as MyFunctionDescriptor? ?: return null diff --git a/compiler/frontend/src/org/jetbrains/kotlin/lexer/JetTokens.java b/compiler/frontend/src/org/jetbrains/kotlin/lexer/JetTokens.java index 047f64c280d..e56084c3c4c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/lexer/JetTokens.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/lexer/JetTokens.java @@ -176,6 +176,7 @@ public interface JetTokens { JetModifierKeywordToken EXTERNAL_KEYWORD = JetModifierKeywordToken.softKeywordModifier("external"); JetModifierKeywordToken ANNOTATION_KEYWORD = JetModifierKeywordToken.softKeywordModifier("annotation"); JetModifierKeywordToken CROSSINLINE_KEYWORD = JetModifierKeywordToken.softKeywordModifier("crossinline"); + JetModifierKeywordToken OPERATOR_KEYWORD = JetModifierKeywordToken.softKeywordModifier("operator"); JetModifierKeywordToken CONST_KEYWORD = JetModifierKeywordToken.softKeywordModifier("const"); @@ -196,7 +197,7 @@ public interface JetTokens { FIELD_KEYWORD, PROPERTY_KEYWORD, RECEIVER_KEYWORD, PARAM_KEYWORD, SPARAM_KEYWORD, LATE_INIT_KEYWORD, DATA_KEYWORD, INLINE_KEYWORD, NOINLINE_KEYWORD, TAILREC_KEYWORD, EXTERNAL_KEYWORD, - ANNOTATION_KEYWORD, CROSSINLINE_KEYWORD, CONST_KEYWORD + ANNOTATION_KEYWORD, CROSSINLINE_KEYWORD, CONST_KEYWORD, OPERATOR_KEYWORD ); /* @@ -210,7 +211,7 @@ public interface JetTokens { PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD, OUT_KEYWORD, IN_KEYWORD, FINAL_KEYWORD, VARARG_KEYWORD, REIFIED_KEYWORD, COMPANION_KEYWORD, SEALED_KEYWORD, LATE_INIT_KEYWORD, DATA_KEYWORD, INLINE_KEYWORD, NOINLINE_KEYWORD, TAILREC_KEYWORD, EXTERNAL_KEYWORD, ANNOTATION_KEYWORD, CROSSINLINE_KEYWORD, - CONST_KEYWORD + CONST_KEYWORD, OPERATOR_KEYWORD }; // Please synchronize this array with org.jetbrains.kotlin.descriptors.annotations.ANNOTATION_MODIFIERS_FQ_NAMES diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/stubs/elements/JetFileElementType.java b/compiler/frontend/src/org/jetbrains/kotlin/psi/stubs/elements/JetFileElementType.java index b2d9a34ea9e..ccd0650c68d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/stubs/elements/JetFileElementType.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/stubs/elements/JetFileElementType.java @@ -34,7 +34,7 @@ import org.jetbrains.kotlin.psi.stubs.KotlinFileStub; import java.io.IOException; public class JetFileElementType extends IStubFileElementType { - public static final int STUB_VERSION = 58; + public static final int STUB_VERSION = 59; private static final String NAME = "kotlin.FILE"; diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java index 9ee0c8efb88..00b4da420aa 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java @@ -241,7 +241,8 @@ public class DescriptorResolver { Collections.emptyList(), returnType, Modality.FINAL, - property.getVisibility() + property.getVisibility(), + false ); trace.record(BindingContext.DATA_CLASS_COMPONENT_FUNCTION, parameter, functionDescriptor); @@ -289,7 +290,8 @@ public class DescriptorResolver { parameterDescriptors, returnType, Modality.FINAL, - Visibilities.PUBLIC + Visibilities.PUBLIC, + false ); trace.record(BindingContext.DATA_CLASS_COPY_FUNCTION, classDescriptor, functionDescriptor); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt index c3744b7c49d..cdf1a998253 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl.create import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl import org.jetbrains.kotlin.diagnostics.DiagnosticUtils import org.jetbrains.kotlin.diagnostics.Errors.* +import org.jetbrains.kotlin.lexer.JetTokens import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.DescriptorResolver.* @@ -170,7 +171,8 @@ class FunctionDescriptorResolver( valueParameterDescriptors, returnType, modality, - visibility + visibility, + function.hasModifier(JetTokens.OPERATOR_KEYWORD) ) receiverType?.let { ForceResolveUtil.forceResolveAllContents(it.getAnnotations()) } for (valueParameterDescriptor in valueParameterDescriptors) { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorUtil.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorUtil.java index 636cf3ea191..8e36495ee42 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorUtil.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorUtil.java @@ -103,7 +103,8 @@ public class FunctionDescriptorUtil { KotlinBuiltIns.getValueParameters(functionDescriptor, functionType), KotlinBuiltIns.getReturnTypeFromFunctionType(functionType), modality, - visibility); + visibility, + false); } public static D alphaConvertTypeParameters(D candidate) { @@ -155,7 +156,8 @@ public class FunctionDescriptorUtil { parameters, function.getReturnType(), function.getModality(), - function.getVisibility()); + function.getVisibility(), + function.isOperator()); return descriptor; } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt index b38e7414113..d915c45872e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt @@ -66,7 +66,8 @@ public object ModifierCheckerCore { EXTERNAL_KEYWORD to EnumSet.of(FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER), ANNOTATION_KEYWORD to EnumSet.of(ANNOTATION_CLASS), CROSSINLINE_KEYWORD to EnumSet.of(VALUE_PARAMETER), - CONST_KEYWORD to EnumSet.of(MEMBER_PROPERTY, TOP_LEVEL_PROPERTY) + CONST_KEYWORD to EnumSet.of(MEMBER_PROPERTY, TOP_LEVEL_PROPERTY), + OPERATOR_KEYWORD to EnumSet.of(FUNCTION) ) // NOTE: redundant targets must be possible! 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 71552c34e5b..587744be514 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 @@ -129,7 +129,8 @@ object DynamicCallableDescriptors { createValueParameters(functionDescriptor, call), DynamicType, Modality.FINAL, - Visibilities.PUBLIC + Visibilities.PUBLIC, + false ) return functionDescriptor } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/synthesizedInvokes.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/synthesizedInvokes.kt index 8ede6660859..52f9c65df17 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/synthesizedInvokes.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/synthesizedInvokes.kt @@ -80,7 +80,8 @@ private fun createSynthesizedFunctionWithFirstParameterAsReceiver(descriptor: Fu }, original.getReturnType(), original.getModality(), - original.getVisibility() + original.getVisibility(), + original.isOperator ) return result 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 d83d0af1ef2..ba969676b06 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingUtils.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingUtils.java @@ -124,7 +124,8 @@ public class ControlStructureTypingUtils { valueParameters, type, Modality.FINAL, - Visibilities.PUBLIC + Visibilities.PUBLIC, + false ); return function; } diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java index 7af4185d99f..447293bd06c 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java @@ -180,6 +180,11 @@ public class DescriptorSerializer { boolean hasConstant = false; boolean lateInit = false; boolean isConst = false; + boolean isOperator = false; + + if (descriptor instanceof FunctionDescriptor) { + isOperator = ((FunctionDescriptor) descriptor).isOperator(); + } if (descriptor instanceof PropertyDescriptor) { PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor; @@ -235,7 +240,8 @@ public class DescriptorSerializer { hasSetter, hasConstant, lateInit, - isConst + isConst, + isOperator )); for (TypeParameterDescriptor typeParameterDescriptor : descriptor.getTypeParameters()) { diff --git a/compiler/testData/loadJava/compiledKotlin/fun/OperatorKeyword.kt b/compiler/testData/loadJava/compiledKotlin/fun/OperatorKeyword.kt new file mode 100644 index 00000000000..7b2b06ec1a5 --- /dev/null +++ b/compiler/testData/loadJava/compiledKotlin/fun/OperatorKeyword.kt @@ -0,0 +1,5 @@ +package test + +class Example { + operator fun plus(other: Example) {} +} \ No newline at end of file diff --git a/compiler/testData/loadJava/compiledKotlin/fun/OperatorKeyword.txt b/compiler/testData/loadJava/compiledKotlin/fun/OperatorKeyword.txt new file mode 100644 index 00000000000..7886429ed59 --- /dev/null +++ b/compiler/testData/loadJava/compiledKotlin/fun/OperatorKeyword.txt @@ -0,0 +1,6 @@ +package test + +public final class Example { + /*primary*/ public constructor Example() + public final operator fun plus(/*0*/ other: test.Example): kotlin.Unit +} diff --git a/compiler/testData/resolvedCalls/functionTypes/invokeForExtensionFunctionType.txt b/compiler/testData/resolvedCalls/functionTypes/invokeForExtensionFunctionType.txt index dca7c56fec1..7e674b88d4f 100644 --- a/compiler/testData/resolvedCalls/functionTypes/invokeForExtensionFunctionType.txt +++ b/compiler/testData/resolvedCalls/functionTypes/invokeForExtensionFunctionType.txt @@ -5,7 +5,7 @@ fun bar(f: Int.()->Unit) { Resolved call: -Resulting descriptor: fun Int.invoke(): Unit defined in kotlin.Function1 +Resulting descriptor: operator fun Int.invoke(): Unit defined in kotlin.Function1 Explicit receiver kind = BOTH_RECEIVERS Dispatch receiver = f {[@kotlin.Extension] Function1} diff --git a/compiler/testData/resolvedCalls/functionTypes/invokeForFunctionType.txt b/compiler/testData/resolvedCalls/functionTypes/invokeForFunctionType.txt index 3d3c438745b..dc8aed5fbba 100644 --- a/compiler/testData/resolvedCalls/functionTypes/invokeForFunctionType.txt +++ b/compiler/testData/resolvedCalls/functionTypes/invokeForFunctionType.txt @@ -5,7 +5,7 @@ fun bar(f: ()->Unit) { Resolved call: -Resulting descriptor: fun invoke(): Unit defined in kotlin.Function0 +Resulting descriptor: operator fun invoke(): Unit defined in kotlin.Function0 Explicit receiver kind = DISPATCH_RECEIVER Dispatch receiver = f {Function0} diff --git a/compiler/testData/resolvedCalls/functionTypes/valOfExtensionFunctionTypeInvoke.txt b/compiler/testData/resolvedCalls/functionTypes/valOfExtensionFunctionTypeInvoke.txt index 1d3b8e56a2d..4a69489b320 100644 --- a/compiler/testData/resolvedCalls/functionTypes/valOfExtensionFunctionTypeInvoke.txt +++ b/compiler/testData/resolvedCalls/functionTypes/valOfExtensionFunctionTypeInvoke.txt @@ -9,7 +9,7 @@ interface A { Resolved call: -Resulting descriptor: fun Int.invoke(): Unit defined in kotlin.Function1 +Resulting descriptor: operator fun Int.invoke(): Unit defined in kotlin.Function1 Explicit receiver kind = BOTH_RECEIVERS Dispatch receiver = foo {[@kotlin.Extension] Function1} diff --git a/compiler/testData/resolvedCalls/functionTypes/valOfFunctionTypeInvoke.txt b/compiler/testData/resolvedCalls/functionTypes/valOfFunctionTypeInvoke.txt index 79e91aef144..dd16c9fa987 100644 --- a/compiler/testData/resolvedCalls/functionTypes/valOfFunctionTypeInvoke.txt +++ b/compiler/testData/resolvedCalls/functionTypes/valOfFunctionTypeInvoke.txt @@ -9,7 +9,7 @@ fun test(a: A) { Resolved call: -Resulting descriptor: fun invoke(p1: Int): Int defined in kotlin.Function1 +Resulting descriptor: operator fun invoke(p1: Int): Int defined in kotlin.Function1 Explicit receiver kind = DISPATCH_RECEIVER Dispatch receiver = foo {Function1} diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java index 9011b7649cf..3d08ac2081e 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java @@ -4078,6 +4078,12 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest { doTestCompiledKotlin(fileName); } + @TestMetadata("OperatorKeyword.kt") + public void testOperatorKeyword() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/fun/OperatorKeyword.kt"); + doTestCompiledKotlin(fileName); + } + @TestMetadata("PropagateDeepSubclass.kt") public void testPropagateDeepSubclass() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/fun/PropagateDeepSubclass.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java index 25b3dab9bcd..54574eaed30 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java @@ -2187,6 +2187,12 @@ public class JvmRuntimeDescriptorLoaderTestGenerated extends AbstractJvmRuntimeD doTest(fileName); } + @TestMetadata("OperatorKeyword.kt") + public void testOperatorKeyword() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/fun/OperatorKeyword.kt"); + doTest(fileName); + } + @TestMetadata("PropagateDeepSubclass.kt") public void testPropagateDeepSubclass() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/fun/PropagateDeepSubclass.kt"); diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaConstructorDescriptor.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaConstructorDescriptor.java index 4343f749847..82906059ba7 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaConstructorDescriptor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaConstructorDescriptor.java @@ -109,7 +109,8 @@ public class JavaConstructorDescriptor extends ConstructorDescriptorImpl impleme DescriptorsPackage.createEnhancedValueParameters(enhancedValueParametersTypes, getValueParameters(), enhanced), enhancedReturnType, getModality(), - getVisibility() + getVisibility(), + false ); return enhanced; diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java index eb1929aa019..6cc6e720ff9 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java @@ -122,7 +122,7 @@ public class JavaMethodDescriptor extends SimpleFunctionDescriptorImpl implement // 1. creates full copy of descriptor // 2. copies method's type parameters (with new containing declaration) and properly substitute to them in value parameters, return type and etc. JavaMethodDescriptor enhancedMethod = (JavaMethodDescriptor) doSubstitute( - TypeSubstitutor.EMPTY, getContainingDeclaration(), getModality(), getVisibility(), getOriginal(), + TypeSubstitutor.EMPTY, getContainingDeclaration(), getModality(), getVisibility(), false, getOriginal(), /* copyOverrides = */ true, getKind(), enhancedValueParameters, enhancedReceiverType, enhancedReturnType ); diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt index cfb4190c3bd..01bbc724821 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt @@ -126,7 +126,8 @@ public abstract class LazyJavaScope( effectiveSignature.getValueParameters(), effectiveSignature.getReturnType(), Modality.convertFromFlags(method.isAbstract(), !method.isFinal()), - method.getVisibility() + method.getVisibility(), + false ) functionDescriptorImpl.setParameterNamesStatus(effectiveSignature.hasStableParameterNames(), valueParameters.hasSynthesizedNames) 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 3c0a9ae0d36..684cbd63ba3 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionInvokeDescriptor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionInvokeDescriptor.kt @@ -60,7 +60,8 @@ public class FunctionInvokeDescriptor private constructor( .map { createValueParameter(result, it.index, it.value) }, typeParameters.last().getDefaultType(), Modality.ABSTRACT, - Visibilities.PUBLIC + Visibilities.PUBLIC, + true ) return result } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java index e256b2f93f3..64ce69fa5e6 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java @@ -40,4 +40,6 @@ public interface FunctionDescriptor extends CallableMemberDescriptor { @NotNull @Override FunctionDescriptor copy(DeclarationDescriptor newOwner, Modality modality, Visibility visibility, Kind kind, boolean copyOverrides); + + boolean isOperator(); } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ConstructorDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ConstructorDescriptorImpl.java index c820de3f8bd..2e7f47c1751 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ConstructorDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ConstructorDescriptorImpl.java @@ -59,7 +59,8 @@ public class ConstructorDescriptorImpl extends FunctionDescriptorImpl implements @NotNull List unsubstitutedValueParameters, @NotNull Visibility visibility ) { - super.initialize(null, calculateDispatchReceiverParameter(), typeParameters, unsubstitutedValueParameters, null, Modality.FINAL, visibility); + super.initialize(null, calculateDispatchReceiverParameter(), typeParameters, unsubstitutedValueParameters, null, + Modality.FINAL, visibility, false); return this; } 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 04ea67bf6f1..458fb842508 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java @@ -42,6 +42,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo private ReceiverParameterDescriptor dispatchReceiverParameter; private Modality modality; private Visibility visibility = Visibilities.UNKNOWN; + private boolean isOperator; private final Set overriddenFunctions = SmartSet.create(); private final FunctionDescriptor original; private final Kind kind; @@ -67,13 +68,15 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo @NotNull List unsubstitutedValueParameters, @Nullable JetType unsubstitutedReturnType, @Nullable Modality modality, - @NotNull Visibility visibility + @NotNull Visibility visibility, + boolean isOperator ) { this.typeParameters = UtilsPackage.toReadOnlyList(typeParameters); this.unsubstitutedValueParameters = unsubstitutedValueParameters; this.unsubstitutedReturnType = unsubstitutedReturnType; this.modality = modality; this.visibility = visibility; + this.isOperator = isOperator; this.extensionReceiverParameter = DescriptorFactory.createExtensionReceiverParameterForCallable(this, receiverParameterType); this.dispatchReceiverParameter = dispatchReceiverParameter; @@ -138,6 +141,17 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo return visibility; } + @Override + public boolean isOperator() { + if (isOperator) return true; + + for (FunctionDescriptor descriptor : overriddenFunctions) { + if (descriptor.isOperator()) return true; + } + + return false; + } + @Override public void addOverriddenDescriptor(@NotNull CallableMemberDescriptor overriddenFunction) { overriddenFunctions.add((FunctionDescriptor) overriddenFunction); @@ -187,7 +201,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo if (originalSubstitutor.isEmpty()) { return this; } - return doSubstitute(originalSubstitutor, getContainingDeclaration(), modality, visibility, getOriginal(), true, getKind()); + return doSubstitute(originalSubstitutor, getContainingDeclaration(), modality, visibility, isOperator, getOriginal(), true, getKind()); } @Nullable @@ -195,12 +209,13 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo @NotNull DeclarationDescriptor newOwner, @NotNull Modality newModality, @NotNull Visibility newVisibility, + boolean isOperator, @Nullable FunctionDescriptor original, boolean copyOverrides, @NotNull Kind kind ) { return doSubstitute(originalSubstitutor, - newOwner, newModality, newVisibility, original, copyOverrides, kind, + newOwner, newModality, newVisibility, isOperator, original, copyOverrides, kind, getValueParameters(), getExtensionReceiverParameterType(), getReturnType() ); } @@ -217,6 +232,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo @NotNull DeclarationDescriptor newOwner, @NotNull Modality newModality, @NotNull Visibility newVisibility, + boolean isOperator, @Nullable FunctionDescriptor original, boolean copyOverrides, @NotNull Kind kind, @@ -277,7 +293,8 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo substitutedValueParameters, substitutedReturnType, newModality, - newVisibility + newVisibility, + isOperator ); if (copyOverrides) { 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 2f91e4584d1..78170674389 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyAccessorDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyAccessorDescriptorImpl.java @@ -73,6 +73,11 @@ public abstract class PropertyAccessorDescriptorImpl extends DeclarationDescript return kind; } + @Override + public boolean isOperator() { + return false; + } + @NotNull @Override public FunctionDescriptor substitute(@NotNull TypeSubstitutor substitutor) { diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ScriptCodeDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ScriptCodeDescriptor.java index 954146d655e..3217da8a932 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ScriptCodeDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ScriptCodeDescriptor.java @@ -36,7 +36,8 @@ public class ScriptCodeDescriptor extends FunctionDescriptorImpl { @NotNull ReceiverParameterDescriptor dispatchReceiverParameter, @NotNull List valueParameters, @NotNull JetType returnType) { - super.initialize(null, dispatchReceiverParameter, Collections.emptyList(), valueParameters, returnType, Modality.FINAL, Visibilities.INTERNAL); + super.initialize(null, dispatchReceiverParameter, Collections.emptyList(), valueParameters, returnType, + Modality.FINAL, Visibilities.INTERNAL, /*isOperator =*/ false); } @NotNull diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/SimpleFunctionDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/SimpleFunctionDescriptorImpl.java index 4239799a2bf..36dfb094a8e 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/SimpleFunctionDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/SimpleFunctionDescriptorImpl.java @@ -58,10 +58,11 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme @NotNull List unsubstitutedValueParameters, @Nullable JetType unsubstitutedReturnType, @Nullable Modality modality, - @NotNull Visibility visibility + @NotNull Visibility visibility, + boolean isOperator ) { super.initialize(receiverParameterType, dispatchReceiverParameter, typeParameters, unsubstitutedValueParameters, - unsubstitutedReturnType, modality, visibility); + unsubstitutedReturnType, modality, visibility, isOperator); return this; } @@ -99,7 +100,7 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme boolean copyOverrides ) { return (SimpleFunctionDescriptorImpl) doSubstitute( - TypeSubstitutor.EMPTY, newOwner, modality, visibility, null, copyOverrides, kind + TypeSubstitutor.EMPTY, newOwner, modality, visibility, isOperator(), null, copyOverrides, kind ); } } diff --git a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt index f4341f1088d..94396721414 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt @@ -461,6 +461,12 @@ internal class DescriptorRendererImpl( } } + private fun renderOperator(functionDescriptor: FunctionDescriptor, builder: StringBuilder) { + if (functionDescriptor.isOperator && functionDescriptor.overriddenDescriptors.none { it.isOperator }) { + builder.append("operator ") + } + } + override fun render(declarationDescriptor: DeclarationDescriptor): String { return StringBuilder { declarationDescriptor.accept(RenderDeclarationDescriptorVisitor(), this) @@ -548,6 +554,7 @@ internal class DescriptorRendererImpl( renderAnnotations(function, builder) renderVisibility(function.getVisibility(), builder) renderModalityForCallable(function, builder) + renderOperator(function, builder) renderOverride(function, builder) renderMemberKind(function, builder) diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorFactory.java b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorFactory.java index eef377c14b1..db974947e3a 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorFactory.java +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorFactory.java @@ -102,8 +102,8 @@ public class DescriptorFactory { CallableMemberDescriptor.Kind.SYNTHESIZED, enumClass.getSource()); return values.initialize(null, null, Collections.emptyList(), Collections.emptyList(), - getBuiltIns(enumClass).getArrayType(Variance.INVARIANT, enumClass.getDefaultType()), Modality.FINAL, - Visibilities.PUBLIC); + getBuiltIns(enumClass).getArrayType(Variance.INVARIANT, enumClass.getDefaultType()), + Modality.FINAL, Visibilities.PUBLIC, false); } @NotNull @@ -116,8 +116,8 @@ public class DescriptorFactory { enumClass.getSource() ); return valueOf.initialize(null, null, Collections.emptyList(), - Collections.singletonList(parameterDescriptor), enumClass.getDefaultType(), Modality.FINAL, - Visibilities.PUBLIC); + Collections.singletonList(parameterDescriptor), enumClass.getDefaultType(), + Modality.FINAL, Visibilities.PUBLIC, false); } @Nullable diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java index b16475a1269..a9f47706615 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java @@ -423,7 +423,8 @@ public class ErrorUtils { Collections.emptyList(), // TODO createErrorType(""), Modality.OPEN, - Visibilities.INTERNAL + Visibilities.INTERNAL, + false ); return function; } diff --git a/core/deserialization/src/descriptors.proto b/core/deserialization/src/descriptors.proto index 569aca3b5d2..310dba170e4 100644 --- a/core/deserialization/src/descriptors.proto +++ b/core/deserialization/src/descriptors.proto @@ -252,6 +252,7 @@ message Callable { hasConstant isConst lateinit + isOperator */ optional int32 flags = 1; diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/Flags.java b/core/deserialization/src/org/jetbrains/kotlin/serialization/Flags.java index 3869e066c9a..7e7372ef046 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/Flags.java +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/Flags.java @@ -52,6 +52,8 @@ public class Flags { public static final FlagField LATE_INIT = FlagField.booleanAfter(IS_CONST); + public static final FlagField IS_OPERATOR = FlagField.booleanAfter(LATE_INIT); + // Parameters public static final FlagField DECLARES_DEFAULT_VALUE = FlagField.booleanAfter(HAS_ANNOTATIONS); @@ -118,7 +120,8 @@ public class Flags { boolean hasSetter, boolean hasConstant, boolean lateInit, - boolean isConst + boolean isConst, + boolean isOperator ) { return HAS_ANNOTATIONS.toFlags(hasAnnotations) | MODALITY.toFlags(modality(modality)) @@ -130,6 +133,7 @@ public class Flags { | HAS_CONSTANT.toFlags(hasConstant) | LATE_INIT.toFlags(lateInit) | IS_CONST.toFlags(isConst) + | IS_OPERATOR.toFlags(isOperator) ; } 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 23876039424..53181276d43 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt @@ -148,9 +148,10 @@ public class MemberDeserializer(private val c: DeserializationContext) { getDispatchReceiverParameter(), local.typeDeserializer.ownTypeParameters, local.memberDeserializer.valueParameters(proto, AnnotatedCallableKind.FUNCTION), - local.typeDeserializer.type(proto.getReturnType()), - Deserialization.modality(Flags.MODALITY.get(proto.getFlags())), - Deserialization.visibility(Flags.VISIBILITY.get(proto.getFlags())) + local.typeDeserializer.type(proto.returnType), + Deserialization.modality(Flags.MODALITY.get(proto.flags)), + Deserialization.visibility(Flags.VISIBILITY.get(proto.flags)), + Flags.IS_OPERATOR.get(proto.flags) ) return function } 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 874d24dd2f1..f68383b3472 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 @@ -98,7 +98,13 @@ private class CallableClsStubBuilder( val modalityModifiers = if (isModalityIrrelevant) listOf() else listOf(MODALITY) val constModifiers = if (callableKind == CallableKind.VAL) listOf(CONST) else listOf() - val relevantModifiers = listOf(VISIBILITY) + constModifiers + modalityModifiers + val additionalModifiers = when (callableKind) { + CallableKind.FUN -> arrayOf(OPERATOR) + CallableKind.VAL, CallableKind.VAR -> arrayOf(LATEINIT) + else -> emptyArray() + } + + val relevantModifiers = listOf(VISIBILITY) + constModifiers + modalityModifiers + additionalModifiers val modifierListStubImpl = createModifierListStubForDeclaration( callableStub, callableProto.getFlags(), relevantModifiers ) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/clsStubBuilding.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/clsStubBuilding.kt index cfb740a8d76..6f4c41ca989 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/clsStubBuilding.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/clsStubBuilding.kt @@ -191,6 +191,18 @@ enum class FlagsToModifiers { override fun getModifiers(flags: Int): JetModifierKeywordToken? { return if (Flags.IS_CONST.get(flags)) JetTokens.CONST_KEYWORD else null } + }, + + LATEINIT { + override fun getModifiers(flags: Int): JetModifierKeywordToken? { + return if (Flags.LATE_INIT.get(flags)) JetTokens.LATE_INIT_KEYWORD else null + } + }, + + OPERATOR { + override fun getModifiers(flags: Int): JetModifierKeywordToken? { + return if (Flags.IS_OPERATOR.get(flags)) JetTokens.OPERATOR_KEYWORD else null + } }; abstract fun getModifiers(flags: Int): JetModifierKeywordToken? diff --git a/idea/idea-completion/testData/keywords/AfterClassProperty.kt b/idea/idea-completion/testData/keywords/AfterClassProperty.kt index ebb65160a2b..f18484ed8cc 100644 --- a/idea/idea-completion/testData/keywords/AfterClassProperty.kt +++ b/idea/idea-completion/testData/keywords/AfterClassProperty.kt @@ -34,6 +34,7 @@ class MouseMovedEventArgs // EXIST: init /*why?*/ // EXIST: companion object +// EXIST: operator // EXIST: sealed // EXIST: lateinit // EXIST: data diff --git a/idea/idea-completion/testData/keywords/AfterClasses.kt b/idea/idea-completion/testData/keywords/AfterClasses.kt index ee9591a3fd0..ec355117fc7 100644 --- a/idea/idea-completion/testData/keywords/AfterClasses.kt +++ b/idea/idea-completion/testData/keywords/AfterClasses.kt @@ -37,6 +37,7 @@ class B { // EXIST: vararg /*why?*/ // EXIST: companion object +// EXIST: operator // EXIST: sealed // EXIST: lateinit // EXIST: data diff --git a/idea/idea-completion/testData/keywords/AfterFuns.kt b/idea/idea-completion/testData/keywords/AfterFuns.kt index fbe8425ac02..4c350cf8085 100644 --- a/idea/idea-completion/testData/keywords/AfterFuns.kt +++ b/idea/idea-completion/testData/keywords/AfterFuns.kt @@ -37,6 +37,7 @@ class A { // EXIST: init /*why?*/ // EXIST: companion object +// EXIST: operator // EXIST: sealed // EXIST: lateinit // EXIST: data diff --git a/idea/idea-completion/testData/keywords/GlobalPropertyAccessors.kt b/idea/idea-completion/testData/keywords/GlobalPropertyAccessors.kt index f2e5733c631..56c67da0dd0 100644 --- a/idea/idea-completion/testData/keywords/GlobalPropertyAccessors.kt +++ b/idea/idea-completion/testData/keywords/GlobalPropertyAccessors.kt @@ -37,6 +37,7 @@ var a : Int // EXIST: vararg /*why?*/ // EXIST: companion object +// EXIST: operator // EXIST: sealed // EXIST: lateinit // EXIST: data diff --git a/idea/idea-completion/testData/keywords/InClassBeforeFun.kt b/idea/idea-completion/testData/keywords/InClassBeforeFun.kt index fc57c7586cf..7dd1ab08453 100644 --- a/idea/idea-completion/testData/keywords/InClassBeforeFun.kt +++ b/idea/idea-completion/testData/keywords/InClassBeforeFun.kt @@ -35,6 +35,7 @@ public class Test { // EXIST: init /*why?*/ // EXIST: companion object +// EXIST: operator // EXIST: sealed // EXIST: lateinit // EXIST: data diff --git a/idea/idea-completion/testData/keywords/InClassScope.kt b/idea/idea-completion/testData/keywords/InClassScope.kt index 326e08dada9..5db8c9a85e1 100644 --- a/idea/idea-completion/testData/keywords/InClassScope.kt +++ b/idea/idea-completion/testData/keywords/InClassScope.kt @@ -29,6 +29,7 @@ class TestClass { // EXIST: constructor // EXIST: init // EXIST: companion object +// EXIST: operator // EXIST: sealed // EXIST: lateinit // EXIST: data diff --git a/idea/idea-completion/testData/keywords/InTopScopeAfterPackage.kt b/idea/idea-completion/testData/keywords/InTopScopeAfterPackage.kt index afd1ddbdddd..4b33a82412e 100644 --- a/idea/idea-completion/testData/keywords/InTopScopeAfterPackage.kt +++ b/idea/idea-completion/testData/keywords/InTopScopeAfterPackage.kt @@ -28,6 +28,7 @@ package Test // EXIST: vararg /*why?*/ // EXIST: companion object +// EXIST: operator // EXIST: sealed // EXIST: lateinit // EXIST: data diff --git a/idea/idea-completion/testData/keywords/PropertyAccessors.kt b/idea/idea-completion/testData/keywords/PropertyAccessors.kt index 62f28d3f622..856f32a3edc 100644 --- a/idea/idea-completion/testData/keywords/PropertyAccessors.kt +++ b/idea/idea-completion/testData/keywords/PropertyAccessors.kt @@ -33,6 +33,7 @@ class Some { // EXIST: constructor // EXIST: init // EXIST: companion object +// EXIST: operator // EXIST: sealed // EXIST: lateinit // EXIST: data diff --git a/idea/idea-completion/testData/keywords/PropertyAccessors2.kt b/idea/idea-completion/testData/keywords/PropertyAccessors2.kt index 9f36f4ef0ba..21dcb1b4fb6 100644 --- a/idea/idea-completion/testData/keywords/PropertyAccessors2.kt +++ b/idea/idea-completion/testData/keywords/PropertyAccessors2.kt @@ -33,6 +33,7 @@ class Some { // EXIST: constructor // EXIST: init // EXIST: companion object +// EXIST: operator // EXIST: sealed // EXIST: lateinit // EXIST: data diff --git a/idea/idea-completion/testData/keywords/PropertySetter.kt b/idea/idea-completion/testData/keywords/PropertySetter.kt index ad421490ba6..cb52f4b384a 100644 --- a/idea/idea-completion/testData/keywords/PropertySetter.kt +++ b/idea/idea-completion/testData/keywords/PropertySetter.kt @@ -35,6 +35,7 @@ class Some { // EXIST: constructor // EXIST: init // EXIST: companion object +// EXIST: operator // EXIST: sealed // EXIST: lateinit // EXIST: data diff --git a/idea/idea-completion/testData/keywords/TopScope.kt b/idea/idea-completion/testData/keywords/TopScope.kt index 93b72a4e8e6..fafd5cd375b 100644 --- a/idea/idea-completion/testData/keywords/TopScope.kt +++ b/idea/idea-completion/testData/keywords/TopScope.kt @@ -27,6 +27,7 @@ // EXIST: vararg /*why?*/ // EXIST: companion object +// EXIST: operator // EXIST: sealed // EXIST: lateinit // EXIST: data diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt index afb692d7393..25a9f406c35 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt @@ -415,7 +415,7 @@ class CallableBuilder(val config: CallableBuilderConfiguration) { ) } - return fakeFunction.initialize(null, null, typeParameters, Collections.emptyList(), null, null, Visibilities.INTERNAL) + return fakeFunction.initialize(null, null, typeParameters, Collections.emptyList(), null, null, Visibilities.INTERNAL, false) } private fun renderTypeCandidates( diff --git a/idea/tests/org/jetbrains/kotlin/idea/stubs/ResolveByStubTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/stubs/ResolveByStubTestGenerated.java index f5501e6f9a6..e2b06eefcba 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/stubs/ResolveByStubTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/stubs/ResolveByStubTestGenerated.java @@ -2185,6 +2185,12 @@ public class ResolveByStubTestGenerated extends AbstractResolveByStubTest { doTest(fileName); } + @TestMetadata("OperatorKeyword.kt") + public void testOperatorKeyword() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/fun/OperatorKeyword.kt"); + doTest(fileName); + } + @TestMetadata("PropagateDeepSubclass.kt") public void testPropagateDeepSubclass() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/fun/PropagateDeepSubclass.kt");