Ease field initialization check
Since there is already VAL_REASSIGNMENT diagnostics, we can safely only for direct assignments. #KT-40893 Fixed
This commit is contained in:
+7
-2
@@ -14,8 +14,8 @@ import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
|
||||
import org.jetbrains.kotlin.diagnostics.Errors.CAPTURED_VAL_INITIALIZATION
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getAssignmentByLHS
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.BindingContext.CAPTURED_IN_CLOSURE
|
||||
import org.jetbrains.kotlin.resolve.BindingTrace
|
||||
@@ -58,7 +58,7 @@ class CapturingInClosureChecker : CallChecker {
|
||||
nameElement: PsiElement
|
||||
) {
|
||||
if (variable !is PropertyDescriptor || scopeContainer !is AnonymousFunctionDescriptor || variable.isVar) return
|
||||
if ((nameElement as KtExpression).getAssignmentByLHS() == null) return
|
||||
if (!isLhsOfAssignment(nameElement as KtExpression)) return
|
||||
val scopeDeclaration = DescriptorToSourceUtils.descriptorToDeclaration(scopeContainer) as? KtFunction ?: return
|
||||
if (scopeContainer.containingDeclaration !is ConstructorDescriptor) return
|
||||
if (!isExactlyOnceContract(trace.bindingContext, scopeDeclaration)) return
|
||||
@@ -70,6 +70,11 @@ class CapturingInClosureChecker : CallChecker {
|
||||
}
|
||||
}
|
||||
|
||||
private fun isLhsOfAssignment(nameElement: KtExpression): Boolean {
|
||||
val parent = nameElement.parent as? KtBinaryExpression ?: return false
|
||||
return parent.operationToken == KtTokens.EQ && parent.left == nameElement
|
||||
}
|
||||
|
||||
private fun isCapturedVariable(variableParent: DeclarationDescriptor, scopeContainer: DeclarationDescriptor): Boolean {
|
||||
if (variableParent !is FunctionDescriptor || scopeContainer == variableParent) return false
|
||||
|
||||
|
||||
Reference in New Issue
Block a user