diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/initialization/SplitDeclarationAndInitializationIntention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/initialization/SplitDeclarationAndInitializationIntention.java new file mode 100644 index 000000000000..34b4c39376d9 --- /dev/null +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/initialization/SplitDeclarationAndInitializationIntention.java @@ -0,0 +1,55 @@ +package com.siyeh.ipp.initialization; + +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.psi.*; +import com.intellij.psi.codeStyle.CodeStyleManager; +import com.intellij.util.IncorrectOperationException; +import com.siyeh.ipp.base.Intention; +import com.siyeh.ipp.base.PsiElementPredicate; + +public class SplitDeclarationAndInitializationIntention extends Intention{ + protected PsiElementPredicate getElementPredicate(){ + return new SplitDeclarationAndInitializationPredicate(); + } + + public String getText(){ + return "Split into declaration and initialization"; + } + + public String getFamilyName(){ + return "Split Declaration And Initialization"; + } + + public void invoke(Project project, Editor editor, PsiFile file) + throws IncorrectOperationException{ + final PsiField field = + (PsiField) findMatchingElement(file, editor); + field.normalizeDeclaration(); + final PsiExpression initializer = field.getInitializer(); + final String initializerText = initializer.getText(); + final PsiManager psiManager = field.getManager(); + final PsiElementFactory elementFactory = psiManager.getElementFactory(); + PsiClassInitializer classInitializer = + elementFactory.createClassInitializer(); + final PsiClass containingClass = field.getContainingClass(); + classInitializer = (PsiClassInitializer) containingClass.addAfter(classInitializer, + field); + final PsiCodeBlock body = classInitializer.getBody(); + final String initializationStatementText = + field.getName() + " = " + initializerText + ';'; + final PsiExpressionStatement statement = + (PsiExpressionStatement) elementFactory.createStatementFromText( + initializationStatementText, body); + body.add(statement); + if(field.hasModifierProperty(PsiModifier.STATIC)){ + final PsiModifierList modifierList = + classInitializer.getModifierList(); + modifierList.setModifierProperty(PsiModifier.STATIC, true); + } + initializer.delete(); + final CodeStyleManager codeStyleManager = psiManager.getCodeStyleManager(); + codeStyleManager.reformat(field); + codeStyleManager.reformat(classInitializer); + } +} diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/initialization/SplitDeclarationAndInitializationPredicate.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/initialization/SplitDeclarationAndInitializationPredicate.java new file mode 100644 index 000000000000..dfdb660ad372 --- /dev/null +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/initialization/SplitDeclarationAndInitializationPredicate.java @@ -0,0 +1,22 @@ +package com.siyeh.ipp.initialization; + +import com.siyeh.ipp.base.PsiElementPredicate; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiField; +import com.intellij.psi.PsiExpression; + +public class SplitDeclarationAndInitializationPredicate + implements PsiElementPredicate{ + public boolean satisfiedBy(PsiElement element){ + if(!(element instanceof PsiField)){ + return false; + } + final PsiField field = (PsiField) element; + final PsiExpression initializer = field.getInitializer(); + if(initializer == null) + { + return false; + } + return true; + } +} diff --git a/plugins/IntentionPowerPak/src/intentionDescriptions/Split Declaration And Initialization/after.java.template b/plugins/IntentionPowerPak/src/intentionDescriptions/Split Declaration And Initialization/after.java.template new file mode 100644 index 000000000000..1d04adc264b8 --- /dev/null +++ b/plugins/IntentionPowerPak/src/intentionDescriptions/Split Declaration And Initialization/after.java.template @@ -0,0 +1,6 @@ +public class X { + int i; + { + i = 65535; + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/src/intentionDescriptions/Split Declaration And Initialization/before.java.template b/plugins/IntentionPowerPak/src/intentionDescriptions/Split Declaration And Initialization/before.java.template new file mode 100644 index 000000000000..86943531bf8c --- /dev/null +++ b/plugins/IntentionPowerPak/src/intentionDescriptions/Split Declaration And Initialization/before.java.template @@ -0,0 +1,3 @@ +public class X { + int i = 65535; +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/src/intentionDescriptions/Split Declaration And Initialization/description.html b/plugins/IntentionPowerPak/src/intentionDescriptions/Split Declaration And Initialization/description.html new file mode 100644 index 000000000000..2e000e163a06 --- /dev/null +++ b/plugins/IntentionPowerPak/src/intentionDescriptions/Split Declaration And Initialization/description.html @@ -0,0 +1,10 @@ + + +This intention splits a field declaration with + initialization into a declaration and an initializer block.
+
+ +

+Powered by IntentionPowerPack + +