diff --git a/core/descriptors/src/org/jetbrains/kotlin/util/OperatorChecker.kt b/core/descriptors/src/org/jetbrains/kotlin/util/OperatorChecker.kt index e7054895f76..7ca5fc8b71e 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/util/OperatorChecker.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/util/OperatorChecker.kt @@ -42,12 +42,10 @@ import org.jetbrains.kotlin.util.OperatorNameConventions.INC import org.jetbrains.kotlin.util.OperatorNameConventions.INVOKE import org.jetbrains.kotlin.util.OperatorNameConventions.ITERATOR import org.jetbrains.kotlin.util.OperatorNameConventions.NEXT -import org.jetbrains.kotlin.util.OperatorNameConventions.NOT import org.jetbrains.kotlin.util.OperatorNameConventions.RANGE_TO import org.jetbrains.kotlin.util.OperatorNameConventions.SET import org.jetbrains.kotlin.util.OperatorNameConventions.SET_VALUE -import org.jetbrains.kotlin.util.OperatorNameConventions.UNARY_MINUS -import org.jetbrains.kotlin.util.OperatorNameConventions.UNARY_PLUS +import org.jetbrains.kotlin.util.OperatorNameConventions.SIMPLE_UNARY_OPERATION_NAMES object OperatorChecks { fun canBeOperator(functionDescriptor: FunctionDescriptor): Boolean { @@ -62,38 +60,39 @@ object OperatorChecks { val lastIsOk = valueParameters.lastOrNull()?.let { !it.hasDefaultValue() && it.varargElementType == null } ?: false valueParameters.size >= 2 && lastIsOk } - + GET_VALUE == name -> noDefaultsAndVarargs && valueParameters.size >= 2 && valueParameters[1].isKProperty SET_VALUE == name -> noDefaultsAndVarargs && valueParameters.size >= 3 && valueParameters[1].isKProperty - + INVOKE == name -> isMemberOrExtension CONTAINS == name -> singleValueParameter && noDefaultsAndVarargs && returnsBoolean - + ITERATOR == name -> noValueParameters NEXT == name -> noValueParameters HAS_NEXT == name -> noValueParameters && returnsBoolean - + RANGE_TO == name -> singleValueParameter && noDefaultsAndVarargs - + EQUALS == name -> { fun DeclarationDescriptor.isAny() = (this as? ClassDescriptor)?.let { KotlinBuiltIns.isAny(it) } ?: false isMember && overriddenDescriptors.any { it.containingDeclaration.isAny() } } COMPARE_TO == name -> returnsInt && singleValueParameter && noDefaultsAndVarargs - - BINARY_OPERATION_NAMES.any { it == name } -> - singleValueParameter && noDefaultsAndVarargs - (UNARY_PLUS == name) || (UNARY_MINUS == name) || (NOT == name) -> - noValueParameters - (INC == name) || (DEC == name) -> { + + name in BINARY_OPERATION_NAMES -> singleValueParameter && noDefaultsAndVarargs + + name in SIMPLE_UNARY_OPERATION_NAMES -> noValueParameters + + INC == name || DEC == name -> { val receiver = dispatchReceiverParameter ?: extensionReceiverParameter isMemberOrExtension && (receiver != null) && (returnType?.let { it.isSubtypeOf(receiver.type) } ?: false) } - - ASSIGNMENT_OPERATIONS.any { it == name } -> + + name in ASSIGNMENT_OPERATIONS -> returnsUnit && singleValueParameter && noDefaultsAndVarargs - + name.asString().matches(COMPONENT_REGEX) -> noValueParameters + else -> false } } diff --git a/core/descriptors/src/org/jetbrains/kotlin/util/OperatorNameConventions.kt b/core/descriptors/src/org/jetbrains/kotlin/util/OperatorNameConventions.kt index 9d76263a313..d146618c3bd 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/util/OperatorNameConventions.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/util/OperatorNameConventions.kt @@ -65,6 +65,7 @@ object OperatorNameConventions { val UNARY_OPERATION_NAMES_WITH_DEPRECATED = Collections.unmodifiableSet(setOf(INC, DEC, UNARY_PLUS, PLUS, UNARY_MINUS, MINUS, NOT)) internal val UNARY_OPERATION_NAMES = setOf(INC, DEC, UNARY_PLUS, UNARY_MINUS, NOT) + internal val SIMPLE_UNARY_OPERATION_NAMES = setOf(UNARY_PLUS, UNARY_MINUS, NOT) internal val BINARY_OPERATION_NAMES = setOf(TIMES, PLUS, MINUS, DIV, MOD, RANGE_TO) internal val ASSIGNMENT_OPERATIONS = setOf(TIMES_ASSIGN, DIV_ASSIGN, MOD_ASSIGN, PLUS_ASSIGN, MINUS_ASSIGN)