diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveMembers/MoveMembersProcessor.java b/java/java-impl/src/com/intellij/refactoring/move/moveMembers/MoveMembersProcessor.java
index cd99907a10e4..e045d80e93a2 100644
--- a/java/java-impl/src/com/intellij/refactoring/move/moveMembers/MoveMembersProcessor.java
+++ b/java/java-impl/src/com/intellij/refactoring/move/moveMembers/MoveMembersProcessor.java
@@ -4,6 +4,7 @@
*/
package com.intellij.refactoring.move.moveMembers;
+import com.intellij.codeInsight.highlighting.ReadWriteAccessDetector;
import com.intellij.lang.LanguageExtension;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
@@ -271,6 +272,16 @@ public class MoveMembersProcessor extends BaseRefactoringProcessor {
conflicts.put(member, message);
}
}
+
+ if (member instanceof PsiField && myTargetClass.isInterface()) {
+ final ReadWriteAccessDetector accessDetector = ReadWriteAccessDetector.findDetector(member);
+ if (accessDetector != null) {
+ final ReadWriteAccessDetector.Access access = accessDetector.getExpressionAccess(element);
+ if (access != ReadWriteAccessDetector.Access.Read) {
+ conflicts.put(element, CommonRefactoringUtil.capitalize(RefactoringUIUtil.getDescription(member, true)) + " has write access but is moved to an interface");
+ }
+ }
+ }
}
}
}
diff --git a/java/java-tests/testData/refactoring/moveMembers/writableField/after/A.java b/java/java-tests/testData/refactoring/moveMembers/writableField/after/A.java
new file mode 100644
index 000000000000..9772fb1a8784
--- /dev/null
+++ b/java/java-tests/testData/refactoring/moveMembers/writableField/after/A.java
@@ -0,0 +1,4 @@
+public interface A {
+
+ String ONE = "";
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/moveMembers/writableField/after/B.java b/java/java-tests/testData/refactoring/moveMembers/writableField/after/B.java
new file mode 100644
index 000000000000..0a70a25c39cc
--- /dev/null
+++ b/java/java-tests/testData/refactoring/moveMembers/writableField/after/B.java
@@ -0,0 +1,6 @@
+public class B {
+
+ void foo() {
+ A.ONE = "foo";
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/moveMembers/writableField/before/A.java b/java/java-tests/testData/refactoring/moveMembers/writableField/before/A.java
new file mode 100644
index 000000000000..39abc02842f9
--- /dev/null
+++ b/java/java-tests/testData/refactoring/moveMembers/writableField/before/A.java
@@ -0,0 +1,3 @@
+public interface A {
+
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/moveMembers/writableField/before/B.java b/java/java-tests/testData/refactoring/moveMembers/writableField/before/B.java
new file mode 100644
index 000000000000..c5933dc18c0a
--- /dev/null
+++ b/java/java-tests/testData/refactoring/moveMembers/writableField/before/B.java
@@ -0,0 +1,7 @@
+public class B {
+ public static String ONE = "";
+
+ void foo() {
+ ONE = "foo";
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testSrc/com/intellij/refactoring/MoveMembersTest.java b/java/java-tests/testSrc/com/intellij/refactoring/MoveMembersTest.java
index 03caa23eb427..12fed4fd23a9 100644
--- a/java/java-tests/testSrc/com/intellij/refactoring/MoveMembersTest.java
+++ b/java/java-tests/testSrc/com/intellij/refactoring/MoveMembersTest.java
@@ -13,6 +13,7 @@ import com.intellij.JavaTestUtil;
import java.util.ArrayList;
import java.util.LinkedHashSet;
+import java.util.Map;
public class MoveMembersTest extends MultiFileTestCase {
@Override
@@ -84,6 +85,16 @@ public class MoveMembersTest extends MultiFileTestCase {
doTest("B", "A", 0);
}
+ public void testWritableField() throws Exception {
+ try {
+ doTest("B", "A", 0);
+ fail("conflict expected");
+ }
+ catch (Exception e) {
+ assertEquals(e.getMessage(), "Found conflicts: Field B.ONE has write access but is moved to an interface");
+ }
+ }
+
protected String getTestRoot() {
return "/refactoring/moveMembers/";
}
@@ -124,7 +135,15 @@ public class MoveMembersTest extends MultiFileTestCase {
MockMoveMembersOptions options = new MockMoveMembersOptions(targetClass.getQualifiedName(), memberSet);
options.setMemberVisibility(null);
- new MoveMembersProcessor(myProject, null, options).run();
+ new MoveMembersProcessor(myProject, null, options){
+ @Override
+ protected boolean showConflicts(Map conflicts) {
+ if (!conflicts.isEmpty()) {
+ throw new RuntimeException("Found conflicts: " + conflicts.values().iterator().next());
+ }
+ return super.showConflicts(conflicts);
+ }
+ }.run();
FileDocumentManager.getInstance().saveAllDocuments();
}
}