getValue()/setValue() should be marked with 'operator'

This commit is contained in:
Yan Zhulanow
2015-10-12 01:59:40 +03:00
parent bc3d1ddda0
commit dc8e796e49
121 changed files with 242 additions and 231 deletions
@@ -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))
}
}
}