extract class: normalize fields declarations (IDEA-153457)

This commit is contained in:
Anna.Kozlova
2016-03-22 19:10:08 +01:00
parent 732d5a8ef0
commit 0d78fb9f8d
6 changed files with 23 additions and 9 deletions

View File

@@ -141,7 +141,7 @@ public class ExtractClassProcessor extends FixableUsagesRefactoringProcessor {
myClass = new WriteCommandAction<PsiClass>(myProject, getCommandName()){
@Override
protected void run(@NotNull Result<PsiClass> result) throws Throwable {
result.setResult(buildClass());
result.setResult(buildClass(false));
}
}.execute().getResultObject();
myExtractEnumProcessor = new ExtractEnumProcessor(myProject, this.enumConstants, myClass);
@@ -272,7 +272,7 @@ public class ExtractClassProcessor extends FixableUsagesRefactoringProcessor {
}
protected void performRefactoring(@NotNull UsageInfo[] usageInfos) {
final PsiClass psiClass = buildClass();
final PsiClass psiClass = buildClass(true);
if (psiClass == null) return;
if (delegationRequired) {
buildDelegate();
@@ -661,7 +661,7 @@ public class ExtractClassProcessor extends FixableUsagesRefactoringProcessor {
}
private PsiClass buildClass() {
private PsiClass buildClass(boolean normalizeDeclaration) {
final PsiManager manager = sourceClass.getManager();
final Project project = sourceClass.getProject();
final ExtractedClassBuilder extractedClassBuilder = new ExtractedClassBuilder();
@@ -691,7 +691,7 @@ public class ExtractClassProcessor extends FixableUsagesRefactoringProcessor {
extractedClassBuilder.setFieldsNeedingSetters(visitor.getFieldsNeedingSetter());
}
final String classString = extractedClassBuilder.buildBeanClass();
final String classString = extractedClassBuilder.buildBeanClass(normalizeDeclaration);
if (extractInnerClass) {
final PsiFileFactory factory = PsiFileFactory.getInstance(project);
final PsiJavaFile newFile = (PsiJavaFile)factory.createFileFromText(newClassName + ".java", JavaFileType.INSTANCE, classString);

View File

@@ -24,7 +24,6 @@ import com.intellij.psi.*;
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.psi.codeStyle.VariableKind;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.PropertyUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.refactoring.psi.MethodInheritanceUtils;
import com.intellij.util.Function;
@@ -101,7 +100,7 @@ class ExtractedClassBuilder {
}
public String buildBeanClass() {
public String buildBeanClass(boolean normalizeDeclaration) {
if (requiresBackPointer) {
calculateBackpointerName();
}
@@ -153,7 +152,7 @@ class ExtractedClassBuilder {
}
out.append(' ' + backPointerName + ";");
}
outputFieldsAndInitializers(out);
outputFieldsAndInitializers(out, normalizeDeclaration);
if (hasEnumConstants()) {
final String fieldName = getValueFieldName();
out.append("\n").append("private ").append(myEnumParameterType.getCanonicalText()).append(" ").append(fieldName).append(";\n");
@@ -256,7 +255,7 @@ class ExtractedClassBuilder {
}
private void outputFieldsAndInitializers(final StringBuffer out) {
private void outputFieldsAndInitializers(final StringBuffer out, boolean normalizeDeclaration) {
if (hasEnumConstants()) {
out.append(StringUtil.join(enumConstantFields, new Function<PsiField, String>() {
public String fun(PsiField field) {
@@ -274,6 +273,9 @@ class ExtractedClassBuilder {
final List<PsiClassInitializer> remainingInitializers = new ArrayList<PsiClassInitializer>(initializers);
for (final PsiField field : fields) {
if (normalizeDeclaration) {
field.normalizeDeclaration();
}
final Iterator<PsiClassInitializer> initializersIterator = remainingInitializers.iterator();
final int fieldOffset = field.getTextRange().getStartOffset();
while (initializersIterator.hasNext()) {

View File

@@ -0,0 +1,3 @@
public class Extracted {
static final int[] myT = {1, 2};
}

View File

@@ -0,0 +1,3 @@
class Test {
static final int[] myF = {};
}

View File

@@ -0,0 +1,3 @@
class Test {
static final int[] myT = {1,2}, myF = {};
}

View File

@@ -24,7 +24,6 @@ import com.intellij.JavaTestUtil;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiField;
import com.intellij.psi.PsiMethod;
@@ -117,6 +116,10 @@ public class ExtractClassTest extends MultiFileTestCase{
doTestField(null);
}
public void testNonNormalizedFields() throws Exception {
doTestField(null);
}
public void testDependantFieldInitializers() throws Exception {
doTestField(null);
}