introduce constant/field: static/final should be set before actual add - anchor detection (IDEA-52969)

This commit is contained in:
anna
2010-03-17 16:13:25 +03:00
parent fec6c8a622
commit eea6a96e7d
8 changed files with 58 additions and 5 deletions

View File

@@ -205,7 +205,7 @@ public abstract class BaseExpressionToFieldHandler extends IntroduceHandlerBase
} }
} }
PsiMember anchorMember = finalAnchorElement instanceof PsiMember ? (PsiMember)finalAnchorElement : null; PsiMember anchorMember = finalAnchorElement instanceof PsiMember ? (PsiMember)finalAnchorElement : null;
setModifiers(field, settings, settings.isDeclareStatic(), occurrences);
if ((anchorMember instanceof PsiField) && if ((anchorMember instanceof PsiField) &&
anchorMember.hasModifierProperty(PsiModifier.STATIC) == field.hasModifierProperty(PsiModifier.STATIC)) { anchorMember.hasModifierProperty(PsiModifier.STATIC) == field.hasModifierProperty(PsiModifier.STATIC)) {
field = (PsiField)destClass.addBefore(field, anchorMember); field = (PsiField)destClass.addBefore(field, anchorMember);
@@ -217,7 +217,9 @@ public abstract class BaseExpressionToFieldHandler extends IntroduceHandlerBase
else { else {
field = (PsiField)destClass.add(field); field = (PsiField)destClass.add(field);
} }
setModifiers(field, settings, settings.isDeclareStatic(), occurrences); if (!settings.isIntroduceEnumConstant()) {
VisibilityUtil.fixVisibility(occurrences, field, settings.getFieldVisibility());
}
PsiStatement assignStatement = null; PsiStatement assignStatement = null;
PsiElement anchorElementHere = null; PsiElement anchorElementHere = null;
if (initializerPlace == InitializationPlace.IN_CURRENT_METHOD && initializer != null || if (initializerPlace == InitializationPlace.IN_CURRENT_METHOD && initializer != null ||
@@ -316,7 +318,6 @@ public abstract class BaseExpressionToFieldHandler extends IntroduceHandlerBase
public static void setModifiers(PsiField field, Settings settings, final boolean declareStatic, PsiExpression[] occurrences) { public static void setModifiers(PsiField field, Settings settings, final boolean declareStatic, PsiExpression[] occurrences) {
if (!settings.isIntroduceEnumConstant()) { if (!settings.isIntroduceEnumConstant()) {
VisibilityUtil.fixVisibility(occurrences, field, settings.getFieldVisibility());
if (declareStatic) { if (declareStatic) {
PsiUtil.setModifierProperty(field, PsiModifier.STATIC, true); PsiUtil.setModifierProperty(field, PsiModifier.STATIC, true);
} }

View File

@@ -34,6 +34,7 @@ import com.intellij.refactoring.util.CommonRefactoringUtil;
import com.intellij.refactoring.util.EnumConstantsUtil; import com.intellij.refactoring.util.EnumConstantsUtil;
import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.refactoring.util.RefactoringUtil;
import com.intellij.util.IncorrectOperationException; import com.intellij.util.IncorrectOperationException;
import com.intellij.util.VisibilityUtil;
import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NonNls;
import static com.intellij.refactoring.introduceField.BaseExpressionToFieldHandler.InitializationPlace.IN_CONSTRUCTOR; import static com.intellij.refactoring.introduceField.BaseExpressionToFieldHandler.InitializationPlace.IN_CONSTRUCTOR;
@@ -134,7 +135,6 @@ public class LocalToFieldHandler {
final String variableName = local.getName(); final String variableName = local.getName();
final String fieldName = settings.getFieldName(); final String fieldName = settings.getFieldName();
final BaseExpressionToFieldHandler.InitializationPlace initializerPlace = settings.getInitializerPlace(); final BaseExpressionToFieldHandler.InitializationPlace initializerPlace = settings.getInitializerPlace();
@Modifier final String fieldVisibility = settings.getFieldVisibility();
final PsiClass destinationClass = settings.getDestinationClass(); final PsiClass destinationClass = settings.getDestinationClass();
boolean rebindNeeded = false; boolean rebindNeeded = false;
if (destinationClass != null) { if (destinationClass != null) {
@@ -161,6 +161,9 @@ public class LocalToFieldHandler {
: createField(local, fieldName, initializerPlace == IN_FIELD_DECLARATION); : createField(local, fieldName, initializerPlace == IN_FIELD_DECLARATION);
field = (PsiField)aaClass.add(field); field = (PsiField)aaClass.add(field);
BaseExpressionToFieldHandler.setModifiers(field, settings, isStatic, occurences); BaseExpressionToFieldHandler.setModifiers(field, settings, isStatic, occurences);
if (!settings.isIntroduceEnumConstant()) {
VisibilityUtil.fixVisibility(occurences, field, settings.getFieldVisibility());
}
local.normalizeDeclaration(); local.normalizeDeclaration();
PsiDeclarationStatement declarationStatement = (PsiDeclarationStatement)local.getParent(); PsiDeclarationStatement declarationStatement = (PsiDeclarationStatement)local.getParent();

View File

@@ -0,0 +1,6 @@
public class Test {
public static final String FIRST = "<selection>pref</selection>";
public static final String SECOND = "pref";
}
class AnotherTest {}

View File

@@ -0,0 +1,8 @@
public class Test {
public static final String FIRST = AnotherTest.xxx;
public static final String SECOND = AnotherTest.xxx;
}
class AnotherTest {
static final String xxx = "pref";
}

View File

@@ -0,0 +1,4 @@
public class Test{
public static final String FIRST = "<selection>pref</selection>.FIRST";
public static final String SECOND = "pref.SECOND";
}

View File

@@ -0,0 +1,5 @@
public class Test{
public static final String xxx = "pref";
public static final String FIRST = xxx + ".FIRST";
public static final String SECOND = xxx + ".SECOND";
}

View File

@@ -9,6 +9,7 @@ import com.intellij.psi.PsiLocalVariable;
import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.testFramework.LightCodeInsightTestCase; import com.intellij.testFramework.LightCodeInsightTestCase;
import com.intellij.testFramework.TestDataPath; import com.intellij.testFramework.TestDataPath;
import com.intellij.util.VisibilityUtil;
import junit.framework.Assert; import junit.framework.Assert;
import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NonNls;
@@ -65,6 +66,27 @@ public class IntroduceConstantTest extends LightCodeInsightTestCase {
checkResultByFile(BASE_PATH + getTestName(false) + "_after.java"); checkResultByFile(BASE_PATH + getTestName(false) + "_after.java");
} }
public void testPartialStringLiteralAnchor() throws Exception {
configureByFile(BASE_PATH + getTestName(false) + ".java");
new MockIntroduceConstantHandler(null).invoke(getProject(), getEditor(), getFile(), null);
checkResultByFile(BASE_PATH + getTestName(false) + "_after.java");
}
public void testEscalateVisibility() throws Exception {
configureByFile(BASE_PATH + getTestName(false) + ".java");
final PsiClass[] classes = ((PsiJavaFile)getFile()).getClasses();
Assert.assertTrue(classes.length == 2);
final PsiClass targetClass = classes[1];
Assert.assertNotNull(targetClass);
new MockIntroduceConstantHandler(targetClass){
@Override
protected String getVisibility() {
return VisibilityUtil.ESCALATE_VISIBILITY;
}
}.invoke(getProject(), getEditor(), getFile(), null);
checkResultByFile(BASE_PATH + getTestName(false) + "_after.java");
}
protected Sdk getProjectJDK() { protected Sdk getProjectJDK() {
return JavaSdkImpl.getMockJdk15("java 1.5"); return JavaSdkImpl.getMockJdk15("java 1.5");
} }

View File

@@ -20,7 +20,11 @@ public class MockIntroduceConstantHandler extends IntroduceConstantHandler{
protected Settings showRefactoringDialog(final Project project, final Editor editor, final PsiClass parentClass, final PsiExpression expr, protected Settings showRefactoringDialog(final Project project, final Editor editor, final PsiClass parentClass, final PsiExpression expr,
final PsiType type, final PsiExpression[] occurences, final PsiElement anchorElement, final PsiType type, final PsiExpression[] occurences, final PsiElement anchorElement,
final PsiElement anchorElementIfAll) { final PsiElement anchorElementIfAll) {
return new Settings("xxx", true, true, true, InitializationPlace.IN_FIELD_DECLARATION, PsiModifier.PUBLIC, null, null, false, return new Settings("xxx", true, true, true, InitializationPlace.IN_FIELD_DECLARATION, getVisibility(), null, null, false,
myTargetClass != null ? myTargetClass : parentClass, false, false); myTargetClass != null ? myTargetClass : parentClass, false, false);
} }
protected String getVisibility() {
return PsiModifier.PUBLIC;
}
} }