diff --git a/build/scripts/layouts.gant b/build/scripts/layouts.gant index a100fc013fd3..60bece10bfc9 100644 --- a/build/scripts/layouts.gant +++ b/build/scripts/layouts.gant @@ -496,8 +496,6 @@ def layout_core(String home, String target) { module("core-impl") module("boot") module("extensions") - module("indexing-api") - module("indexing-impl") module("java-psi-api") module("java-psi-impl") } diff --git a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java index 0efa25f378ac..44a9e6ab979b 100644 --- a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java +++ b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java @@ -525,7 +525,7 @@ public class BuildManager implements ApplicationComponent{ } final String defaultCharset = EncodingManager.getInstance().getDefaultCharsetName(); - if (defaultCharset != null) { + if (!StringUtil.isEmpty(defaultCharset)) { cmdBuilder.setGlobalEncoding(defaultCharset); } diff --git a/java/java-tests/testData/psi/parser-partial/declarations/Extension.txt b/java/java-tests/testData/psi/parser-partial/declarations/Extension.txt index fe4e23c8ec36..8e876a4d19a3 100644 --- a/java/java-tests/testData/psi/parser-partial/declarations/Extension.txt +++ b/java/java-tests/testData/psi/parser-partial/declarations/Extension.txt @@ -13,8 +13,14 @@ PsiJavaFile:Extension.java PsiParameterList:() PsiJavaToken:LPARENTH('(') PsiJavaToken:RPARENTH(')') + PsiWhiteSpace(' ') PsiReferenceList - + PsiKeyword:throws('throws') + PsiWhiteSpace(' ') + PsiJavaCodeReferenceElement:E + PsiIdentifier:E('E') + PsiReferenceParameterList + PsiWhiteSpace(' ') PsiKeyword:default('default') PsiWhiteSpace(' ') diff --git a/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/DeclarationParserTest.java b/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/DeclarationParserTest.java index a1b6b4290124..f9c7f5db6571 100644 --- a/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/DeclarationParserTest.java +++ b/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/DeclarationParserTest.java @@ -81,7 +81,7 @@ public class DeclarationParserTest extends JavaParsingTestCase { public void testMethodNormal1() { doParserTest("{ void f(); }", false, false); } public void testSemicolons() { doParserTest("{ void f() {}; void g() {}; }", false, false); } public void testUnclosed0() { doParserTest("{ void f() }", false, false); } - public void testExtension() { doParserTest("{ int f() default { return 42; } }", false, false); } + public void testExtension() { doParserTest("{ int f() throws E default { return 42; } }", false, false); } public void testUnclosed1() { doParserTest("{ void f( }", false, false); } public void testUnclosed2() { doParserTest("{ void f()\n void g(); }", false, false); } public void testUnclosed3() { doParserTest("{ void f(int a }", false, false); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java index 7838b9d84135..5ec0df3ea587 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java +++ b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java @@ -477,7 +477,7 @@ final class BuildSession implements Runnable, CanceledStatus { final String loadPath = isDirectoryBased(projectFile) ? new File(projectFile, IDEA_PROJECT_DIRNAME).getPath() : projectPath; IdeaProjectLoader.loadFromPath(project, loadPath, myPathVars, null, new SystemOutErrorReporter(false)); final String globalEncoding = myGlobalEncoding; - if (globalEncoding != null && project.getProjectCharset() == null) { + if (!StringUtil.isEmpty(globalEncoding) && project.getProjectCharset() == null) { project.setProjectCharset(globalEncoding); } project.getIgnoredFilePatterns().loadFromString(myIgnorePatterns); diff --git a/lib/guava-11.0.1.jar b/lib/guava-11.0.1.jar new file mode 100644 index 000000000000..af4a383eff83 Binary files /dev/null and b/lib/guava-11.0.1.jar differ diff --git a/lib/guava-12.0.jar b/lib/guava-12.0.jar deleted file mode 100644 index fefd6b2713c6..000000000000 Binary files a/lib/guava-12.0.jar and /dev/null differ diff --git a/lib/src/guava-11.0.1-sources.jar b/lib/src/guava-11.0.1-sources.jar new file mode 100644 index 000000000000..778c0c453d51 Binary files /dev/null and b/lib/src/guava-11.0.1-sources.jar differ diff --git a/lib/src/guava-12.0-sources.jar b/lib/src/guava-12.0-sources.jar deleted file mode 100644 index f6e03018ccdc..000000000000 Binary files a/lib/src/guava-12.0-sources.jar and /dev/null differ diff --git a/platform/lang-impl/src/com/intellij/formatting/AbstractBlockAlignmentProcessor.java b/platform/lang-impl/src/com/intellij/formatting/AbstractBlockAlignmentProcessor.java index 329cab1f1e7a..d166573bdb97 100644 --- a/platform/lang-impl/src/com/intellij/formatting/AbstractBlockAlignmentProcessor.java +++ b/platform/lang-impl/src/com/intellij/formatting/AbstractBlockAlignmentProcessor.java @@ -15,7 +15,9 @@ */ package com.intellij.formatting; +import com.intellij.diagnostic.LogMessageEx; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.TextRange; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -85,12 +87,20 @@ public abstract class AbstractBlockAlignmentProcessor implements BlockAlignmentP // alignment of blocks located before them and post error every time we detect endless cycle. Set blocksCausedRealignment = context.backwardShiftedAlignedBlocks.get(offsetResponsibleBlock); if (blocksCausedRealignment != null && blocksCausedRealignment.contains(context.targetBlock)) { - LOG.error(String.format("Please create dedicated ticket at the tracker with the content of the current editor attached%n%n" - + "Formatting error - code block %s is set to be shifted right because of its alignment with " - + "block %s more than once. I.e. moving the former block because of alignment algorithm causes " - + "subsequent block to be shifted right as well - cyclic dependency.%nDebug info: %s", - offsetResponsibleBlock.getTextRange(), context.targetBlock.getTextRange(), context.targetBlock.getDebugInfo() - )); + StringBuilder messageBuilder = new StringBuilder(); + TextRange targetRange = context.targetBlock.getTextRange(); + messageBuilder.append( + String.format("Formatting error - code block %s is set to be shifted right because of its alignment with " + + "block %s more than once. I.e. moving the former block because of alignment algorithm causes " + + "subsequent block to be shifted right as well - cyclic dependency.", + offsetResponsibleBlock.getTextRange(), targetRange + )); + messageBuilder.append(context.targetBlock.getDebugInfo()); + messageBuilder.append("\nBlock content: '") + .append(context.document.getText().substring(targetRange.getStartOffset(), targetRange.getEndOffset())) + .append("'\n"); + messageBuilder.append("Note: document text is attached to this report."); + LogMessageEx.error(LOG, messageBuilder.toString(), context.document.getText()); blocksCausedRealignment.add(context.targetBlock); return Result.UNABLE_TO_ALIGN_BACKWARD_BLOCK; } diff --git a/platform/lang-impl/src/com/intellij/refactoring/actions/RenameElementAction.java b/platform/lang-impl/src/com/intellij/refactoring/actions/RenameElementAction.java index 426aa4863f53..51046716b486 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/actions/RenameElementAction.java +++ b/platform/lang-impl/src/com/intellij/refactoring/actions/RenameElementAction.java @@ -18,7 +18,9 @@ package com.intellij.refactoring.actions; import com.intellij.lang.Language; import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.editor.Editor; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; import com.intellij.psi.PsiNamedElement; import com.intellij.psi.SyntheticElement; import com.intellij.refactoring.RefactoringActionHandler; @@ -57,4 +59,9 @@ public class RenameElementAction extends BaseRefactoringAction { protected boolean isAvailableForLanguage(Language language) { return true; } + + @Override + protected boolean isAvailableOnElementInEditorAndFile(PsiElement element, Editor editor, PsiFile file, DataContext context) { + return getHandler(context) != null; + } } diff --git a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/CallerChooserBase.java b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/CallerChooserBase.java index 7717f3513a0a..e9af5ca2164a 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/CallerChooserBase.java +++ b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/CallerChooserBase.java @@ -148,7 +148,7 @@ public abstract class CallerChooserBase extends DialogWrap }); final M caller = node.getMethod(); - final M callee = parentNode != null ? parentNode.getMethod() : null; + final PsiElement callee = parentNode != null ? parentNode.getElementToSearch() : null; if (caller != null && caller.isPhysical() && callee != null) { HighlightManager highlighter = HighlightManager.getInstance(myProject); EditorColorsManager colorManager = EditorColorsManager.getInstance(); @@ -161,7 +161,7 @@ public abstract class CallerChooserBase extends DialogWrap } } - protected Collection findElementsToHighlight(M caller, M callee) { + protected Collection findElementsToHighlight(M caller, PsiElement callee) { Query references = ReferencesSearch.search(callee, new LocalSearchScope(caller), false); return ContainerUtil.mapNotNull(references, new Function() { @Override diff --git a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/MethodNodeBase.java b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/MethodNodeBase.java index 6b51236c1ef1..f4a1faa80bb9 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/MethodNodeBase.java +++ b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/MethodNodeBase.java @@ -115,4 +115,9 @@ public abstract class MethodNodeBase extends CheckedTreeNo public M getMethod() { return myMethod; } + + public PsiElement getElementToSearch() { + return getMethod(); + } + } diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/commands/RequestFocusInEditorComponentCmd.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/commands/RequestFocusInEditorComponentCmd.java index 1adb4f46851e..96c0f77c6384 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/commands/RequestFocusInEditorComponentCmd.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/commands/RequestFocusInEditorComponentCmd.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -86,7 +86,8 @@ public final class RequestFocusInEditorComponentCmd extends FinalizableCommand{ return; } - if (owner instanceof IdeFrameImpl && IdeFrameImpl.getActiveFrame() != owner) { + final Window activeFrame = IdeFrameImpl.getActiveFrame(); + if (activeFrame != null && owner instanceof IdeFrameImpl && activeFrame != owner) { myDoneCallback.setRejected(); return; } diff --git a/plugins/IntentionPowerPak/src/com/siyeh/IntentionPowerPackBundle.properties b/plugins/IntentionPowerPak/src/com/siyeh/IntentionPowerPackBundle.properties index d9759cd5802e..41d59b6dc7a3 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/IntentionPowerPackBundle.properties +++ b/plugins/IntentionPowerPak/src/com/siyeh/IntentionPowerPackBundle.properties @@ -37,7 +37,6 @@ replace.switch.with.if.intention.name=Replace 'switch' with 'if' replace.switch.with.if.intention.family.name=Replace Switch with If simplify.variable.intention.name=Replace with Java-style array declaration simplify.variable.intention.family.name=Replace with Java Style Array Declaration -constant.expression.intention.name=Compute constant value constant.expression.intention.family.name=Compute Constant Value create.assert.intention.name=Create JUnit Assertion create.assert.intention.family.name=Create JUnit Assertion @@ -176,7 +175,7 @@ add.braces.intention.name=Add Braces to ''{0}'' statement remove.braces.intention.name=Remove braces from ''{0}'' statement flip.commutative.method.call.intention.name=Flip ''.{0}()'' flip.commutative.method.call.intention.name1=Flip ''.{0}()'' (may change semantics) -constant.subexpression.intention.name=Compute constant value of ''{0}'' +constant.expression.intention.name=Compute constant value of ''{0}'' status.bar.escape.highlighting.message=Press Escape to remove the highlighting 1.fully.qualified.name.status.bar.escape.highlighting.message=1 fully qualified name replaced with import (press Escape to remove highlighting) multiple.fully.qualified.names.status.bar.escape.highlighting.message={0} fully qualified names replaced with import (press Escape to remove highlighting) diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/constant/ConstantExpressionIntention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/constant/ConstantExpressionIntention.java index ba3e54e0f2b9..4c597df5d2ba 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/constant/ConstantExpressionIntention.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/constant/ConstantExpressionIntention.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2009 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2012 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,15 +16,24 @@ package com.siyeh.ipp.constant; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.psi.*; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiExpression; import com.intellij.util.IncorrectOperationException; -import com.siyeh.ipp.base.Intention; +import com.siyeh.IntentionPowerPackBundle; +import com.siyeh.ipp.base.MutablyNamedIntention; import com.siyeh.ipp.base.PsiElementPredicate; import com.siyeh.ipp.psiutils.ExpressionUtils; +import com.siyeh.ipp.psiutils.HighlightUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; -public class ConstantExpressionIntention extends Intention { +public class ConstantExpressionIntention extends MutablyNamedIntention { + + @Override + protected String getTextForElement(PsiElement element) { + final String text = HighlightUtil.getPresentableText(element); + return IntentionPowerPackBundle.message("constant.expression.intention.name", text); + } @Override @NotNull @@ -33,22 +42,16 @@ public class ConstantExpressionIntention extends Intention { } @Override - public void processIntention(PsiElement element) - throws IncorrectOperationException { - final PsiExpression expression = - (PsiExpression)element; - final Object value = - ExpressionUtils.computeConstantExpression(expression); + public void processIntention(PsiElement element) throws IncorrectOperationException { + final PsiExpression expression = (PsiExpression)element; + final Object value = ExpressionUtils.computeConstantExpression(expression); @NonNls final String newExpression; if (value instanceof String) { final String string = (String)value; - newExpression = - '"' + StringUtil.escapeStringCharacters(string) + '"'; + newExpression = '"' + StringUtil.escapeStringCharacters(string) + '"'; } else if (value instanceof Character) { - newExpression = - '\'' + StringUtil.escapeStringCharacters(value.toString()) + - '\''; + newExpression = '\'' + StringUtil.escapeStringCharacters(value.toString()) + '\''; } else if (value instanceof Long) { newExpression = value.toString() + 'L'; diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/constant/ConstantExpressionPredicate.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/constant/ConstantExpressionPredicate.java index 53a5fc14acdf..ad2ce95af9fc 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/constant/ConstantExpressionPredicate.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/constant/ConstantExpressionPredicate.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2009 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2012 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,28 +24,35 @@ import com.siyeh.ipp.psiutils.ExpressionUtils; class ConstantExpressionPredicate implements PsiElementPredicate { public boolean satisfiedBy(PsiElement element) { - if (!(element instanceof PsiBinaryExpression)) { + if (!(element instanceof PsiPolyadicExpression)) { return false; } - if (element instanceof PsiLiteralExpression || - element instanceof PsiClassObjectAccessExpression) { + if (element instanceof PsiLiteralExpression || element instanceof PsiClassObjectAccessExpression) { return false; } - final PsiBinaryExpression expression = (PsiBinaryExpression)element; - final PsiExpression rhs = expression.getROperand(); - if (rhs == null) { + final PsiPolyadicExpression expression = (PsiPolyadicExpression)element; + final PsiType expressionType = expression.getType(); + if (expressionType == null) return false; + if (expressionType.equalsToText("java.lang.String")) { + // intention disabled for string concatenations because of performance issues on + // relatively common large string expressions. return false; } - final PsiType type = rhs.getType(); - if (type == null || type.equalsToText("java.lang.String")) { - return false; + final PsiExpression[] operands = expression.getOperands(); + for (PsiExpression operand : operands) { + if (operand == null) { + return false; + } + final PsiType type = operand.getType(); + if (type == null || type.equalsToText("java.lang.String")) { + return false; + } } if (!PsiUtil.isConstantExpression(expression)) { return false; } try { - final Object value = - ExpressionUtils.computeConstantExpression(expression, true); + final Object value = ExpressionUtils.computeConstantExpression(expression, true); if (value == null) { return false; } @@ -54,7 +61,6 @@ class ConstantExpressionPredicate implements PsiElementPredicate { return false; } final PsiElement parent = element.getParent(); - return !(parent instanceof PsiExpression && - PsiUtil.isConstantExpression((PsiExpression)parent)); + return !(parent instanceof PsiExpression) || !PsiUtil.isConstantExpression((PsiExpression)parent); } } \ No newline at end of file diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/constant/ConstantSubexpressionIntention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/constant/ConstantSubexpressionIntention.java index d638fc6a4ecf..3b02069a5913 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/constant/ConstantSubexpressionIntention.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/constant/ConstantSubexpressionIntention.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2009 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2012 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,17 +15,13 @@ */ package com.siyeh.ipp.constant; -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.psi.PsiBinaryExpression; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiExpression; -import com.intellij.psi.PsiJavaToken; +import com.intellij.psi.*; import com.intellij.util.IncorrectOperationException; import com.siyeh.IntentionPowerPackBundle; import com.siyeh.ipp.base.MutablyNamedIntention; import com.siyeh.ipp.base.PsiElementPredicate; -import com.siyeh.ipp.psiutils.ConcatenationUtils; import com.siyeh.ipp.psiutils.ExpressionUtils; +import com.siyeh.ipp.psiutils.HighlightUtil; import org.jetbrains.annotations.NotNull; public class ConstantSubexpressionIntention extends MutablyNamedIntention { @@ -38,108 +34,109 @@ public class ConstantSubexpressionIntention extends MutablyNamedIntention { @Override protected String getTextForElement(PsiElement element) { - final PsiBinaryExpression binaryExpression = - (PsiBinaryExpression)element.getParent(); - assert binaryExpression != null; - final PsiExpression lhs = binaryExpression.getLOperand(); - final PsiExpression leftSide; - if (lhs instanceof PsiBinaryExpression) { - final PsiBinaryExpression lhsBinaryExpression = - (PsiBinaryExpression)lhs; - leftSide = lhsBinaryExpression.getROperand(); + final PsiJavaToken token; + if (element instanceof PsiJavaToken) { + token = (PsiJavaToken)element; + } else { + final PsiElement prevSibling = element.getPrevSibling(); + if (prevSibling instanceof PsiJavaToken) { + token = (PsiJavaToken)prevSibling; + } else { + throw new AssertionError(); + } } - else { - leftSide = lhs; - } - final PsiJavaToken operationSign = binaryExpression.getOperationSign(); - final PsiExpression rhs = binaryExpression.getROperand(); - assert rhs != null; - assert leftSide != null; - return IntentionPowerPackBundle.message( - "constant.subexpression.intention.name", leftSide.getText() + - ' ' + operationSign.getText() + ' ' + rhs.getText()); + final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)element.getParent(); + final PsiPolyadicExpression subexpression = ConstantSubexpressionPredicate.getSubexpression(polyadicExpression, token); + final String text = HighlightUtil.getPresentableText(subexpression); + return IntentionPowerPackBundle.message("constant.expression.intention.name", text); } @Override - public void processIntention(@NotNull PsiElement element) - throws IncorrectOperationException { - final PsiExpression expression = (PsiExpression)element.getParent(); - assert expression != null; - String newExpression = ""; - final Object constantValue; - if (expression instanceof PsiBinaryExpression) { - final PsiBinaryExpression copy = - (PsiBinaryExpression)expression.copy(); - final PsiExpression lhs = copy.getLOperand(); - if (lhs instanceof PsiBinaryExpression) { - final PsiBinaryExpression lhsBinaryExpression = - (PsiBinaryExpression)lhs; - newExpression += getLeftSideText(lhsBinaryExpression); - final PsiExpression rightSide = - lhsBinaryExpression.getROperand(); - assert rightSide != null; - lhs.replace(rightSide); - } - if (ConcatenationUtils.isConcatenation(expression)) { - constantValue = computeConstantStringExpression(copy); - } - else { - constantValue = - ExpressionUtils.computeConstantExpression(copy); + public void processIntention(@NotNull PsiElement element) throws IncorrectOperationException { + final PsiJavaToken token; + if (element instanceof PsiJavaToken) { + token = (PsiJavaToken)element; + } else { + final PsiElement prevSibling = element.getPrevSibling(); + if (prevSibling instanceof PsiJavaToken) { + token = (PsiJavaToken)prevSibling; + } else { + throw new AssertionError(); } } - else { - constantValue = - ExpressionUtils.computeConstantExpression(expression); - } - if (constantValue instanceof String) { - newExpression += '"' + StringUtil.escapeStringCharacters( - constantValue.toString()) + '"'; - } - else if (constantValue != null) { - if (constantValue instanceof Number) { - final Number number = (Number)constantValue; - if (0 > number.doubleValue()) { - newExpression += " "; + final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)element.getParent(); + final PsiPolyadicExpression subexpression = ConstantSubexpressionPredicate.getSubexpression(polyadicExpression, token); + final Object value = ExpressionUtils.computeConstantExpression(subexpression); + final StringBuilder newExpressionText = new StringBuilder(); + final PsiExpression[] operands = polyadicExpression.getOperands(); + PsiExpression prevOperand = null; + PsiJavaToken prevToken = null; + for (PsiExpression operand : operands) { + final PsiJavaToken currentToken = polyadicExpression.getTokenBeforeOperand(operand); + if (token == currentToken) { + if (prevToken != null) { + newExpressionText.append(prevToken.getText()); } + if (newExpressionText.length() > 0) { + newExpressionText.append(' '); + } + if (value instanceof Long) { + newExpressionText.append(value).append('L'); + } else if (value instanceof Double) { + final double v = ((Double)value).doubleValue(); + if (Double.isNaN(v)) { + newExpressionText.append("java.lang.Double.NaN"); + } + else if (Double.isInfinite(v)) { + if (v > 0.0) { + newExpressionText.append("java.lang.Double.POSITIVE_INFINITY"); + } + else { + newExpressionText.append("java.lang.Double.NEGATIVE_INFINITY"); + } + } + else { + newExpressionText.append(Double.toString(v)); + } + } + else if (value instanceof Float) { + final float v = ((Float)value).floatValue(); + if (Float.isNaN(v)) { + newExpressionText.append("java.lang.Float.NaN"); + } + else if (Float.isInfinite(v)) { + if (v > 0.0F) { + newExpressionText.append("java.lang.Float.POSITIVE_INFINITY"); + } + else { + newExpressionText.append("java.lang.Float.NEGATIVE_INFINITY"); + } + } + else { + newExpressionText.append(Float.toString(v)).append('f'); + } + } else { + newExpressionText.append(value); + } + prevOperand = null; + prevToken = null; + } else { + if (prevToken != null) { + newExpressionText.append(prevToken.getText()); + } + if (prevOperand != null) { + newExpressionText.append(prevOperand.getText()); + } + prevOperand = operand; + prevToken = currentToken; } - newExpression += constantValue.toString(); } - replaceExpression(newExpression, expression); - } - - /** - * handles the specified expression as if it was part of a string expression - * (even if it's of another type) and computes a constant string expression - * from it. - */ - private static String computeConstantStringExpression( - PsiBinaryExpression expression) { - final PsiExpression lhs = expression.getLOperand(); - final String lhsText = lhs.getText(); - String result; - if (lhsText.charAt(0) == '\'' || lhsText.charAt(0) == '"') { - result = lhsText.substring(1, lhsText.length() - 1); + if (prevToken != null) { + newExpressionText.append(prevToken.getText()); } - else { - result = lhsText; + if (prevOperand != null) { + newExpressionText.append(prevOperand.getText()); } - final PsiExpression rhs = expression.getROperand(); - assert rhs != null; - final String rhsText = rhs.getText(); - if (rhsText.charAt(0) == '\'' || rhsText.charAt(0) == '"') { - result += rhsText.substring(1, rhsText.length() - 1); - } - else { - result += rhsText; - } - return result; - } - - private static String getLeftSideText( - PsiBinaryExpression binaryExpression) { - final PsiExpression lhs = binaryExpression.getLOperand(); - final PsiJavaToken sign = binaryExpression.getOperationSign(); - return lhs.getText() + sign.getText(); + replaceExpression(newExpressionText.toString(), polyadicExpression); } } \ No newline at end of file diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/constant/ConstantSubexpressionPredicate.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/constant/ConstantSubexpressionPredicate.java index bbe065227f63..02d111224d3b 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/constant/ConstantSubexpressionPredicate.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/constant/ConstantSubexpressionPredicate.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2009 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2012 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,47 +19,71 @@ import com.intellij.psi.*; import com.intellij.psi.util.PsiUtil; import com.siyeh.ipp.base.PsiElementPredicate; import com.siyeh.ipp.psiutils.ExpressionUtils; -import org.jetbrains.annotations.Nullable; class ConstantSubexpressionPredicate implements PsiElementPredicate { public boolean satisfiedBy(PsiElement element) { - if (!(element instanceof PsiJavaToken) && - !(element.getPrevSibling() instanceof PsiJavaToken)) { - return false; + final PsiJavaToken token; + if (element instanceof PsiJavaToken) { + token = (PsiJavaToken)element; } + else { + final PsiElement prevSibling = element.getPrevSibling(); + if (prevSibling instanceof PsiJavaToken) { + token = (PsiJavaToken)prevSibling; + } + else { + return false; + } + } + final PsiElement parent = element.getParent(); - if (!(parent instanceof PsiBinaryExpression)) { + if (!(parent instanceof PsiPolyadicExpression)) { return false; } - final PsiBinaryExpression binaryExpression = - (PsiBinaryExpression)parent; - final PsiType type = binaryExpression.getType(); + final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)parent; + final PsiType type = polyadicExpression.getType(); if (type == null || type.equalsToText("java.lang.String")) { // handled by JoinConcatenatedStringLiteralsIntention return false; } - final PsiBinaryExpression subexpression = - getSubexpression(binaryExpression); + final PsiPolyadicExpression subexpression = getSubexpression(polyadicExpression, token); if (subexpression == null) { return false; } - if (binaryExpression.equals(subexpression) && - !isPartOfConstantExpression(binaryExpression)) { - // handled by ConstantExpressonIntention + if (!isPartOfLargerExpression(polyadicExpression)) { + // handled by ConstantExpressionIntention return false; } if (!PsiUtil.isConstantExpression(subexpression)) { return false; } - final Object value = - ExpressionUtils.computeConstantExpression(subexpression); + final Object value = ExpressionUtils.computeConstantExpression(subexpression); return value != null; } - private static boolean isPartOfConstantExpression( - PsiBinaryExpression binaryExpression) { - final PsiElement containingElement = binaryExpression.getParent(); + static PsiPolyadicExpression getSubexpression(PsiPolyadicExpression expression, PsiJavaToken token) { + final PsiExpression[] operands = expression.getOperands(); + if (operands.length == 2) { + return expression; + } + for (int i = 1; i < operands.length; i++) { + final PsiExpression operand = operands[i]; + final PsiJavaToken currentToken = expression.getTokenBeforeOperand(operand); + if (currentToken == token) { + final String binaryExpressionText = operands[i - 1].getText() + ' ' + token.getText() + ' ' + operand.getText(); + final PsiElementFactory factory = JavaPsiFacade.getElementFactory(expression.getProject()); + return (PsiBinaryExpression)factory.createExpressionFromText(binaryExpressionText, expression); + } + } + return null; + } + + private static boolean isPartOfLargerExpression(PsiPolyadicExpression expression) { + if (expression.getOperands().length > 2) { + return true; + } + final PsiElement containingElement = expression.getParent(); if (containingElement instanceof PsiExpression) { final PsiExpression containingExpression = (PsiExpression)containingElement; @@ -72,38 +96,4 @@ class ConstantSubexpressionPredicate implements PsiElementPredicate { } return true; } - - /** - * Returns the smallest subexpression (if precendence allows it). example: - * variable + 2 + 3 normally gets evaluated left to right -> (variable + 2) - * + 3 this method returns the right most legal subexpression -> 2 + 3 - */ - @Nullable - private static PsiBinaryExpression getSubexpression( - PsiBinaryExpression expression) { - final PsiExpression rhs = expression.getROperand(); - if (rhs == null) { - return null; - } - final PsiExpression lhs = expression.getLOperand(); - if (!(lhs instanceof PsiBinaryExpression)) { - return expression; - } - final PsiBinaryExpression lhsBinaryExpression = - (PsiBinaryExpression)lhs; - final PsiExpression leftSide = lhsBinaryExpression.getROperand(); - if (leftSide == null) { - return null; - } - try { - final PsiBinaryExpression binaryExpression = - (PsiBinaryExpression)expression.copy(); - final PsiExpression lOperand = binaryExpression.getLOperand(); - lOperand.replace(leftSide); - return binaryExpression; - } - catch (Throwable ignore) { - return null; - } - } } \ No newline at end of file diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/psiutils/HighlightUtil.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/psiutils/HighlightUtil.java index c7350f7cce1a..e03c5c876868 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/psiutils/HighlightUtil.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/psiutils/HighlightUtil.java @@ -1,5 +1,5 @@ /* - * Copyright 2007-2011 Bas Leijdekkers + * Copyright 2007-2012 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,7 +30,8 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.wm.StatusBar; import com.intellij.openapi.wm.WindowManager; import com.intellij.psi.PsiElement; -import com.intellij.psi.util.PsiUtilBase; +import com.intellij.psi.PsiWhiteSpace; +import com.intellij.psi.util.PsiUtilCore; import org.jetbrains.annotations.NotNull; import java.util.Collection; @@ -51,32 +52,24 @@ public class HighlightUtil { final Application application = ApplicationManager.getApplication(); application.invokeLater(new Runnable() { public void run() { - final PsiElement[] elements = - PsiUtilBase.toPsiElementArray(elementCollection); + final PsiElement[] elements = PsiUtilCore.toPsiElementArray(elementCollection); final PsiElement firstElement = elements[0]; if (!firstElement.isValid()) { return; } final Project project = firstElement.getProject(); - final FileEditorManager editorManager = - FileEditorManager.getInstance(project); - final EditorColorsManager editorColorsManager = - EditorColorsManager.getInstance(); + final FileEditorManager editorManager = FileEditorManager.getInstance(project); + final EditorColorsManager editorColorsManager = EditorColorsManager.getInstance(); final Editor editor = editorManager.getSelectedTextEditor(); if (editor == null) { return; } - final EditorColorsScheme globalScheme = - editorColorsManager.getGlobalScheme(); - final TextAttributes textattributes = - globalScheme.getAttributes( + final EditorColorsScheme globalScheme = editorColorsManager.getGlobalScheme(); + final TextAttributes textattributes = globalScheme.getAttributes( EditorColors.SEARCH_RESULT_ATTRIBUTES); - final HighlightManager highlightManager = - HighlightManager.getInstance(project); - highlightManager.addOccurrenceHighlights( - editor, elements, textattributes, true, null); - final FindManager findmanager = - FindManager.getInstance(project); + final HighlightManager highlightManager = HighlightManager.getInstance(project); + highlightManager.addOccurrenceHighlights(editor, elements, textattributes, true, null); + final FindManager findmanager = FindManager.getInstance(project); FindModel findmodel = findmanager.getFindNextModel(); if (findmodel == null) { findmodel = findmanager.getFindInFileModel(); @@ -86,11 +79,11 @@ public class HighlightUtil { findmanager.setFindNextModel(findmodel); application.invokeLater(new Runnable() { public void run() { - final WindowManager windowManager = - WindowManager.getInstance(); - final StatusBar statusBar = - windowManager.getStatusBar(project); - statusBar.setInfo(statusBarText); + final WindowManager windowManager = WindowManager.getInstance(); + final StatusBar statusBar = windowManager.getStatusBar(project); + if (statusBar != null) { + statusBar.setInfo(statusBarText); + } } }); } @@ -102,4 +95,27 @@ public class HighlightUtil { final List elements = Collections.singletonList(element); highlightElements(elements, statusBarText); } + + public static String getPresentableText(PsiElement element) { + return getPresentableText(element, new StringBuilder()).toString(); + } + + private static StringBuilder getPresentableText(PsiElement element, StringBuilder builder) { + if (element == null) { + return builder; + } + if (element instanceof PsiWhiteSpace) { + return builder.append(' '); + } + final PsiElement[] children = element.getChildren(); + if (children.length != 0) { + for (PsiElement child : children) { + getPresentableText(child, builder); + } + } + else { + builder.append(element.getText()); + } + return builder; + } } \ No newline at end of file diff --git a/plugins/git4idea/src/git4idea/repo/GitRepositoryManagerImpl.java b/plugins/git4idea/src/git4idea/repo/GitRepositoryManagerImpl.java index c8129a70249f..b853317890af 100644 --- a/plugins/git4idea/src/git4idea/repo/GitRepositoryManagerImpl.java +++ b/plugins/git4idea/src/git4idea/repo/GitRepositoryManagerImpl.java @@ -100,8 +100,9 @@ public class GitRepositoryManagerImpl extends AbstractProjectComponent implement public GitRepository getRepositoryForFile(@NotNull VirtualFile file) { final VcsRoot vcsRoot = myVcsManager.getVcsRootObjectFor(file); if (vcsRoot == null) { return null; } - if (!myVcs.equals(vcsRoot.vcs)) { - LOG.info(String.format("getRepositoryForFile returned non-Git (%s) root for file %s", vcsRoot.vcs.getDisplayName(), file)); + final AbstractVcs vcs = vcsRoot.vcs; + if (!myVcs.equals(vcs)) { + LOG.info(String.format("getRepositoryForFile returned non-Git (%s) root for file %s", vcs != null ? vcs.getDisplayName() : vcs, file)); return null; } return getRepositoryForRoot(vcsRoot.path); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/actions/NewGroovyClassAction.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/actions/NewGroovyClassAction.java index cdd5e6d8436c..bab6c05bdeb5 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/actions/NewGroovyClassAction.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/actions/NewGroovyClassAction.java @@ -32,6 +32,7 @@ import com.intellij.psi.JavaDirectoryService; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; +import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.GroovyBundle; @@ -112,6 +113,7 @@ public class NewGroovyClassAction extends JavaCreateTemplateInPackageAction \n//\ ------------------------------\ FIELDS\ - ------------------------------\n - + fillString="" useProjectWidthForFill="true" fillWidth="0">\n// ------------------------------ FIELDS ------------------------------\n @@ -247,9 +245,7 @@ \n//\ --------------------------\ OTHER\ METHODS\ - --------------------------\n - + fillString="" useProjectWidthForFill="true" fillWidth="0">\n// -------------------------- OTHER METHODS --------------------------\n @@ -285,9 +281,7 @@ \n//\ --------------------------\ INNER\ CLASSES\ - --------------------------\n - + fillString="" useProjectWidthForFill="true" fillWidth="0">\n// -------------------------- INNER CLASSES --------------------------\n diff --git a/plugins/rearranger/test/src/com/wrq/rearranger/InteractiveTest.java b/plugins/rearranger/test/src/com/wrq/rearranger/InteractiveTest.java index 09beffce623b..78865f5de646 100644 --- a/plugins/rearranger/test/src/com/wrq/rearranger/InteractiveTest.java +++ b/plugins/rearranger/test/src/com/wrq/rearranger/InteractiveTest.java @@ -30,11 +30,8 @@ import com.wrq.rearranger.settings.RearrangerSettings; * Date: Mar 30, 2004 */ @SkipInHeadlessEnvironment -public class InteractiveTest - extends LightCodeInsightFixtureTestCase -{ - public static final String DEFAULT_CONFIGURATION_ROOT = ".."; // up one level from test - public static final String DEFAULT_CONFIGURATION = DEFAULT_CONFIGURATION_ROOT + "/src/com/wrq/rearranger/defaultConfiguration.xml"; +public class InteractiveTest extends LightCodeInsightFixtureTestCase { + public static final String DEFAULT_CONFIGURATION = "/src/com/wrq/rearranger/defaultConfiguration.xml"; private RearrangerSettings mySettings; @Override diff --git a/plugins/rearranger/test/src/com/wrq/rearranger/RearrangerTest.groovy b/plugins/rearranger/test/src/com/wrq/rearranger/RearrangerTest.groovy index 47f437e26fda..adfa21cd1d41 100644 --- a/plugins/rearranger/test/src/com/wrq/rearranger/RearrangerTest.groovy +++ b/plugins/rearranger/test/src/com/wrq/rearranger/RearrangerTest.groovy @@ -24,12 +24,16 @@ package com.wrq.rearranger; import com.intellij.openapi.application.ApplicationManager import com.intellij.psi.PsiModifier +import com.intellij.testFramework.PlatformTestUtil import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase import com.wrq.rearranger.settings.CommentRule import com.wrq.rearranger.settings.RearrangerSettings import com.wrq.rearranger.settings.RelatedMethodsSettings import com.wrq.rearranger.settings.attributeGroups.GetterSetterDefinition +import com.wrq.rearranger.settings.attributeGroups.InterfaceAttributes +import com.wrq.rearranger.settings.attributeGroups.RegexUtil import com.wrq.rearranger.util.CommentRuleBuilder +import com.wrq.rearranger.util.SettingsConfigurationBuilder import org.jetbrains.annotations.NotNull import org.jetbrains.annotations.Nullable import com.wrq.rearranger.util.java.* @@ -37,13 +41,15 @@ import com.wrq.rearranger.util.java.* /** JUnit tests for the rearranger plugin. */ class RearrangerTest extends LightCodeInsightFixtureTestCase { - private RearrangerSettings mySettings - private JavaClassRuleBuilder classRule - private JavaInnerClassRuleBuilder innerClassRule - private JavaFieldRuleBuilder fieldRule - private JavaMethodRuleBuilder methodRule - private CommentRuleBuilder commentRule - private JavaSpacingRule spacingRule + private RearrangerSettings mySettings + private SettingsConfigurationBuilder settings + private JavaClassRuleBuilder classRule + private JavaInterfaceRuleBuilder interfaceRule + private JavaInnerClassRuleBuilder innerClassRule + private JavaFieldRuleBuilder fieldRule + private JavaMethodRuleBuilder methodRule + private CommentRuleBuilder commentRule + private JavaSpacingRule spacingRule @Override protected String getBasePath() { @@ -61,7 +67,13 @@ class RearrangerTest extends LightCodeInsightFixtureTestCase { mySettings.showRules = true mySettings.rearrangeInnerClasses = true + prepareBuilders(mySettings) + } + + private void prepareBuilders(RearrangerSettings mySettings) { + settings = new SettingsConfigurationBuilder(settings: mySettings) classRule = new JavaClassRuleBuilder(settings: mySettings) + interfaceRule = new JavaInterfaceRuleBuilder(settings: mySettings) innerClassRule = new JavaInnerClassRuleBuilder(settings: mySettings) fieldRule = new JavaFieldRuleBuilder(settings: mySettings) methodRule = new JavaMethodRuleBuilder(settings: mySettings) @@ -75,15 +87,13 @@ class RearrangerTest extends LightCodeInsightFixtureTestCase { public final void testPublicFieldRearrangement() throws Exception { doTest('RearrangementTest', 'RearrangementResult2') { - fieldRule.create { - modifier( PsiModifier.PUBLIC ) - } } } + fieldRule.modifier PsiModifier.PUBLIC + } } public final void testNotPublicFieldRearrangement() throws Exception { doTest('RearrangementTest', 'RearrangementResult3') { - fieldRule.create { - modifier( PsiModifier.PUBLIC, invert: true ) - } } } + fieldRule.modifier PsiModifier.PUBLIC, invert: true + } } public final void testConstructorRearrangement() throws Exception { doTest('RearrangementTest', 'RearrangementResult4') { @@ -126,7 +136,7 @@ class RearrangerTest extends LightCodeInsightFixtureTestCase { doTest('RearrangementTest', 'RearrangementResult9') { methodRule.create { target([ MethodType.GETTER_OR_SETTER, MethodType.OTHER ]) - sort(SortType.BY_NAME) + 'sort by'( SortOption.BY_NAME ) } } } public final void testSimpleComment() throws Exception { @@ -151,12 +161,12 @@ class RearrangerTest extends LightCodeInsightFixtureTestCase { public final void testMultipleRuleCommentMatch() throws Exception { doTest('RearrangementTest11', 'RearrangementResult11') { - commentRule.create { comment('// FIELDS:', condition: CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE, allSubsequent: false) } - commentRule.create { comment('// FINAL FIELDS:', condition: CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE, allSubsequent: false, - subsequentRulesToMatch: 1) } + commentRule.create { comment('// FIELDS:', condition: CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE, 'all subsequent': false) } + commentRule.create { comment('// FINAL FIELDS:', condition: CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE, 'all subsequent': false, + 'subsequent rules to match': 1) } fieldRule.create { modifier(PsiModifier.FINAL) } - commentRule.create { comment('// NON-FINAL FIELDS:', condition: CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE, allSubsequent: true, - subsequentRulesToMatch: 1) } + commentRule.create { comment('// NON-FINAL FIELDS:', condition: CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE, 'all subsequent': true, + 'subsequent rules to match': 1) } fieldRule.create { modifier(PsiModifier.FINAL, invert: true) } } } @@ -182,56 +192,56 @@ class RearrangerTest extends LightCodeInsightFixtureTestCase { doTest(srcFilename, compareFilename) { commentRule.create { comment('//************************************** PUBLIC STATIC FIELDS *************************************', - condition: CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE, allSubsequent: false, allPreceding: true, - subsequentRulesToMatch: 2, precedingRulesToMatch: 1) + condition: CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE, 'all subsequent': false, 'all preceding': true, + 'subsequent rules to match': 2, 'preceding rules to match': 1) } fieldRule.create { modifier([ PsiModifier.PUBLIC, PsiModifier.STATIC, PsiModifier.FINAL ]) - sort( SortType.BY_NAME ) + 'sort by'( SortOption.BY_NAME ) } fieldRule.create { modifier([ PsiModifier.PUBLIC, PsiModifier.STATIC ]) - sort( SortType.BY_NAME ) + 'sort by'( SortOption.BY_NAME ) } commentRule.create { comment('//************************************** PUBLIC FIELDS *****************************************', - condition: CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE, allSubsequent: true, allPreceding: true, - subsequentRulesToMatch: 1, precedingRulesToMatch: 1) + condition: CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE, 'all subsequent': true, 'all preceding': true, + 'subsequent rules to match': 1, 'preceding rules to match': 1) } fieldRule.create { modifier( PsiModifier.PUBLIC ) - sort( SortType.BY_NAME ) + 'sort by'( SortOption.BY_NAME ) } commentRule.create { comment('//*********************************** PROTECTED/PACKAGE FIELDS **************************************', - condition: CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE, allSubsequent: false, allPreceding: true, - subsequentRulesToMatch: 3, precedingRulesToMatch: 1) + condition: CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE, 'all subsequent': false, 'all preceding': true, + 'subsequent rules to match': 3, 'preceding rules to match': 1) } fieldRule.create { modifier([ PsiModifier.PROTECTED, PsiModifier.PACKAGE_LOCAL, PsiModifier.STATIC, PsiModifier.FINAL ]) - sort( SortType.BY_NAME ) + 'sort by'( SortOption.BY_NAME ) } fieldRule.create { modifier([ PsiModifier.PROTECTED, PsiModifier.PACKAGE_LOCAL, PsiModifier.STATIC ]) - sort( SortType.BY_NAME ) + 'sort by'( SortOption.BY_NAME ) } fieldRule.create { modifier([ PsiModifier.PROTECTED, PsiModifier.PACKAGE_LOCAL ]) - sort( SortType.BY_NAME ) + 'sort by'( SortOption.BY_NAME ) } commentRule.create { comment('//************************************** PRIVATE FIELDS *****************************************', - condition: CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE, allSubsequent: false, allPreceding: true, - subsequentRulesToMatch: 1, precedingRulesToMatch: 1) + condition: CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE, 'all subsequent': false, 'all preceding': true, + 'subsequent rules to match': 1, 'preceding rules to match': 1) } fieldRule.create { modifier( PsiModifier.PRIVATE ) - sort( SortType.BY_NAME ) + 'sort by'( SortOption.BY_NAME ) } commentRule.create { comment('//************************************** CONSTRUCTORS ************************************* ', - condition: CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE, allSubsequent: false, allPreceding: true, - subsequentRulesToMatch: 2, precedingRulesToMatch: 1) + condition: CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE, 'all subsequent': false, 'all preceding': true, + 'subsequent rules to match': 2, 'preceding rules to match': 1) } methodRule.create { modifier( PsiModifier.PUBLIC ) @@ -240,54 +250,54 @@ class RearrangerTest extends LightCodeInsightFixtureTestCase { methodRule.create { target( MethodType.CONSTRUCTOR ) } commentRule.create { comment('//*********************************** GETTERS AND SETTERS ********************************** ', - condition: CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE, allSubsequent: false, allPreceding: true, - subsequentRulesToMatch: 2, precedingRulesToMatch: 1) + condition: CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE, 'all subsequent': false, 'all preceding': true, + 'subsequent rules to match': 2, 'preceding rules to match': 1) } methodRule.create { modifier( PsiModifier.PUBLIC ) target( MethodType.GETTER_OR_SETTER ) - sort( SortType.BY_NAME ) + 'sort by'( SortOption.BY_NAME ) } methodRule.create { target( MethodType.GETTER_OR_SETTER ) - sort( SortType.BY_NAME ) + 'sort by'( SortOption.BY_NAME ) } def text = '//************************************** PUBLIC METHODS ************************************* ' if (doublePublicMethods) { text += "\n// PUBLIC METHODS LINE 2"; } commentRule.create { - comment(text, condition: CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE, allSubsequent: true, allPreceding: true, - subsequentRulesToMatch: 1, precedingRulesToMatch: 1) + comment(text, condition: CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE, 'all subsequent': true, 'all preceding': true, + 'subsequent rules to match': 1, 'preceding rules to match': 1) } methodRule.create { modifier( PsiModifier.PUBLIC ) - sort( SortType.BY_NAME ) + 'sort by'( SortOption.BY_NAME ) } commentRule.create { comment('//********************************* PACKAGE/PROTECTED METHODS ******************************** ', - condition: CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE, allSubsequent: true, allPreceding: true, - subsequentRulesToMatch: 1, precedingRulesToMatch: 1) + condition: CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE, 'all subsequent': true, 'all preceding': true, + 'subsequent rules to match': 1, 'preceding rules to match': 1) } methodRule.create { modifier([ PsiModifier.PROTECTED, PsiModifier.PACKAGE_LOCAL ]) - sort( SortType.BY_NAME ) + 'sort by'( SortOption.BY_NAME ) } commentRule.create { comment('//************************************** PRIVATE METHODS *************************************', - condition: CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE, allSubsequent: true, allPreceding: true, - subsequentRulesToMatch: 1, precedingRulesToMatch: 1) + condition: CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE, 'all subsequent': true, 'all preceding': true, + 'subsequent rules to match': 1, 'preceding rules to match': 1) } methodRule.create { modifier( PsiModifier.PRIVATE ) - sort( SortType.BY_NAME ) + 'sort by'( SortOption.BY_NAME ) } commentRule.create { comment('//************************************** INNER CLASSES ************************************* ', - condition: CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE, allSubsequent: true, allPreceding: true, - subsequentRulesToMatch: 1, precedingRulesToMatch: 1) + condition: CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE, 'all subsequent': true, 'all preceding': true, + 'subsequent rules to match': 1, 'preceding rules to match': 1) } - innerClassRule.create { sort(SortType.BY_NAME ) } + innerClassRule.create { 'sort by'(SortOption.BY_NAME ) } mySettings.extractedMethodsSettings.moveExtractedMethods = false if (doGlobalPattern) { @@ -298,61 +308,46 @@ class RearrangerTest extends LightCodeInsightFixtureTestCase { public final void testReturnTypeMatch() throws Exception { doTest('RearrangementTest12', 'RearrangementResult12') { - methodRule.create { returnType( 'void' ) } - fieldRule.create { type( 'int' ) } - methodRule.create { returnType( '.*je.*' ) } - methodRule.create { returnType( /Integer\[\]/) } - methodRule.create { returnType( 'int' ) } + methodRule.create { 'return type'( 'void' ) } + fieldRule.create { type( 'int' ) } + methodRule.create { 'return type'( '.*je.*' ) } + methodRule.create { 'return type'( /Integer\[\]/) } + methodRule.create { 'return type'( 'int' ) } } } public final void testRelatedMethodsDepthOriginal() throws Exception { doTest('RearrangementTest13', 'RearrangementResult13DO') { - mySettings.extractedMethodsSettings.moveExtractedMethods = true - mySettings.extractedMethodsSettings.depthFirstOrdering = true - mySettings.extractedMethodsSettings.ordering = RelatedMethodsSettings.RETAIN_ORIGINAL_ORDER + settings.'extracted methods'( 'depth-first order': true, order: RelatedMethodsSettings.RETAIN_ORIGINAL_ORDER ) } } public final void testRelatedMethodsDepthAlphabetical() throws Exception { doTest('RearrangementTest13', 'RearrangementResult13DA') { - mySettings.extractedMethodsSettings.moveExtractedMethods = true - mySettings.extractedMethodsSettings.depthFirstOrdering = true - mySettings.extractedMethodsSettings.ordering = RelatedMethodsSettings.ALPHABETICAL_ORDER + settings.'extracted methods'( 'depth-first order': true, order: RelatedMethodsSettings.ALPHABETICAL_ORDER ) } } public final void testRelatedMethodsDepthInvocation() throws Exception { doTest('RearrangementTest13', 'RearrangementResult13DI') { - mySettings.extractedMethodsSettings.moveExtractedMethods = true - mySettings.extractedMethodsSettings.depthFirstOrdering = true - mySettings.extractedMethodsSettings.ordering = RelatedMethodsSettings.INVOCATION_ORDER + settings.'extracted methods'( 'depth-first order': true, order: RelatedMethodsSettings.INVOCATION_ORDER ) } } public final void testRelatedMethodsBreadthOriginal() throws Exception { doTest('RearrangementTest13', 'RearrangementResult13BO') { - mySettings.extractedMethodsSettings.moveExtractedMethods = true - mySettings.extractedMethodsSettings.depthFirstOrdering = false - mySettings.extractedMethodsSettings.ordering = RelatedMethodsSettings.RETAIN_ORIGINAL_ORDER + settings.'extracted methods'( 'depth-first order': false, order: RelatedMethodsSettings.RETAIN_ORIGINAL_ORDER ) } } public final void testRelatedMethodsBreadthAlphabetical() throws Exception { doTest('RearrangementTest13', 'RearrangementResult13BA') { - mySettings.extractedMethodsSettings.moveExtractedMethods = true - mySettings.extractedMethodsSettings.depthFirstOrdering = false - mySettings.extractedMethodsSettings.ordering = RelatedMethodsSettings.ALPHABETICAL_ORDER + settings.'extracted methods'( 'depth-first order': false, order: RelatedMethodsSettings.ALPHABETICAL_ORDER) } } public final void testRelatedMethodsBreadthInvocation() throws Exception { doTest('RearrangementTest13', 'RearrangementResult13BI') { - mySettings.extractedMethodsSettings.moveExtractedMethods = true - mySettings.extractedMethodsSettings.depthFirstOrdering = false - mySettings.extractedMethodsSettings.ordering = RelatedMethodsSettings.INVOCATION_ORDER + settings.'extracted methods'( 'depth-first order': false, order: RelatedMethodsSettings.INVOCATION_ORDER) } } private void doTestEmitComments(args) { doTest(args.initial?: 'RearrangementTest13', args.expected) { - mySettings.extractedMethodsSettings.moveExtractedMethods = true - mySettings.extractedMethodsSettings.depthFirstOrdering = args.depthFirst - mySettings.extractedMethodsSettings.ordering = args.orderType - mySettings.extractedMethodsSettings.commentType = args.commentType + settings.'extracted methods'( 'depth-first order': args.depthFirst, order: args.orderType, commentType: args.commentType ) def precedingCommentRule = new CommentRule() precedingCommentRule.commentText = '''\ @@ -373,161 +368,156 @@ class RearrangerTest extends LightCodeInsightFixtureTestCase { public final void testEmitTLCommentsRelatedMethodsBreadthInvocation() throws Exception { doTestEmitComments( - expected: 'RearrangementResult13BITLC', - depthFirst: false, - orderType: RelatedMethodsSettings.INVOCATION_ORDER, - commentType: RelatedMethodsSettings.COMMENT_TYPE_TOP_LEVEL + expected: 'RearrangementResult13BITLC', + depthFirst: false, + orderType: RelatedMethodsSettings.INVOCATION_ORDER, + commentType: RelatedMethodsSettings.COMMENT_TYPE_TOP_LEVEL ) } public final void testEmitEMCommentsRelatedMethodsBreadthInvocation() throws Exception { doTestEmitComments( - expected: 'RearrangementResult13BIEMC', - depthFirst: false, - orderType: RelatedMethodsSettings.INVOCATION_ORDER, - commentType: RelatedMethodsSettings.COMMENT_TYPE_EACH_METHOD + expected: 'RearrangementResult13BIEMC', + depthFirst: false, + orderType: RelatedMethodsSettings.INVOCATION_ORDER, + commentType: RelatedMethodsSettings.COMMENT_TYPE_EACH_METHOD ) } public final void testEmitELCommentsRelatedMethodsBreadthInvocation() throws Exception { doTestEmitComments( - expected: 'RearrangementResult13BIELC', - depthFirst: false, - orderType: RelatedMethodsSettings.INVOCATION_ORDER, - commentType: RelatedMethodsSettings.COMMENT_TYPE_EACH_LEVEL + expected: 'RearrangementResult13BIELC', + depthFirst: false, + orderType: RelatedMethodsSettings.INVOCATION_ORDER, + commentType: RelatedMethodsSettings.COMMENT_TYPE_EACH_LEVEL ) } public final void testEmitNFCommentsRelatedMethodsBreadthInvocation() throws Exception { doTestEmitComments( - expected: 'RearrangementResult13BINFC', - depthFirst: false, - orderType: RelatedMethodsSettings.INVOCATION_ORDER, - commentType: RelatedMethodsSettings.COMMENT_TYPE_NEW_FAMILY + expected: 'RearrangementResult13BINFC', + depthFirst: false, + orderType: RelatedMethodsSettings.INVOCATION_ORDER, + commentType: RelatedMethodsSettings.COMMENT_TYPE_NEW_FAMILY ) } public final void testEmitTLCommentsRelatedMethodsDepthInvocation() throws Exception { doTestEmitComments( - expected: 'RearrangementResult13DITLC', - depthFirst: true, - orderType: RelatedMethodsSettings.INVOCATION_ORDER, - commentType: RelatedMethodsSettings.COMMENT_TYPE_TOP_LEVEL + expected: 'RearrangementResult13DITLC', + depthFirst: true, + orderType: RelatedMethodsSettings.INVOCATION_ORDER, + commentType: RelatedMethodsSettings.COMMENT_TYPE_TOP_LEVEL ) } public final void testEmitEMCommentsRelatedMethodsDepthInvocation() throws Exception { doTestEmitComments( - expected: 'RearrangementResult13DIEMC', - depthFirst: true, - orderType: RelatedMethodsSettings.INVOCATION_ORDER, - commentType: RelatedMethodsSettings.COMMENT_TYPE_EACH_METHOD + expected: 'RearrangementResult13DIEMC', + depthFirst: true, + orderType: RelatedMethodsSettings.INVOCATION_ORDER, + commentType: RelatedMethodsSettings.COMMENT_TYPE_EACH_METHOD ) } public final void testEmitELCommentsRelatedMethodsDepthInvocation() throws Exception { doTestEmitComments( - expected: 'RearrangementResult13BIELC', - depthFirst: false, - orderType: RelatedMethodsSettings.INVOCATION_ORDER, - commentType: RelatedMethodsSettings.COMMENT_TYPE_EACH_LEVEL + expected: 'RearrangementResult13BIELC', + depthFirst: false, + orderType: RelatedMethodsSettings.INVOCATION_ORDER, + commentType: RelatedMethodsSettings.COMMENT_TYPE_EACH_LEVEL ) } public final void testEmitNFCommentsRelatedMethodsDepthInvocation() throws Exception { doTestEmitComments( - expected: 'RearrangementResult13DINFC', - depthFirst: true, - orderType: RelatedMethodsSettings.INVOCATION_ORDER, - commentType: RelatedMethodsSettings.COMMENT_TYPE_NEW_FAMILY + expected: 'RearrangementResult13DINFC', + depthFirst: true, + orderType: RelatedMethodsSettings.INVOCATION_ORDER, + commentType: RelatedMethodsSettings.COMMENT_TYPE_NEW_FAMILY ) } public final void testRelatedMethodsException() throws Exception { doTest('RearrangementTest13', 'RearrangementResult13Ex') { - mySettings.extractedMethodsSettings.moveExtractedMethods = true - mySettings.extractedMethodsSettings.depthFirstOrdering = true - mySettings.extractedMethodsSettings.ordering = RelatedMethodsSettings.RETAIN_ORIGINAL_ORDER + settings.'extracted methods'( 'depth-first order': true, order: RelatedMethodsSettings.RETAIN_ORIGINAL_ORDER ) methodRule.create { name('GF') } } } public final void testKeepOverloadedMethodsTogether() throws Exception { doTest('RearrangementTest14', 'RearrangementResult14') { - mySettings.extractedMethodsSettings.moveExtractedMethods = true - mySettings.extractedMethodsSettings.depthFirstOrdering = false - mySettings.extractedMethodsSettings.ordering = RelatedMethodsSettings.INVOCATION_ORDER - mySettings.keepOverloadedMethodsTogether = true - } } + settings.configure { + 'extracted methods'( 'depth-first order': false, order: RelatedMethodsSettings.INVOCATION_ORDER ) + 'keep together'( 'overloaded' ) + } } } public final void testXML() throws Exception { doTest('RearrangementTest17', 'RearrangementTest17', 'xml') } public final void testKeepGSTogether() throws Exception { doTest('RearrangementTest18', 'RearrangementResult18') { - mySettings.keepGettersSettersTogether = true - mySettings.extractedMethodsSettings.ordering = RelatedMethodsSettings.ALPHABETICAL_ORDER + settings.configure { + 'extracted methods'( order: RelatedMethodsSettings.INVOCATION_ORDER ) + 'keep together'( 'getters and setters' ) + } fieldRule.create {} methodRule.create { target( MethodType.CONSTRUCTOR ) } methodRule.create { target( MethodType.GETTER_OR_SETTER ) - sort( SortType.BY_NAME ) + 'sort by'( SortOption.BY_NAME ) } } } public final void testKeepGSWithProperty() throws Exception { doTest('RearrangementTest18', 'RearrangementResult18A') { - mySettings.keepGettersSettersTogether = true - mySettings.keepGettersSettersWithProperty = true - mySettings.extractedMethodsSettings.ordering = RelatedMethodsSettings.ALPHABETICAL_ORDER + settings.configure { + 'extracted methods'( order: RelatedMethodsSettings.ALPHABETICAL_ORDER ) + 'keep together'([ 'getters and setters', 'getters and setters with property' ]) + } fieldRule.create { } methodRule.create { target(MethodType.CONSTRUCTOR) } methodRule.create { target( MethodType.GETTER_OR_SETTER ) - sort( SortType.BY_NAME ) + 'sort by'( SortOption.BY_NAME ) } } } public final void testKeepGSWithPropertyElseTogether() throws Exception { doTest('RearrangementTest18B', 'RearrangementResult18B') { - mySettings.keepGettersSettersTogether = true - mySettings.keepGettersSettersWithProperty = true - mySettings.extractedMethodsSettings.ordering = RelatedMethodsSettings.ALPHABETICAL_ORDER + settings.configure { + 'extracted methods'( order: RelatedMethodsSettings.ALPHABETICAL_ORDER ) + 'keep together'([ 'getters and setters', 'getters and setters with property' ]) + } fieldRule.create { } commentRule.create { comment('// Getters/Setters', condition: CommentRule.EMIT_ALWAYS) } methodRule.create { target( MethodType.GETTER_OR_SETTER ) - getterCriteria( + 'getter criteria'( name: GetterSetterDefinition.GETTER_NAME_CORRECT_PREFIX, body: GetterSetterDefinition.GETTER_BODY_IMMATERIAL ) - setterCriteria( + 'setter criteria'( name: GetterSetterDefinition.SETTER_NAME_CORRECT_PREFIX, body: GetterSetterDefinition.SETTER_BODY_IMMATERIAL ) - sort( SortType.BY_NAME ) + 'sort by'( SortOption.BY_NAME ) } commentRule.create { comment('// Other Methods', condition: CommentRule.EMIT_ALWAYS) } - methodRule.create { sort( SortType.BY_NAME ) } + methodRule.create { 'sort by'( SortOption.BY_NAME ) } } } public final void testKeepOverloadsTogetherOriginalOrder() throws Exception { doTest('RearrangementTest19', 'RearrangementResult19A') { - mySettings.extractedMethodsSettings.moveExtractedMethods = false - mySettings.keepOverloadedMethodsTogether = true - mySettings.overloadedOrder = RearrangerSettings.OVERLOADED_ORDER_RETAIN_ORIGINAL + settings.'overloaded methods'( 'keep together': true, order: RearrangerSettings.OVERLOADED_ORDER_RETAIN_ORIGINAL ) } } public final void testKeepOverloadsTogetherAscendingOrder() throws Exception { doTest('RearrangementTest19', 'RearrangementResult19B') { - mySettings.extractedMethodsSettings.moveExtractedMethods = false - mySettings.keepOverloadedMethodsTogether = true - mySettings.overloadedOrder = RearrangerSettings.OVERLOADED_ORDER_ASCENDING_PARAMETERS + settings.'overloaded methods'( 'keep together': true, order: RearrangerSettings.OVERLOADED_ORDER_ASCENDING_PARAMETERS ) } } public final void testKeepOverloadsTogetherDescendingOrder() throws Exception { doTest('RearrangementTest19', 'RearrangementResult19C') { - mySettings.extractedMethodsSettings.moveExtractedMethods = false - mySettings.keepOverloadedMethodsTogether = true - mySettings.overloadedOrder = RearrangerSettings.OVERLOADED_ORDER_DESCENDING_PARAMETERS + settings.'overloaded methods'( 'keep together': true, order: RearrangerSettings.OVERLOADED_ORDER_DESCENDING_PARAMETERS ) } } public final void testInnerClassReferenceToChild() throws Exception { @@ -537,7 +527,7 @@ class RearrangerTest extends LightCodeInsightFixtureTestCase { public final void testMultipleFieldDecl() throws Exception { doTest('RearrangementTest21', 'RearrangementResult21') { - fieldRule.create { sort( SortType.BY_NAME ) } + fieldRule.create { 'sort by'( SortOption.BY_NAME ) } } } public final void testRemoveBlankLines() throws Exception { @@ -602,7 +592,7 @@ class RearrangerTest extends LightCodeInsightFixtureTestCase { doTest('GetterDefinitionTest', 'GetPrefixImmaterialResult') { methodRule.create { target( MethodType.GETTER_OR_SETTER ) - getterCriteria( + 'getter criteria'( name: GetterSetterDefinition.GETTER_NAME_CORRECT_PREFIX, body: GetterSetterDefinition.GETTER_BODY_IMMATERIAL ) } } } @@ -611,7 +601,7 @@ class RearrangerTest extends LightCodeInsightFixtureTestCase { doTest('GetterDefinitionTest', 'GetPrefixReturnsResult') { methodRule.create { target( MethodType.GETTER_OR_SETTER ) - getterCriteria( + 'getter criteria'( name: GetterSetterDefinition.GETTER_NAME_CORRECT_PREFIX, body: GetterSetterDefinition.GETTER_BODY_RETURNS ) } } } @@ -620,7 +610,7 @@ class RearrangerTest extends LightCodeInsightFixtureTestCase { doTest('GetterDefinitionTest', 'GetPrefixReturnsFieldResult') { methodRule.create { target( MethodType.GETTER_OR_SETTER ) - getterCriteria( + 'getter criteria'( name: GetterSetterDefinition.GETTER_NAME_CORRECT_PREFIX, body: GetterSetterDefinition.GETTER_BODY_RETURNS_FIELD ) } } } @@ -629,7 +619,7 @@ class RearrangerTest extends LightCodeInsightFixtureTestCase { doTest('GetterDefinitionTest', 'GetFieldReturnsResult') { methodRule.create { target( MethodType.GETTER_OR_SETTER ) - getterCriteria( + 'getter criteria'( name: GetterSetterDefinition.GETTER_NAME_MATCHES_FIELD, body: GetterSetterDefinition.GETTER_BODY_RETURNS ) } } } @@ -638,7 +628,7 @@ class RearrangerTest extends LightCodeInsightFixtureTestCase { doTest('GetterDefinitionTest', 'GetFieldReturnsFieldResult') { methodRule.create { target( MethodType.GETTER_OR_SETTER ) - getterCriteria( + 'getter criteria'( name: GetterSetterDefinition.GETTER_NAME_MATCHES_FIELD, body: GetterSetterDefinition.GETTER_BODY_RETURNS_FIELD ) } } } @@ -647,707 +637,335 @@ class RearrangerTest extends LightCodeInsightFixtureTestCase { doTest('RearrangementTest22', 'RearrangementResult22') { methodRule.create { target( MethodType.GETTER_OR_SETTER ) - getterCriteria( + 'getter criteria'( name: GetterSetterDefinition.GETTER_NAME_CORRECT_PREFIX, body: GetterSetterDefinition.GETTER_BODY_RETURNS ) - setterCriteria( + 'setter criteria'( name: GetterSetterDefinition.SETTER_NAME_CORRECT_PREFIX, body: GetterSetterDefinition.SETTER_BODY_IMMATERIAL ) } mySettings.keepGettersSettersTogether = true } } -// public void testInterfaceNoNameNotAlphabeticalNoExcludeMethodAlphabetical() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest23.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// rs.setKeepGettersSettersTogether(false); -// InterfaceAttributes ia = new InterfaceAttributes(); -// CommentRule cr = new CommentRule(); -// cr.setCommentText("/**** Interface %IF% Header ****/"); -// ia.setPrecedingComment(cr); -// cr = new CommentRule(); -// cr.setCommentText("/**** Interface %IF% Trailer ***/"); -// ia.setTrailingComment(cr); -// ia.setNoExtractedMethods(true); -// ia.setMethodOrder(InterfaceAttributes.METHOD_ORDER_ALPHABETICAL); -// ia.setAlphabetizeInterfaces(false); -// rs.addItem(ia, 0); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementResult23NNNANXMA.java"); -// } -// -// public void testInterfaceNoNameNotAlphabeticalNoExcludeMethodEncountered() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest23.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// rs.setKeepGettersSettersTogether(false); -// InterfaceAttributes ia = new InterfaceAttributes(); -// CommentRule cr = new CommentRule(); -// cr.setCommentText("/**** Interface %IF% Header ****/"); -// ia.setPrecedingComment(cr); -// cr = new CommentRule(); -// cr.setCommentText("/**** Interface %IF% Trailer ***/"); -// ia.setTrailingComment(cr); -// ia.setNoExtractedMethods(true); -// ia.setMethodOrder(InterfaceAttributes.METHOD_ORDER_ENCOUNTERED); -// ia.setAlphabetizeInterfaces(false); -// rs.addItem(ia, 0); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementResult23NNNANXME.java"); -// } -// -// public void testInterfaceNoNameNotAlphabeticalNoExcludeMethodInterfaceOrder() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest23.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// rs.setKeepGettersSettersTogether(false); -// InterfaceAttributes ia = new InterfaceAttributes(); -// CommentRule cr = new CommentRule(); -// cr.setCommentText("/**** Interface %IF% Header ****/"); -// ia.setPrecedingComment(cr); -// cr = new CommentRule(); -// cr.setCommentText("/**** Interface %IF% Trailer ***/"); -// ia.setTrailingComment(cr); -// ia.setNoExtractedMethods(true); -// ia.setMethodOrder(InterfaceAttributes.METHOD_ORDER_INTERFACE_ORDER); -// ia.setAlphabetizeInterfaces(false); -// rs.addItem(ia, 0); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementResult23NNNANXMI.java"); -// } -// -// public void testInterfaceByNameNotAlphabeticalNoExcludeMethodEncountered() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest23.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// rs.setKeepGettersSettersTogether(false); -// InterfaceAttributes ia = new InterfaceAttributes(); -// ia.getNameAttr().setMatch(true); -// ia.getNameAttr().setExpression("IFace1"); -// ia.setNoExtractedMethods(true); -// ia.setMethodOrder(InterfaceAttributes.METHOD_ORDER_ENCOUNTERED); -// ia.setAlphabetizeInterfaces(false); -// rs.addItem(ia, 0); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementResult23BNNANXME.java"); -// } -// -// public void testInterfaceIsAlphabeticalNoExcludeMethodEncountered() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest23.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// rs.setKeepGettersSettersTogether(false); -// InterfaceAttributes ia = new InterfaceAttributes(); -// CommentRule cr = new CommentRule(); -// cr.setCommentText("/**** Interface %IF% Header ****/"); -// ia.setPrecedingComment(cr); -// cr = new CommentRule(); -// cr.setCommentText("/**** Interface %IF% Trailer ***/"); -// ia.setTrailingComment(cr); -// ia.setNoExtractedMethods(true); -// ia.setMethodOrder(InterfaceAttributes.METHOD_ORDER_ENCOUNTERED); -// ia.setAlphabetizeInterfaces(true); -// rs.addItem(ia, 0); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementResult23NNIANXME.java"); -// } -// -// public void testNPE24() throws Exception { -// // submitted by Nathan Brown. Caused NPE in Rearranger plugin version 1.7. -// int itemIndex = 0; -// configureByFile("/com/wrq/rearranger/RearrangementTest24.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// rs.setKeepGettersSettersTogether(true); -// rs.setKeepOverloadedMethodsTogether(true); -//// rs.setAskBeforeRearranging(false); -// rs.setOverloadedOrder(1); -// rs.setGlobalCommentPattern(""); -// rs.setRemoveBlanksInsideCodeBlocks(false); -// FieldAttributes fa; -// fa = new FieldAttributes(); -// fa.getSortAttr().setByName(false); -// fa.getPlAttr().setPlPublic(true); -// fa.getPlAttr().setPlPrivate(true); -// fa.getPlAttr().setPlProtected(true); -// fa.getPlAttr().setPlPackage(true); -// fa.getPlAttr().setInvertProtectionLevel(false); -// fa.getStAttr().setValue(true); -// fa.getStAttr().setInvert(false); -// rs.addItem(fa, itemIndex++); -// fa = new FieldAttributes(); -// fa.getStAttr().setValue(true); -// fa.getStAttr().setInvert(true); -// fa.getInitToAnonClassAttr().setValue(true); -// fa.getInitToAnonClassAttr().setInvert(true); -// rs.addItem(fa, itemIndex++); -// fa = new FieldAttributes(); -// fa.getInitToAnonClassAttr().setValue(true); -// rs.addItem(fa, itemIndex++); -// MethodAttributes ma; -// ma = new MethodAttributes(); -// ma.getStaticInitAttr().setValue(true); -// rs.addItem(ma, itemIndex++); -// ma = new MethodAttributes(); -// ma.setConstructorMethodType(true); -// rs.addItem(ma, itemIndex++); -// ma = new MethodAttributes(); -// ma.getNameAttr().setMatch(true); -// ma.getNameAttr().setExpression("clone"); -// rs.addItem(ma, itemIndex++); -// ma = new MethodAttributes(); -// ma.getNameAttr().setMatch(true); -// ma.getNameAttr().setExpression("dispose"); -// rs.addItem(ma, itemIndex++); -// ma = new MethodAttributes(); -// ma.getNameAttr().setMatch(true); -// ma.getNameAttr().setExpression("_dispose"); -// rs.addItem(ma, itemIndex++); -// ma = new MethodAttributes(); -// ma.getNameAttr().setMatch(true); -// ma.getNameAttr().setExpression("build"); -// rs.addItem(ma, itemIndex++); -// ma = new MethodAttributes(); -// ma.getAbstractAttr().setValue(true); -// rs.addItem(ma, itemIndex++); -// ma = new MethodAttributes(); -// ma.getStAttr().setValue(true); -// ma.getStAttr().setInvert(true); -// ma.getAbstractAttr().setValue(true); -// ma.getAbstractAttr().setInvert(true); -// ma.setOtherMethodType(true); -// rs.addItem(ma, itemIndex++); -// ma = new MethodAttributes(); -// ma.setGetterSetterMethodType(true); -// rs.addItem(ma, itemIndex++); -// InnerClassAttributes ica = new InnerClassAttributes(); -// rs.addItem(ica, itemIndex++); -// ma = new MethodAttributes(); -// ma.getStAttr().setValue(true); -// rs.addItem(ma, itemIndex); -// rs.getExtractedMethodsSettings().setMoveExtractedMethods(true); -// rs.getExtractedMethodsSettings().setBelowFirstCaller(false); -// rs.getExtractedMethodsSettings().setDepthFirstOrdering(true); -// rs.getExtractedMethodsSettings().setOrdering(0); -// rs.getExtractedMethodsSettings().setNonPrivateTreatment(2); -// rs.getExtractedMethodsSettings().setCommentType(0); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// } -// -// public void testSpacingOptions() throws Exception { -// /** -// * From Thomas Singer: -// * I've enabled -// * - Force 0 blank lines before class close brace "}" -// * - Force 0 blank lines before method close brace "}" -// * - Remove initial and final blank lines inside code block -// * but in the code below the blank lines don't get removed when invoking -// * Rearrager from editor's context menu: -// */ -// configureByFile("/com/wrq/rearranger/RearrangementTest25.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// rs.getBeforeClassRBrace().setForce(true); -// rs.getBeforeClassRBrace().setnBlankLines(0); -// rs.getBeforeMethodRBrace().setForce(true); -// rs.getBeforeMethodRBrace().setnBlankLines(0); -// rs.setRemoveBlanksInsideCodeBlocks(true); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementResult25.java"); -// } -// -// public void testPriority() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// MethodAttributes ma; -// ma = new MethodAttributes(); -// ma.setPriority(1); -// rs.addItem(ma, 0); -// ma = new MethodAttributes(); -// ma.setPriority(2); -// ma.getNameAttr().setMatch(true); -// ma.getNameAttr().setExpression("method.*"); -// rs.addItem(ma, 1); -// ma = new MethodAttributes(); -// ma.setPriority(2); -// ma.getNameAttr().setMatch(true); -// ma.getNameAttr().setExpression(".*Method"); -// rs.addItem(ma, 2); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementResult1A.java"); -// } -// -// public void testGSRuleWithClassInitializer() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest26.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// MethodAttributes ma; -// ma = new MethodAttributes(); -// ma.setGetterSetterMethodType(true); -// rs.addItem(ma, 0); -// rs.setKeepGettersSettersTogether(true); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementResult26.java"); -// } -// -// public void testKeepGSTogetherAndExtractedMethods() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest27.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// rs.setKeepGettersSettersTogether(true); -// rs.setKeepOverloadedMethodsTogether(true); -// rs.getExtractedMethodsSettings().setMoveExtractedMethods(true); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementResult27.java"); -// } -// -// public void testRegexEscape() throws Exception { -// String s = "// ********* start of fields *********"; -// String result = RegexUtil.escape(s); -// assertEquals("sequence reduction failed", "// \\*{9} start of fields \\*{9}", result); -// s = "// \\ backslash \n \t \\d [...] (^...$)"; -// result = RegexUtil.escape(s); -// assertEquals("special character escape failed", "// \\\\ backslash \\n \\t \\\\d \\[\\.\\.\\.\\]" + -// " \\(\\^\\.\\.\\.\\$\\)", result); -// } -// -// public void testRegexCombine() throws Exception { -// String p1 = RegexUtil.escape("// ********* start of fields *********"); -// String p2 = RegexUtil.escape("// ********* start of methods *********"); -// List list = new ArrayList(); -// list.add(p1); -// list.add(p2); -// String result = RegexUtil.combineExpressions(list); -// assertEquals("combination failed", "// \\*{9} start of (fiel|metho)ds \\*{9}", result); -// String p3 = RegexUtil.escape("// ***** start of interfaces *******"); -// list.add(p3); -// result = RegexUtil.combineExpressions(list); -// assertEquals("combination failed", "// (\\*{9} start of (fiel|metho)ds \\*{9}|" + -// "\\*{5} start of interfaces \\*{7})", result); -// } -// -// public void testVariousComments() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest28.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// rs.setKeepGettersSettersTogether(true); -// rs.setKeepOverloadedMethodsTogether(true); -// CommentRule cr = new CommentRule(); -// cr.setCommentText("// start of fields"); -// cr.setEmitCondition(CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE); -// cr.setAllSubsequentRules(true); -// cr.setnSubsequentRulesToMatch(1); -// rs.addItem(cr, 0); -// FieldAttributes fa = new FieldAttributes(); -// rs.addItem(fa, 1); -// cr = new CommentRule(); -// cr.setCommentText("// end of fields"); -// cr.setEmitCondition(CommentRule.EMIT_IF_ITEMS_MATCH_PRECEDING_RULE); -// cr.setAllPrecedingRules(true); -// cr.setnPrecedingRulesToMatch(1); -// rs.addItem(cr, 2); -// InterfaceAttributes ia = new InterfaceAttributes(); -// ia.setMethodOrder(InterfaceAttributes.METHOD_ORDER_ENCOUNTERED); -// ia.setAlphabetizeInterfaces(false); -// ia.setNoExtractedMethods(false); -// cr = new CommentRule(); -// cr.setCommentText("// start of interface %IF%"); -// ia.setPrecedingComment(cr); -// cr = new CommentRule(); -// cr.setCommentText("// end of interface %IF%"); -// ia.setTrailingComment(cr); -// rs.addItem(ia, 3); -// rs.getExtractedMethodsSettings().setBelowFirstCaller(false); -// rs.getExtractedMethodsSettings().setMoveExtractedMethods(true); -// rs.getExtractedMethodsSettings().setCommentType(RelatedMethodsSettings.COMMENT_TYPE_EACH_LEVEL); -// rs.getExtractedMethodsSettings().setNonPrivateTreatment(RelatedMethodsSettings.NON_PRIVATE_EXTRACTED_ANY_CALLERS); -// rs.getExtractedMethodsSettings().setDepthFirstOrdering(true); -// cr = new CommentRule(); -// cr.setCommentText("// Level %LV% methods"); -// rs.getExtractedMethodsSettings().setPrecedingComment(cr); -// cr = new CommentRule(); -// cr.setCommentText("// end Level %LV% methods"); -// rs.getExtractedMethodsSettings().setTrailingComment(cr); -// // should work with or without the global comment pattern -//// rs.setGlobalCommentPattern("// (((start|end) of (fields|interface [A-Za-z_0-9]+))|(end|)Level [0-9]+ methods)"); -// rah.rearrangeDocument(getProject(), file, rs, doc); // note - blank lines end up "reversed" -// // where a blank line, generated comment, and method occur in order; the generated comment is removed -// // and the blank line precedes the method; when the new comment is generated, it is inserted before -// // the blank line. -// super.checkResultByFile("/com/wrq/rearranger/RearrangementResult28.java"); -// } -// -// public void testParseBugInfiniteLoop() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest29.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementTest29.java"); -// } -// -// public void testSpacingBug() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest30.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// rs.getAfterClassLBrace().setForce(true); -// rs.getAfterClassLBrace().setnBlankLines(0); -// rs.getAfterClassRBrace().setForce(true); -// rs.getAfterClassRBrace().setnBlankLines(1); -// rs.getAfterMethodLBrace().setForce(true); -// rs.getAfterMethodLBrace().setnBlankLines(0); -// rs.getAfterMethodRBrace().setForce(true); -// rs.getAfterMethodRBrace().setnBlankLines(1); -// rs.getBeforeClassRBrace().setForce(true); -// rs.getBeforeClassRBrace().setnBlankLines(0); -// rs.getNewlinesAtEOF().setForce(true); -// rs.getNewlinesAtEOF().setnBlankLines(1); -// rs.setRemoveBlanksInsideCodeBlocks(true); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementResult30.java"); -// } -// -// public void testSpacingBug2() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest31.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// rs.getAfterClassLBrace().setForce(true); -// rs.getAfterClassLBrace().setnBlankLines(0); -// rs.getAfterClassRBrace().setForce(true); -// rs.getAfterClassRBrace().setnBlankLines(1); -// rs.getAfterMethodLBrace().setForce(true); -// rs.getAfterMethodLBrace().setnBlankLines(0); -// rs.getAfterMethodRBrace().setForce(true); -// rs.getAfterMethodRBrace().setnBlankLines(1); -// rs.getBeforeClassRBrace().setForce(true); -// rs.getBeforeClassRBrace().setnBlankLines(0); -// rs.getBeforeMethodRBrace().setForce(true); -// rs.getBeforeMethodRBrace().setnBlankLines(0); -// rs.setRemoveBlanksInsideCodeBlocks(true); -// rs.getNewlinesAtEOF().setForce(true); -// rs.getNewlinesAtEOF().setnBlankLines(1); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementResult31.java"); -// } -// -// public void testSpacingBug3() throws Exception { -// configureByFile("/com/wrq/rearranger/DomainExpanderTest.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// rs.getAfterClassLBrace().setForce(true); -// rs.getAfterClassLBrace().setnBlankLines(0); -// rs.getAfterClassRBrace().setForce(true); -// rs.getAfterClassRBrace().setnBlankLines(1); -// rs.getAfterMethodLBrace().setForce(true); -// rs.getAfterMethodLBrace().setnBlankLines(0); -// rs.getAfterMethodRBrace().setForce(true); -// rs.getAfterMethodRBrace().setnBlankLines(0); -// rs.getBeforeClassRBrace().setForce(true); -// rs.getBeforeClassRBrace().setnBlankLines(0); -// rs.getBeforeMethodRBrace().setForce(true); -// rs.getBeforeMethodRBrace().setnBlankLines(0); -// rs.setRemoveBlanksInsideCodeBlocks(true); -// rs.getNewlinesAtEOF().setForce(true); -// rs.getNewlinesAtEOF().setnBlankLines(1); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/DomainExpanderResult.java"); -// } -// -// /** -// * Bug occurs when one or more blank lines precede a generated comment. -// * When comment is removed, blank lines now precede the item. Comment is inserted -// * at the beginning (i.e. before the blank lines) and a newline character is -// * prefixed to the comment. Net effect is that new blank line(s) appear after the comment. -// * -// * @throws Exception test exception -// */ -// public void testGeneratedCommentSpacingBug() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest32.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// rs = RearrangerSettings.getSettingsFromFile(new File(InteractiveTest.DEFAULT_CONFIGURATION)); -// rs.setAskBeforeRearranging(false); -// rs.getNewlinesAtEOF().setForce(true); -// rs.getNewlinesAtEOF().setnBlankLines(1); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementResult32.java"); -// } -// -// public void testGeneratedCommentSpacing() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest32.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// rs = RearrangerSettings.getSettingsFromFile(new File(InteractiveTest.DEFAULT_CONFIGURATION)); -// rs.setAskBeforeRearranging(false); -// rs.getNewlinesAtEOF().setForce(true); -// rs.getNewlinesAtEOF().setnBlankLines(1); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementResult32.java"); -// } -// -// public void testInnerClassComments() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest34.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// rs = RearrangerSettings.getSettingsFromFile(new File(InteractiveTest.DEFAULT_CONFIGURATION)); -// rs.setAskBeforeRearranging(false); -// rs.setRearrangeInnerClasses(true); -// rs.getNewlinesAtEOF().setForce(true); -// rs.getNewlinesAtEOF().setnBlankLines(1); -// CommentRule cr = new CommentRule(); -// cr.setCommentText("// ----- OUTER CLASS -----\n"); -// rs.getClassOrderAttributeList().add(0, cr); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementResult34.java"); -// } -// -// public void testInnerClassCommentsNoRearrangement() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest34.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// rs = RearrangerSettings.getSettingsFromFile(new File(InteractiveTest.DEFAULT_CONFIGURATION)); -// rs.setAskBeforeRearranging(false); -// rs.setRearrangeInnerClasses(false); -// rs.getNewlinesAtEOF().setForce(true); -// rs.getNewlinesAtEOF().setnBlankLines(1); -// CommentRule cr = new CommentRule(); -// cr.setCommentText("// ----- OUTER CLASS -----\n"); -// rs.getClassOrderAttributeList().add(0, cr); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementResult34B.java"); -// } -// -// public void testFirstInsertionOfComment() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest35.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// CommentRule cr = new CommentRule(); -// cr.setCommentText("// ----- FIELDS -----\n"); -// FieldAttributes fa = new FieldAttributes(); -// rs.addItem(cr, 0); -// rs.addItem(fa, 1); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementResult35.java"); -// } -// -// public void testExcludeFromExtraction() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest36.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementTest36.java"); -// } -// -// public void testInterferingGSNames() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest37.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// rs.setKeepGettersSettersTogether(true); -// rs.getDefaultGSDefinition().setGetterBodyCriterion(GetterSetterDefinition.GETTER_BODY_IMMATERIAL); -// rs.getDefaultGSDefinition().setGetterNameCriterion(GetterSetterDefinition.GETTER_NAME_CORRECT_PREFIX); -// rs.getDefaultGSDefinition().setSetterBodyCriterion(GetterSetterDefinition.SETTER_BODY_IMMATERIAL); -// rs.getDefaultGSDefinition().setSetterNameCriterion(GetterSetterDefinition.GETTER_NAME_CORRECT_PREFIX); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementResult37.java"); -// } -// -// public void testInterferingGSNamesNoKGSTogether() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest37.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// rs.setKeepGettersSettersTogether(false); -// rs.getDefaultGSDefinition().setGetterBodyCriterion(GetterSetterDefinition.GETTER_BODY_IMMATERIAL); -// rs.getDefaultGSDefinition().setGetterNameCriterion(GetterSetterDefinition.GETTER_NAME_CORRECT_PREFIX); -// rs.getDefaultGSDefinition().setSetterBodyCriterion(GetterSetterDefinition.SETTER_BODY_IMMATERIAL); -// rs.getDefaultGSDefinition().setSetterNameCriterion(GetterSetterDefinition.GETTER_NAME_CORRECT_PREFIX); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementTest37.java"); -// } -// -// public void testRemoveBlankLineInsideMethodBug() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest38.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// File settingsFile = new File(InteractiveTest.DEFAULT_CONFIGURATION_ROOT + -// "/test/testData/com/wrq/rearranger/RearrangementTest38cfg.xml"); -// rs = RearrangerSettings.getSettingsFromFile(settingsFile); -// rs.setAskBeforeRearranging(false); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementTest38.java"); -// } -// -// public void testSortFieldsByTypeAndName() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest39.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// FieldAttributes fa = new FieldAttributes(); -// fa.getSortAttr().setByType(true); -// fa.getSortAttr().setByName(true); -// rs.addItem(fa, 0); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementResult39B.java"); -// } -// -// public void testSortFieldsByType() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest39.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// FieldAttributes fa = new FieldAttributes(); -// fa.getSortAttr().setByType(true); -// fa.getSortAttr().setByName(false); -// rs.addItem(fa, 0); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementResult39C.java"); -// } -// -// public void testSortFieldsByTypeICAndName() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest39.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// FieldAttributes fa = new FieldAttributes(); -// fa.getSortAttr().setByType(true); -// fa.getSortAttr().setTypeCaseInsensitive(true); -// fa.getSortAttr().setByName(true); -// rs.addItem(fa, 0); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementResult39.java"); -// } -// -// public void testSortFieldsByTypeIC() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest39.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// FieldAttributes fa = new FieldAttributes(); -// fa.getSortAttr().setByType(true); -// fa.getSortAttr().setTypeCaseInsensitive(true); -// fa.getSortAttr().setByName(false); -// rs.addItem(fa, 0); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementResult39A.java"); -// } -// -// /** -// * test detection of method overrides/overridden/implements/implemented attributes. -// * -// * @throws Exception test exception -// */ -// public void testOverImpl() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest40.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementResult40.java"); -// } -// -// public final void testRemoveBlankLinesBeforeMethod() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest41.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// rs.getAfterClassLBrace().setForce(true); -// rs.getAfterClassLBrace().setnBlankLines(0); -// rs.getBeforeMethodLBrace().setForce(true); -// rs.getBeforeMethodLBrace().setnBlankLines(0); -// rs.getAfterMethodLBrace().setForce(true); -// rs.getAfterMethodLBrace().setnBlankLines(0); -// rs.getBeforeMethodRBrace().setForce(true); -// rs.getBeforeMethodRBrace().setnBlankLines(0); -// rs.getAfterMethodRBrace().setForce(true); -// rs.getAfterMethodRBrace().setnBlankLines(0); -// rs.getBeforeClassRBrace().setForce(true); -// rs.getBeforeClassRBrace().setnBlankLines(0); -// rs.getAfterClassRBrace().setForce(true); -// rs.getAfterClassRBrace().setnBlankLines(0); -// rs.setRemoveBlanksInsideCodeBlocks(true); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementResult41.java"); -// } -// -// public final void testEnumClass() throws Exception { -// final Project project = getProject(); -// final LanguageLevelProjectExtension llpExtension = LanguageLevelProjectExtension.getInstance(project); -// LanguageLevel oldLevel = llpExtension.getLanguageLevel(); -// llpExtension.setLanguageLevel(LanguageLevel.JDK_1_5); -// configureByFile("/com/wrq/rearranger/RearrangementTest42.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementResult42.java"); -// llpExtension.setLanguageLevel(oldLevel); -// } -// -// public final void testNumParameters() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest43.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// MethodAttributes ma; -// ma = new MethodAttributes(); -// ma.getMinParamsAttr().setMatch(true); -// ma.getMinParamsAttr().setValue(2); -// ma.getMaxParamsAttr().setMatch(true); -// ma.getMaxParamsAttr().setValue(3); -// rs.addItem(ma, 0); -// ma = new MethodAttributes(); -// ma.getMinParamsAttr().setMatch(true); -// ma.getMinParamsAttr().setValue(1); -// rs.addItem(ma, 1); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementResult43.java"); -// } -// -// public final void testGeneratedComment() throws Exception { -// configureByFile("/com/wrq/rearranger/RearrangementTest44.java"); -// final PsiFile file = getFile(); -// final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(file); -// final RearrangerActionHandler rah = new RearrangerActionHandler(); -// CommentRule cr = new CommentRule(); -// CommentFillString cfs = cr.getCommentFillString(); -// cfs.setFillString("-+"); -// cfs.setUseProjectWidthForFill(false); -// cfs.setFillWidth(30); -// cr.setEmitCondition(CommentRule.EMIT_ALWAYS); -// cr.setCommentText("// %FS% METHODS %FS%"); -// rs.addItem(cr, 0); -// MethodAttributes ma; -// ma = new MethodAttributes(); // match all methods -// rs.addItem(ma, 1); -// rah.rearrangeDocument(getProject(), file, rs, doc); -// super.checkResultByFile("/com/wrq/rearranger/RearrangementResult44.java"); -// } -// + public void testInterfaceNoNameNotAlphabeticalNoExcludeMethodAlphabetical() throws Exception { + doTest('RearrangementTest23', 'RearrangementResult23NNNANXMA') { + mySettings.keepGettersSettersTogether = false + interfaceRule.create { + 'preceding comment'( '/**** Interface %IF% Header ****/' ) + 'trailing comment'( '/**** Interface %IF% Trailer ***/' ) + setup( "don't group extracted methods": false, order: InterfaceAttributes.METHOD_ORDER_ALPHABETICAL, alphabetize: false ) + } } } + + public void testInterfaceNoNameNotAlphabeticalNoExcludeMethodEncountered() throws Exception { + doTest('RearrangementTest23', 'RearrangementResult23NNNANXME') { + mySettings.keepGettersSettersTogether = false + interfaceRule.create { + 'preceding comment'( '/**** Interface %IF% Header ****/' ) + 'trailing comment'( '/**** Interface %IF% Trailer ***/' ) + setup( "don't group extracted methods": false, order: InterfaceAttributes.METHOD_ORDER_ENCOUNTERED, alphabetize: false ) + } } } + + public void testInterfaceNoNameNotAlphabeticalNoExcludeMethodInterfaceOrder() throws Exception { + doTest('RearrangementTest23', 'RearrangementResult23NNNANXMI') { + mySettings.keepGettersSettersTogether = false + interfaceRule.create { + 'preceding comment'( '/**** Interface %IF% Header ****/' ) + 'trailing comment'( '/**** Interface %IF% Trailer ***/' ) + setup( "don't group extracted methods": false, order: InterfaceAttributes.METHOD_ORDER_INTERFACE_ORDER, alphabetize: false ) + } } } + + public void testInterfaceByNameNotAlphabeticalNoExcludeMethodEncountered() throws Exception { + doTest('RearrangementTest23', 'RearrangementResult23BNNANXME') { + mySettings.keepGettersSettersTogether = false + interfaceRule.setup( "don't group extracted methods": true, order: InterfaceAttributes.METHOD_ORDER_ENCOUNTERED, + alphabetize: false, name : 'IFace1' + ) } } + + public void testInterfaceIsAlphabeticalNoExcludeMethodEncountered() throws Exception { + doTest('RearrangementTest23', 'RearrangementResult23NNIANXME') { + interfaceRule.create { + 'preceding comment'( '/**** Interface %IF% Header ****/' ) + 'trailing comment'( '/**** Interface %IF% Trailer ***/' ) + setup( "don't group extracted methods": true, order: InterfaceAttributes.METHOD_ORDER_ENCOUNTERED, alphabetize: true ) + } } } + + public void testSpacingOptions() throws Exception { + /* + * From Thomas Singer: + * I've enabled + * - Force 0 blank lines before class close brace "}" + * - Force 0 blank lines before method close brace "}" + * - Remove initial and final blank lines inside code block + * but in the code below the blank lines don't get removed when invoking + * Rearranger from editor's context menu: + */ + doTest('RearrangementTest25', 'RearrangementResult25') { + spacingRule.spacing(anchor: [ SpacingAnchor.BEFORE_CLASS_RBRACE, SpacingAnchor.BEFORE_METHOD_RBRACE ], + lines: 0, 'remove blank lines': true + ) } } + + public void testPriority() throws Exception { + doTest('RearrangementTest', 'RearrangementResult1A') { + methodRule.create { priority( 1 ) } + methodRule.create { + priority( 2 ) + name( 'method.*' ) + } + methodRule.create { + priority( 2 ) + name( '.*Method' ) + } } } + + public void testGSRuleWithClassInitializer() throws Exception { + doTest('RearrangementTest26', 'RearrangementResult26') { + mySettings.keepOverloadedMethodsTogether = true + methodRule.create { + target( MethodType.GETTER_OR_SETTER ) + } } } + + public void testKeepGSTogetherAndExtractedMethods() throws Exception { + doTest('RearrangementTest27', 'RearrangementResult27') { + settings.configure { + 'keep together'([ 'getters and setters', 'overloaded' ]) + 'extracted methods' move: true + } } } + + public void testRegexEscape() throws Exception { + String s = "// ********* start of fields *********"; + String result = RegexUtil.escape(s); + assertEquals("sequence reduction failed", "// \\*{9} start of fields \\*{9}", result); + s = "// \\ backslash \n \t \\d [...] (^...\$)"; + result = RegexUtil.escape(s); + assertEquals("special character escape failed", "// \\\\ backslash \\n \\t \\\\d \\[\\.\\.\\.\\]" + + " \\(\\^\\.\\.\\.\\\$\\)", result); + } + + public void testRegexCombine() throws Exception { + String p1 = RegexUtil.escape("// ********* start of fields *********"); + String p2 = RegexUtil.escape("// ********* start of methods *********"); + List list = new ArrayList(); + list.add(p1); + list.add(p2); + String result = RegexUtil.combineExpressions(list); + assertEquals("combination failed", "// \\*{9} start of (fiel|metho)ds \\*{9}", result); + String p3 = RegexUtil.escape("// ***** start of interfaces *******"); + list.add(p3); + result = RegexUtil.combineExpressions(list); + assertEquals("combination failed", "// (\\*{9} start of (fiel|metho)ds \\*{9}|" + + "\\*{5} start of interfaces \\*{7})", result); + } + + public void testVariousComments() throws Exception { + doTest('RearrangementTest28', 'RearrangementResult28') { + settings.configure{ + 'keep together'([ 'getters and setters', 'overloaded' ]) + 'extracted methods'( 'depth-first order': true, commentType: RelatedMethodsSettings.COMMENT_TYPE_EACH_LEVEL, + 'below first caller': false, + 'non-private treatment': RelatedMethodsSettings.NON_PRIVATE_EXTRACTED_ANY_CALLERS, + 'preceding comment': '// Level %LV% methods', 'trailing comment': '// end Level %LV% methods' ) + } + commentRule.create { + comment('// start of fields', condition: CommentRule.EMIT_IF_ITEMS_MATCH_SUBSEQUENT_RULE, 'all subsequent': true, + 'subsequent rules to match': 1) + } + fieldRule.create { } + commentRule.create { + comment('// end of fields', condition: CommentRule.EMIT_IF_ITEMS_MATCH_PRECEDING_RULE, 'all preceding': true, + 'preceding rules to match': 1) + } + interfaceRule.configure { + 'preceding comment'( '// start of interface %IF%' ) + 'trailing comment'( '// end of interface %IF%' ) + setup( methodOrder: InterfaceAttributes.METHOD_ORDER_ENCOUNTERED, alphabetize: false, 'group extracted methods': false ) + } } + // where a blank line, generated comment, and method occur in order; the generated comment is removed + // and the blank line precedes the method; when the new comment is generated, it is inserted before + // the blank line. + } + + public void testParseBugInfiniteLoop() throws Exception { doTest('RearrangementTest29', 'RearrangementTest29') } + + public void testSpacingBug() throws Exception { + doTest('RearrangementTest30', 'RearrangementResult30') { + spacingRule.create { + spacing( anchor: [ SpacingAnchor.AFTER_CLASS_LBRACE, SpacingAnchor.AFTER_METHOD_LBRACE, SpacingAnchor.BEFORE_CLASS_RBRACE ], + lines: 0 ) + spacing( anchor: [ SpacingAnchor.AFTER_CLASS_RBRACE, SpacingAnchor.AFTER_METHOD_RBRACE, SpacingAnchor.EOF ], + lines: 1 ) + spacing ( 'remove blank lines': true ) + } } } + + public void testSpacingBug2() throws Exception { + doTest('RearrangementTest31', 'RearrangementResult31') { + spacingRule.create { + spacing( anchor: [ SpacingAnchor.AFTER_CLASS_LBRACE, SpacingAnchor.AFTER_METHOD_LBRACE, SpacingAnchor.BEFORE_CLASS_RBRACE, + SpacingAnchor.BEFORE_METHOD_RBRACE ], + lines: 0 ) + spacing( anchor: [ SpacingAnchor.AFTER_CLASS_RBRACE, SpacingAnchor.AFTER_METHOD_RBRACE, SpacingAnchor.EOF ], + lines: 1 ) + spacing ( 'remove blank lines': true ) + } } } + + public void testSpacingBug3() throws Exception { + doTest('DomainExpanderTest', 'DomainExpanderResult') { + spacingRule.create { + spacing( anchor: [ SpacingAnchor.AFTER_CLASS_LBRACE, SpacingAnchor.AFTER_METHOD_LBRACE, + SpacingAnchor.BEFORE_CLASS_RBRACE, SpacingAnchor.BEFORE_METHOD_RBRACE], + lines: 0 ) + spacing( anchor: [ SpacingAnchor.AFTER_CLASS_RBRACE, SpacingAnchor.EOF, SpacingAnchor.AFTER_METHOD_RBRACE ], + lines: 1 ) + spacing ( 'remove blank lines': true ) + } } } + + private void setupSettings(@NotNull String relativePath) { + // Using concat() because simple '+' here produces weird groovy.lang.MissingMethodException: No signature of method: + // java.lang.String.positive() is applicable for argument types: () values: [] + def path = PlatformTestUtil.getCommunityPath().replace(File.separator, '/').concat("/plugins/rearranger") + .concat(relativePath) + mySettings = RearrangerSettings.getSettingsFromFile(new File(path)); + mySettings.askBeforeRearranging = false + + prepareBuilders(mySettings) + } + + /** + * Bug occurs when one or more blank lines precede a generated comment. + * When comment is removed, blank lines now precede the item. Comment is inserted + * at the beginning (i.e. before the blank lines) and a newline character is + * prefixed to the comment. Net effect is that new blank line(s) appear after the comment. + * + * @throws Exception test exception + */ + public void testGeneratedCommentSpacingBug() throws Exception { + doTest('RearrangementTest32', 'RearrangementResult32') { + setupSettings(InteractiveTest.DEFAULT_CONFIGURATION) + spacingRule.spacing(anchor: SpacingAnchor.EOF, lines: 1) + } } + + public void testGeneratedCommentSpacing() throws Exception { + doTest('RearrangementTest32', 'RearrangementResult32') { + setupSettings(InteractiveTest.DEFAULT_CONFIGURATION) + spacingRule.spacing(anchor: SpacingAnchor.EOF, lines: 1) + } } + + public void testInnerClassComments() throws Exception { + doTest('RearrangementTest34', 'RearrangementResult34') { + setupSettings(InteractiveTest.DEFAULT_CONFIGURATION) + spacingRule.spacing(anchor: SpacingAnchor.EOF, lines: 1) + settings.configure( 'rearranger inner classes': true, 'class comment': '// ----- OUTER CLASS -----\n' ) + } } + + public void testInnerClassCommentsNoRearrangement() throws Exception { + doTest('RearrangementTest34', 'RearrangementResult34B') { + setupSettings(InteractiveTest.DEFAULT_CONFIGURATION) + spacingRule.spacing(anchor: SpacingAnchor.EOF, lines: 1) + settings.configure( 'rearranger inner classes': false, 'class comment': '// ----- OUTER CLASS -----\n' ) + } } + + public void testFirstInsertionOfComment() throws Exception { + doTest('RearrangementTest35', 'RearrangementResult35') { + commentRule.comment('// ----- FIELDS -----\n') + fieldRule.create { } + } } + + public void testExcludeFromExtraction() throws Exception { doTest('RearrangementTest36', 'RearrangementTest36') } + + public void testInterferingGSNames() throws Exception { + doTest('RearrangementTest37', 'RearrangementResult37') { + settings.configure { + 'keep together'( 'getters and setters' ) + 'getter criteria'( + name: GetterSetterDefinition.GETTER_NAME_CORRECT_PREFIX, + body: GetterSetterDefinition.GETTER_BODY_IMMATERIAL + ) + 'setter criteria'( + name: GetterSetterDefinition.SETTER_NAME_CORRECT_PREFIX, + body: GetterSetterDefinition.SETTER_BODY_IMMATERIAL + ) + } } } + + public void testInterferingGSNamesNoKGSTogether() throws Exception { + doTest('RearrangementTest37', 'RearrangementTest37') { + settings.configure { + 'getter criteria'( + name: GetterSetterDefinition.GETTER_NAME_CORRECT_PREFIX, + body: GetterSetterDefinition.GETTER_BODY_IMMATERIAL + ) + 'setter criteria'( + name: GetterSetterDefinition.SETTER_NAME_CORRECT_PREFIX, + body: GetterSetterDefinition.SETTER_BODY_IMMATERIAL + ) + } } } + + public void testRemoveBlankLineInsideMethodBug() throws Exception { + doTest('RearrangementTest38', 'RearrangementTest38') { + setupSettings('/test/testData/com/wrq/rearranger/RearrangementTest38cfg.xml') + } } + + public void testSortFieldsByTypeAndName() throws Exception { + doTest('RearrangementTest39', 'RearrangementResult39B') { + fieldRule.create { + 'sort by'([ SortOption.BY_NAME, SortOption.BY_TYPE ]) + } } } + + public void testSortFieldsByType() throws Exception { + doTest('RearrangementTest39', 'RearrangementResult39C') { + fieldRule.create { + 'sort by' SortOption.BY_TYPE + 'not sort by' SortOption.BY_NAME + } + } } + + public void testSortFieldsByTypeICAndName() throws Exception { + doTest('RearrangementTest39', 'RearrangementResult39') { + fieldRule.create { + 'sort by'([ SortOption.BY_NAME, SortOption.BY_TYPE, SortOption.TYPE_CASE_INSENSITIVE ]) + } } } + + public void testSortFieldsByTypeIC() throws Exception { + doTest('RearrangementTest39', 'RearrangementResult39A') { + fieldRule.create { + 'sort by'([ SortOption.BY_TYPE, SortOption.TYPE_CASE_INSENSITIVE ]) + 'not sort by' SortOption.BY_NAME + } } } + + /** + * test detection of method overrides/overridden/implements/implemented attributes. + * + * @throws Exception test exception + */ + public void testOverImpl() throws Exception { doTest('RearrangementTest40', 'RearrangementResult40') } + + public final void testRemoveBlankLinesBeforeMethod() throws Exception { + doTest('RearrangementTest41', 'RearrangementResult41') { + spacingRule.create { + spacing(anchor: [ SpacingAnchor.AFTER_CLASS_LBRACE, SpacingAnchor.BEFORE_METHOD_LBRACE, SpacingAnchor.AFTER_METHOD_LBRACE, + SpacingAnchor.BEFORE_METHOD_RBRACE, SpacingAnchor.AFTER_METHOD_RBRACE, SpacingAnchor.BEFORE_CLASS_RBRACE, + SpacingAnchor.AFTER_CLASS_RBRACE], + lines: 0, 'remove blank lines': true) + } + } + } + + public final void testEnumClass() throws Exception { doTest('RearrangementTest42', 'RearrangementResult42') } + + public final void testNumParameters() throws Exception { + doTest('RearrangementTest43', 'RearrangementResult43') { + methodRule.create { + 'arguments number' ( from: 2, to: 3) + } + methodRule.create { + 'arguments number' ( from: 1) + } } } + + public final void testGeneratedComment() throws Exception { + doTest('RearrangementTest44', 'RearrangementResult44') { + commentRule.comment('// %FS% METHODS %FS%', condition: CommentRule.EMIT_ALWAYS, 'fill string': '-+', + 'use project width for fill': false, 'fill width': 30) + methodRule.create { } // match all methods + } } + // public void testEnum1() throws Exception { // final Project project = getProject(); // final LanguageLevelProjectExtension llpExtension = LanguageLevelProjectExtension.getInstance(project); @@ -1643,7 +1261,6 @@ class RearrangerTest extends LightCodeInsightFixtureTestCase { doTest(srcFileName, expectedResultFileName, 'java', adjustment) } - private void doTest(@NotNull String srcFileName, @Nullable String expectedResultFileName, @Nullable String extension, @Nullable Closure adjustment = null) { diff --git a/plugins/rearranger/test/src/com/wrq/rearranger/util/AbstractRuleBuilder.groovy b/plugins/rearranger/test/src/com/wrq/rearranger/util/AbstractRuleBuilder.groovy index 2b3452f0fe91..a9051a28862f 100644 --- a/plugins/rearranger/test/src/com/wrq/rearranger/util/AbstractRuleBuilder.groovy +++ b/plugins/rearranger/test/src/com/wrq/rearranger/util/AbstractRuleBuilder.groovy @@ -18,6 +18,7 @@ import org.junit.Assert public abstract class AbstractRuleBuilder extends BuilderSupport { @NotNull def RearrangerSettings settings + private int depth /** * Holds rule customization handlers in the form {@code 'property id -> closure'} where 'property id' @@ -30,25 +31,33 @@ public abstract class AbstractRuleBuilder extends BuilderSupport { { key -> Assert.fail("No handler for the rule attribute '${key}'") } } + @Override + protected Object getCurrent() { + if (!super.current) { + current = createRule() + } + super.current + } + @Override protected void nodeCompleted(Object parent, Object node) { - if (!parent && node) { + if (--depth <= 0) { + // Top level call on the build object has been reached. registerRule(settings, node as T) + current = null } } @Override protected void setParent(Object parent, Object child) { + depth++ } @Override protected Object createNode(Object name) { - if (name == 'create') { - return createRule() - } createNode(name, [:], []) } - + @Override protected Object createNode(Object name, Object value) { createNode(name, [:], value) @@ -61,6 +70,9 @@ public abstract class AbstractRuleBuilder extends BuilderSupport { @Override protected Object createNode(Object name, Map attributes, Object value) { + if (!myHandlers.containsKey(name)) { + return current + } if (value) { for (i in [value].flatten()) { myHandlers[name](i, attributes, current) @@ -70,7 +82,7 @@ public abstract class AbstractRuleBuilder extends BuilderSupport { myHandlers[name](null, attributes, current) } - getCurrent() + current } @Nullable @@ -83,7 +95,7 @@ public abstract class AbstractRuleBuilder extends BuilderSupport { *

* Example: *

-   *   register('modifier', PsiModifier.FINAL, { rule, value, attributes ->
+   *   register('modifier', PsiModifier.FINAL, { value, attributes, rule ->
    *       rule.finalAttribute.value = value
    *       if (attributes.invert) rule.finalAttribute.invert = true
    *   })
@@ -143,10 +155,4 @@ public abstract class AbstractRuleBuilder extends BuilderSupport {
       rule."$propertyName".expression = value
     }
   }
-  
-  protected static void setIf(@NotNull RearrangerTestDsl dslProperty, map, rulePropertyName, rule) {
-    if (map.containsKey(dslProperty.value)) {
-      rule."$rulePropertyName" = map[dslProperty.value]
-    }
-  }
 }
diff --git a/plugins/rearranger/test/src/com/wrq/rearranger/util/CommentRuleBuilder.groovy b/plugins/rearranger/test/src/com/wrq/rearranger/util/CommentRuleBuilder.groovy
index 80f06617fc57..0c9b4a4ac17b 100644
--- a/plugins/rearranger/test/src/com/wrq/rearranger/util/CommentRuleBuilder.groovy
+++ b/plugins/rearranger/test/src/com/wrq/rearranger/util/CommentRuleBuilder.groovy
@@ -13,11 +13,18 @@ class CommentRuleBuilder extends AbstractRuleBuilder {
   {
     registerHandler(RearrangerTestDsl.COMMENT, { data, attributes, rule ->
       rule.commentText = data
-      setIf(RearrangerTestDsl.CONDITION, attributes, 'emitCondition', rule)
-      setIf(RearrangerTestDsl.ALL_SUBSEQUENT, attributes, 'allSubsequentRules', rule)
-      setIf(RearrangerTestDsl.ALL_PRECEDING, attributes, 'allPrecedingRules', rule)
-      setIf(RearrangerTestDsl.SUBSEQUENT_RULES_TO_MATCH, attributes, 'NSubsequentRulesToMatch', rule)
-      setIf(RearrangerTestDsl.PRECEDING_RULES_TO_MATCH, attributes, 'NPrecedingRulesToMatch', rule)
+      RearrangerTestUtil.setIf(RearrangerTestDsl.CONDITION,                          attributes, 'emitCondition', rule)
+      RearrangerTestUtil.setIf(RearrangerTestDsl.ALL_SUBSEQUENT,                     attributes, 'allSubsequentRules', rule)
+      RearrangerTestUtil.setIf(RearrangerTestDsl.ALL_PRECEDING,                      attributes, 'allPrecedingRules', rule)
+      RearrangerTestUtil.setIf(RearrangerTestDsl.SUBSEQUENT_RULES_TO_MATCH,          attributes, 'NSubsequentRulesToMatch', rule)
+      RearrangerTestUtil.setIf(RearrangerTestDsl.PRECEDING_RULES_TO_MATCH,           attributes, 'NPrecedingRulesToMatch', rule)
+      
+      def fillString = rule.commentFillString
+      RearrangerTestUtil.setIf(RearrangerTestDsl.USE_PROJECT_WIDTH_FOR_COMMENT_FILL, attributes, 'useProjectWidthForFill', fillString)
+      RearrangerTestUtil.setIf(RearrangerTestDsl.FILL_WIDTH,                         attributes, 'fillWidth', fillString)
+      if (attributes[RearrangerTestDsl.FILL_STRING.value]) {
+        rule.commentFillString.fillString = attributes[RearrangerTestDsl.FILL_STRING.value]
+      }
     })
   }
   
diff --git a/plugins/rearranger/test/src/com/wrq/rearranger/util/RearrangerTestDsl.java b/plugins/rearranger/test/src/com/wrq/rearranger/util/RearrangerTestDsl.java
index c6a46cbeb636..04e6c62be229 100644
--- a/plugins/rearranger/test/src/com/wrq/rearranger/util/RearrangerTestDsl.java
+++ b/plugins/rearranger/test/src/com/wrq/rearranger/util/RearrangerTestDsl.java
@@ -9,7 +9,19 @@ import org.jetbrains.annotations.NotNull;
  * @since 5/17/12 12:57 PM
  */
 public enum RearrangerTestDsl {
+
+  // Settings
+  EXTRACTED_METHODS("extracted methods"),
+  OVERLOADED_METHODS("overloaded methods"),
+  DEPTH_FIRST_ORDER("depth-first order"),
+  ORDER,
+  COMMENT_TYPE("commentType"),
+  KEEP_TOGETHER("keep together"),
+  OVERLOADED,
+  GETTERS_SETTERS("getters and setters"),
+  GETTERS_SETTERS_WITH_PROPERTY("getters and setters with property"),
   
+  // Rules
   NAME,
   MODIFIER,
   /** Field initializer type. */
@@ -17,23 +29,41 @@ public enum RearrangerTestDsl {
   /** Method target type (e.g. constructor). */
   TARGET,
   TYPE,
-  RETURN_TYPE("returnType"),
-  SORT,
+  RETURN_TYPE("return type"),
+  SORT("sort by"),
+  NOT_SORT("not sort by"),
   COMMENT,
-  GETTER_CRITERIA("getterCriteria"),
-  SETTER_CRITERIA("setterCriteria"),
+  GETTER_CRITERIA("getter criteria"),
+  SETTER_CRITERIA("setter criteria"),
   SPACING,
+  PRECEDING_COMMENT("preceding comment"),
+  TRAILING_COMMENT("trailing comment"),
+  SETUP,
+  GROUP_EXTRACTED_METHODS("group extracted methods"),
+  ALPHABETIZE,
+  PRIORITY,
   
   // Attributes
   INVERT,
   CONDITION,
-  ALL_SUBSEQUENT("allSubsequent"),
-  ALL_PRECEDING("allPreceding"),
-  SUBSEQUENT_RULES_TO_MATCH("subsequentRulesToMatch"),
-  PRECEDING_RULES_TO_MATCH("precedingRulesToMatch"),
+  ALL_SUBSEQUENT("all subsequent"),
+  ALL_PRECEDING("all preceding"),
+  SUBSEQUENT_RULES_TO_MATCH("subsequent rules to match"),
+  PRECEDING_RULES_TO_MATCH("preceding rules to match"),
   BODY,
   ANCHOR,
-  BLANK_LINES("lines");
+  BLANK_LINES("lines"),
+  REMOVE_BLANK_LINES("remove blank lines"),
+  BELOW_FIRST_CALLER("below first caller"),
+  NON_PRIVATE_TREATMENT("non-private treatment"),
+  REARRANGE_INNER_CLASSES("rearranger inner classes"),
+  CLASS_COMMENT("class comment"),
+  ARGUMENTS_NUMBER("arguments number"),
+  FROM,
+  TO,
+  FILL_STRING("fill string"),
+  USE_PROJECT_WIDTH_FOR_COMMENT_FILL("use project width for fill"),
+  FILL_WIDTH("fill width");
 
   @NotNull private final String myValue;
   
diff --git a/plugins/rearranger/test/src/com/wrq/rearranger/util/RearrangerTestUtil.groovy b/plugins/rearranger/test/src/com/wrq/rearranger/util/RearrangerTestUtil.groovy
new file mode 100644
index 000000000000..64e0dc28f6e3
--- /dev/null
+++ b/plugins/rearranger/test/src/com/wrq/rearranger/util/RearrangerTestUtil.groovy
@@ -0,0 +1,19 @@
+package com.wrq.rearranger.util
+
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author Denis Zhdanov
+ * @since 5/22/12 11:11 AM
+ */
+public class RearrangerTestUtil {
+
+  private RearrangerTestUtil() {
+  }
+
+  public static void setIf(@NotNull RearrangerTestDsl dslProperty, map, rulePropertyName, rule) {
+    if (map.containsKey(dslProperty.value)) {
+      rule."$rulePropertyName" = map[dslProperty.value]
+    }
+  }
+}
diff --git a/plugins/rearranger/test/src/com/wrq/rearranger/util/SettingsConfigurationBuilder.groovy b/plugins/rearranger/test/src/com/wrq/rearranger/util/SettingsConfigurationBuilder.groovy
new file mode 100644
index 000000000000..4a5bcdc5ecc6
--- /dev/null
+++ b/plugins/rearranger/test/src/com/wrq/rearranger/util/SettingsConfigurationBuilder.groovy
@@ -0,0 +1,89 @@
+package com.wrq.rearranger.util
+
+import com.wrq.rearranger.settings.CommentRule
+import com.wrq.rearranger.settings.RearrangerSettings
+
+import static com.wrq.rearranger.util.RearrangerTestUtil.setIf
+
+/**
+ * @author Denis Zhdanov
+ * @since 5/22/12 11:07 AM
+ */
+class SettingsConfigurationBuilder extends BuilderSupport {
+  
+  def RearrangerSettings settings
+  
+  @Override
+  protected void setParent(Object parent, Object child) {
+  }
+
+  @Override
+  protected Object createNode(Object name) {
+    createNode(name, [:], [])
+  }
+
+  @Override
+  protected Object createNode(Object name, Object value) {
+    createNode(name, [:], value)
+  }
+
+  @Override
+  protected Object createNode(Object name, Map attributes) {
+    createNode(name, attributes, [])
+  }
+
+  @Override
+  protected Object createNode(Object name, Map attributes, Object value) {
+    def commentHandler = { RearrangerTestDsl dslName, propertyName ->
+      if (attributes.containsKey(dslName.value)) {
+        def comment = new CommentRule()
+        comment.commentText = attributes[dslName.value]
+        settings.extractedMethodsSettings."$propertyName" = comment
+      }
+    }
+    
+    switch (name) {
+      case RearrangerTestDsl.EXTRACTED_METHODS.value:
+        settings.extractedMethodsSettings.moveExtractedMethods = true
+        setIf(RearrangerTestDsl.DEPTH_FIRST_ORDER,     attributes, 'depthFirstOrdering',  settings.extractedMethodsSettings)
+        setIf(RearrangerTestDsl.ORDER,                 attributes, 'ordering',            settings.extractedMethodsSettings)
+        setIf(RearrangerTestDsl.COMMENT_TYPE,          attributes, 'commentType',         settings.extractedMethodsSettings)
+        setIf(RearrangerTestDsl.BELOW_FIRST_CALLER,    attributes, 'belowFirstCaller',    settings.extractedMethodsSettings)
+        setIf(RearrangerTestDsl.NON_PRIVATE_TREATMENT, attributes, 'nonPrivateTreatment', settings.extractedMethodsSettings)
+        
+        commentHandler(RearrangerTestDsl.PRECEDING_COMMENT, 'precedingComment')
+        commentHandler(RearrangerTestDsl.TRAILING_COMMENT,  'trailingComment')
+        break
+      case RearrangerTestDsl.KEEP_TOGETHER.value:
+        def m = [
+          (RearrangerTestDsl.OVERLOADED.value)                    : 'keepOverloadedMethodsTogether',
+          (RearrangerTestDsl.GETTERS_SETTERS.value)               : 'keepGettersSettersTogether',
+          (RearrangerTestDsl.GETTERS_SETTERS_WITH_PROPERTY.value) : 'keepGettersSettersWithProperty'
+        ]
+        for (i in [value].flatten()) {
+          settings."${m[i]}" = true
+        }
+        break
+      case RearrangerTestDsl.OVERLOADED_METHODS.value:
+        setIf(RearrangerTestDsl.ORDER,         attributes, 'overloadedOrder',               settings)
+        setIf(RearrangerTestDsl.KEEP_TOGETHER, attributes, 'keepOverloadedMethodsTogether', settings)
+        break
+      case RearrangerTestDsl.GETTER_CRITERIA.value:
+        setIf(RearrangerTestDsl.NAME, attributes, 'getterNameCriterion', settings.defaultGSDefinition)
+        setIf(RearrangerTestDsl.BODY, attributes, 'getterBodyCriterion', settings.defaultGSDefinition)
+        break
+      case RearrangerTestDsl.SETTER_CRITERIA.value:
+        setIf(RearrangerTestDsl.NAME, attributes, 'setterNameCriterion', settings.defaultGSDefinition)
+        setIf(RearrangerTestDsl.BODY, attributes, 'setterBodyCriterion', settings.defaultGSDefinition)
+        break
+      default:
+        setIf(RearrangerTestDsl.REARRANGE_INNER_CLASSES, attributes, 'rearrangeInnerClasses', settings)
+        if (attributes[RearrangerTestDsl.CLASS_COMMENT.value]) {
+          def comment = new CommentRule()
+          comment.commentText = attributes[RearrangerTestDsl.CLASS_COMMENT.value]
+          settings.classOrderAttributeList.add(0, comment)
+        }
+    }
+    settings
+  }
+}
diff --git a/plugins/rearranger/test/src/com/wrq/rearranger/util/java/AbstractJavaRuleBuilder.groovy b/plugins/rearranger/test/src/com/wrq/rearranger/util/java/AbstractJavaRuleBuilder.groovy
index a7e53e599332..8540a5a9e6cb 100644
--- a/plugins/rearranger/test/src/com/wrq/rearranger/util/java/AbstractJavaRuleBuilder.groovy
+++ b/plugins/rearranger/test/src/com/wrq/rearranger/util/java/AbstractJavaRuleBuilder.groovy
@@ -18,10 +18,17 @@ abstract class AbstractJavaRuleBuilder extends AbstractRuleBuilder {{
   })
   
   // Sort
-  def sortOptions = [ (SortType.BY_NAME) : "byName"]
+  def sortOptions = [
+    (SortOption.BY_NAME)               : 'byName',
+    (SortOption.BY_TYPE)               : 'byType',
+    (SortOption.TYPE_CASE_INSENSITIVE) : 'typeCaseInsensitive',
+  ]
   registerHandler(RearrangerTestDsl.SORT, { data, attributes, rule ->
     rule.sortOptions."${sortOptions[data]}" = true
   })
+  registerHandler(RearrangerTestDsl.NOT_SORT, { data, attributes, rule ->
+    rule.sortOptions."${sortOptions[data]}" = false
+  })
   
   // Modifiers
   //   Visibility
@@ -48,4 +55,9 @@ abstract class AbstractJavaRuleBuilder extends AbstractRuleBuilder {{
       genericHandlers[value](attributes, rule)
     }
   })
+  
+  // Priority.
+  registerHandler(RearrangerTestDsl.PRIORITY, { value, attributes, rule ->
+    rule.priority = value
+  })
 }}
diff --git a/plugins/rearranger/test/src/com/wrq/rearranger/util/java/JavaInterfaceRuleBuilder.groovy b/plugins/rearranger/test/src/com/wrq/rearranger/util/java/JavaInterfaceRuleBuilder.groovy
new file mode 100644
index 000000000000..083138816896
--- /dev/null
+++ b/plugins/rearranger/test/src/com/wrq/rearranger/util/java/JavaInterfaceRuleBuilder.groovy
@@ -0,0 +1,45 @@
+package com.wrq.rearranger.util.java
+
+import com.wrq.rearranger.settings.attributeGroups.InterfaceAttributes
+import com.wrq.rearranger.settings.RearrangerSettings
+import com.wrq.rearranger.util.RearrangerTestDsl
+import com.wrq.rearranger.settings.CommentRule
+import com.wrq.rearranger.util.RearrangerTestUtil
+
+/** 
+ * @author Denis Zhdanov
+ * @since 5/22/12 11:56 AM
+ */
+class JavaInterfaceRuleBuilder extends AbstractJavaRuleBuilder {
+  
+  {
+    def commentHandler = { rule, commentText, propertyName ->
+      def comment = new CommentRule()
+      comment.commentText = commentText
+      rule."$propertyName" = comment
+    }
+    
+    def nameHandler = createStringAttributeHandler('nameAttr')
+    
+    registerHandler(RearrangerTestDsl.PRECEDING_COMMENT, { value, attributes, rule -> commentHandler(rule, value, 'precedingComment') })
+    registerHandler(RearrangerTestDsl.TRAILING_COMMENT, { value, attributes, rule -> commentHandler(rule, value, 'trailingComment') })
+    registerHandler(RearrangerTestDsl.SETUP, { value, attributes, rule -> 
+      RearrangerTestUtil.setIf(RearrangerTestDsl.GROUP_EXTRACTED_METHODS, attributes, 'noExtractedMethods', rule)
+      RearrangerTestUtil.setIf(RearrangerTestDsl.ORDER, attributes, 'methodOrder', rule)
+      RearrangerTestUtil.setIf(RearrangerTestDsl.ALPHABETIZE, attributes, 'alphabetizeInterfaces', rule)
+      if (attributes[RearrangerTestDsl.NAME.value]) {
+        nameHandler(attributes[RearrangerTestDsl.NAME.value], attributes, rule)
+      }
+    })
+  }
+  
+  @Override
+  protected InterfaceAttributes createRule() {
+    new InterfaceAttributes()
+  }
+
+  @Override
+  protected void registerRule(RearrangerSettings settings, InterfaceAttributes rule) {
+    settings.addItem(rule) 
+  }
+}
diff --git a/plugins/rearranger/test/src/com/wrq/rearranger/util/java/JavaMethodRuleBuilder.groovy b/plugins/rearranger/test/src/com/wrq/rearranger/util/java/JavaMethodRuleBuilder.groovy
index c83323449342..215e912de1bf 100644
--- a/plugins/rearranger/test/src/com/wrq/rearranger/util/java/JavaMethodRuleBuilder.groovy
+++ b/plugins/rearranger/test/src/com/wrq/rearranger/util/java/JavaMethodRuleBuilder.groovy
@@ -4,6 +4,7 @@ import com.wrq.rearranger.settings.RearrangerSettings
 import com.wrq.rearranger.settings.attributeGroups.MethodAttributes
 import org.jetbrains.annotations.NotNull
 import com.wrq.rearranger.util.RearrangerTestDsl
+import com.wrq.rearranger.util.RearrangerTestUtil
 
 /** 
  * @author Denis Zhdanov
@@ -13,19 +14,37 @@ class JavaMethodRuleBuilder extends AbstractJavaRuleBuilder {
   
   {
     def handlers = [
-      (MethodType.CONSTRUCTOR) : createRawBooleanAttributeHandler('constructorMethodType'),
+      (MethodType.CONSTRUCTOR)      : createRawBooleanAttributeHandler('constructorMethodType'),
       (MethodType.GETTER_OR_SETTER) : createRawBooleanAttributeHandler('getterSetterMethodType'),
-      (MethodType.OTHER) : createRawBooleanAttributeHandler('otherMethodType')
+      (MethodType.OTHER)            : createRawBooleanAttributeHandler('otherMethodType')
     ]
     registerHandler(RearrangerTestDsl.TARGET, { data, attributes, rule -> handlers[data](attributes, rule) })
     registerHandler(RearrangerTestDsl.RETURN_TYPE, createStringAttributeHandler('returnTypeAttr'))
+    
+    // Getters & setters criteria.
     registerHandler(RearrangerTestDsl.GETTER_CRITERIA, { data, attributes, rule ->
-      setIf(RearrangerTestDsl.NAME, attributes, 'getterNameCriterion', rule.getterSetterDefinition)
-      setIf(RearrangerTestDsl.BODY, attributes, 'getterBodyCriterion', rule.getterSetterDefinition)
+      RearrangerTestUtil.setIf(RearrangerTestDsl.NAME, attributes, 'getterNameCriterion', rule.getterSetterDefinition)
+      RearrangerTestUtil.setIf(RearrangerTestDsl.BODY, attributes, 'getterBodyCriterion', rule.getterSetterDefinition)
     })
     registerHandler(RearrangerTestDsl.SETTER_CRITERIA, { data, attributes, rule ->
-      setIf(RearrangerTestDsl.NAME, attributes, 'setterNameCriterion', rule.getterSetterDefinition)
-      setIf(RearrangerTestDsl.BODY, attributes, 'setterBodyCriterion', rule.getterSetterDefinition)
+      RearrangerTestUtil.setIf(RearrangerTestDsl.NAME, attributes, 'setterNameCriterion', rule.getterSetterDefinition)
+      RearrangerTestUtil.setIf(RearrangerTestDsl.BODY, attributes, 'setterBodyCriterion', rule.getterSetterDefinition)
+    })
+    
+    // Args number.
+    def argsNumber = [
+      (RearrangerTestDsl.FROM) : 'minParamsAttr',
+      (RearrangerTestDsl.TO)   : 'maxParamsAttr'
+    ]
+    def argsNumberHandler = { RearrangerTestDsl key, attributes, rule ->
+      if (attributes.containsKey(key.value)) {
+        rule."${argsNumber[key]}".match = true
+        rule."${argsNumber[key]}".value = attributes[key.value]
+      }
+    }
+    registerHandler(RearrangerTestDsl.ARGUMENTS_NUMBER, { data, attributes, rule ->
+      argsNumberHandler(RearrangerTestDsl.FROM, attributes, rule)
+      argsNumberHandler(RearrangerTestDsl.TO, attributes, rule)
     })
   }
   
diff --git a/plugins/rearranger/test/src/com/wrq/rearranger/util/java/JavaSpacingRule.groovy b/plugins/rearranger/test/src/com/wrq/rearranger/util/java/JavaSpacingRule.groovy
index 559df6d97ae8..bcc99867d94a 100644
--- a/plugins/rearranger/test/src/com/wrq/rearranger/util/java/JavaSpacingRule.groovy
+++ b/plugins/rearranger/test/src/com/wrq/rearranger/util/java/JavaSpacingRule.groovy
@@ -27,6 +27,9 @@ class JavaSpacingRule extends AbstractRuleBuilder {
         s.force = true
         s.nBlankLines = attributes[RearrangerTestDsl.BLANK_LINES.value]
       }
+      if (attributes[RearrangerTestDsl.REMOVE_BLANK_LINES.value]) {
+        settings.removeBlanksInsideCodeBlocks = true
+      }
     })
   }
   
diff --git a/plugins/rearranger/test/src/com/wrq/rearranger/util/java/MethodType.java b/plugins/rearranger/test/src/com/wrq/rearranger/util/java/MethodType.java
index f31690cb7248..d02eb8148d04 100644
--- a/plugins/rearranger/test/src/com/wrq/rearranger/util/java/MethodType.java
+++ b/plugins/rearranger/test/src/com/wrq/rearranger/util/java/MethodType.java
@@ -5,5 +5,5 @@ package com.wrq.rearranger.util.java;
  * @since 5/17/12 11:05 AM
  */
 public enum MethodType {
-  CONSTRUCTOR, GETTER_OR_SETTER, OTHER
+  CONSTRUCTOR, GETTER_OR_SETTER, OVERLOADED, OTHER
 }
diff --git a/plugins/rearranger/test/src/com/wrq/rearranger/util/java/SortType.java b/plugins/rearranger/test/src/com/wrq/rearranger/util/java/SortOption.java
similarity index 59%
rename from plugins/rearranger/test/src/com/wrq/rearranger/util/java/SortType.java
rename to plugins/rearranger/test/src/com/wrq/rearranger/util/java/SortOption.java
index ab035a85809e..77f8340bdf26 100644
--- a/plugins/rearranger/test/src/com/wrq/rearranger/util/java/SortType.java
+++ b/plugins/rearranger/test/src/com/wrq/rearranger/util/java/SortOption.java
@@ -4,6 +4,6 @@ package com.wrq.rearranger.util.java;
  * @author Denis Zhdanov
  * @since 5/17/12 3:57 PM
  */
-public enum SortType {
-  BY_NAME
+public enum SortOption {
+  BY_NAME, BY_TYPE, TYPE_CASE_INSENSITIVE
 }
diff --git a/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult23BNNANXME.java b/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult23BNNANXME.java
index 4e7bf76cd622..3bf2004df185 100644
--- a/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult23BNNANXME.java
+++ b/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult23BNNANXME.java
@@ -1,6 +1,7 @@
 public class RearrangementTest23
   implements IFace2, IFace1
 {
+
   public int getY() {
     return 6;
   }
@@ -8,7 +9,6 @@ public class RearrangementTest23
   public int getX() {
     return getA() ? 5 : 3;
   }
-
   int method1() {
     return 4;
   }
diff --git a/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult23NNIANXME.java b/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult23NNIANXME.java
index 73e08795186f..ef00945287f0 100644
--- a/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult23NNIANXME.java
+++ b/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult23NNIANXME.java
@@ -1,7 +1,8 @@
 public class RearrangementTest23
   implements IFace2, IFace1
 {
-  /** * Interface IFace1 Header *** */
+/**** Interface IFace1 Header ****/
+
   public int getY() {
     return 6;
   }
@@ -10,7 +11,8 @@ public class RearrangementTest23
     return getA() ? 5 : 3;
   }
 /**** Interface IFace1 Trailer ***/
-  /** * Interface IFace2 Header *** */
+/**** Interface IFace2 Header ****/
+
   public boolean getB() {
     return false;
   }
@@ -18,8 +20,7 @@ public class RearrangementTest23
   public boolean getA() {
     return true;
   }
-
-  /** * Interface IFace2 Trailer ** */
+/**** Interface IFace2 Trailer ***/
   int method1() {
     return 4;
   }
diff --git a/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult23NNNANXMA.java b/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult23NNNANXMA.java
index 22a6c10e38e7..4f0b0b8ea0e1 100644
--- a/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult23NNNANXMA.java
+++ b/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult23NNNANXMA.java
@@ -1,7 +1,8 @@
 public class RearrangementTest23
   implements IFace2, IFace1
 {
-  /** * Interface IFace2 Header *** */
+/**** Interface IFace2 Header ****/
+
   public boolean getA() {
     return true;
   }
@@ -10,7 +11,8 @@ public class RearrangementTest23
     return false;
   }
 /**** Interface IFace2 Trailer ***/
-  /** * Interface IFace1 Header *** */
+/**** Interface IFace1 Header ****/
+
   public int getX() {
     return getA() ? 5 : 3;
   }
@@ -18,8 +20,7 @@ public class RearrangementTest23
   public int getY() {
     return 6;
   }
-
-  /** * Interface IFace1 Trailer ** */
+/**** Interface IFace1 Trailer ***/
   int method1() {
     return 4;
   }
diff --git a/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult23NNNANXME.java b/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult23NNNANXME.java
index f903e3e5cc05..7e52e4923324 100644
--- a/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult23NNNANXME.java
+++ b/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult23NNNANXME.java
@@ -1,7 +1,8 @@
 public class RearrangementTest23
   implements IFace2, IFace1
 {
-  /** * Interface IFace2 Header *** */
+/**** Interface IFace2 Header ****/
+
   public boolean getB() {
     return false;
   }
@@ -10,7 +11,8 @@ public class RearrangementTest23
     return true;
   }
 /**** Interface IFace2 Trailer ***/
-  /** * Interface IFace1 Header *** */
+/**** Interface IFace1 Header ****/
+
   public int getY() {
     return 6;
   }
@@ -18,8 +20,7 @@ public class RearrangementTest23
   public int getX() {
     return getA() ? 5 : 3;
   }
-
-  /** * Interface IFace1 Trailer ** */
+/**** Interface IFace1 Trailer ***/
   int method1() {
     return 4;
   }
diff --git a/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult23NNNANXMI.java b/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult23NNNANXMI.java
index 8088b74fa28a..1ab483ac4f6e 100644
--- a/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult23NNNANXMI.java
+++ b/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult23NNNANXMI.java
@@ -1,7 +1,8 @@
 public class RearrangementTest23
   implements IFace2, IFace1
 {
-  /** * Interface IFace2 Header *** */
+/**** Interface IFace2 Header ****/
+
   public boolean getA() {
     return true;
   }
@@ -10,7 +11,8 @@ public class RearrangementTest23
     return false;
   }
 /**** Interface IFace2 Trailer ***/
-  /** * Interface IFace1 Header *** */
+/**** Interface IFace1 Header ****/
+
   public int getY() {
     return 6;
   }
@@ -18,8 +20,7 @@ public class RearrangementTest23
   public int getX() {
     return getA() ? 5 : 3;
   }
-
-  /** * Interface IFace1 Trailer ** */
+/**** Interface IFace1 Trailer ***/
   int method1() {
     return 4;
   }
diff --git a/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult26.java b/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult26.java
index fd22dd84a491..6145ad5a6868 100644
--- a/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult26.java
+++ b/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult26.java
@@ -7,7 +7,6 @@ class RearrangementTest26 {
   public void setValue(int i) {
     value = i;
   }
-
   int value;
 
   {
diff --git a/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult28.java b/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult28.java
index f7382377292c..ef4bc4993913 100644
--- a/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult28.java
+++ b/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult28.java
@@ -1,37 +1,32 @@
 public class RearrangementTest28
   implements InterfaceName, InterfaceName2
 {
-  // start of fields
+// start of fields
   int i;
-
-  // end of fields
+// end of fields
 // start of interface InterfaceName
 // Level 1 methods
   public int getTime() {
     return getAnother();
   }
-
-  // Level 2 methods
+// Level 2 methods
   public int getAnother() {
     return 0;
   }
-
-  // end Level 2 methods
+// end Level 2 methods
 // end Level 1 methods
 // end of interface InterfaceName
 // start of interface InterfaceName2
   public int getDate() {
     return 0;
   }
-
-  // end of interface InterfaceName2
+// end of interface InterfaceName2
 // Level 1 methods
   public void m1() {
     m2();
     m3();
   }
-
-  // Level 2 methods
+// Level 2 methods
   public void m2() {
   }
 
diff --git a/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult41.java b/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult41.java
index 899c73d58aea..ac91dac03562 100644
--- a/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult41.java
+++ b/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult41.java
@@ -1,5 +1,6 @@
 public class RearrangementTest41 {
-  public final void setPrice(final double price) {
+  public final void setPrice(final double price)
+  {
     this.price = price;
   }
 }
diff --git a/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult43.java b/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult43.java
index 3c9995a3c124..049fbd8b5b6b 100644
--- a/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult43.java
+++ b/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult43.java
@@ -1,4 +1,5 @@
 public class RearrangementTest43 {
+
   void method2(int a, int b) {
   }
 
@@ -7,7 +8,6 @@ public class RearrangementTest43 {
 
   void method1(int a) {
   }
-
   void method0() {
   }
 }
diff --git a/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult44.java b/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult44.java
index 8a24d11d1a0d..ef7dac09dd16 100644
--- a/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult44.java
+++ b/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementResult44.java
@@ -1,6 +1,6 @@
 /** test generated comment with fill. */
 public class RearrangementTest44 {
-  // -+-+-+-+- METHODS -+-+-+-+-
+// -+-+-+-+- METHODS -+-+-+-+-
   private void method(int i) {
   }
 }
diff --git a/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementTest32.java b/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementTest32.java
index 58d1b54e6d63..b89ab41d9237 100644
--- a/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementTest32.java
+++ b/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementTest32.java
@@ -1,5 +1,7 @@
 public class Temp {
-  // ------------------------------ FIELDS ------------------------------
+
+// ------------------------------ FIELDS ------------------------------
+
   int field1;
 
 // -------------------------- OTHER METHODS --------------------------
diff --git a/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementTest38cfg.xml b/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementTest38cfg.xml
index d900d4239981..96f82645dfe9 100644
--- a/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementTest38cfg.xml
+++ b/plugins/rearranger/test/testData/com/wrq/rearranger/RearrangementTest38cfg.xml
@@ -179,9 +179,7 @@
               noExtractedMethods="false"/>
         
       
-      \n\
-        \ //////////////////////////////////////////////\n\ \ //\ Instance\ Methods\n\ \ //////////////////////////////////////////////
-      
+      \n  //////////////////////////////////////////////\n  // Instance Methods\n  //////////////////////////////////////////////
       
         
         
diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/ComponentTree.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/ComponentTree.java
index 80b8c7b3eb6b..e0970a24af44 100644
--- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/ComponentTree.java
+++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/ComponentTree.java
@@ -79,12 +79,7 @@ public final class ComponentTree extends Tree implements DataProvider {
 
   @Override
   public Object getData(@NonNls String dataId) {
-    // TODO: support keys
-
-    if (myActionPanel != null) {
-      return myActionPanel.getData(dataId);
-    }
-    return null;
+    return myActionPanel == null ? null : myActionPanel.getData(dataId);
   }
 
   @Nullable
diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/DesignerEditorPanel.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/DesignerEditorPanel.java
index f46df3e4126b..805a75852f6e 100644
--- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/DesignerEditorPanel.java
+++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/DesignerEditorPanel.java
@@ -681,7 +681,6 @@ public abstract class DesignerEditorPanel extends JPanel implements DataProvider
 
   @Override
   public Object getData(@NonNls String dataId) {
-    // TODO: support keys
     return myActionPanel.getData(dataId);
   }
 
diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/PropertyTablePanel.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/PropertyTablePanel.java
index fb9771775ab1..de01a6a7fbf7 100644
--- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/PropertyTablePanel.java
+++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/PropertyTablePanel.java
@@ -49,17 +49,17 @@ public final class PropertyTablePanel extends JPanel implements ListSelectionLis
     ActionManager actionManager = ActionManager.getInstance();
     DefaultActionGroup actionGroup = new DefaultActionGroup();
 
-    ShowJavadoc showJavadoc = new ShowJavadoc();
+    ShowJavadoc showJavadoc = new ShowJavadoc(myPropertyTable);
     showJavadoc.registerCustomShortcutSet(actionManager.getAction(IdeActions.ACTION_QUICK_JAVADOC).getShortcutSet(), myPropertyTable);
     actionGroup.add(showJavadoc);
 
     actionGroup.addSeparator();
 
-    RestoreDefault restoreDefault = new RestoreDefault();
+    RestoreDefault restoreDefault = new RestoreDefault(myPropertyTable);
     restoreDefault.registerCustomShortcutSet(actionManager.getAction(IdeActions.ACTION_DELETE).getShortcutSet(), myPropertyTable);
     actionGroup.add(restoreDefault);
 
-    actionGroup.add(new ShowExpert());
+    actionGroup.add(new ShowExpert(myPropertyTable));
 
     PopupHandler.installPopupHandler(myPropertyTable, actionGroup,
                                      ActionPlaces.GUI_DESIGNER_PROPERTY_INSPECTOR_POPUP,
@@ -92,7 +92,7 @@ public final class PropertyTablePanel extends JPanel implements ListSelectionLis
   public void valueChanged(ListSelectionEvent e) {
     for (AnAction action : myActions) {
       if (action instanceof IPropertyTableAction) {
-        ((IPropertyTableAction)action).update(myPropertyTable);
+        ((IPropertyTableAction)action).update();
       }
     }
   }
diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/IPropertyTableAction.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/IPropertyTableAction.java
index c4585198cfc9..78fd4094fa22 100644
--- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/IPropertyTableAction.java
+++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/IPropertyTableAction.java
@@ -15,11 +15,9 @@
  */
 package com.intellij.designer.propertyTable.actions;
 
-import com.intellij.designer.propertyTable.PropertyTable;
-
 /**
  * @author Alexander Lobas
  */
 public interface IPropertyTableAction {
-  void update(PropertyTable table);
+  void update();
 }
\ No newline at end of file
diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/RestoreDefault.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/RestoreDefault.java
index 1261283f1599..3f36998c7a1e 100644
--- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/RestoreDefault.java
+++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/RestoreDefault.java
@@ -16,7 +16,6 @@
 package com.intellij.designer.propertyTable.actions;
 
 import com.intellij.designer.DesignerBundle;
-import com.intellij.designer.DesignerToolWindowManager;
 import com.intellij.designer.propertyTable.Property;
 import com.intellij.designer.propertyTable.PropertyTable;
 import com.intellij.openapi.actionSystem.AnAction;
@@ -28,7 +27,11 @@ import com.intellij.openapi.util.IconLoader;
  * @author Alexander Lobas
  */
 public class RestoreDefault extends AnAction implements IPropertyTableAction {
-  public RestoreDefault() {
+  private final PropertyTable myTable;
+
+  public RestoreDefault(PropertyTable table) {
+    myTable = table;
+
     Presentation presentation = getTemplatePresentation();
     String text = DesignerBundle.message("designer.properties.restore_default");
     presentation.setText(text);
@@ -38,13 +41,12 @@ public class RestoreDefault extends AnAction implements IPropertyTableAction {
 
   @Override
   public void update(AnActionEvent e) {
-    PropertyTable table = DesignerToolWindowManager.getInstance(e.getProject()).getPropertyTable();
-    setEnabled(table, e.getPresentation());
+    setEnabled(myTable, e.getPresentation());
   }
 
   @Override
-  public void update(PropertyTable table) {
-    setEnabled(table, getTemplatePresentation());
+  public void update() {
+    setEnabled(myTable, getTemplatePresentation());
   }
 
   private static void setEnabled(PropertyTable table, Presentation presentation) {
@@ -57,10 +59,8 @@ public class RestoreDefault extends AnAction implements IPropertyTableAction {
     }
   }
 
-
   @Override
   public void actionPerformed(AnActionEvent e) {
-    PropertyTable table = DesignerToolWindowManager.getInstance(e.getProject()).getPropertyTable();
-    table.restoreDefaultValue();
+    myTable.restoreDefaultValue();
   }
 }
\ No newline at end of file
diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/ShowExpert.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/ShowExpert.java
index 7b972ff85967..3348c8f88736 100644
--- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/ShowExpert.java
+++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/ShowExpert.java
@@ -16,7 +16,6 @@
 package com.intellij.designer.propertyTable.actions;
 
 import com.intellij.designer.DesignerBundle;
-import com.intellij.designer.DesignerToolWindowManager;
 import com.intellij.designer.propertyTable.PropertyTable;
 import com.intellij.openapi.actionSystem.AnActionEvent;
 import com.intellij.openapi.actionSystem.Presentation;
@@ -27,7 +26,11 @@ import com.intellij.openapi.util.IconLoader;
  * @author Alexander Lobas
  */
 public class ShowExpert extends ToggleAction {
-  public ShowExpert() {
+  private final PropertyTable myTable;
+
+  public ShowExpert(PropertyTable table) {
+    myTable = table;
+
     Presentation presentation = getTemplatePresentation();
     String text = DesignerBundle.message("designer.properties.show.expert");
     presentation.setText(text);
@@ -37,13 +40,11 @@ public class ShowExpert extends ToggleAction {
 
   @Override
   public boolean isSelected(AnActionEvent e) {
-    PropertyTable table = DesignerToolWindowManager.getInstance(e.getProject()).getPropertyTable();
-    return table.isShowExpert();
+    return myTable.isShowExpert();
   }
 
   @Override
   public void setSelected(AnActionEvent e, boolean state) {
-    PropertyTable table = DesignerToolWindowManager.getInstance(e.getProject()).getPropertyTable();
-    table.showExpert(state);
+    myTable.showExpert(state);
   }
 }
\ No newline at end of file
diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/ShowJavadoc.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/ShowJavadoc.java
index 2f2b7da84e3a..06778d652f4d 100644
--- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/ShowJavadoc.java
+++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/ShowJavadoc.java
@@ -18,7 +18,6 @@ package com.intellij.designer.propertyTable.actions;
 import com.intellij.codeInsight.documentation.DocumentationComponent;
 import com.intellij.codeInsight.documentation.DocumentationManager;
 import com.intellij.designer.DesignerBundle;
-import com.intellij.designer.DesignerToolWindowManager;
 import com.intellij.designer.propertyTable.Property;
 import com.intellij.designer.propertyTable.PropertyTable;
 import com.intellij.openapi.actionSystem.AnAction;
@@ -42,7 +41,11 @@ import java.awt.*;
  * @author Alexander Lobas
  */
 public class ShowJavadoc extends AnAction implements IPropertyTableAction {
-  public ShowJavadoc() {
+  private final PropertyTable myTable;
+
+  public ShowJavadoc(PropertyTable table) {
+    myTable = table;
+
     Presentation presentation = getTemplatePresentation();
     String text = DesignerBundle.message("designer.properties.show.javadoc");
     presentation.setText(text);
@@ -52,13 +55,12 @@ public class ShowJavadoc extends AnAction implements IPropertyTableAction {
 
   @Override
   public void update(AnActionEvent e) {
-    PropertyTable table = DesignerToolWindowManager.getInstance(e.getProject()).getPropertyTable();
-    setEnabled(table, e.getPresentation());
+    setEnabled(myTable, e.getPresentation());
   }
 
   @Override
-  public void update(PropertyTable table) {
-    setEnabled(table, getTemplatePresentation());
+  public void update() {
+    setEnabled(myTable, getTemplatePresentation());
   }
 
   private static void setEnabled(PropertyTable table, Presentation presentation) {
@@ -72,8 +74,7 @@ public class ShowJavadoc extends AnAction implements IPropertyTableAction {
     DocumentationManager documentationManager = DocumentationManager.getInstance(project);
     final DocumentationComponent component = new DocumentationComponent(documentationManager);
 
-    final PropertyTable table = DesignerToolWindowManager.getInstance(project).getPropertyTable();
-    final Property property = table.getSelectionProperty();
+    final Property property = myTable.getSelectionProperty();
     PsiElement javadocElement = property.getJavadocElement();
 
     ActionCallback callback;
@@ -106,7 +107,7 @@ public class ShowJavadoc extends AnAction implements IPropertyTableAction {
             .createPopup();
         component.setHint(hint);
         Disposer.register(hint, component);
-        hint.show(new RelativePoint(table.getParent(), new Point(0, 0)));
+        hint.show(new RelativePoint(myTable.getParent(), new Point(0, 0)));
       }
     });