Introduce special CAPTURED_VAL_INITIALIZATION for members
This commit is contained in:
@@ -459,7 +459,12 @@ class ControlFlowInformationProvider private constructor(
|
|||||||
if (!hasReassignMethodReturningUnit) {
|
if (!hasReassignMethodReturningUnit) {
|
||||||
if (!isThisOrNoDispatchReceiver || !varWithValReassignErrorGenerated.contains(variableDescriptor)) {
|
if (!isThisOrNoDispatchReceiver || !varWithValReassignErrorGenerated.contains(variableDescriptor)) {
|
||||||
if (captured && !mayBeInitializedNotHere && hasBackingField && isThisOrNoDispatchReceiver) {
|
if (captured && !mayBeInitializedNotHere && hasBackingField && isThisOrNoDispatchReceiver) {
|
||||||
report(Errors.CAPTURED_VAL_INITIALIZATION.on(expression, variableDescriptor), ctxt)
|
if (variableDescriptor.containingDeclaration is ClassDescriptor) {
|
||||||
|
report(Errors.CAPTURED_MEMBER_VAL_INITIALIZATION.on(expression, variableDescriptor), ctxt)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
report(Errors.CAPTURED_VAL_INITIALIZATION.on(expression, variableDescriptor), ctxt)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
report(Errors.VAL_REASSIGNMENT.on(expression, variableDescriptor), ctxt)
|
report(Errors.VAL_REASSIGNMENT.on(expression, variableDescriptor), ctxt)
|
||||||
|
|||||||
@@ -762,6 +762,7 @@ public interface Errors {
|
|||||||
|
|
||||||
DiagnosticFactory1<KtExpression, DeclarationDescriptor> VAL_REASSIGNMENT = DiagnosticFactory1.create(ERROR);
|
DiagnosticFactory1<KtExpression, DeclarationDescriptor> VAL_REASSIGNMENT = DiagnosticFactory1.create(ERROR);
|
||||||
DiagnosticFactory1<KtExpression, DeclarationDescriptor> CAPTURED_VAL_INITIALIZATION = DiagnosticFactory1.create(ERROR);
|
DiagnosticFactory1<KtExpression, DeclarationDescriptor> CAPTURED_VAL_INITIALIZATION = DiagnosticFactory1.create(ERROR);
|
||||||
|
DiagnosticFactory1<KtExpression, DeclarationDescriptor> CAPTURED_MEMBER_VAL_INITIALIZATION = DiagnosticFactory1.create(ERROR);
|
||||||
DiagnosticFactory1<KtExpression, DeclarationDescriptor> SETTER_PROJECTED_OUT = DiagnosticFactory1.create(ERROR);
|
DiagnosticFactory1<KtExpression, DeclarationDescriptor> SETTER_PROJECTED_OUT = DiagnosticFactory1.create(ERROR);
|
||||||
|
|
||||||
DiagnosticFactory1<KtExpression, DeclarationDescriptor> INITIALIZATION_BEFORE_DECLARATION = DiagnosticFactory1.create(ERROR);
|
DiagnosticFactory1<KtExpression, DeclarationDescriptor> INITIALIZATION_BEFORE_DECLARATION = DiagnosticFactory1.create(ERROR);
|
||||||
|
|||||||
+1
@@ -300,6 +300,7 @@ public class DefaultErrorMessages {
|
|||||||
|
|
||||||
MAP.put(VAL_REASSIGNMENT, "Val cannot be reassigned", NAME);
|
MAP.put(VAL_REASSIGNMENT, "Val cannot be reassigned", NAME);
|
||||||
MAP.put(CAPTURED_VAL_INITIALIZATION, "Captured values initialization is forbidden due to possible reassignment", NAME);
|
MAP.put(CAPTURED_VAL_INITIALIZATION, "Captured values initialization is forbidden due to possible reassignment", NAME);
|
||||||
|
MAP.put(CAPTURED_MEMBER_VAL_INITIALIZATION, "Captured member values initialization is forbidden due to possible reassignment", NAME);
|
||||||
MAP.put(SETTER_PROJECTED_OUT, "Setter for ''{0}'' is removed by type projection", NAME);
|
MAP.put(SETTER_PROJECTED_OUT, "Setter for ''{0}'' is removed by type projection", NAME);
|
||||||
MAP.put(INVISIBLE_SETTER, "Cannot assign to ''{0}'': the setter is {1} in {2}", NAME, VISIBILITY, NAME_OF_PARENT_OR_FILE);
|
MAP.put(INVISIBLE_SETTER, "Cannot assign to ''{0}'': the setter is {1} in {2}", NAME, VISIBILITY, NAME_OF_PARENT_OR_FILE);
|
||||||
MAP.put(INITIALIZATION_BEFORE_DECLARATION, "Variable cannot be initialized before declaration", NAME);
|
MAP.put(INITIALIZATION_BEFORE_DECLARATION, "Variable cannot be initialized before declaration", NAME);
|
||||||
|
|||||||
+2
-2
@@ -7,7 +7,7 @@ class Test {
|
|||||||
val t = object {
|
val t = object {
|
||||||
fun some() {
|
fun some() {
|
||||||
// See KT-13597
|
// See KT-13597
|
||||||
<!CAPTURED_VAL_INITIALIZATION!>a<!> = "12"
|
<!CAPTURED_MEMBER_VAL_INITIALIZATION!>a<!> = "12"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,7 +41,7 @@ class Test4 {
|
|||||||
init {
|
init {
|
||||||
exec {
|
exec {
|
||||||
// See KT-14381
|
// See KT-14381
|
||||||
<!CAPTURED_VAL_INITIALIZATION!>a<!> = "12"
|
<!CAPTURED_MEMBER_VAL_INITIALIZATION!>a<!> = "12"
|
||||||
}
|
}
|
||||||
a = "34"
|
a = "34"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ object J2KPostProcessingRegistrar {
|
|||||||
}
|
}
|
||||||
|
|
||||||
registerDiagnosticBasedProcessingFactory(
|
registerDiagnosticBasedProcessingFactory(
|
||||||
Errors.VAL_REASSIGNMENT, Errors.CAPTURED_VAL_INITIALIZATION
|
Errors.VAL_REASSIGNMENT, Errors.CAPTURED_VAL_INITIALIZATION, Errors.CAPTURED_MEMBER_VAL_INITIALIZATION
|
||||||
) {
|
) {
|
||||||
element: KtSimpleNameExpression, _: Diagnostic ->
|
element: KtSimpleNameExpression, _: Diagnostic ->
|
||||||
val property = element.mainReference.resolve() as? KtProperty
|
val property = element.mainReference.resolve() as? KtProperty
|
||||||
|
|||||||
@@ -68,6 +68,8 @@ class ChangeVariableMutabilityFix(element: KtValVarKeywordOwner, private val mak
|
|||||||
|
|
||||||
val CAPTURED_VAL_INITIALIZATION_FACTORY = ReassignmentActionFactory(Errors.CAPTURED_VAL_INITIALIZATION)
|
val CAPTURED_VAL_INITIALIZATION_FACTORY = ReassignmentActionFactory(Errors.CAPTURED_VAL_INITIALIZATION)
|
||||||
|
|
||||||
|
val CAPTURED_MEMBER_VAL_INITIALIZATION_FACTORY = ReassignmentActionFactory(Errors.CAPTURED_MEMBER_VAL_INITIALIZATION)
|
||||||
|
|
||||||
val VAR_OVERRIDDEN_BY_VAL_FACTORY: KotlinSingleIntentionActionFactory = object: KotlinSingleIntentionActionFactory() {
|
val VAR_OVERRIDDEN_BY_VAL_FACTORY: KotlinSingleIntentionActionFactory = object: KotlinSingleIntentionActionFactory() {
|
||||||
override fun createAction(diagnostic: Diagnostic): IntentionAction? {
|
override fun createAction(diagnostic: Diagnostic): IntentionAction? {
|
||||||
val element = diagnostic.psiElement
|
val element = diagnostic.psiElement
|
||||||
|
|||||||
@@ -194,6 +194,7 @@ class QuickFixRegistrar : QuickFixContributor {
|
|||||||
VAL_REASSIGNMENT.registerFactory(ChangeVariableMutabilityFix.VAL_REASSIGNMENT_FACTORY)
|
VAL_REASSIGNMENT.registerFactory(ChangeVariableMutabilityFix.VAL_REASSIGNMENT_FACTORY)
|
||||||
VAL_REASSIGNMENT.registerFactory(LiftAssignmentOutOfTryFix)
|
VAL_REASSIGNMENT.registerFactory(LiftAssignmentOutOfTryFix)
|
||||||
CAPTURED_VAL_INITIALIZATION.registerFactory(ChangeVariableMutabilityFix.CAPTURED_VAL_INITIALIZATION_FACTORY)
|
CAPTURED_VAL_INITIALIZATION.registerFactory(ChangeVariableMutabilityFix.CAPTURED_VAL_INITIALIZATION_FACTORY)
|
||||||
|
CAPTURED_MEMBER_VAL_INITIALIZATION.registerFactory(ChangeVariableMutabilityFix.CAPTURED_MEMBER_VAL_INITIALIZATION_FACTORY)
|
||||||
VAR_OVERRIDDEN_BY_VAL.registerFactory(ChangeVariableMutabilityFix.VAR_OVERRIDDEN_BY_VAL_FACTORY)
|
VAR_OVERRIDDEN_BY_VAL.registerFactory(ChangeVariableMutabilityFix.VAR_OVERRIDDEN_BY_VAL_FACTORY)
|
||||||
VAR_ANNOTATION_PARAMETER.registerFactory(ChangeVariableMutabilityFix.VAR_ANNOTATION_PARAMETER_FACTORY)
|
VAR_ANNOTATION_PARAMETER.registerFactory(ChangeVariableMutabilityFix.VAR_ANNOTATION_PARAMETER_FACTORY)
|
||||||
|
|
||||||
|
|||||||
+16
@@ -0,0 +1,16 @@
|
|||||||
|
// "Make variable mutable" "true"
|
||||||
|
|
||||||
|
class Test {
|
||||||
|
val a: String
|
||||||
|
|
||||||
|
init {
|
||||||
|
val t = object {
|
||||||
|
fun some() {
|
||||||
|
<caret>a = "12"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a = "2"
|
||||||
|
t.some()
|
||||||
|
}
|
||||||
|
}
|
||||||
+16
@@ -0,0 +1,16 @@
|
|||||||
|
// "Make variable mutable" "true"
|
||||||
|
|
||||||
|
class Test {
|
||||||
|
var a: String
|
||||||
|
|
||||||
|
init {
|
||||||
|
val t = object {
|
||||||
|
fun some() {
|
||||||
|
a = "12"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a = "2"
|
||||||
|
t.some()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10600,6 +10600,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/variables/changeMutability"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), TargetBackend.ANY, true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/variables/changeMutability"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), TargetBackend.ANY, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("capturedMemberValInitialization.kt")
|
||||||
|
public void testCapturedMemberValInitialization() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/variables/changeMutability/capturedMemberValInitialization.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("capturedValInitialization.kt")
|
@TestMetadata("capturedValInitialization.kt")
|
||||||
public void testCapturedValInitialization() throws Exception {
|
public void testCapturedValInitialization() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/variables/changeMutability/capturedValInitialization.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/variables/changeMutability/capturedValInitialization.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user