From a65fe552028380105a82b8007317be3cb61eae50 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Thu, 14 Jun 2012 09:54:40 +0200 Subject: [PATCH 01/11] improve whitespace handling of "Replace with 'try' with resources" quickfix --- ...inallyCanBeTryWithResourcesInspection.java | 51 ++++++++----------- 1 file changed, 21 insertions(+), 30 deletions(-) diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/migration/TryFinallyCanBeTryWithResourcesInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/migration/TryFinallyCanBeTryWithResourcesInspection.java index 68cca910f8b4..5154916f3f18 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/migration/TryFinallyCanBeTryWithResourcesInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/migration/TryFinallyCanBeTryWithResourcesInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 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. @@ -31,6 +31,7 @@ import com.siyeh.ig.InspectionGadgetsFix; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.*; @@ -74,8 +75,7 @@ public class TryFinallyCanBeTryWithResourcesInspection extends BaseInspection { } @Override - protected void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { + protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { final PsiElement element = descriptor.getPsiElement(); final PsiElement parent = element.getParent(); if (!(parent instanceof PsiTryStatement)) { @@ -93,10 +93,8 @@ public class TryFinallyCanBeTryWithResourcesInspection extends BaseInspection { variables.add(variable); } } - final PsiElementFactory factory = - JavaPsiFacade.getElementFactory(project); - @NonNls final StringBuilder newTryStatementText = - new StringBuilder("try ("); + final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project); + @NonNls final StringBuilder newTryStatementText = new StringBuilder("try ("); final Set unwantedChildren = new HashSet(2); boolean separator = false; for (PsiLocalVariable variable : variables) { @@ -120,19 +118,17 @@ public class TryFinallyCanBeTryWithResourcesInspection extends BaseInspection { newTryStatementText.append(initializer.getText()); } else { - final int index = findInitialization(tryBlockChildren, - variable, hasInitializer); + final int index = findInitialization(tryBlockChildren, variable, hasInitializer); if (index < 0) { return; } unwantedChildren.add(Integer.valueOf(index)); - final PsiExpressionStatement expressionStatement = - (PsiExpressionStatement)tryBlockChildren[index]; - final PsiAssignmentExpression assignmentExpression = - (PsiAssignmentExpression) - expressionStatement.getExpression(); - final PsiExpression rhs = - assignmentExpression.getRExpression(); + final PsiExpressionStatement expressionStatement = (PsiExpressionStatement)tryBlockChildren[index]; + if (expressionStatement.getNextSibling() instanceof PsiWhiteSpace) { + unwantedChildren.add(Integer.valueOf(index + 1)); + } + final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression)expressionStatement.getExpression(); + final PsiExpression rhs = assignmentExpression.getRExpression(); if (rhs == null) { return; } @@ -145,16 +141,12 @@ public class TryFinallyCanBeTryWithResourcesInspection extends BaseInspection { for (int i = 1; i < tryBlockStatementsLength; i++) { final PsiElement child = tryBlockChildren[i]; if (unwantedChildren.contains(Integer.valueOf(i))) { - if (child.getNextSibling() instanceof PsiWhiteSpace) { - i++; - } continue; } newTryStatementText.append(child.getText()); } newTryStatementText.append('}'); - final PsiCatchSection[] catchSections = - tryStatement.getCatchSections(); + final PsiCatchSection[] catchSections = tryStatement.getCatchSections(); for (PsiCatchSection catchSection : catchSections) { newTryStatementText.append(catchSection.getText()); } @@ -167,17 +159,17 @@ public class TryFinallyCanBeTryWithResourcesInspection extends BaseInspection { for (int i = 1; i < finallyChildrenLength; i++) { final PsiElement child = finallyChildren[i]; if (isCloseStatement(child, variables)) { - if (child.getNextSibling() instanceof PsiWhiteSpace) { - i++; - } continue; } if (!appended) { - if (child instanceof PsiWhiteSpace || - child instanceof PsiComment) { + if (child instanceof PsiComment) { + final PsiElement prevSibling = child.getPrevSibling(); + if (prevSibling instanceof PsiWhiteSpace) { + savedComments.add(prevSibling); + } savedComments.add(child); } - else { + else if (!(child instanceof PsiWhiteSpace)) { newTryStatementText.append(" finally {"); for (PsiElement savedComment : savedComments) { newTryStatementText.append(savedComment.getText()); @@ -204,9 +196,7 @@ public class TryFinallyCanBeTryWithResourcesInspection extends BaseInspection { parent1.addAfter(savedComment, tryStatement); } } - final PsiStatement newTryStatement = - factory.createStatementFromText( - newTryStatementText.toString(), element); + final PsiStatement newTryStatement = factory.createStatementFromText(newTryStatementText.toString(), element); tryStatement.replace(newTryStatement); } @@ -404,6 +394,7 @@ public class TryFinallyCanBeTryWithResourcesInspection extends BaseInspection { return variables; } + @Nullable static PsiLocalVariable findAutoCloseableVariable( PsiStatement statement) { if (statement instanceof PsiIfStatement) { From 2c544d3fee4f5ba98a12eaabc440c4240be163da Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Thu, 14 Jun 2012 11:54:37 +0400 Subject: [PATCH 02/11] Fix GitCherryPickTest: commit session is null in tests => return the original commit message --- .../src/git4idea/history/browser/GitCherryPicker.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/plugins/git4idea/src/git4idea/history/browser/GitCherryPicker.java b/plugins/git4idea/src/git4idea/history/browser/GitCherryPicker.java index d71aa1d10d12..031809e42429 100644 --- a/plugins/git4idea/src/git4idea/history/browser/GitCherryPicker.java +++ b/plugins/git4idea/src/git4idea/history/browser/GitCherryPicker.java @@ -45,6 +45,7 @@ import git4idea.repo.GitRepository; import git4idea.util.UntrackedFilesNotifier; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.event.HyperlinkEvent; @@ -462,17 +463,17 @@ public class GitCherryPicker { @NotNull private final Project myProject; @NotNull private final PlatformFacade myPlatformFacade; @NotNull private final List myChanges; - @NotNull private final String myCommitMessage; + @NotNull private final String myOriginalCommitMessage; private boolean myCommitFailed; - private CherryPickCommitExecutor.CherryPickCommitSession myCommitSession; + @Nullable private CherryPickCommitExecutor.CherryPickCommitSession myCommitSession; CherryPickCommitExecutor(@NotNull Project project, @NotNull PlatformFacade platformFacade, - @NotNull List changes, @NotNull String commitMessage) { + @NotNull List changes, @NotNull String originalCommitMessage) { myProject = project; myPlatformFacade = platformFacade; myChanges = changes; - myCommitMessage = commitMessage; + myOriginalCommitMessage = originalCommitMessage; } @Nls @@ -494,7 +495,7 @@ public class GitCherryPicker { @NotNull public String getActualCommitMessage() { - return myCommitSession.getActualCommitMessage(); + return myCommitSession == null ? myOriginalCommitMessage : myCommitSession.getActualCommitMessage(); } private class CherryPickCommitSession implements CommitSession { From d978a1b19d32c0f49c105b6e4e9d5ae43baad738 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 14 Jun 2012 11:11:16 +0400 Subject: [PATCH 03/11] create test: remember once chosen super class --- .../createTest/CreateTestDialog.java | 9 ++++++--- .../ui/ReferenceEditorComboWithBrowseButton.java | 7 ++++++- .../src/com/intellij/ui/EditorComboBox.java | 14 ++++++++++++++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/java/java-impl/src/com/intellij/testIntegration/createTest/CreateTestDialog.java b/java/java-impl/src/com/intellij/testIntegration/createTest/CreateTestDialog.java index 3b38008516db..573a8c7dba60 100644 --- a/java/java-impl/src/com/intellij/testIntegration/createTest/CreateTestDialog.java +++ b/java/java-impl/src/com/intellij/testIntegration/createTest/CreateTestDialog.java @@ -69,6 +69,7 @@ import java.util.List; public class CreateTestDialog extends DialogWrapper { private static final String RECENTS_KEY = "CreateTestDialog.RecentsKey"; + private static final String RECENT_SUPERS_KEY = "CreateTestDialog.Recents.Supers"; private static final String DEFAULT_LIBRARY_NAME_PROPERTY = CreateTestDialog.class.getName() + ".defaultLibrary"; private static final String SHOW_INHERITED_MEMBERS_PROPERTY = CreateTestDialog.class.getName() + ".includeInheritedMembers"; @@ -81,7 +82,7 @@ public class CreateTestDialog extends DialogWrapper { private final List myLibraryButtons = new ArrayList(); private EditorTextField myTargetClassNameField; - private ReferenceEditorWithBrowseButton mySuperClassField; + private ReferenceEditorComboWithBrowseButton mySuperClassField; private ReferenceEditorComboWithBrowseButton myTargetPackageField; private JCheckBox myGenerateBeforeBox; private JCheckBox myGenerateAfterBox; @@ -176,7 +177,8 @@ public class CreateTestDialog extends DialogWrapper { } }); - mySuperClassField = JavaReferenceEditorUtil.createReferenceEditorWithBrowseButton(new MyChooseSuperClassAction(), "", myProject, true); + mySuperClassField = new ReferenceEditorComboWithBrowseButton(new MyChooseSuperClassAction(), null, myProject, true, + JavaCodeFragment.VisibilityChecker.EVERYTHING_VISIBLE, RECENT_SUPERS_KEY); mySuperClassField.setMinimumSize(mySuperClassField.getPreferredSize()); String targetPackageName = targetPackage != null ? targetPackage.getQualifiedName() : ""; @@ -209,7 +211,7 @@ public class CreateTestDialog extends DialogWrapper { myFixLibraryPanel.setVisible(!descriptor.isLibraryAttached(myTargetModule)); String superClass = descriptor.getDefaultSuperClass(); - mySuperClassField.setText(superClass == null ? "" : superClass); + mySuperClassField.appendItem(superClass == null ? "" : superClass); mySelectedFramework = descriptor; } @@ -416,6 +418,7 @@ public class CreateTestDialog extends DialogWrapper { protected void doOKAction() { RecentsManager.getInstance(myProject).registerRecentEntry(RECENTS_KEY, myTargetPackageField.getText()); + RecentsManager.getInstance(myProject).registerRecentEntry(RECENT_SUPERS_KEY, mySuperClassField.getText()); String errorMessage; try { diff --git a/java/java-impl/src/com/intellij/ui/ReferenceEditorComboWithBrowseButton.java b/java/java-impl/src/com/intellij/ui/ReferenceEditorComboWithBrowseButton.java index 286e897e82ec..718a8c2fcdc7 100644 --- a/java/java-impl/src/com/intellij/ui/ReferenceEditorComboWithBrowseButton.java +++ b/java/java-impl/src/com/intellij/ui/ReferenceEditorComboWithBrowseButton.java @@ -19,6 +19,7 @@ import com.intellij.openapi.editor.Document; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.ComponentWithBrowseButton; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.util.ArrayUtil; import org.jetbrains.annotations.NotNull; @@ -42,7 +43,7 @@ public class ReferenceEditorComboWithBrowseButton extends ComponentWithBrowseBut @NotNull final Project project, boolean toAcceptClasses, final JavaCodeFragment.VisibilityChecker visibilityChecker, final String recentsKey) { - super(new EditorComboBox(createDocument(text, project, toAcceptClasses, visibilityChecker), project, StdFileTypes.JAVA), + super(new EditorComboBox(createDocument(StringUtil.isEmpty(text) ? "" : text, project, toAcceptClasses, visibilityChecker), project, StdFileTypes.JAVA), browseActionListener); final List recentEntries = RecentsManager.getInstance(project).getRecentEntries(recentsKey); if (recentEntries != null) { @@ -82,4 +83,8 @@ public class ReferenceEditorComboWithBrowseButton extends ComponentWithBrowseBut public void prependItem(String item) { getChildComponent().prependItem(item); } + + public void appendItem(String item) { + getChildComponent().appendItem(item); + } } diff --git a/platform/platform-impl/src/com/intellij/ui/EditorComboBox.java b/platform/platform-impl/src/com/intellij/ui/EditorComboBox.java index e20f02484fb0..af01dd3dce83 100644 --- a/platform/platform-impl/src/com/intellij/ui/EditorComboBox.java +++ b/platform/platform-impl/src/com/intellij/ui/EditorComboBox.java @@ -215,6 +215,20 @@ public class EditorComboBox extends JComboBox implements DocumentListener { setModel(new DefaultComboBoxModel(ArrayUtil.toObjectArray(objects))); } + public void appendItem(String item) { + ArrayList objects = new ArrayList(); + + int count = getItemCount(); + for (int i = 0; i < count; i++) { + objects.add(getItemAt(i)); + } + + if (!objects.contains(item)) { + objects.add(item); + } + setModel(new DefaultComboBoxModel(ArrayUtil.toObjectArray(objects))); + } + private class MyEditor implements ComboBoxEditor { public void addActionListener(ActionListener l) { } From 9711e33baee4d11fa4cb573f588680c1a6cf4be6 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 14 Jun 2012 12:02:20 +0400 Subject: [PATCH 04/11] include file templates in searchable options (IDEA-87213) --- .../ide/ui/search/TraverseUIStarter.java | 58 ++++++++++++++----- 1 file changed, 43 insertions(+), 15 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/ui/search/TraverseUIStarter.java b/platform/lang-impl/src/com/intellij/ide/ui/search/TraverseUIStarter.java index 04dde9854cda..05dd4c188f5b 100644 --- a/platform/lang-impl/src/com/intellij/ide/ui/search/TraverseUIStarter.java +++ b/platform/lang-impl/src/com/intellij/ide/ui/search/TraverseUIStarter.java @@ -17,8 +17,12 @@ package com.intellij.ide.ui.search; import com.intellij.application.options.OptionsContainingConfigurable; +import com.intellij.ide.fileTemplates.FileTemplate; +import com.intellij.ide.fileTemplates.FileTemplateManager; +import com.intellij.ide.fileTemplates.impl.AllFileTemplatesConfigurable; import com.intellij.ide.plugins.AvailablePluginsManagerMain; import com.intellij.ide.plugins.PluginManagerConfigurable; +import com.intellij.internal.ImageDuplicateResultsDialog; import com.intellij.openapi.actionSystem.ActionManager; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.impl.ActionManagerImpl; @@ -90,9 +94,7 @@ public class TraverseUIStarter implements ApplicationStarter { configurableElement.setAttribute(ID, id); configurableElement.setAttribute(CONFIGURABLE_NAME, configurable.getDisplayName()); final TreeSet sortedOptions = options.get(configurable); - for (OptionDescription option : sortedOptions) { - append(option.getPath(), option.getHit(), option.getOption(), configurableElement); - } + writeOptions(configurableElement, sortedOptions); if (configurable instanceof KeymapPanel){ processKeymap(configurableElement); } else if (configurable instanceof OptionsContainingConfigurable){ @@ -102,6 +104,8 @@ public class TraverseUIStarter implements ApplicationStarter { for (OptionDescription description : descriptions) { append(null, AvailablePluginsManagerMain.MANAGE_REPOSITORIES, description.getOption(), configurableElement); } + } else if (configurable instanceof AllFileTemplatesConfigurable) { + processFileTemplates(configurableElement); } root.addContent(configurableElement); configurable.disposeUIResources(); @@ -118,13 +122,39 @@ public class TraverseUIStarter implements ApplicationStarter { ((ApplicationEx)ApplicationManager.getApplication()).exit(true); } + private static void processFileTemplates(Element configurableElement) { + final SearchableOptionsRegistrar optionsRegistrar = SearchableOptionsRegistrar.getInstance(); + TreeSet options = new TreeSet(); + + processTemplates(optionsRegistrar, options, FileTemplateManager.getInstance().getAllTemplates()); + processTemplates(optionsRegistrar, options, FileTemplateManager.getInstance().getAllPatterns()); + processTemplates(optionsRegistrar, options, FileTemplateManager.getInstance().getAllCodeTemplates()); + processTemplates(optionsRegistrar, options, FileTemplateManager.getInstance().getAllJ2eeTemplates()); + + writeOptions(configurableElement, options); + } + + private static void processTemplates(SearchableOptionsRegistrar optionsRegistrar, + TreeSet options, + FileTemplate[] templates) { + for (FileTemplate template : templates) { + collectOptions(optionsRegistrar, options, template.getName()); + //collectOptions(optionsRegistrar, options, template.getDescription()); + } + } + + private static void collectOptions(SearchableOptionsRegistrar optionsRegistrar, TreeSet options, String text) { + final Set strings = optionsRegistrar.getProcessedWordsWithoutStemming(text); + for (String word : strings) { + options.add(new OptionDescription(word, text, null)); + } + } + private static void processOptionsContainingConfigurable(final OptionsContainingConfigurable configurable, final Element configurableElement) { final Set optionsPath = configurable.processListOptions(); final TreeSet result = wordsToOptionDescriptors(optionsPath); - for (OptionDescription option : result) { - append(option.getPath(), option.getHit(), option.getOption(), configurableElement); - } + writeOptions(configurableElement, result); } private static TreeSet wordsToOptionDescriptors(Set optionsPath) { @@ -150,24 +180,22 @@ public class TraverseUIStarter implements ApplicationStarter { final AnAction anAction = actionManager.getAction(id); final String text = anAction.getTemplatePresentation().getText(); if (text != null) { - final Set strings = searchableOptionsRegistrar.getProcessedWordsWithoutStemming(text); - for (String word : strings) { - options.add(new OptionDescription(word, text, null)); - } + collectOptions(searchableOptionsRegistrar, options, text); } final String description = anAction.getTemplatePresentation().getDescription(); if (description != null) { - final Set strings = searchableOptionsRegistrar.getProcessedWordsWithoutStemming(description); - for (String word : strings) { - options.add(new OptionDescription(word, description, null)); - } + collectOptions(searchableOptionsRegistrar, options, description); } } + writeOptions(configurableElement, options); + } + + private static void writeOptions(Element configurableElement, TreeSet options) { for (OptionDescription opt : options) { append(opt.getPath(), opt.getHit(), opt.getOption(), configurableElement); } } - + private static void append(String path, String hit, final String word, final Element configurableElement) { Element optionElement = new Element(OPTION); optionElement.setAttribute(NAME, word); From 369771bc855b94cbbf16427bb49fc56ddb005a31 Mon Sep 17 00:00:00 2001 From: Oleg Sukhodolsky Date: Thu, 14 Jun 2012 12:12:54 +0400 Subject: [PATCH 05/11] RUBY-11320: ERB_RAW_EXPRESSION_START can also start ruby expression so we must filter out errors if next element is ERB_RAW_EXPRESSION_START #RUBY-11320 fixed --- .../highlighting/TemplateLanguageErrorFilter.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/highlighting/TemplateLanguageErrorFilter.java b/platform/lang-impl/src/com/intellij/codeInsight/highlighting/TemplateLanguageErrorFilter.java index c70ffd4f3576..3b58b7602ea1 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/highlighting/TemplateLanguageErrorFilter.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/highlighting/TemplateLanguageErrorFilter.java @@ -19,18 +19,23 @@ import com.intellij.lang.Language; import com.intellij.psi.FileViewProvider; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiErrorElement; -import com.intellij.psi.tree.IElementType; +import com.intellij.psi.tree.TokenSet; import org.jetbrains.annotations.NotNull; /** * @author Dennis.Ushakov */ public abstract class TemplateLanguageErrorFilter extends HighlightErrorFilter { - private final IElementType myTemplateExpressionStart; + @NotNull + private final TokenSet myTemplateExpressionStartTokens; + @NotNull private final Class myTemplateFileViewProviderClass; - protected TemplateLanguageErrorFilter(IElementType templateExpressionStart, Class templateFileViewProviderClass) { - myTemplateExpressionStart = templateExpressionStart; + protected TemplateLanguageErrorFilter( + final @NotNull TokenSet templateExpressionStartTokens, + final @NotNull Class templateFileViewProviderClass) + { + myTemplateExpressionStartTokens = TokenSet.create(templateExpressionStartTokens.getTypes()); myTemplateFileViewProviderClass = templateFileViewProviderClass; } @@ -45,7 +50,7 @@ public abstract class TemplateLanguageErrorFilter extends HighlightErrorFilter { final Language css = Language.findLanguageByID("CSS"); if (javaScript != null && parentLanguage.is(javaScript) || css != null && parentLanguage.is(css)) { final PsiElement next = viewProvider.findElementAt(element.getTextOffset() + 1, viewProvider.getBaseLanguage()); - if (next != null && next.getNode().getElementType() == myTemplateExpressionStart) { + if (next != null && myTemplateExpressionStartTokens.contains(next.getNode().getElementType())) { return false; } } From be37189c4604523a9c7e7e0ad147f58be36a0e9a Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Thu, 14 Jun 2012 13:27:21 +0400 Subject: [PATCH 06/11] IDEA-80408 android-dex: optimize option --- .../compiler/tools/AndroidDxRunner.java | 36 +++++++++++++++++-- .../AndroidDexCompilerConfiguration.java | 1 + ...ndroidDexCompilerSettingsConfigurable.form | 12 +++++-- .../AndroidDexCompilerSettingsFactory.java | 11 +++--- .../compiler/tools/AndroidDxWrapper.java | 10 +++--- 5 files changed, 58 insertions(+), 12 deletions(-) diff --git a/plugins/android/rt/src/org/jetbrains/android/compiler/tools/AndroidDxRunner.java b/plugins/android/rt/src/org/jetbrains/android/compiler/tools/AndroidDxRunner.java index 017d393d6aab..035643b98267 100644 --- a/plugins/android/rt/src/org/jetbrains/android/compiler/tools/AndroidDxRunner.java +++ b/plugins/android/rt/src/org/jetbrains/android/compiler/tools/AndroidDxRunner.java @@ -52,6 +52,7 @@ public class AndroidDxRunner { private static Field myJarOutputField; private static Field myFileNamesField; private static Field myStrictNameCheckField; + private static Field myOptimizeField; private static Field myConsoleOut; private static Field myConsoleErr; @@ -82,6 +83,8 @@ public class AndroidDxRunner { myVerboseField = argClass.getField("verbose"); myStrictNameCheckField = argClass.getField("strictNameCheck"); + myOptimizeField = getFieldIfPossible(argClass); + myConsoleOut = consoleClass.getField("out"); myConsoleErr = consoleClass.getField("err"); } @@ -102,7 +105,17 @@ public class AndroidDxRunner { } } - private static int runDex(String dxPath, String outFilePath, String[] fileNames) { + @Nullable + private static Field getFieldIfPossible(Class argClass) { + try { + return argClass.getField("optimize"); + } + catch (NoSuchFieldException e) { + return null; + } + } + + private static int runDex(String dxPath, String outFilePath, String[] fileNames, boolean optimize) { loadDex(dxPath); try { @@ -116,6 +129,13 @@ public class AndroidDxRunner { myVerboseField.set(args, false); myStrictNameCheckField.set(args, false); + if (myOptimizeField != null) { + myOptimizeField.set(args, optimize); + } + else { + reportWarning("Cannot find 'optimize' field. The option won't be passed to DEX"); + } + Object res = myMethod.invoke(null, args); if (res instanceof Integer) { @@ -203,8 +223,20 @@ public class AndroidDxRunner { Set files = new HashSet(); HashSet visited = new HashSet(); HashSet qNames = new HashSet(); + boolean optimize = true; int i = 2; + + while (i < args.length && args[i].startsWith("--")) { + if ("--optimize".equals(args[i])) { + i++; + if (i < args.length) { + optimize = Boolean.parseBoolean(args[i]); + } + } + i++; + } + while (i < args.length) { String arg = args[i]; if ("--exclude".equals(arg)) { @@ -226,7 +258,7 @@ public class AndroidDxRunner { files.removeAll(Arrays.asList(excludedFiles)); String[] filesArray = files.toArray(new String[files.size()]); //System.out.println("file names: " + concat(filesArray)); - runDex(dxPath, outFilePath, filesArray); + runDex(dxPath, outFilePath, filesArray, optimize); } private static String concat(String[] ar) { diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompilerConfiguration.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompilerConfiguration.java index 73af4e6d2b82..419e22f4d001 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompilerConfiguration.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompilerConfiguration.java @@ -32,6 +32,7 @@ import com.intellij.util.xmlb.XmlSerializerUtil; public class AndroidDexCompilerConfiguration implements PersistentStateComponent { public String VM_OPTIONS = ""; public int MAX_HEAP_SIZE = 1024; + public boolean OPTIMIZE = true; @Override public AndroidDexCompilerConfiguration getState() { diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompilerSettingsConfigurable.form b/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompilerSettingsConfigurable.form index 6e6e87d078fe..53097ee7e989 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompilerSettingsConfigurable.form +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompilerSettingsConfigurable.form @@ -1,6 +1,6 @@
- + @@ -24,7 +24,7 @@ - + @@ -49,6 +49,14 @@ + + + + + + + + diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompilerSettingsFactory.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompilerSettingsFactory.java index eb5c8c31b120..6502c7e87046 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompilerSettingsFactory.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompilerSettingsFactory.java @@ -21,6 +21,7 @@ import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.SearchableConfigurable; import com.intellij.openapi.project.Project; import com.intellij.ui.RawCommandLineEditor; +import com.intellij.ui.components.JBCheckBox; import org.jetbrains.android.util.AndroidBundle; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; @@ -42,6 +43,7 @@ public class AndroidDexCompilerSettingsFactory implements CompilerSettingsFactor private JSpinner myHeapSizeSpinner; private JLabel myVmOptionsLabel; private RawCommandLineEditor myVmOptionsEditor; + private JBCheckBox myOptimizeCheckBox; public AndroidDexCompilerSettingsConfigurable(Project project) { myConfig = AndroidDexCompilerConfiguration.getInstance(project); @@ -68,22 +70,23 @@ public class AndroidDexCompilerSettingsFactory implements CompilerSettingsFactor @Override public boolean isModified() { int maxHeapSize = ((Integer)myHeapSizeSpinner.getValue()).intValue(); - if (maxHeapSize != myConfig.MAX_HEAP_SIZE) { - return true; - } - return !myVmOptionsEditor.getText().equals(myConfig.VM_OPTIONS); + return maxHeapSize != myConfig.MAX_HEAP_SIZE || + !myVmOptionsEditor.getText().equals(myConfig.VM_OPTIONS) || + myOptimizeCheckBox.isSelected() != myConfig.OPTIMIZE; } @Override public void apply() throws ConfigurationException { myConfig.MAX_HEAP_SIZE = ((Integer)myHeapSizeSpinner.getValue()).intValue(); myConfig.VM_OPTIONS = myVmOptionsEditor.getText(); + myConfig.OPTIMIZE = myOptimizeCheckBox.isSelected(); } @Override public void reset() { myHeapSizeSpinner.setModel(new SpinnerNumberModel(myConfig.MAX_HEAP_SIZE, 1, 10000000, 1)); myVmOptionsEditor.setText(myConfig.VM_OPTIONS); + myOptimizeCheckBox.setSelected(myConfig.OPTIMIZE); } @Override diff --git a/plugins/android/src/org/jetbrains/android/compiler/tools/AndroidDxWrapper.java b/plugins/android/src/org/jetbrains/android/compiler/tools/AndroidDxWrapper.java index 892ff18591ea..7267ac0f54bd 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/tools/AndroidDxWrapper.java +++ b/plugins/android/src/org/jetbrains/android/compiler/tools/AndroidDxWrapper.java @@ -51,9 +51,9 @@ public class AndroidDxWrapper { @SuppressWarnings({"IOResourceOpenedButNotSafelyClosed"}) public static Map> execute(@NotNull Module module, - @NotNull IAndroidTarget target, - @NotNull String outputDir, - @NotNull String[] compileTargets) { + @NotNull IAndroidTarget target, + @NotNull String outputDir, + @NotNull String[] compileTargets) { String outFile = outputDir + File.separatorChar + AndroidCommonUtils.CLASSES_FILE_NAME; final Map> messages = new HashMap>(2); @@ -79,15 +79,17 @@ public class AndroidDxWrapper { parameters.setJdk(sdk); parameters.setMainClass(AndroidDxRunner.class.getName()); + final AndroidDexCompilerConfiguration configuration = AndroidDexCompilerConfiguration.getInstance(module.getProject()); + ParametersList programParamList = parameters.getProgramParametersList(); programParamList.add(dxJarPath); programParamList.add(outFile); + programParamList.add("--optimize", Boolean.toString(configuration.OPTIMIZE)); programParamList.addAll(compileTargets); programParamList.add("--exclude"); ParametersList vmParamList = parameters.getVMParametersList(); - AndroidDexCompilerConfiguration configuration = AndroidDexCompilerConfiguration.getInstance(module.getProject()); String additionalVmParams = configuration.VM_OPTIONS; if (additionalVmParams.length() > 0) { vmParamList.addParametersString(additionalVmParams); From 112157af1dada4b4e5e874d4f8bff82fb5222138 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Thu, 14 Jun 2012 13:47:26 +0400 Subject: [PATCH 07/11] annotations in stacktraces --- .../execution/impl/ConsoleViewImpl.java | 6 +- .../unscramble/AnalyzeStacktraceUtil.java | 10 +- .../unscramble/AnnotateStackTraceAction.java | 232 ++++++++++++++++++ 3 files changed, 241 insertions(+), 7 deletions(-) create mode 100644 platform/lang-impl/src/com/intellij/unscramble/AnnotateStackTraceAction.java diff --git a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java index e87a6cf4d699..c61e184c4209 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java @@ -79,7 +79,6 @@ import gnu.trove.TIntObjectHashMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.TestOnly; import javax.swing.*; import java.awt.*; @@ -130,11 +129,14 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo private final Runnable myFinishProgress; private boolean myAllowHeavyFilters = false; - @TestOnly public Editor getEditor() { return myEditor; } + public EditorHyperlinkSupport getHyperlinks() { + return myHyperlinks; + } + public void scrollToEnd() { if (myEditor == null) return; myEditor.getCaretModel().moveToOffset(myEditor.getDocument().getTextLength()); diff --git a/platform/lang-impl/src/com/intellij/unscramble/AnalyzeStacktraceUtil.java b/platform/lang-impl/src/com/intellij/unscramble/AnalyzeStacktraceUtil.java index a094599f2c14..44648abcc385 100644 --- a/platform/lang-impl/src/com/intellij/unscramble/AnalyzeStacktraceUtil.java +++ b/platform/lang-impl/src/com/intellij/unscramble/AnalyzeStacktraceUtil.java @@ -19,9 +19,8 @@ package com.intellij.unscramble; import com.intellij.execution.ExecutionManager; import com.intellij.execution.Executor; import com.intellij.execution.executors.DefaultRunExecutor; -import com.intellij.execution.filters.Filter; -import com.intellij.execution.filters.TextConsoleBuilder; -import com.intellij.execution.filters.TextConsoleBuilderFactory; +import com.intellij.execution.filters.*; +import com.intellij.execution.impl.ConsoleViewImpl; import com.intellij.execution.ui.ConsoleView; import com.intellij.execution.ui.ConsoleViewContentType; import com.intellij.execution.ui.ExecutionConsole; @@ -95,8 +94,8 @@ public class AnalyzeStacktraceUtil { for(Filter filter: Extensions.getExtensions(EP_NAME, project)) { builder.addFilter(filter); } - final ConsoleView consoleView = builder.getConsole(); + final DefaultActionGroup toolbarActions = new DefaultActionGroup(); JComponent consoleComponent = consoleFactory != null ? consoleFactory.createConsoleComponent(consoleView, toolbarActions) @@ -109,10 +108,11 @@ public class AnalyzeStacktraceUtil { }; final Executor executor = DefaultRunExecutor.getRunExecutorInstance(); - toolbarActions.add(new CloseAction(executor, descriptor, project)); for (AnAction action: consoleView.createConsoleActions()) { toolbarActions.add(action); } + toolbarActions.add(new AnnotateStackTraceAction((ConsoleViewImpl)consoleView)); + toolbarActions.add(new CloseAction(executor, descriptor, project)); ExecutionManager.getInstance(project).getContentManager().showRunContent(executor, descriptor); consoleView.allowHeavyFilters(); printStacktrace(consoleView, text); diff --git a/platform/lang-impl/src/com/intellij/unscramble/AnnotateStackTraceAction.java b/platform/lang-impl/src/com/intellij/unscramble/AnnotateStackTraceAction.java new file mode 100644 index 000000000000..00a18b3e0479 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/unscramble/AnnotateStackTraceAction.java @@ -0,0 +1,232 @@ +/* + * 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.unscramble; + +import com.intellij.execution.filters.FileHyperlinkInfo; +import com.intellij.execution.filters.HyperlinkInfo; +import com.intellij.execution.impl.ConsoleViewImpl; +import com.intellij.execution.impl.EditorHyperlinkSupport; +import com.intellij.icons.AllIcons; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.colors.ColorKey; +import com.intellij.openapi.editor.colors.EditorColors; +import com.intellij.openapi.editor.colors.EditorColorsManager; +import com.intellij.openapi.editor.colors.EditorFontType; +import com.intellij.openapi.editor.ex.EditorGutterComponentEx; +import com.intellij.openapi.editor.markup.RangeHighlighter; +import com.intellij.openapi.fileEditor.OpenFileDescriptor; +import com.intellij.openapi.progress.PerformInBackgroundOption; +import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.progress.Task; +import com.intellij.openapi.vcs.AbstractVcs; +import com.intellij.openapi.vcs.FilePath; +import com.intellij.openapi.vcs.VcsException; +import com.intellij.openapi.vcs.actions.ActiveAnnotationGutter; +import com.intellij.openapi.vcs.actions.VcsContextFactory; +import com.intellij.openapi.vcs.annotate.AnnotationSource; +import com.intellij.openapi.vcs.history.VcsFileRevision; +import com.intellij.openapi.vcs.history.VcsHistoryProvider; +import com.intellij.openapi.vcs.history.VcsHistorySession; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.text.DateFormatUtil; +import com.intellij.vcsUtil.VcsUtil; +import org.jetbrains.annotations.NotNull; + +import java.awt.*; +import java.util.*; +import java.util.List; + +/** +* @author Konstantin Bulenkov +*/ +class AnnotateStackTraceAction extends AnAction { + private final EditorHyperlinkSupport myHyperlinks; + private Map cache; + private int newestLine = -1; + private int maxDateLength = 0; + private final Editor myEditor; + + AnnotateStackTraceAction(ConsoleViewImpl consoleView) { + super("Annotate", null, AllIcons.Actions.Annotate); + myHyperlinks = consoleView.getHyperlinks(); + myEditor = consoleView.getEditor(); + myEditor.getColorsScheme().setColor( + EditorColors.CARET_ROW_COLOR, EditorColorsManager.getInstance().getGlobalScheme().getColor(EditorColors.CARET_ROW_COLOR)); + } + + @Override + public void actionPerformed(AnActionEvent e) { + cache = new HashMap(); + + ProgressManager.getInstance().run( + new Task.Backgroundable(myEditor.getProject(), "Getting file history", true, PerformInBackgroundOption.ALWAYS_BACKGROUND) { + @Override + public boolean shouldStartInBackground() { + return true; + } + + @Override + public void onSuccess() { + } + + private void showGutter() { + myEditor.getGutter().registerTextAnnotation(new ActiveAnnotationGutter() { + @Override + public void doAction(int lineNum) { + } + + @Override + public Cursor getCursor(int lineNum) { + return Cursor.getDefaultCursor(); + } + + @Override + public String getLineText(int line, Editor editor) { + final VcsFileRevision revision = cache.get(line); + if (revision != null) { + return String.format("%"+maxDateLength+"s", DateFormatUtil.formatPrettyDate(revision.getRevisionDate())) + " " + revision.getAuthor(); + } + return ""; + } + + @Override + public String getToolTip(int line, Editor editor) { + final VcsFileRevision revision = cache.get(line); + if (revision != null) { + return "" + + revision.getAuthor() + + " " + + DateFormatUtil.formatDateTime(revision.getRevisionDate()) + + "
" + + revision.getCommitMessage() + + ""; + } + return null; + } + + @Override + public EditorFontType getStyle(int line, Editor editor) { + return line == newestLine ? EditorFontType.BOLD : EditorFontType.PLAIN; + } + + @Override + public ColorKey getColor(int line, Editor editor) { + return AnnotationSource.LOCAL.getColor(); + } + + @Override + public Color getBgColor(int line, Editor editor) { + return null; + } + + @Override + public List getPopupActions(int line, Editor editor) { + return Collections.emptyList(); + } + + @Override + public void gutterClosed() { + } + }); + } + + @Override + public void run(@NotNull ProgressIndicator indicator) { + Date newestDate = null; + HashMap> files2lines = new HashMap>(); + List files = new ArrayList(); + for (int line = 0; line < myEditor.getDocument().getLineCount(); line++) { + indicator.checkCanceled(); + final List links = myHyperlinks.findAllHyperlinksOnLine(line); + if (links.size() > 0) { + final HyperlinkInfo info = myHyperlinks.getHyperlinks().get(links.get(links.size() - 1)); + if (info instanceof FileHyperlinkInfo) { + final OpenFileDescriptor fileDescriptor = ((FileHyperlinkInfo)info).getDescriptor(); + if (fileDescriptor != null) { + final VirtualFile file = fileDescriptor.getFile(); + if (files2lines.containsKey(file)) { + files2lines.get(file).add(line); + } else { + final ArrayList lines = new ArrayList(); + lines.add(line); + files2lines.put(file, lines); + files.add(file); + } + } + } + } + } + + + for (VirtualFile file : files) { + indicator.checkCanceled(); + final AbstractVcs vcs = VcsUtil.getVcsFor(myEditor.getProject(), file); + FilePath filePath = VcsContextFactory.SERVICE.getInstance().createFilePathOn(file); + if (vcs != null) { + try { + final VcsHistoryProvider provider = vcs.getVcsHistoryProvider(); + final VcsHistorySession session; + if (provider != null) { + session = provider.createSessionFor(filePath); + final List list; + if (session != null) { + list = session.getRevisionList(); + final List lines = files2lines.get(file); + if (list != null && !list.isEmpty()) { + final VcsFileRevision revision = list.get(0); + final Date date = revision.getRevisionDate(); + if (newestDate == null || date.after(newestDate)) { + newestDate = date; + newestLine = lines.get(0); + } + final int length = DateFormatUtil.formatPrettyDate(date).length(); + if (length > maxDateLength) { + maxDateLength = length; + } + for (Integer line : lines) { + cache.put(line, revision); + } + ApplicationManager.getApplication().invokeLater(new Runnable() { + public void run() { + if (cache.keySet().size() == 1) { + showGutter(); + } else { + ((EditorGutterComponentEx)myEditor.getGutter()).revalidateMarkup(); + } + } + }); + } + } + } + } + catch (VcsException ignored) { + } + } + + } + } + }); + } + + @Override + public void update(AnActionEvent e) { + e.getPresentation().setEnabled(cache == null); + } +} From 97ed06614a67e6c70e8fa41d79f604bb6a63c42e Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Thu, 14 Jun 2012 13:54:36 +0400 Subject: [PATCH 08/11] relaunch dex on make if its configuration is changed --- .../android/compiler/AndroidDexCompiler.java | 69 +++++++++++++++++-- .../compiler/tools/AndroidDxWrapper.java | 13 ++-- 2 files changed, 69 insertions(+), 13 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompiler.java index a1b6abf4ab76..d4fcde7f0261 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompiler.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompiler.java @@ -41,6 +41,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.DataInput; +import java.io.DataOutput; import java.io.IOException; import java.util.*; @@ -78,7 +79,7 @@ public class AndroidDexCompiler implements ClassPostProcessingCompiler { } public ValidityState createValidityState(DataInput in) throws IOException { - return new ClassesAndJarsValidityState(in); + return new MyValidityState(in); } public static VirtualFile getOutputDirectoryForDex(@NotNull Module module) { @@ -114,6 +115,9 @@ public class AndroidDexCompiler implements ClassPostProcessingCompiler { } public ProcessingItem[] compute() { + final AndroidDexCompilerConfiguration dexConfig = + AndroidDexCompilerConfiguration.getInstance(myContext.getProject()); + Module[] modules = ModuleManager.getInstance(myContext.getProject()).getModules(); List items = new ArrayList(); for (Module module : modules) { @@ -181,7 +185,8 @@ public class AndroidDexCompiler implements ClassPostProcessingCompiler { continue; } - items.add(new DexItem(module, dexOutputDir, platform.getTarget(), files)); + items.add(new DexItem(module, dexOutputDir, platform.getTarget(), files, dexConfig.VM_OPTIONS, dexConfig.MAX_HEAP_SIZE, + dexConfig.OPTIMIZE)); } } return items.toArray(new ProcessingItem[items.size()]); @@ -214,8 +219,9 @@ public class AndroidDexCompiler implements ClassPostProcessingCompiler { files[i++] = FileUtil.toSystemDependentName(file.getPath()); } - Map> messages = AndroidCompileUtil.toCompilerMessageCategoryKeys( - AndroidDxWrapper.execute(dexItem.myModule, dexItem.myAndroidTarget, outputDirPath, files)); + Map> messages = AndroidCompileUtil.toCompilerMessageCategoryKeys(AndroidDxWrapper.execute( + dexItem.myModule, dexItem.myAndroidTarget, outputDirPath, files, dexItem.myAdditionalVmParams, dexItem.myMaxHeapSize, + dexItem.myOptimize)); addMessages(messages, dexItem.myModule); if (messages.get(CompilerMessageCategory.ERROR).isEmpty()) { @@ -241,15 +247,24 @@ public class AndroidDexCompiler implements ClassPostProcessingCompiler { final VirtualFile myClassDir; final IAndroidTarget myAndroidTarget; final Collection myFiles; + final String myAdditionalVmParams; + final int myMaxHeapSize; + final boolean myOptimize; public DexItem(@NotNull Module module, @NotNull VirtualFile classDir, @NotNull IAndroidTarget target, - Collection files) { + Collection files, + @NotNull String additionalVmParams, + int maxHeapSize, + boolean optimize) { myModule = module; myClassDir = classDir; myAndroidTarget = target; myFiles = files; + myAdditionalVmParams = additionalVmParams; + myMaxHeapSize = maxHeapSize; + myOptimize = optimize; } @NotNull @@ -259,7 +274,49 @@ public class AndroidDexCompiler implements ClassPostProcessingCompiler { @Nullable public ValidityState getValidityState() { - return new ClassesAndJarsValidityState(myFiles); + return new MyValidityState(myFiles, myAdditionalVmParams, myMaxHeapSize, myOptimize); + } + } + + private static class MyValidityState extends ClassesAndJarsValidityState { + private final String myAdditionalVmParams; + private final int myMaxHeapSize; + private final boolean myOptimize; + + public MyValidityState(@NotNull Collection files, @NotNull String additionalVmParams, int maxHeapSize, boolean optimize) { + super(files); + myAdditionalVmParams = additionalVmParams; + myMaxHeapSize = maxHeapSize; + myOptimize = optimize; + } + + public MyValidityState(@NotNull DataInput in) throws IOException { + super(in); + myAdditionalVmParams = in.readUTF(); + myMaxHeapSize = in.readInt(); + myOptimize = in.readBoolean(); + } + + @Override + public void save(DataOutput out) throws IOException { + super.save(out); + out.writeUTF(myAdditionalVmParams); + out.writeInt(myMaxHeapSize); + out.writeBoolean(myOptimize); + } + + @Override + public boolean equalsTo(ValidityState otherState) { + if (!super.equalsTo(otherState)) { + return false; + } + if (!(otherState instanceof MyValidityState)) { + return false; + } + final MyValidityState state = (MyValidityState)otherState; + return state.myAdditionalVmParams.equals(myAdditionalVmParams) && + state.myMaxHeapSize == myMaxHeapSize && + state.myOptimize == myOptimize; } } } diff --git a/plugins/android/src/org/jetbrains/android/compiler/tools/AndroidDxWrapper.java b/plugins/android/src/org/jetbrains/android/compiler/tools/AndroidDxWrapper.java index 7267ac0f54bd..3456dac64a94 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/tools/AndroidDxWrapper.java +++ b/plugins/android/src/org/jetbrains/android/compiler/tools/AndroidDxWrapper.java @@ -29,7 +29,6 @@ import com.intellij.openapi.util.io.FileUtilRt; import com.intellij.util.PathUtil; import com.intellij.util.PathsList; import com.intellij.util.containers.HashMap; -import org.jetbrains.android.compiler.AndroidDexCompilerConfiguration; import org.jetbrains.android.util.AndroidBundle; import org.jetbrains.android.util.AndroidCommonUtils; import org.jetbrains.android.util.AndroidCompilerMessageKind; @@ -53,7 +52,10 @@ public class AndroidDxWrapper { public static Map> execute(@NotNull Module module, @NotNull IAndroidTarget target, @NotNull String outputDir, - @NotNull String[] compileTargets) { + @NotNull String[] compileTargets, + @NotNull String additionalVmParams, + int maxHeapSize, + boolean optimize) { String outFile = outputDir + File.separatorChar + AndroidCommonUtils.CLASSES_FILE_NAME; final Map> messages = new HashMap>(2); @@ -79,23 +81,20 @@ public class AndroidDxWrapper { parameters.setJdk(sdk); parameters.setMainClass(AndroidDxRunner.class.getName()); - final AndroidDexCompilerConfiguration configuration = AndroidDexCompilerConfiguration.getInstance(module.getProject()); - ParametersList programParamList = parameters.getProgramParametersList(); programParamList.add(dxJarPath); programParamList.add(outFile); - programParamList.add("--optimize", Boolean.toString(configuration.OPTIMIZE)); + programParamList.add("--optimize", Boolean.toString(optimize)); programParamList.addAll(compileTargets); programParamList.add("--exclude"); ParametersList vmParamList = parameters.getVMParametersList(); - String additionalVmParams = configuration.VM_OPTIONS; if (additionalVmParams.length() > 0) { vmParamList.addParametersString(additionalVmParams); } if (!hasXmxParam(vmParamList)) { - vmParamList.add("-Xmx" + configuration.MAX_HEAP_SIZE + "M"); + vmParamList.add("-Xmx" + maxHeapSize + "M"); } final PathsList classPath = parameters.getClassPath(); classPath.add(PathUtil.getJarPathForClass(AndroidDxRunner.class)); From 9e78298af87b3fe1a4cb32bc541cf8f6f5419fb0 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 14 Jun 2012 13:38:35 +0400 Subject: [PATCH 09/11] support loaded local profiles with the same name as existing shared (IDEA-84956) --- .../ui/InspectionToolsConfigurable.java | 46 +++++++++++++------ 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/InspectionToolsConfigurable.java b/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/InspectionToolsConfigurable.java index 5067129f78fb..fe306e537246 100644 --- a/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/InspectionToolsConfigurable.java +++ b/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/InspectionToolsConfigurable.java @@ -27,7 +27,6 @@ import com.intellij.codeInsight.daemon.impl.SeverityRegistrar; import com.intellij.codeInspection.ModifiableModel; import com.intellij.codeInspection.ex.InspectionProfileImpl; import com.intellij.codeInspection.ex.InspectionToolRegistrar; -import com.intellij.icons.AllIcons; import com.intellij.ui.ListCellRendererWrapper; import com.intellij.lang.annotation.HighlightSeverity; import com.intellij.openapi.diagnostic.Logger; @@ -173,7 +172,7 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable imple profile.setLocal(true); profile.initInspectionTools(null); profile.setModified(true); - if (myPanels.get(profile.getName()) != null) { + if (getProfilePanel(profile) != null) { if (Messages.showOkCancelDialog(myWholePanel, "Profile with name \'" + profile.getName() + "\' already exists. Do you want to overwrite it?", "Warning", Messages.getInformationIcon()) != DialogWrapper.OK_EXIT_CODE) return; } addProfile((InspectionProfileImpl)profile.getModifiableModel()); @@ -247,7 +246,7 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable imple if (!myPanels.containsKey(modelName)) { ((DefaultComboBoxModel)myProfiles.getModel()).addElement(model); } - myPanels.put(modelName, panel); + putProfile(model, panel); myProfiles.setSelectedItem(model); } @@ -281,7 +280,7 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable imple public void customize(final JList list, final Profile value, final int index, final boolean selected, final boolean hasFocus) { final String profileName = value.getName(); setText(profileName); - final SingleInspectionProfilePanel panel = myPanels.get(profileName); + final SingleInspectionProfilePanel panel = getProfilePanel(value); setIcon(panel != null && panel.isProfileShared() ? Profile.PROJECT_PROFILE : Profile.LOCAL_PROFILE); } }); @@ -320,15 +319,36 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable imple } public void apply() throws ConfigurationException { - for (final Iterator it = myPanels.keySet().iterator(); it.hasNext();) { - final String name = it.next(); + final Map panels = new LinkedHashMap(); + for (final String name : myPanels.keySet()) { if (myDeletedProfiles.remove(name)) { deleteProfile(name); - it.remove(); - } else { - myPanels.get(name).apply(); + } + else { + final SingleInspectionProfilePanel panel = getProfilePanel(name); + panel.apply(); + final ModifiableModel profile = panel.getSelectedProfile(); + panels.put(getProfilePrefix(profile) + profile.getName(), panel); } } + myPanels.clear(); + myPanels.putAll(panels); + } + + private SingleInspectionProfilePanel getProfilePanel(String name) { + return myPanels.get(name); + } + + private SingleInspectionProfilePanel getProfilePanel(Profile inspectionProfile) { + return getProfilePanel(getProfilePrefix(inspectionProfile) + inspectionProfile.getName()); + } + + private void putProfile(Profile profile, SingleInspectionProfilePanel panel) { + myPanels.put(getProfilePrefix(profile) + profile.getName(), panel); + } + + private static String getProfilePrefix(Profile profile) { + return (profile.isLocal() ? "L" : "S"); } protected void deleteProfile(String name) { @@ -349,7 +369,7 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable imple model.addElement(profile); final String profileName = profile.getName(); final SingleInspectionProfilePanel panel = new SingleInspectionProfilePanel(myProjectProfileManager, profileName, ((InspectionProfileImpl)profile).getModifiableModel()); - myPanels.put(profileName, panel); + putProfile(profile, panel); myPanel.add(profileName, panel); } final InspectionProfileImpl inspectionProfile = getCurrentProfile(); @@ -426,7 +446,7 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable imple public void selectInspectionTool(String selectedToolShortName) { final InspectionProfileImpl inspectionProfile = getSelectedObject(); assert inspectionProfile != null : configuredProfiles(); - final SingleInspectionProfilePanel panel = myPanels.get(inspectionProfile.getName()); + final SingleInspectionProfilePanel panel = getProfilePanel(inspectionProfile); LOG.assertTrue(panel != null, "No settings panel for: " + inspectionProfile.getName() + "; " + configuredProfiles()); panel.selectInspectionTool(selectedToolShortName); } @@ -434,7 +454,7 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable imple protected SingleInspectionProfilePanel getSelectedPanel() { final InspectionProfileImpl inspectionProfile = getSelectedObject(); assert inspectionProfile != null : configuredProfiles(); - return myPanels.get(inspectionProfile.getName()); + return getProfilePanel(inspectionProfile); } private String configuredProfiles() { @@ -453,6 +473,6 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable imple public JComponent getPreferredFocusedComponent() { final InspectionProfileImpl inspectionProfile = getSelectedObject(); assert inspectionProfile != null : configuredProfiles(); - return myPanels.get(inspectionProfile.getName()).getTree(); + return getProfilePanel(inspectionProfile).getTree(); } } From e98378e08a6abd0f62e8cbf1f8ea162e8b5a3c63 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 14 Jun 2012 14:16:15 +0400 Subject: [PATCH 10/11] add hint to run tests from go-to-test popup (IDEA-84931) --- .../navigation/GotoTargetHandler.java | 5 +++++ .../GotoTestOrCodeHandler.java | 20 ++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/navigation/GotoTargetHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/navigation/GotoTargetHandler.java index 68f42ce81276..76e1d92784fe 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/navigation/GotoTargetHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/navigation/GotoTargetHandler.java @@ -176,6 +176,7 @@ public abstract class GotoTargetHandler implements CodeInsightActionHandler { return true; } }). + setAdText(getAdText(gotoData.source, targets.length)). createPopup(); if (gotoData.listUpdaterTask != null) { gotoData.listUpdaterTask.init((AbstractPopup)popup, list); @@ -237,6 +238,10 @@ public abstract class GotoTargetHandler implements CodeInsightActionHandler { protected abstract String getChooserTitle(PsiElement sourceElement, String name, int length); protected abstract String getNotFoundMessage(Project project, Editor editor, PsiFile file); + @Nullable + protected String getAdText(PsiElement source, int length) { + return null; + } public interface AdditionalAction { String getText(); diff --git a/platform/lang-impl/src/com/intellij/testIntegration/GotoTestOrCodeHandler.java b/platform/lang-impl/src/com/intellij/testIntegration/GotoTestOrCodeHandler.java index cdd9ec709d36..41ec65b1ce54 100644 --- a/platform/lang-impl/src/com/intellij/testIntegration/GotoTestOrCodeHandler.java +++ b/platform/lang-impl/src/com/intellij/testIntegration/GotoTestOrCodeHandler.java @@ -20,7 +20,12 @@ import com.intellij.codeInsight.CodeInsightBundle; import com.intellij.codeInsight.navigation.GotoTargetHandler; import com.intellij.codeInsight.navigation.NavigationUtil; import com.intellij.icons.AllIcons; +import com.intellij.openapi.actionSystem.IdeActions; +import com.intellij.openapi.actionSystem.Shortcut; import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.keymap.Keymap; +import com.intellij.openapi.keymap.KeymapManager; +import com.intellij.openapi.keymap.KeymapUtil; import com.intellij.openapi.project.Project; import com.intellij.pom.Navigatable; import com.intellij.psi.PsiElement; @@ -75,7 +80,7 @@ public class GotoTestOrCodeHandler extends GotoTargetHandler { } } - return new GotoData(sourceElement, PsiUtilBase.toPsiElementArray(candidates), actions); + return new GotoData(sourceElement, PsiUtilCore.toPsiElementArray(candidates), actions); } @NotNull @@ -102,6 +107,19 @@ public class GotoTestOrCodeHandler extends GotoTargetHandler { return CodeInsightBundle.message("goto.test.notFound"); } + @Nullable + @Override + protected String getAdText(PsiElement source, int length) { + if (length > 0 && !TestFinderHelper.isTest(source)) { + final Keymap keymap = KeymapManager.getInstance().getActiveKeymap(); + final Shortcut[] shortcuts = keymap.getShortcuts(IdeActions.ACTION_DEFAULT_RUNNER); + if (shortcuts.length > 0) { + return ("Press " + KeymapUtil.getShortcutText(shortcuts[0]) + " to run selected tests"); + } + } + return null; + } + @Override protected void navigateToElement(Navigatable element) { if (element instanceof PsiElement) { From 312d4892c0392b38b665a29947b31a235391e075 Mon Sep 17 00:00:00 2001 From: "Maxim.Medvedev" Date: Thu, 14 Jun 2012 14:41:29 +0400 Subject: [PATCH 11/11] IDEA-87114 renaming @TupleConstructor class --- .../rename/RenameJavaClassProcessor.java | 6 ++++-- .../refactoring/rename/RenameTest.groovy | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaClassProcessor.java b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaClassProcessor.java index 9069c92bf963..d98870a493f6 100644 --- a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaClassProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaClassProcessor.java @@ -21,6 +21,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Pair; import com.intellij.psi.*; +import com.intellij.psi.impl.light.LightElement; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.SearchScope; @@ -134,10 +135,11 @@ public class RenameJavaClassProcessor extends RenamePsiElementProcessor { final PsiElement prototype = ((PsiMirrorElement)constructor).getPrototype(); if (prototype instanceof PsiNamedElement) { allRenames.put(prototype, newName); - continue; } } - allRenames.put(constructor, newName); + else if (!(constructor instanceof LightElement)) { + allRenames.put(constructor, newName); + } } } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/rename/RenameTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/rename/RenameTest.groovy index 7fc6d22388a5..c4e6352a9a4c 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/rename/RenameTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/rename/RenameTest.groovy @@ -573,4 +573,23 @@ class Java { } } + + void testTupleConstructor() { + myFixture.with { + configureByText('a.groovy', '''\ +import groovy.transform.TupleConstructor + +@TupleConstructor +class Xx {} +''') + + renameElementAtCaret('Yy') + checkResult("""\ +import groovy.transform.TupleConstructor + +@TupleConstructor +class Yy {} +""") + } + } }