getValue()/setValue() should be marked with 'operator'
This commit is contained in:
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.resolve.calls.results.OverloadResolutionResults;
|
||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo;
|
||||
import org.jetbrains.kotlin.resolve.scopes.LexicalScope;
|
||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver;
|
||||
import org.jetbrains.kotlin.resolve.validation.OperatorValidator;
|
||||
import org.jetbrains.kotlin.resolve.validation.SymbolUsageValidator;
|
||||
import org.jetbrains.kotlin.types.DeferredType;
|
||||
import org.jetbrains.kotlin.types.JetType;
|
||||
@@ -174,7 +175,7 @@ public class DelegatedPropertyResolver {
|
||||
trace.record(DELEGATED_PROPERTY_PD_RESOLVED_CALL, propertyDescriptor, functionResults.getResultingCall());
|
||||
}
|
||||
|
||||
/* Resolve get() or set() methods from delegate */
|
||||
/* Resolve getValue() or setValue() methods from delegate */
|
||||
private void resolveDelegatedPropertyConventionMethod(
|
||||
@NotNull PropertyDescriptor propertyDescriptor,
|
||||
@NotNull JetExpression delegateExpression,
|
||||
@@ -213,6 +214,11 @@ public class DelegatedPropertyResolver {
|
||||
return;
|
||||
}
|
||||
|
||||
FunctionDescriptor resultingDescriptor = functionResults.getResultingDescriptor();
|
||||
if (!resultingDescriptor.isOperator()) {
|
||||
OperatorValidator.Companion.report(delegateExpression, resultingDescriptor, trace);
|
||||
}
|
||||
|
||||
ResolvedCall<FunctionDescriptor> resultingCall = functionResults.getResultingCall();
|
||||
PsiElement declaration = DescriptorToSourceUtils.descriptorToDeclaration(propertyDescriptor);
|
||||
if (declaration instanceof JetProperty) {
|
||||
|
||||
@@ -23,7 +23,6 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticSink
|
||||
import org.jetbrains.kotlin.diagnostics.Errors
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.bindingContextUtil.get
|
||||
import org.jetbrains.kotlin.resolve.BindingTrace
|
||||
import org.jetbrains.kotlin.resolve.calls.CallTransformer
|
||||
import org.jetbrains.kotlin.resolve.calls.tasks.isDynamic
|
||||
@@ -35,7 +34,7 @@ public class OperatorValidator : SymbolUsageValidator {
|
||||
|
||||
override fun validateCall(resolvedCall: ResolvedCall<*>?, targetDescriptor: CallableDescriptor, trace: BindingTrace, element: PsiElement) {
|
||||
val functionDescriptor = targetDescriptor as? FunctionDescriptor ?: return
|
||||
if (functionDescriptor.isDynamic() || ErrorUtils.isError(functionDescriptor)) return
|
||||
if (!checkNotErrorOrDynamic(functionDescriptor)) return
|
||||
|
||||
val jetElement = element as? JetElement ?: return
|
||||
val call = resolvedCall?.call ?: trace.bindingContext[BindingContext.CALL, jetElement]
|
||||
@@ -71,9 +70,15 @@ public class OperatorValidator : SymbolUsageValidator {
|
||||
|
||||
companion object {
|
||||
fun report(element: JetElement, descriptor: FunctionDescriptor, sink: DiagnosticSink) {
|
||||
if (!checkNotErrorOrDynamic(descriptor)) return
|
||||
|
||||
val containingDeclaration = descriptor.containingDeclaration
|
||||
val containingDeclarationName = containingDeclaration.fqNameUnsafe.asString()
|
||||
sink.report(Errors.OPERATOR_MODIFIER_REQUIRED.on(element, descriptor, containingDeclarationName))
|
||||
}
|
||||
|
||||
private fun checkNotErrorOrDynamic(functionDescriptor: FunctionDescriptor): Boolean {
|
||||
return (!functionDescriptor.isDynamic() && !ErrorUtils.isError(functionDescriptor))
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user