Add 'operator' keyword

This commit is contained in:
Yan Zhulanow
2015-09-16 19:59:02 +03:00
parent 4a32993cc3
commit bc727a170b
58 changed files with 179 additions and 54 deletions
@@ -47,7 +47,8 @@ public class AccessorForConstructorDescriptor(
copyValueParameters(calleeDescriptor), copyValueParameters(calleeDescriptor),
calleeDescriptor.returnType, calleeDescriptor.returnType,
Modality.FINAL, Modality.FINAL,
Visibilities.INTERNAL Visibilities.INTERNAL,
false
) )
} }
} }
@@ -47,7 +47,8 @@ public class AccessorForFunctionDescriptor extends AbstractAccessorForFunctionDe
copyValueParameters(descriptor), copyValueParameters(descriptor),
descriptor.getReturnType(), descriptor.getReturnType(),
Modality.FINAL, Modality.FINAL,
Visibilities.INTERNAL); Visibilities.INTERNAL,
descriptor.isOperator());
} }
@NotNull @NotNull
@@ -197,8 +197,8 @@ public class ClosureCodegen extends MemberCodegen<JetElement> {
descriptorForBridges descriptorForBridges
.initialize(null, erasedInterfaceFunction.getDispatchReceiverParameter(), erasedInterfaceFunction.getTypeParameters(), .initialize(null, erasedInterfaceFunction.getDispatchReceiverParameter(), erasedInterfaceFunction.getTypeParameters(),
erasedInterfaceFunction.getValueParameters(), erasedInterfaceFunction.getReturnType(), Modality.OPEN, erasedInterfaceFunction.getValueParameters(), erasedInterfaceFunction.getReturnType(),
erasedInterfaceFunction.getVisibility()); Modality.OPEN, erasedInterfaceFunction.getVisibility(), false);
descriptorForBridges.addOverriddenDescriptor(erasedInterfaceFunction); descriptorForBridges.addOverriddenDescriptor(erasedInterfaceFunction);
functionCodegen.generateBridges(descriptorForBridges); functionCodegen.generateBridges(descriptorForBridges);
@@ -337,7 +337,7 @@ public abstract class MemberCodegen<T extends JetElement/* TODO: & JetDeclaratio
clInit.initialize(null, null, Collections.<TypeParameterDescriptor>emptyList(), clInit.initialize(null, null, Collections.<TypeParameterDescriptor>emptyList(),
Collections.<ValueParameterDescriptor>emptyList(), Collections.<ValueParameterDescriptor>emptyList(),
DescriptorUtilPackage.getModule(descriptor).getBuiltIns().getUnitType(), 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); this.clInit = new ExpressionCodegen(mv, new FrameMap(), Type.VOID_TYPE, context.intoFunction(clInit), state, this);
} }
@@ -150,7 +150,7 @@ public class PropertyReferenceCodegen(
SourceElement.NO_SOURCE SourceElement.NO_SOURCE
) )
fakeDescriptor.initialize(null, classDescriptor.getThisAsReceiverParameter(), emptyList(), emptyList(), 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( val fakeCodegen = ExpressionCodegen(
this, FrameMap(), OBJECT_TYPE, context.intoFunction(fakeDescriptor), state, this@PropertyReferenceCodegen this, FrameMap(), OBJECT_TYPE, context.intoFunction(fakeDescriptor), state, this@PropertyReferenceCodegen
@@ -162,8 +162,8 @@ public class SamWrapperCodegen {
descriptorForBridges descriptorForBridges
.initialize(null, originalInterfaceErased.getDispatchReceiverParameter(), originalInterfaceErased.getTypeParameters(), .initialize(null, originalInterfaceErased.getDispatchReceiverParameter(), originalInterfaceErased.getTypeParameters(),
originalInterfaceErased.getValueParameters(), originalInterfaceErased.getReturnType(), Modality.OPEN, originalInterfaceErased.getValueParameters(), originalInterfaceErased.getReturnType(),
originalInterfaceErased.getVisibility()); Modality.OPEN, originalInterfaceErased.getVisibility(), false);
descriptorForBridges.addOverriddenDescriptor(originalInterfaceErased); descriptorForBridges.addOverriddenDescriptor(originalInterfaceErased);
codegen.generateBridges(descriptorForBridges); codegen.generateBridges(descriptorForBridges);
@@ -170,7 +170,8 @@ public class SingleAbstractMethodUtils {
Arrays.asList(parameter), Arrays.asList(parameter),
returnType, returnType,
Modality.FINAL, Modality.FINAL,
samInterface.getVisibility() samInterface.getVisibility(),
false
); );
return result; return result;
@@ -206,7 +207,8 @@ public class SingleAbstractMethodUtils {
valueParameters, valueParameters,
returnType, returnType,
Modality.FINAL, Modality.FINAL,
original.getVisibility() original.getVisibility(),
false
); );
} }
}); });
@@ -116,7 +116,8 @@ public class SignaturesPropagationData {
autoValueParameters, autoValueParameters,
autoReturnType, autoReturnType,
Modality.OPEN, Modality.OPEN,
Visibilities.PUBLIC Visibilities.PUBLIC,
false
); );
return autoMethodDescriptor; return autoMethodDescriptor;
} }
@@ -128,7 +128,7 @@ class SamAdapterFunctionsScope(storageManager: StorageManager) : JetScope by Jet
val visibility = syntheticExtensionVisibility(sourceFunction) 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 return descriptor
} }
@@ -148,6 +148,7 @@ class SamAdapterFunctionsScope(storageManager: StorageManager) : JetScope by Jet
newOwner: DeclarationDescriptor, newOwner: DeclarationDescriptor,
newModality: Modality, newModality: Modality,
newVisibility: Visibility, newVisibility: Visibility,
newIsOperator: Boolean,
original: FunctionDescriptor?, original: FunctionDescriptor?,
copyOverrides: Boolean, copyOverrides: Boolean,
kind: CallableMemberDescriptor.Kind, kind: CallableMemberDescriptor.Kind,
@@ -156,7 +157,7 @@ class SamAdapterFunctionsScope(storageManager: StorageManager) : JetScope by Jet
newReturnType: JetType newReturnType: JetType
): FunctionDescriptor? { ): FunctionDescriptor? {
val descriptor = super<SimpleFunctionDescriptorImpl>.doSubstitute( val descriptor = super<SimpleFunctionDescriptorImpl>.doSubstitute(
originalSubstitutor, newOwner, newModality, newVisibility, original, originalSubstitutor, newOwner, newModality, newVisibility, newIsOperator, original,
copyOverrides, kind, newValueParameterDescriptors, newExtensionReceiverParameterType, newReturnType) copyOverrides, kind, newValueParameterDescriptors, newExtensionReceiverParameterType, newReturnType)
as MyFunctionDescriptor? ?: return null as MyFunctionDescriptor? ?: return null
@@ -176,6 +176,7 @@ public interface JetTokens {
JetModifierKeywordToken EXTERNAL_KEYWORD = JetModifierKeywordToken.softKeywordModifier("external"); JetModifierKeywordToken EXTERNAL_KEYWORD = JetModifierKeywordToken.softKeywordModifier("external");
JetModifierKeywordToken ANNOTATION_KEYWORD = JetModifierKeywordToken.softKeywordModifier("annotation"); JetModifierKeywordToken ANNOTATION_KEYWORD = JetModifierKeywordToken.softKeywordModifier("annotation");
JetModifierKeywordToken CROSSINLINE_KEYWORD = JetModifierKeywordToken.softKeywordModifier("crossinline"); JetModifierKeywordToken CROSSINLINE_KEYWORD = JetModifierKeywordToken.softKeywordModifier("crossinline");
JetModifierKeywordToken OPERATOR_KEYWORD = JetModifierKeywordToken.softKeywordModifier("operator");
JetModifierKeywordToken CONST_KEYWORD = JetModifierKeywordToken.softKeywordModifier("const"); JetModifierKeywordToken CONST_KEYWORD = JetModifierKeywordToken.softKeywordModifier("const");
@@ -196,7 +197,7 @@ public interface JetTokens {
FIELD_KEYWORD, PROPERTY_KEYWORD, RECEIVER_KEYWORD, PARAM_KEYWORD, SPARAM_KEYWORD, FIELD_KEYWORD, PROPERTY_KEYWORD, RECEIVER_KEYWORD, PARAM_KEYWORD, SPARAM_KEYWORD,
LATE_INIT_KEYWORD, LATE_INIT_KEYWORD,
DATA_KEYWORD, INLINE_KEYWORD, NOINLINE_KEYWORD, TAILREC_KEYWORD, EXTERNAL_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, PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD, OUT_KEYWORD, IN_KEYWORD, FINAL_KEYWORD, VARARG_KEYWORD,
REIFIED_KEYWORD, COMPANION_KEYWORD, SEALED_KEYWORD, LATE_INIT_KEYWORD, REIFIED_KEYWORD, COMPANION_KEYWORD, SEALED_KEYWORD, LATE_INIT_KEYWORD,
DATA_KEYWORD, INLINE_KEYWORD, NOINLINE_KEYWORD, TAILREC_KEYWORD, EXTERNAL_KEYWORD, ANNOTATION_KEYWORD, CROSSINLINE_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 // Please synchronize this array with org.jetbrains.kotlin.descriptors.annotations.ANNOTATION_MODIFIERS_FQ_NAMES
@@ -34,7 +34,7 @@ import org.jetbrains.kotlin.psi.stubs.KotlinFileStub;
import java.io.IOException; import java.io.IOException;
public class JetFileElementType extends IStubFileElementType<KotlinFileStub> { public class JetFileElementType extends IStubFileElementType<KotlinFileStub> {
public static final int STUB_VERSION = 58; public static final int STUB_VERSION = 59;
private static final String NAME = "kotlin.FILE"; private static final String NAME = "kotlin.FILE";
@@ -241,7 +241,8 @@ public class DescriptorResolver {
Collections.<ValueParameterDescriptor>emptyList(), Collections.<ValueParameterDescriptor>emptyList(),
returnType, returnType,
Modality.FINAL, Modality.FINAL,
property.getVisibility() property.getVisibility(),
false
); );
trace.record(BindingContext.DATA_CLASS_COMPONENT_FUNCTION, parameter, functionDescriptor); trace.record(BindingContext.DATA_CLASS_COMPONENT_FUNCTION, parameter, functionDescriptor);
@@ -289,7 +290,8 @@ public class DescriptorResolver {
parameterDescriptors, parameterDescriptors,
returnType, returnType,
Modality.FINAL, Modality.FINAL,
Visibilities.PUBLIC Visibilities.PUBLIC,
false
); );
trace.record(BindingContext.DATA_CLASS_COPY_FUNCTION, classDescriptor, functionDescriptor); trace.record(BindingContext.DATA_CLASS_COPY_FUNCTION, classDescriptor, functionDescriptor);
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl.create
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
import org.jetbrains.kotlin.diagnostics.DiagnosticUtils import org.jetbrains.kotlin.diagnostics.DiagnosticUtils
import org.jetbrains.kotlin.diagnostics.Errors.* import org.jetbrains.kotlin.diagnostics.Errors.*
import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.DescriptorResolver.* import org.jetbrains.kotlin.resolve.DescriptorResolver.*
@@ -170,7 +171,8 @@ class FunctionDescriptorResolver(
valueParameterDescriptors, valueParameterDescriptors,
returnType, returnType,
modality, modality,
visibility visibility,
function.hasModifier(JetTokens.OPERATOR_KEYWORD)
) )
receiverType?.let { ForceResolveUtil.forceResolveAllContents(it.getAnnotations()) } receiverType?.let { ForceResolveUtil.forceResolveAllContents(it.getAnnotations()) }
for (valueParameterDescriptor in valueParameterDescriptors) { for (valueParameterDescriptor in valueParameterDescriptors) {
@@ -103,7 +103,8 @@ public class FunctionDescriptorUtil {
KotlinBuiltIns.getValueParameters(functionDescriptor, functionType), KotlinBuiltIns.getValueParameters(functionDescriptor, functionType),
KotlinBuiltIns.getReturnTypeFromFunctionType(functionType), KotlinBuiltIns.getReturnTypeFromFunctionType(functionType),
modality, modality,
visibility); visibility,
false);
} }
public static <D extends CallableDescriptor> D alphaConvertTypeParameters(D candidate) { public static <D extends CallableDescriptor> D alphaConvertTypeParameters(D candidate) {
@@ -155,7 +156,8 @@ public class FunctionDescriptorUtil {
parameters, parameters,
function.getReturnType(), function.getReturnType(),
function.getModality(), function.getModality(),
function.getVisibility()); function.getVisibility(),
function.isOperator());
return descriptor; return descriptor;
} }
} }
@@ -66,7 +66,8 @@ public object ModifierCheckerCore {
EXTERNAL_KEYWORD to EnumSet.of(FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER), EXTERNAL_KEYWORD to EnumSet.of(FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER),
ANNOTATION_KEYWORD to EnumSet.of(ANNOTATION_CLASS), ANNOTATION_KEYWORD to EnumSet.of(ANNOTATION_CLASS),
CROSSINLINE_KEYWORD to EnumSet.of(VALUE_PARAMETER), 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! // NOTE: redundant targets must be possible!
@@ -129,7 +129,8 @@ object DynamicCallableDescriptors {
createValueParameters(functionDescriptor, call), createValueParameters(functionDescriptor, call),
DynamicType, DynamicType,
Modality.FINAL, Modality.FINAL,
Visibilities.PUBLIC Visibilities.PUBLIC,
false
) )
return functionDescriptor return functionDescriptor
} }
@@ -80,7 +80,8 @@ private fun createSynthesizedFunctionWithFirstParameterAsReceiver(descriptor: Fu
}, },
original.getReturnType(), original.getReturnType(),
original.getModality(), original.getModality(),
original.getVisibility() original.getVisibility(),
original.isOperator
) )
return result return result
@@ -124,7 +124,8 @@ public class ControlStructureTypingUtils {
valueParameters, valueParameters,
type, type,
Modality.FINAL, Modality.FINAL,
Visibilities.PUBLIC Visibilities.PUBLIC,
false
); );
return function; return function;
} }
@@ -180,6 +180,11 @@ public class DescriptorSerializer {
boolean hasConstant = false; boolean hasConstant = false;
boolean lateInit = false; boolean lateInit = false;
boolean isConst = false; boolean isConst = false;
boolean isOperator = false;
if (descriptor instanceof FunctionDescriptor) {
isOperator = ((FunctionDescriptor) descriptor).isOperator();
}
if (descriptor instanceof PropertyDescriptor) { if (descriptor instanceof PropertyDescriptor) {
PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor; PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor;
@@ -235,7 +240,8 @@ public class DescriptorSerializer {
hasSetter, hasSetter,
hasConstant, hasConstant,
lateInit, lateInit,
isConst isConst,
isOperator
)); ));
for (TypeParameterDescriptor typeParameterDescriptor : descriptor.getTypeParameters()) { for (TypeParameterDescriptor typeParameterDescriptor : descriptor.getTypeParameters()) {
@@ -0,0 +1,5 @@
package test
class Example {
operator fun plus(other: Example) {}
}
@@ -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
}
@@ -5,7 +5,7 @@ fun bar(f: Int.()->Unit) {
Resolved call: 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 Explicit receiver kind = BOTH_RECEIVERS
Dispatch receiver = f {[@kotlin.Extension] Function1<Int, Unit>} Dispatch receiver = f {[@kotlin.Extension] Function1<Int, Unit>}
@@ -5,7 +5,7 @@ fun bar(f: ()->Unit) {
Resolved call: 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 Explicit receiver kind = DISPATCH_RECEIVER
Dispatch receiver = f {Function0<Unit>} Dispatch receiver = f {Function0<Unit>}
@@ -9,7 +9,7 @@ interface A {
Resolved call: 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 Explicit receiver kind = BOTH_RECEIVERS
Dispatch receiver = foo {[@kotlin.Extension] Function1<Int, Unit>} Dispatch receiver = foo {[@kotlin.Extension] Function1<Int, Unit>}
@@ -9,7 +9,7 @@ fun test(a: A) {
Resolved call: 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 Explicit receiver kind = DISPATCH_RECEIVER
Dispatch receiver = foo {Function1<Int, Int>} Dispatch receiver = foo {Function1<Int, Int>}
@@ -4078,6 +4078,12 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest {
doTestCompiledKotlin(fileName); 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") @TestMetadata("PropagateDeepSubclass.kt")
public void testPropagateDeepSubclass() throws Exception { public void testPropagateDeepSubclass() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/fun/PropagateDeepSubclass.kt"); String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/fun/PropagateDeepSubclass.kt");
@@ -2187,6 +2187,12 @@ public class JvmRuntimeDescriptorLoaderTestGenerated extends AbstractJvmRuntimeD
doTest(fileName); 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") @TestMetadata("PropagateDeepSubclass.kt")
public void testPropagateDeepSubclass() throws Exception { public void testPropagateDeepSubclass() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/fun/PropagateDeepSubclass.kt"); String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/fun/PropagateDeepSubclass.kt");
@@ -109,7 +109,8 @@ public class JavaConstructorDescriptor extends ConstructorDescriptorImpl impleme
DescriptorsPackage.createEnhancedValueParameters(enhancedValueParametersTypes, getValueParameters(), enhanced), DescriptorsPackage.createEnhancedValueParameters(enhancedValueParametersTypes, getValueParameters(), enhanced),
enhancedReturnType, enhancedReturnType,
getModality(), getModality(),
getVisibility() getVisibility(),
false
); );
return enhanced; return enhanced;
@@ -122,7 +122,7 @@ public class JavaMethodDescriptor extends SimpleFunctionDescriptorImpl implement
// 1. creates full copy of descriptor // 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. // 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( JavaMethodDescriptor enhancedMethod = (JavaMethodDescriptor) doSubstitute(
TypeSubstitutor.EMPTY, getContainingDeclaration(), getModality(), getVisibility(), getOriginal(), TypeSubstitutor.EMPTY, getContainingDeclaration(), getModality(), getVisibility(), false, getOriginal(),
/* copyOverrides = */ true, getKind(), /* copyOverrides = */ true, getKind(),
enhancedValueParameters, enhancedReceiverType, enhancedReturnType enhancedValueParameters, enhancedReceiverType, enhancedReturnType
); );
@@ -126,7 +126,8 @@ public abstract class LazyJavaScope(
effectiveSignature.getValueParameters(), effectiveSignature.getValueParameters(),
effectiveSignature.getReturnType(), effectiveSignature.getReturnType(),
Modality.convertFromFlags(method.isAbstract(), !method.isFinal()), Modality.convertFromFlags(method.isAbstract(), !method.isFinal()),
method.getVisibility() method.getVisibility(),
false
) )
functionDescriptorImpl.setParameterNamesStatus(effectiveSignature.hasStableParameterNames(), valueParameters.hasSynthesizedNames) functionDescriptorImpl.setParameterNamesStatus(effectiveSignature.hasStableParameterNames(), valueParameters.hasSynthesizedNames)
@@ -60,7 +60,8 @@ public class FunctionInvokeDescriptor private constructor(
.map { createValueParameter(result, it.index, it.value) }, .map { createValueParameter(result, it.index, it.value) },
typeParameters.last().getDefaultType(), typeParameters.last().getDefaultType(),
Modality.ABSTRACT, Modality.ABSTRACT,
Visibilities.PUBLIC Visibilities.PUBLIC,
true
) )
return result return result
} }
@@ -40,4 +40,6 @@ public interface FunctionDescriptor extends CallableMemberDescriptor {
@NotNull @NotNull
@Override @Override
FunctionDescriptor copy(DeclarationDescriptor newOwner, Modality modality, Visibility visibility, Kind kind, boolean copyOverrides); FunctionDescriptor copy(DeclarationDescriptor newOwner, Modality modality, Visibility visibility, Kind kind, boolean copyOverrides);
boolean isOperator();
} }
@@ -59,7 +59,8 @@ public class ConstructorDescriptorImpl extends FunctionDescriptorImpl implements
@NotNull List<ValueParameterDescriptor> unsubstitutedValueParameters, @NotNull List<ValueParameterDescriptor> unsubstitutedValueParameters,
@NotNull Visibility visibility @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; return this;
} }
@@ -42,6 +42,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
private ReceiverParameterDescriptor dispatchReceiverParameter; private ReceiverParameterDescriptor dispatchReceiverParameter;
private Modality modality; private Modality modality;
private Visibility visibility = Visibilities.UNKNOWN; private Visibility visibility = Visibilities.UNKNOWN;
private boolean isOperator;
private final Set<FunctionDescriptor> overriddenFunctions = SmartSet.create(); private final Set<FunctionDescriptor> overriddenFunctions = SmartSet.create();
private final FunctionDescriptor original; private final FunctionDescriptor original;
private final Kind kind; private final Kind kind;
@@ -67,13 +68,15 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
@NotNull List<ValueParameterDescriptor> unsubstitutedValueParameters, @NotNull List<ValueParameterDescriptor> unsubstitutedValueParameters,
@Nullable JetType unsubstitutedReturnType, @Nullable JetType unsubstitutedReturnType,
@Nullable Modality modality, @Nullable Modality modality,
@NotNull Visibility visibility @NotNull Visibility visibility,
boolean isOperator
) { ) {
this.typeParameters = UtilsPackage.toReadOnlyList(typeParameters); this.typeParameters = UtilsPackage.toReadOnlyList(typeParameters);
this.unsubstitutedValueParameters = unsubstitutedValueParameters; this.unsubstitutedValueParameters = unsubstitutedValueParameters;
this.unsubstitutedReturnType = unsubstitutedReturnType; this.unsubstitutedReturnType = unsubstitutedReturnType;
this.modality = modality; this.modality = modality;
this.visibility = visibility; this.visibility = visibility;
this.isOperator = isOperator;
this.extensionReceiverParameter = DescriptorFactory.createExtensionReceiverParameterForCallable(this, receiverParameterType); this.extensionReceiverParameter = DescriptorFactory.createExtensionReceiverParameterForCallable(this, receiverParameterType);
this.dispatchReceiverParameter = dispatchReceiverParameter; this.dispatchReceiverParameter = dispatchReceiverParameter;
@@ -138,6 +141,17 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
return visibility; return visibility;
} }
@Override
public boolean isOperator() {
if (isOperator) return true;
for (FunctionDescriptor descriptor : overriddenFunctions) {
if (descriptor.isOperator()) return true;
}
return false;
}
@Override @Override
public void addOverriddenDescriptor(@NotNull CallableMemberDescriptor overriddenFunction) { public void addOverriddenDescriptor(@NotNull CallableMemberDescriptor overriddenFunction) {
overriddenFunctions.add((FunctionDescriptor) overriddenFunction); overriddenFunctions.add((FunctionDescriptor) overriddenFunction);
@@ -187,7 +201,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
if (originalSubstitutor.isEmpty()) { if (originalSubstitutor.isEmpty()) {
return this; return this;
} }
return doSubstitute(originalSubstitutor, getContainingDeclaration(), modality, visibility, getOriginal(), true, getKind()); return doSubstitute(originalSubstitutor, getContainingDeclaration(), modality, visibility, isOperator, getOriginal(), true, getKind());
} }
@Nullable @Nullable
@@ -195,12 +209,13 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
@NotNull DeclarationDescriptor newOwner, @NotNull DeclarationDescriptor newOwner,
@NotNull Modality newModality, @NotNull Modality newModality,
@NotNull Visibility newVisibility, @NotNull Visibility newVisibility,
boolean isOperator,
@Nullable FunctionDescriptor original, @Nullable FunctionDescriptor original,
boolean copyOverrides, boolean copyOverrides,
@NotNull Kind kind @NotNull Kind kind
) { ) {
return doSubstitute(originalSubstitutor, return doSubstitute(originalSubstitutor,
newOwner, newModality, newVisibility, original, copyOverrides, kind, newOwner, newModality, newVisibility, isOperator, original, copyOverrides, kind,
getValueParameters(), getExtensionReceiverParameterType(), getReturnType() getValueParameters(), getExtensionReceiverParameterType(), getReturnType()
); );
} }
@@ -217,6 +232,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
@NotNull DeclarationDescriptor newOwner, @NotNull DeclarationDescriptor newOwner,
@NotNull Modality newModality, @NotNull Modality newModality,
@NotNull Visibility newVisibility, @NotNull Visibility newVisibility,
boolean isOperator,
@Nullable FunctionDescriptor original, @Nullable FunctionDescriptor original,
boolean copyOverrides, boolean copyOverrides,
@NotNull Kind kind, @NotNull Kind kind,
@@ -277,7 +293,8 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
substitutedValueParameters, substitutedValueParameters,
substitutedReturnType, substitutedReturnType,
newModality, newModality,
newVisibility newVisibility,
isOperator
); );
if (copyOverrides) { if (copyOverrides) {
@@ -73,6 +73,11 @@ public abstract class PropertyAccessorDescriptorImpl extends DeclarationDescript
return kind; return kind;
} }
@Override
public boolean isOperator() {
return false;
}
@NotNull @NotNull
@Override @Override
public FunctionDescriptor substitute(@NotNull TypeSubstitutor substitutor) { public FunctionDescriptor substitute(@NotNull TypeSubstitutor substitutor) {
@@ -36,7 +36,8 @@ public class ScriptCodeDescriptor extends FunctionDescriptorImpl {
@NotNull ReceiverParameterDescriptor dispatchReceiverParameter, @NotNull ReceiverParameterDescriptor dispatchReceiverParameter,
@NotNull List<ValueParameterDescriptor> valueParameters, @NotNull List<ValueParameterDescriptor> valueParameters,
@NotNull JetType returnType) { @NotNull JetType returnType) {
super.initialize(null, dispatchReceiverParameter, Collections.<TypeParameterDescriptor>emptyList(), valueParameters, returnType, Modality.FINAL, Visibilities.INTERNAL); super.initialize(null, dispatchReceiverParameter, Collections.<TypeParameterDescriptor>emptyList(), valueParameters, returnType,
Modality.FINAL, Visibilities.INTERNAL, /*isOperator =*/ false);
} }
@NotNull @NotNull
@@ -58,10 +58,11 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme
@NotNull List<ValueParameterDescriptor> unsubstitutedValueParameters, @NotNull List<ValueParameterDescriptor> unsubstitutedValueParameters,
@Nullable JetType unsubstitutedReturnType, @Nullable JetType unsubstitutedReturnType,
@Nullable Modality modality, @Nullable Modality modality,
@NotNull Visibility visibility @NotNull Visibility visibility,
boolean isOperator
) { ) {
super.initialize(receiverParameterType, dispatchReceiverParameter, typeParameters, unsubstitutedValueParameters, super.initialize(receiverParameterType, dispatchReceiverParameter, typeParameters, unsubstitutedValueParameters,
unsubstitutedReturnType, modality, visibility); unsubstitutedReturnType, modality, visibility, isOperator);
return this; return this;
} }
@@ -99,7 +100,7 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme
boolean copyOverrides boolean copyOverrides
) { ) {
return (SimpleFunctionDescriptorImpl) doSubstitute( return (SimpleFunctionDescriptorImpl) doSubstitute(
TypeSubstitutor.EMPTY, newOwner, modality, visibility, null, copyOverrides, kind TypeSubstitutor.EMPTY, newOwner, modality, visibility, isOperator(), null, copyOverrides, kind
); );
} }
} }
@@ -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 { override fun render(declarationDescriptor: DeclarationDescriptor): String {
return StringBuilder { return StringBuilder {
declarationDescriptor.accept(RenderDeclarationDescriptorVisitor(), this) declarationDescriptor.accept(RenderDeclarationDescriptorVisitor(), this)
@@ -548,6 +554,7 @@ internal class DescriptorRendererImpl(
renderAnnotations(function, builder) renderAnnotations(function, builder)
renderVisibility(function.getVisibility(), builder) renderVisibility(function.getVisibility(), builder)
renderModalityForCallable(function, builder) renderModalityForCallable(function, builder)
renderOperator(function, builder)
renderOverride(function, builder) renderOverride(function, builder)
renderMemberKind(function, builder) renderMemberKind(function, builder)
@@ -102,8 +102,8 @@ public class DescriptorFactory {
CallableMemberDescriptor.Kind.SYNTHESIZED, enumClass.getSource()); CallableMemberDescriptor.Kind.SYNTHESIZED, enumClass.getSource());
return values.initialize(null, null, Collections.<TypeParameterDescriptor>emptyList(), return values.initialize(null, null, Collections.<TypeParameterDescriptor>emptyList(),
Collections.<ValueParameterDescriptor>emptyList(), Collections.<ValueParameterDescriptor>emptyList(),
getBuiltIns(enumClass).getArrayType(Variance.INVARIANT, enumClass.getDefaultType()), Modality.FINAL, getBuiltIns(enumClass).getArrayType(Variance.INVARIANT, enumClass.getDefaultType()),
Visibilities.PUBLIC); Modality.FINAL, Visibilities.PUBLIC, false);
} }
@NotNull @NotNull
@@ -116,8 +116,8 @@ public class DescriptorFactory {
enumClass.getSource() enumClass.getSource()
); );
return valueOf.initialize(null, null, Collections.<TypeParameterDescriptor>emptyList(), return valueOf.initialize(null, null, Collections.<TypeParameterDescriptor>emptyList(),
Collections.singletonList(parameterDescriptor), enumClass.getDefaultType(), Modality.FINAL, Collections.singletonList(parameterDescriptor), enumClass.getDefaultType(),
Visibilities.PUBLIC); Modality.FINAL, Visibilities.PUBLIC, false);
} }
@Nullable @Nullable
@@ -423,7 +423,8 @@ public class ErrorUtils {
Collections.<ValueParameterDescriptor>emptyList(), // TODO Collections.<ValueParameterDescriptor>emptyList(), // TODO
createErrorType("<ERROR FUNCTION RETURN TYPE>"), createErrorType("<ERROR FUNCTION RETURN TYPE>"),
Modality.OPEN, Modality.OPEN,
Visibilities.INTERNAL Visibilities.INTERNAL,
false
); );
return function; return function;
} }
@@ -252,6 +252,7 @@ message Callable {
hasConstant hasConstant
isConst isConst
lateinit lateinit
isOperator
*/ */
optional int32 flags = 1; optional int32 flags = 1;
@@ -52,6 +52,8 @@ public class Flags {
public static final FlagField<Boolean> LATE_INIT = FlagField.booleanAfter(IS_CONST); public static final FlagField<Boolean> LATE_INIT = FlagField.booleanAfter(IS_CONST);
public static final FlagField<Boolean> IS_OPERATOR = FlagField.booleanAfter(LATE_INIT);
// Parameters // Parameters
public static final FlagField<Boolean> DECLARES_DEFAULT_VALUE = FlagField.booleanAfter(HAS_ANNOTATIONS); public static final FlagField<Boolean> DECLARES_DEFAULT_VALUE = FlagField.booleanAfter(HAS_ANNOTATIONS);
@@ -118,7 +120,8 @@ public class Flags {
boolean hasSetter, boolean hasSetter,
boolean hasConstant, boolean hasConstant,
boolean lateInit, boolean lateInit,
boolean isConst boolean isConst,
boolean isOperator
) { ) {
return HAS_ANNOTATIONS.toFlags(hasAnnotations) return HAS_ANNOTATIONS.toFlags(hasAnnotations)
| MODALITY.toFlags(modality(modality)) | MODALITY.toFlags(modality(modality))
@@ -130,6 +133,7 @@ public class Flags {
| HAS_CONSTANT.toFlags(hasConstant) | HAS_CONSTANT.toFlags(hasConstant)
| LATE_INIT.toFlags(lateInit) | LATE_INIT.toFlags(lateInit)
| IS_CONST.toFlags(isConst) | IS_CONST.toFlags(isConst)
| IS_OPERATOR.toFlags(isOperator)
; ;
} }
@@ -148,9 +148,10 @@ public class MemberDeserializer(private val c: DeserializationContext) {
getDispatchReceiverParameter(), getDispatchReceiverParameter(),
local.typeDeserializer.ownTypeParameters, local.typeDeserializer.ownTypeParameters,
local.memberDeserializer.valueParameters(proto, AnnotatedCallableKind.FUNCTION), local.memberDeserializer.valueParameters(proto, AnnotatedCallableKind.FUNCTION),
local.typeDeserializer.type(proto.getReturnType()), local.typeDeserializer.type(proto.returnType),
Deserialization.modality(Flags.MODALITY.get(proto.getFlags())), Deserialization.modality(Flags.MODALITY.get(proto.flags)),
Deserialization.visibility(Flags.VISIBILITY.get(proto.getFlags())) Deserialization.visibility(Flags.VISIBILITY.get(proto.flags)),
Flags.IS_OPERATOR.get(proto.flags)
) )
return function return function
} }
@@ -98,7 +98,13 @@ private class CallableClsStubBuilder(
val modalityModifiers = if (isModalityIrrelevant) listOf() else listOf(MODALITY) val modalityModifiers = if (isModalityIrrelevant) listOf() else listOf(MODALITY)
val constModifiers = if (callableKind == CallableKind.VAL) listOf(CONST) else listOf() 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<FlagsToModifiers>()
}
val relevantModifiers = listOf(VISIBILITY) + constModifiers + modalityModifiers + additionalModifiers
val modifierListStubImpl = createModifierListStubForDeclaration( val modifierListStubImpl = createModifierListStubForDeclaration(
callableStub, callableProto.getFlags(), relevantModifiers callableStub, callableProto.getFlags(), relevantModifiers
) )
@@ -191,6 +191,18 @@ enum class FlagsToModifiers {
override fun getModifiers(flags: Int): JetModifierKeywordToken? { override fun getModifiers(flags: Int): JetModifierKeywordToken? {
return if (Flags.IS_CONST.get(flags)) JetTokens.CONST_KEYWORD else null 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? abstract fun getModifiers(flags: Int): JetModifierKeywordToken?
@@ -34,6 +34,7 @@ class MouseMovedEventArgs
// EXIST: init // EXIST: init
/*why?*/ /*why?*/
// EXIST: companion object // EXIST: companion object
// EXIST: operator
// EXIST: sealed // EXIST: sealed
// EXIST: lateinit // EXIST: lateinit
// EXIST: data // EXIST: data
@@ -37,6 +37,7 @@ class B {
// EXIST: vararg // EXIST: vararg
/*why?*/ /*why?*/
// EXIST: companion object // EXIST: companion object
// EXIST: operator
// EXIST: sealed // EXIST: sealed
// EXIST: lateinit // EXIST: lateinit
// EXIST: data // EXIST: data
+1
View File
@@ -37,6 +37,7 @@ class A {
// EXIST: init // EXIST: init
/*why?*/ /*why?*/
// EXIST: companion object // EXIST: companion object
// EXIST: operator
// EXIST: sealed // EXIST: sealed
// EXIST: lateinit // EXIST: lateinit
// EXIST: data // EXIST: data
@@ -37,6 +37,7 @@ var a : Int
// EXIST: vararg // EXIST: vararg
/*why?*/ /*why?*/
// EXIST: companion object // EXIST: companion object
// EXIST: operator
// EXIST: sealed // EXIST: sealed
// EXIST: lateinit // EXIST: lateinit
// EXIST: data // EXIST: data
@@ -35,6 +35,7 @@ public class Test {
// EXIST: init // EXIST: init
/*why?*/ /*why?*/
// EXIST: companion object // EXIST: companion object
// EXIST: operator
// EXIST: sealed // EXIST: sealed
// EXIST: lateinit // EXIST: lateinit
// EXIST: data // EXIST: data
@@ -29,6 +29,7 @@ class TestClass {
// EXIST: constructor // EXIST: constructor
// EXIST: init // EXIST: init
// EXIST: companion object // EXIST: companion object
// EXIST: operator
// EXIST: sealed // EXIST: sealed
// EXIST: lateinit // EXIST: lateinit
// EXIST: data // EXIST: data
@@ -28,6 +28,7 @@ package Test
// EXIST: vararg // EXIST: vararg
/*why?*/ /*why?*/
// EXIST: companion object // EXIST: companion object
// EXIST: operator
// EXIST: sealed // EXIST: sealed
// EXIST: lateinit // EXIST: lateinit
// EXIST: data // EXIST: data
@@ -33,6 +33,7 @@ class Some {
// EXIST: constructor // EXIST: constructor
// EXIST: init // EXIST: init
// EXIST: companion object // EXIST: companion object
// EXIST: operator
// EXIST: sealed // EXIST: sealed
// EXIST: lateinit // EXIST: lateinit
// EXIST: data // EXIST: data
@@ -33,6 +33,7 @@ class Some {
// EXIST: constructor // EXIST: constructor
// EXIST: init // EXIST: init
// EXIST: companion object // EXIST: companion object
// EXIST: operator
// EXIST: sealed // EXIST: sealed
// EXIST: lateinit // EXIST: lateinit
// EXIST: data // EXIST: data
@@ -35,6 +35,7 @@ class Some {
// EXIST: constructor // EXIST: constructor
// EXIST: init // EXIST: init
// EXIST: companion object // EXIST: companion object
// EXIST: operator
// EXIST: sealed // EXIST: sealed
// EXIST: lateinit // EXIST: lateinit
// EXIST: data // EXIST: data
+1
View File
@@ -27,6 +27,7 @@
// EXIST: vararg // EXIST: vararg
/*why?*/ /*why?*/
// EXIST: companion object // EXIST: companion object
// EXIST: operator
// EXIST: sealed // EXIST: sealed
// EXIST: lateinit // EXIST: lateinit
// EXIST: data // EXIST: data
@@ -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( private fun renderTypeCandidates(
@@ -2185,6 +2185,12 @@ public class ResolveByStubTestGenerated extends AbstractResolveByStubTest {
doTest(fileName); 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") @TestMetadata("PropagateDeepSubclass.kt")
public void testPropagateDeepSubclass() throws Exception { public void testPropagateDeepSubclass() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/fun/PropagateDeepSubclass.kt"); String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/fun/PropagateDeepSubclass.kt");