Minor, extract validatePropertyCall out of SymbolUsageValidator#validateCall
BasicExpressionTypingVisitor#checkLValue is the only place where it's used. There's no ResolvedCall instance for the setter call (only for the property itself), that's why this special method is needed
This commit is contained in:
@@ -265,7 +265,7 @@ public class DelegatedPropertyResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (SymbolUsageValidator validator : symbolUsageValidators) {
|
for (SymbolUsageValidator validator : symbolUsageValidators) {
|
||||||
validator.validateCall(resultingCall, resultingCall.getResultingDescriptor(), trace, byKeyword);
|
validator.validateCall(resultingCall, trace, byKeyword);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ class CallCompleter(
|
|||||||
resolvedCall.call.calleeExpression
|
resolvedCall.call.calleeExpression
|
||||||
|
|
||||||
for (validator in symbolUsageValidators) {
|
for (validator in symbolUsageValidators) {
|
||||||
validator.validateCall(resolvedCall, resolvedCall.resultingDescriptor, context.trace, element!!)
|
validator.validateCall(resolvedCall, context.trace, element!!)
|
||||||
}
|
}
|
||||||
|
|
||||||
resolveHandleResultCallForCoroutineLambdaExpressions(context, resolvedCall)
|
resolveHandleResultCallForCoroutineLambdaExpressions(context, resolvedCall)
|
||||||
|
|||||||
+12
-8
@@ -19,10 +19,7 @@ package org.jetbrains.kotlin.resolve.validation
|
|||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.tree.TokenSet
|
import com.intellij.psi.tree.TokenSet
|
||||||
import com.intellij.psi.util.PsiTreeUtil
|
import com.intellij.psi.util.PsiTreeUtil
|
||||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor
|
|
||||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
|
||||||
import org.jetbrains.kotlin.descriptors.PropertySetterDescriptor
|
|
||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors
|
import org.jetbrains.kotlin.diagnostics.Errors
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
@@ -35,7 +32,15 @@ import org.jetbrains.kotlin.resolve.getDeprecation
|
|||||||
|
|
||||||
class DeprecatedSymbolValidator : SymbolUsageValidator {
|
class DeprecatedSymbolValidator : SymbolUsageValidator {
|
||||||
|
|
||||||
override fun validateCall(resolvedCall: ResolvedCall<*>?, targetDescriptor: CallableDescriptor, trace: BindingTrace, element: PsiElement) {
|
override fun validateCall(resolvedCall: ResolvedCall<*>, trace: BindingTrace, element: PsiElement) {
|
||||||
|
validate(resolvedCall.resultingDescriptor, trace, element)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun validatePropertyCall(targetDescriptor: PropertyAccessorDescriptor, trace: BindingTrace, element: PsiElement) {
|
||||||
|
validate(targetDescriptor, trace, element)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun validate(targetDescriptor: CallableDescriptor, trace: BindingTrace, element: PsiElement) {
|
||||||
val deprecation = targetDescriptor.getDeprecation()
|
val deprecation = targetDescriptor.getDeprecation()
|
||||||
|
|
||||||
// avoid duplicating diagnostic when deprecation for property effectively deprecates setter
|
// avoid duplicating diagnostic when deprecation for property effectively deprecates setter
|
||||||
@@ -45,7 +50,7 @@ class DeprecatedSymbolValidator : SymbolUsageValidator {
|
|||||||
trace.report(createDeprecationDiagnostic(element, deprecation))
|
trace.report(createDeprecationDiagnostic(element, deprecation))
|
||||||
}
|
}
|
||||||
else if (targetDescriptor is PropertyDescriptor) {
|
else if (targetDescriptor is PropertyDescriptor) {
|
||||||
propertyGetterWorkaround(resolvedCall, targetDescriptor, trace, element)
|
propertyGetterWorkaround(targetDescriptor, trace, element)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,7 +82,6 @@ class DeprecatedSymbolValidator : SymbolUsageValidator {
|
|||||||
KtTokens.DIVEQ, KtTokens.PERCEQ, KtTokens.PLUSPLUS, KtTokens.MINUSMINUS)
|
KtTokens.DIVEQ, KtTokens.PERCEQ, KtTokens.PLUSPLUS, KtTokens.MINUSMINUS)
|
||||||
|
|
||||||
fun propertyGetterWorkaround(
|
fun propertyGetterWorkaround(
|
||||||
resolvedCall: ResolvedCall<*>?,
|
|
||||||
propertyDescriptor: PropertyDescriptor,
|
propertyDescriptor: PropertyDescriptor,
|
||||||
trace: BindingTrace,
|
trace: BindingTrace,
|
||||||
expression: PsiElement
|
expression: PsiElement
|
||||||
@@ -105,6 +109,6 @@ class DeprecatedSymbolValidator : SymbolUsageValidator {
|
|||||||
// skip Type::property
|
// skip Type::property
|
||||||
if (callableExpression != null && callableExpression.callableReference == expression) return
|
if (callableExpression != null && callableExpression.callableReference == expression) return
|
||||||
|
|
||||||
propertyDescriptor.getter?.let { validateCall(resolvedCall, it, trace, expression) }
|
propertyDescriptor.getter?.let { validatePropertyCall(it, trace, expression) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-1
@@ -19,11 +19,14 @@ package org.jetbrains.kotlin.resolve.validation
|
|||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor
|
||||||
import org.jetbrains.kotlin.resolve.BindingTrace
|
import org.jetbrains.kotlin.resolve.BindingTrace
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
||||||
|
|
||||||
interface SymbolUsageValidator {
|
interface SymbolUsageValidator {
|
||||||
fun validateTypeUsage(targetDescriptor: ClassifierDescriptor, trace: BindingTrace, element: PsiElement)
|
fun validateTypeUsage(targetDescriptor: ClassifierDescriptor, trace: BindingTrace, element: PsiElement)
|
||||||
|
|
||||||
fun validateCall(resolvedCall: ResolvedCall<*>?, targetDescriptor: CallableDescriptor, trace: BindingTrace, element: PsiElement)
|
fun validateCall(resolvedCall: ResolvedCall<*>, trace: BindingTrace, element: PsiElement)
|
||||||
|
|
||||||
|
fun validatePropertyCall(targetDescriptor: PropertyAccessorDescriptor, trace: BindingTrace, element: PsiElement)
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -592,7 +592,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
|
|||||||
checker.check(resolvedCall, resolutionContext, components.languageFeatureSettings);
|
checker.check(resolvedCall, resolutionContext, components.languageFeatureSettings);
|
||||||
}
|
}
|
||||||
for (SymbolUsageValidator validator : components.symbolUsageValidators) {
|
for (SymbolUsageValidator validator : components.symbolUsageValidators) {
|
||||||
validator.validateCall(resolvedCall, descriptor, trace, expression);
|
validator.validateCall(resolvedCall, trace, expression);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -925,7 +925,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
|
|||||||
}
|
}
|
||||||
else if (setter != null) {
|
else if (setter != null) {
|
||||||
for (SymbolUsageValidator validator : components.symbolUsageValidators) {
|
for (SymbolUsageValidator validator : components.symbolUsageValidators) {
|
||||||
validator.validateCall(null, setter, trace, reportOn);
|
validator.validatePropertyCall(setter, trace, reportOn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-3
@@ -81,12 +81,11 @@ class DestructuringDeclarationResolver(
|
|||||||
|
|
||||||
context.trace.record(BindingContext.COMPONENT_RESOLVED_CALL, entry, results.resultingCall)
|
context.trace.record(BindingContext.COMPONENT_RESOLVED_CALL, entry, results.resultingCall)
|
||||||
|
|
||||||
val functionDescriptor = results.resultingDescriptor
|
|
||||||
for (validator in symbolUsageValidators) {
|
for (validator in symbolUsageValidators) {
|
||||||
validator.validateCall(null, functionDescriptor, context.trace, entry)
|
validator.validateCall(results.resultingCall, context.trace, entry)
|
||||||
}
|
}
|
||||||
|
|
||||||
val functionReturnType = functionDescriptor.returnType
|
val functionReturnType = results.resultingDescriptor.returnType
|
||||||
if (functionReturnType != null && !TypeUtils.noExpectedType(expectedType)
|
if (functionReturnType != null && !TypeUtils.noExpectedType(expectedType)
|
||||||
&& !KotlinTypeChecker.DEFAULT.isSubtypeOf(functionReturnType, expectedType) ) {
|
&& !KotlinTypeChecker.DEFAULT.isSubtypeOf(functionReturnType, expectedType) ) {
|
||||||
context.trace.report(Errors.COMPONENT_FUNCTION_RETURN_TYPE_MISMATCH.on(initializer, componentName, functionReturnType, expectedType))
|
context.trace.report(Errors.COMPONENT_FUNCTION_RETURN_TYPE_MISMATCH.on(initializer, componentName, functionReturnType, expectedType))
|
||||||
|
|||||||
+2
-2
@@ -77,7 +77,7 @@ public class ForLoopConventionsChecker {
|
|||||||
checkIfOperatorModifierPresent(loopRangeExpression, iteratorFunction, context.trace);
|
checkIfOperatorModifierPresent(loopRangeExpression, iteratorFunction, context.trace);
|
||||||
|
|
||||||
for (SymbolUsageValidator validator : symbolUsageValidators) {
|
for (SymbolUsageValidator validator : symbolUsageValidators) {
|
||||||
validator.validateCall(iteratorResolvedCall, iteratorFunction, context.trace, loopRangeExpression);
|
validator.validateCall(iteratorResolvedCall, context.trace, loopRangeExpression);
|
||||||
}
|
}
|
||||||
|
|
||||||
KotlinType iteratorType = iteratorFunction.getReturnType();
|
KotlinType iteratorType = iteratorFunction.getReturnType();
|
||||||
@@ -132,7 +132,7 @@ public class ForLoopConventionsChecker {
|
|||||||
context.trace.record(resolvedCallKey, loopRangeExpression, resolvedCall);
|
context.trace.record(resolvedCallKey, loopRangeExpression, resolvedCall);
|
||||||
FunctionDescriptor functionDescriptor = resolvedCall.getResultingDescriptor();
|
FunctionDescriptor functionDescriptor = resolvedCall.getResultingDescriptor();
|
||||||
for (SymbolUsageValidator validator : symbolUsageValidators) {
|
for (SymbolUsageValidator validator : symbolUsageValidators) {
|
||||||
validator.validateCall(resolvedCall, functionDescriptor, context.trace, loopRangeExpression);
|
validator.validateCall(resolvedCall, context.trace, loopRangeExpression);
|
||||||
}
|
}
|
||||||
|
|
||||||
checkIfOperatorModifierPresent(loopRangeExpression, functionDescriptor, context.trace);
|
checkIfOperatorModifierPresent(loopRangeExpression, functionDescriptor, context.trace);
|
||||||
|
|||||||
Reference in New Issue
Block a user