Don't suggest might be const on actual member declaration

#KT-27822 Fixed
This commit is contained in:
Dmitry Gridin
2019-05-14 20:18:18 +07:00
parent 142c9e2a8b
commit 98a4c4588e
5 changed files with 25 additions and 7 deletions
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.psi.KtObjectDeclaration
import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.psi.propertyVisitor import org.jetbrains.kotlin.psi.propertyVisitor
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
import org.jetbrains.kotlin.psi.psiUtil.hasActualModifier
import org.jetbrains.kotlin.psi.psiUtil.isObjectLiteral import org.jetbrains.kotlin.psi.psiUtil.isObjectLiteral
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.constants.ErrorValue import org.jetbrains.kotlin.resolve.constants.ErrorValue
@@ -40,8 +41,7 @@ class MayBeConstantInspection : AbstractKotlinInspection() {
override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor { override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor {
return propertyVisitor { property -> return propertyVisitor { property ->
val status = property.getStatus() when (val status = property.getStatus()) {
when (status) {
NONE, JVM_FIELD_MIGHT_BE_CONST_NO_INITIALIZER, NONE, JVM_FIELD_MIGHT_BE_CONST_NO_INITIALIZER,
MIGHT_BE_CONST_ERRONEOUS, JVM_FIELD_MIGHT_BE_CONST_ERRONEOUS -> return@propertyVisitor MIGHT_BE_CONST_ERRONEOUS, JVM_FIELD_MIGHT_BE_CONST_ERRONEOUS -> return@propertyVisitor
MIGHT_BE_CONST, JVM_FIELD_MIGHT_BE_CONST -> { MIGHT_BE_CONST, JVM_FIELD_MIGHT_BE_CONST -> {
@@ -59,7 +59,7 @@ class MayBeConstantInspection : AbstractKotlinInspection() {
companion object { companion object {
fun KtProperty.getStatus(): Status { fun KtProperty.getStatus(): Status {
if (isLocal || isVar || getter != null || if (isLocal || isVar || getter != null ||
hasModifier(KtTokens.CONST_KEYWORD) || hasModifier(KtTokens.OVERRIDE_KEYWORD) hasModifier(KtTokens.CONST_KEYWORD) || hasModifier(KtTokens.OVERRIDE_KEYWORD) || hasActualModifier()
) { ) {
return NONE return NONE
} }
@@ -39,6 +39,7 @@ import org.jetbrains.kotlin.psi.KtAnnotationEntry
import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.psi.KtReferenceExpression import org.jetbrains.kotlin.psi.KtReferenceExpression
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.kotlin.psi.psiUtil.hasActualModifier
import org.jetbrains.kotlin.resolve.checkers.ConstModifierChecker import org.jetbrains.kotlin.resolve.checkers.ConstModifierChecker
import org.jetbrains.kotlin.resolve.source.PsiSourceElement import org.jetbrains.kotlin.resolve.source.PsiSourceElement
@@ -69,11 +70,15 @@ class AddConstModifierIntention : SelfTargetingIntention<KtProperty>(KtProperty:
companion object { companion object {
fun isApplicableTo(element: KtProperty): Boolean { fun isApplicableTo(element: KtProperty): Boolean {
if (element.isLocal || element.isVar || element.hasDelegate() || element.initializer == null with(element) {
|| element.getter?.hasBody() == true || element.receiverTypeReference != null if (isLocal || isVar || hasDelegate() || initializer == null
|| element.hasModifier(KtTokens.CONST_KEYWORD) || element.hasModifier(KtTokens.OVERRIDE_KEYWORD)) { || getter?.hasBody() == true || receiverTypeReference != null
return false || hasModifier(KtTokens.CONST_KEYWORD) || hasModifier(KtTokens.OVERRIDE_KEYWORD) || hasActualModifier()
) {
return false
}
} }
val propertyDescriptor = element.descriptor as? VariableDescriptor ?: return false val propertyDescriptor = element.descriptor as? VariableDescriptor ?: return false
return ConstModifierChecker.canBeConst(element, element, propertyDescriptor) return ConstModifierChecker.canBeConst(element, element, propertyDescriptor)
} }
@@ -0,0 +1 @@
expect val x: Int
@@ -0,0 +1,7 @@
// "Make 'x' const" "false"
// ACTION: Add getter
// ACTION: Convert property initializer to getter
// ACTION: Convert property to function
// ACTION: Specify type explicitly
actual val x<caret> = 42
@@ -549,6 +549,11 @@ public class QuickFixMultiModuleTestGenerated extends AbstractQuickFixMultiModul
runTest("idea/testData/multiModuleQuickFix/makeOpenFromExpect/"); runTest("idea/testData/multiModuleQuickFix/makeOpenFromExpect/");
} }
@TestMetadata("mayBeConstantWithActual")
public void testMayBeConstantWithActual() throws Exception {
runTest("idea/testData/multiModuleQuickFix/mayBeConstantWithActual/");
}
@TestMetadata("memberFunParameterToReceiverByHeader") @TestMetadata("memberFunParameterToReceiverByHeader")
public void testMemberFunParameterToReceiverByHeader() throws Exception { public void testMemberFunParameterToReceiverByHeader() throws Exception {
runTest("idea/testData/multiModuleQuickFix/memberFunParameterToReceiverByHeader/"); runTest("idea/testData/multiModuleQuickFix/memberFunParameterToReceiverByHeader/");