From 39f93426e2bcb6fc28f08bb6b7b169cbbf83d0c1 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 17 Sep 2009 21:10:31 +0400 Subject: [PATCH] move members: show conflict if non-final field is moved to interface --- .../moveMembers/MoveMembersProcessor.java | 11 ++++++++++ .../moveMembers/writableField/after/A.java | 4 ++++ .../moveMembers/writableField/after/B.java | 6 ++++++ .../moveMembers/writableField/before/A.java | 3 +++ .../moveMembers/writableField/before/B.java | 7 +++++++ .../intellij/refactoring/MoveMembersTest.java | 21 ++++++++++++++++++- 6 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/refactoring/moveMembers/writableField/after/A.java create mode 100644 java/java-tests/testData/refactoring/moveMembers/writableField/after/B.java create mode 100644 java/java-tests/testData/refactoring/moveMembers/writableField/before/A.java create mode 100644 java/java-tests/testData/refactoring/moveMembers/writableField/before/B.java 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(); } }