From 0b7a5bf25742b2775ae3a7aec8447ed7fcdb18b9 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Wed, 1 Feb 2012 18:36:53 +0400 Subject: [PATCH 01/40] IDEA-74778 Display tracking branches for local branches in the Git branch popup --- .../src/git4idea/repo/GitBranchTrackInfo.java | 8 +++- .../ui/branch/GitBranchPopupActions.java | 13 +++++- .../ui/branch/GitMultiRootBranchConfig.java | 40 ++++++++++++++++++- 3 files changed, 58 insertions(+), 3 deletions(-) diff --git a/plugins/git4idea/src/git4idea/repo/GitBranchTrackInfo.java b/plugins/git4idea/src/git4idea/repo/GitBranchTrackInfo.java index 5658590ee2f7..f7b79d1e6345 100644 --- a/plugins/git4idea/src/git4idea/repo/GitBranchTrackInfo.java +++ b/plugins/git4idea/src/git4idea/repo/GitBranchTrackInfo.java @@ -15,6 +15,7 @@ */ package git4idea.repo; +import git4idea.GitBranch; import org.jetbrains.annotations.NotNull; /** @@ -30,7 +31,12 @@ public class GitBranchTrackInfo { GitBranchTrackInfo(@NotNull String branch, @NotNull GitRemote remote, @NotNull String remoteBranch, boolean merge) { myBranch = branch; myMerge = merge; - myRemoteBranch = remoteBranch; + if (remoteBranch.startsWith(GitBranch.REFS_HEADS_PREFIX)) { + myRemoteBranch = remoteBranch.substring(GitBranch.REFS_HEADS_PREFIX.length()); + } + else { + myRemoteBranch = remoteBranch; + } myRemote = remote; } diff --git a/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopupActions.java b/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopupActions.java index 8f8bcb176f4f..e1dda0d03b4e 100644 --- a/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopupActions.java +++ b/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopupActions.java @@ -185,7 +185,18 @@ class GitBranchPopupActions { myRepositories = repositories; myBranchName = branchName; mySelectedRepository = selectedRepository; - getTemplatePresentation().setText(myBranchName, false); // no mnemonics + getTemplatePresentation().setText(calcBranchText(), false); // no mnemonics + } + + @NotNull + private String calcBranchText() { + String trackedBranch = new GitMultiRootBranchConfig(myRepositories).getTrackedBranch(myBranchName); + if (trackedBranch != null) { + return myBranchName + " -> " + trackedBranch; + } + else { + return myBranchName; + } } @NotNull diff --git a/plugins/git4idea/src/git4idea/ui/branch/GitMultiRootBranchConfig.java b/plugins/git4idea/src/git4idea/ui/branch/GitMultiRootBranchConfig.java index c45b886bd1f2..a4040993053e 100644 --- a/plugins/git4idea/src/git4idea/ui/branch/GitMultiRootBranchConfig.java +++ b/plugins/git4idea/src/git4idea/ui/branch/GitMultiRootBranchConfig.java @@ -15,9 +15,11 @@ */ package git4idea.ui.branch; +import com.intellij.openapi.util.Pair; import git4idea.GitBranch; import git4idea.GitUtil; import git4idea.branch.GitBranchesCollection; +import git4idea.repo.GitBranchTrackInfo; import git4idea.repo.GitRepository; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -81,7 +83,42 @@ public class GitMultiRootBranchConfig { @NotNull Collection getRemoteBranches() { return getCommonBranches(false); - } + } + + /** + * If there is a common remote branch which is commonly tracked by the given branch in all repositories, + * returns the name of this remote branch. Otherwise returns null.
+ * For one repository just returns the tracked branch or null if there is no tracked branch. + */ + @Nullable + public String getTrackedBranch(@NotNull String branch) { + String trackedBranch = null; + String trackedRemote = null; + for (GitRepository repository : myRepositories) { + Pair tracked = getTrackedBranchAndRemote(repository, branch); + if (tracked == null) { + return null; + } + if (trackedBranch == null) { + trackedBranch = tracked.getFirst(); + trackedRemote = tracked.getSecond(); + } + else if (!tracked.getFirst().equals(trackedBranch) || !tracked.getSecond().equals(trackedRemote)) { + return null; + } + } + return trackedRemote + "/" + trackedBranch; + } + + @Nullable + private static Pair getTrackedBranchAndRemote(@NotNull GitRepository repository, @NotNull String branch) { + for (GitBranchTrackInfo trackInfo : repository.getConfig().getBranchTrackInfos()) { + if (trackInfo.getBranch().equals(branch)) { + return Pair.create(trackInfo.getRemoteBranch(), trackInfo.getRemote().getName()); + } + } + return null; + } @NotNull private Collection getCommonBranches(boolean local) { @@ -106,4 +143,5 @@ public class GitMultiRootBranchConfig { } return sb.toString(); } + } From 7f09a214e187d4fe32d540845c806506454a4ecb Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Wed, 1 Feb 2012 13:49:49 +0400 Subject: [PATCH 02/40] exception on restart project --- .../components/impl/stores/StorageUtil.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/StorageUtil.java b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/StorageUtil.java index 7a86a03e5c44..5e4431fc4099 100644 --- a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/StorageUtil.java +++ b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/StorageUtil.java @@ -184,7 +184,7 @@ public class StorageUtil { final int ndx = fileText.indexOf('\n'); return Pair.create(fileText, ndx == -1 ? SystemProperties.getLineSeparator() - : (ndx - 1 >=0 ? (fileText.charAt(ndx - 1) == '\r' ? "\r\n" : "\n") : "\n")); + : ndx - 1 >=0 ? fileText.charAt(ndx - 1) == '\r' ? "\r\n" : "\n" : "\n"); } public static boolean contentEquals(@NotNull final Document document, @NotNull final IFile file) { @@ -264,7 +264,7 @@ public class StorageUtil { @Nullable public static Document loadDocument(final byte[] bytes) { try { - return (bytes == null || bytes.length == 0) ? null : JDOMUtil.loadDocument(new ByteArrayInputStream(bytes)); + return bytes == null || bytes.length == 0 ? null : JDOMUtil.loadDocument(new ByteArrayInputStream(bytes)); } catch (JDOMException e) { return null; @@ -313,7 +313,6 @@ public class StorageUtil { } public static void logStateDiffInfo(Set> changedFiles, Set componentNames) throws IOException { - if (!ApplicationManagerEx.getApplicationEx().isInternal() && !ourDumpChangedComponentStates) return; try { @@ -324,7 +323,7 @@ public class StorageUtil { for (String componentName : componentNames) { for (Pair pair : changedFiles) { StateStorage storage = pair.second; - if ((storage instanceof XmlElementStorage)) { + if (storage instanceof XmlElementStorage) { Element state = ((XmlElementStorage)storage).getState(componentName); if (state != null) { File logFile = new File(logDirectory, "prev_" + componentName + ".xml"); @@ -332,13 +331,14 @@ public class StorageUtil { } } } - } for (Pair changedFile : changedFiles) { - File logFile = new File(logDirectory, "new_" + changedFile.first.getName()); - - FileUtil.copy(new File(changedFile.first.getPath()), logFile); + File in = new File(changedFile.first.getPath()); + if (in.exists()) { + File logFile = new File(logDirectory, "new_" + changedFile.first.getName()); + FileUtil.copy(in, logFile); + } } } catch (Throwable e) { From ad12c9fc70c16247872c0e8cbff03924786707e4 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Wed, 1 Feb 2012 16:00:45 +0400 Subject: [PATCH 03/40] proper concurrent map used --- .../intellij/codeInsight/ExternalAnnotationsManagerImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java index ab6284cc9eb3..bac7e47a1e48 100644 --- a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java +++ b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java @@ -65,7 +65,7 @@ import com.intellij.psi.xml.XmlDocument; import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTag; import com.intellij.util.*; -import com.intellij.util.containers.ConcurrentWeakHashMap; +import com.intellij.util.containers.ConcurrentWeakValueHashMap; import com.intellij.util.messages.MessageBusConnection; import com.intellij.util.ui.OptionsMessageDialog; import org.jetbrains.annotations.NonNls; @@ -84,7 +84,7 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { public static final Icon ICON = IconLoader.getIcon("/modules/annotation.png"); private static final Logger LOG = Logger.getInstance("#" + ExternalAnnotationsManagerImpl.class.getName()); - private final Map> myExternalAnnotations = new ConcurrentWeakHashMap>(); + private final Map> myExternalAnnotations = new ConcurrentWeakValueHashMap>(); private final AtomicReference myHasAnyAnnotationsRoots = new AtomicReference(ThreeState.UNSURE); private static final List NULL = new ArrayList(); private final PsiManager myPsiManager; From 7dc835726ae359a1416ec67bb085a03fd0b2096e Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Wed, 1 Feb 2012 19:25:43 +0400 Subject: [PATCH 04/40] cleanup --- .../openapi/components/impl/stores/StorageUtil.java | 4 ++-- .../intellij/openapi/progress/util/ProgressWindow.java | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/StorageUtil.java b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/StorageUtil.java index 5e4431fc4099..b6624845f61f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/StorageUtil.java +++ b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/StorageUtil.java @@ -190,7 +190,7 @@ public class StorageUtil { public static boolean contentEquals(@NotNull final Document document, @NotNull final IFile file) { try { final Pair pair = loadFile(file); - return pair.first == null ? false : pair.first.equals(printDocumentToString(document, pair.second)); + return pair.first != null && pair.first.equals(printDocumentToString(document, pair.second)); } catch (IOException e) { LOG.debug(e); @@ -201,7 +201,7 @@ public class StorageUtil { public static boolean contentEquals(@NotNull final Element element, @NotNull final IFile file) { try { final Pair pair = loadFile(file); - return pair.first == null ? false : pair.first.equals(printElement(element, pair.second)); + return pair.first != null && pair.first.equals(printElement(element, pair.second)); } catch (IOException e) { LOG.debug(e); diff --git a/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressWindow.java b/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressWindow.java index ccbb4f8afcc4..0a6c80418c06 100644 --- a/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressWindow.java +++ b/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressWindow.java @@ -164,7 +164,6 @@ public class ProgressWindow extends BlockingProgressIndicator implements Disposa final DialogWrapper popup = myDialog.myPopup; if (popup != null) { myFocusTrackback.registerFocusComponent(new FocusTrackback.ComponentQuery() { - @SuppressWarnings({"ConstantConditions"}) public Component getComponent() { return popup.getPreferredFocusedComponent(); } @@ -250,7 +249,7 @@ public class ProgressWindow extends BlockingProgressIndicator implements Disposa if (isDialogShowing()) { if (myFocusTrackback != null) { myFocusTrackback.setWillBeSheduledForRestore(); - } + } } UIUtil.invokeLaterIfNeeded(new Runnable() { @@ -260,11 +259,12 @@ public class ProgressWindow extends BlockingProgressIndicator implements Disposa if (myDialog != null) { myDialog.hide(); } - + if (myFocusTrackback != null) { if (wasShowing) { myFocusTrackback.restoreFocus(); - } else { + } + else { myFocusTrackback.consume(); } } From 7013733394ca4ea87a4a49c786ca92c19aa2d285 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Thu, 2 Feb 2012 10:30:11 +0100 Subject: [PATCH 05/40] Remove unnecessary StringBuilder usages --- .../extapi/psi/StubBasedPsiElementBase.java | 18 ++++++++---------- .../intellij/openapi/project/ProjectUtil.java | 10 +++++----- .../src/com/intellij/extapi/psi/StubPath.java | 8 +------- .../openapi/util/DimensionService.java | 7 +------ .../internal/inspector/UiInspectorAction.java | 18 +++++++----------- .../util/src/com/intellij/ui/ColorUtil.java | 6 +----- .../annotate/ShowAllAffectedGenericAction.java | 3 +-- .../vcs/changes/VcsChangeDetailsManager.java | 4 +--- .../vcs/changes/patch/ApplyPatchAction.java | 7 ++++--- .../history/wholeTree/UsersFilterAction.java | 2 +- .../svn17/dialogs/UpgradeFormatDialog.java | 13 ++++++------- .../idea/svn/dialogs/UpgradeFormatDialog.java | 11 +++++------ 12 files changed, 41 insertions(+), 66 deletions(-) diff --git a/platform/core-impl/src/com/intellij/extapi/psi/StubBasedPsiElementBase.java b/platform/core-impl/src/com/intellij/extapi/psi/StubBasedPsiElementBase.java index c38b1e3f54be..d854b6cbbd60 100644 --- a/platform/core-impl/src/com/intellij/extapi/psi/StubBasedPsiElementBase.java +++ b/platform/core-impl/src/com/intellij/extapi/psi/StubBasedPsiElementBase.java @@ -81,16 +81,14 @@ public class StubBasedPsiElementBase extends ASTDelegateP final FileElement fileElement = file.loadTreeElement(); node = myNode; if (node == null) { - String message = new StringBuilder(). - append("Failed to bind stub to AST for element "). - append(getClass()). - append(" in "). - append(file.getVirtualFile() == null ? "" : file.getVirtualFile().getPath()). - append("\nFile stub tree:\n"). - append(stubTree != null ? StringUtil.trimLog(((PsiFileStubImpl)stubTree.getRoot()).printTree(), 1024) : " is null"). - append("\nLoaded file AST:\n"). - append(StringUtil.trimLog(DebugUtil.treeToString(fileElement, true), 1024)). - toString(); + String message = "Failed to bind stub to AST for element " + + getClass() + + " in " + + (file.getVirtualFile() == null ? "" : file.getVirtualFile().getPath()) + + "\nFile stub tree:\n" + + (stubTree != null ? StringUtil.trimLog(((PsiFileStubImpl)stubTree.getRoot()).printTree(), 1024) : " is null") + + "\nLoaded file AST:\n" + + StringUtil.trimLog(DebugUtil.treeToString(fileElement, true), 1024); throw new IllegalArgumentException(message); } } diff --git a/platform/lang-api/src/com/intellij/openapi/project/ProjectUtil.java b/platform/lang-api/src/com/intellij/openapi/project/ProjectUtil.java index 0a7c42517dd7..cd22a9b403f6 100644 --- a/platform/lang-api/src/com/intellij/openapi/project/ProjectUtil.java +++ b/platform/lang-api/src/com/intellij/openapi/project/ProjectUtil.java @@ -83,12 +83,12 @@ public class ProjectUtil { final OrderEntry libraryEntry = LibraryUtil.findLibraryEntry(file, project); if (libraryEntry != null) { if (libraryEntry instanceof JdkOrderEntry) { - url = new StringBuilder(url).append(" - [").append(((JdkOrderEntry)libraryEntry).getJdkName()).append("]").toString(); + url = url + " - [" + ((JdkOrderEntry)libraryEntry).getJdkName() + "]"; } else { - url = new StringBuilder(url).append(" - [").append(libraryEntry.getPresentableName()).append("]").toString(); + url = url + " - [" + libraryEntry.getPresentableName() + "]"; } } else { - url = new StringBuilder(url).append(" - [").append(fileForJar.getName()).append("]").toString(); + url = url + " - [" + fileForJar.getName() + "]"; } } } @@ -96,8 +96,8 @@ public class ProjectUtil { final Module module = ModuleUtil.findModuleForFile(file, project); if (module == null) return url; return !keepModuleAlwaysOnTheLeft && SystemInfo.isMac ? - new StringBuffer().append(url).append(" - [").append(module.getName()).append("]").toString() : - new StringBuffer().append("[").append(module.getName()).append("] - ").append(url).toString(); + url + " - [" + module.getName() + "]" : + "[" + module.getName() + "] - " + url; } } diff --git a/platform/lang-impl/src/com/intellij/extapi/psi/StubPath.java b/platform/lang-impl/src/com/intellij/extapi/psi/StubPath.java index 3ba3c7b77b21..0ebd2584561d 100644 --- a/platform/lang-impl/src/com/intellij/extapi/psi/StubPath.java +++ b/platform/lang-impl/src/com/intellij/extapi/psi/StubPath.java @@ -67,12 +67,6 @@ public class StubPath { } public String toString() { - return new StringBuilder(). - append(myParentPath != null ? myParentPath.toString() : ""). - append("::("). - append(myType.toString()). - append(":"). - append(myId). - append(")").toString(); + return (myParentPath != null ? myParentPath.toString() : "") + "::(" + myType.toString() + ":" + myId + ")"; } } diff --git a/platform/platform-api/src/com/intellij/openapi/util/DimensionService.java b/platform/platform-api/src/com/intellij/openapi/util/DimensionService.java index 770d0256fe7e..2f19b937e14b 100644 --- a/platform/platform-api/src/com/intellij/openapi/util/DimensionService.java +++ b/platform/platform-api/src/com/intellij/openapi/util/DimensionService.java @@ -272,11 +272,6 @@ public class DimensionService implements PersistentStateComponent, Appl final Point topLeft = frame.getLocation(); Point center = new Point(topLeft.x + frame.getWidth() / 2, topLeft.y + frame.getHeight() / 2); final Rectangle frameScreen = ScreenUtil.getScreenRectangle(center); - return new StringBuffer(key) - .append('.').append(frameScreen.x) - .append('.').append(frameScreen.y) - .append('.').append(frameScreen.width) - .append('.').append(frameScreen.height) - .toString(); + return key + '.' + frameScreen.x + '.' + frameScreen.y + '.' + frameScreen.width + '.' + frameScreen.height; } } diff --git a/platform/platform-impl/src/com/intellij/internal/inspector/UiInspectorAction.java b/platform/platform-impl/src/com/intellij/internal/inspector/UiInspectorAction.java index 75a098b5906b..7b74cbcfbbc3 100644 --- a/platform/platform-impl/src/com/intellij/internal/inspector/UiInspectorAction.java +++ b/platform/platform-impl/src/com/intellij/internal/inspector/UiInspectorAction.java @@ -481,7 +481,7 @@ public class UiInspectorAction extends ToggleAction implements DumbAware { g2d.fillRect(insets.left, insets.top, bounds.width - insets.left - insets.right, bounds.height - insets.top - insets.bottom); g2d.setColor(getForeground()); - final String sizeString = new StringBuilder().append(myWidth).append(" x ").append(myHeight).toString(); + final String sizeString = String.valueOf(myWidth) + " x " + myHeight; FontMetrics fm = g2d.getFontMetrics(); int sizeWidth = fm.stringWidth(sizeString); @@ -595,46 +595,42 @@ public class UiInspectorAction extends ToggleAction implements DumbAware { private static class PointRenderer extends JLabel implements Renderer { public JComponent setValue(@NotNull final Point value) { - setText(new StringBuilder().append(value.x).append(':').append(value.y).toString()); + setText(String.valueOf(value.x) + ':' + value.y); return this; } } private static class DimensionRenderer extends JLabel implements Renderer { public JComponent setValue(@NotNull final Dimension value) { - setText(new StringBuilder().append(value.width).append(" x ").append(value.height).toString()); + setText(String.valueOf(value.width) + " x " + value.height); return this; } } private static class InsetsRenderer extends JLabel implements Renderer { public JComponent setValue(@NotNull final Insets value) { - setText(new StringBuilder("top: ").append(value.top).append(" left:").append(value.left).append(" bottom:").append(value.bottom) - .append(" right:").append(value.right).toString()); + setText("top: " + value.top + " left:" + value.left + " bottom:" + value.bottom + " right:" + value.right); return this; } } private static class RectangleRenderer extends JLabel implements Renderer { public JComponent setValue(@NotNull final Rectangle value) { - setText(new StringBuilder().append(value.x).append(":").append(value.y).append(", ").append(value.width) - .append(" x ").append(value.height).toString()); + setText(String.valueOf(value.x) + ":" + value.y + ", " + value.width + " x " + value.height); return this; } } private static class ColorRenderer extends JLabel implements Renderer { public JComponent setValue(@NotNull final Color value) { - setText(new StringBuilder("r:").append(value.getRed()).append(", g:").append(value.getGreen()).append(", b:").append(value.getBlue()) - .toString()); + setText("r:" + value.getRed() + ", g:" + value.getGreen() + ", b:" + value.getBlue()); return this; } } private static class FontRenderer extends JLabel implements Renderer { public JComponent setValue(@NotNull final Font value) { - setText(new StringBuilder(value.getFontName()).append(" (").append(value.getFamily()).append("), ").append(value.getSize()). - append("px").toString()); + setText(value.getFontName() + " (" + value.getFamily() + "), " + value.getSize() + "px"); return this; } } diff --git a/platform/util/src/com/intellij/ui/ColorUtil.java b/platform/util/src/com/intellij/ui/ColorUtil.java index c1adf1b26468..034adec7b502 100644 --- a/platform/util/src/com/intellij/ui/ColorUtil.java +++ b/platform/util/src/com/intellij/ui/ColorUtil.java @@ -53,11 +53,7 @@ public class ColorUtil { final String R = Integer.toHexString(c.getRed()); final String G = Integer.toHexString(c.getGreen()); final String B = Integer.toHexString(c.getBlue()); - return new StringBuffer() - .append(R.length() < 2 ? "0" : "").append(R) - .append(G.length() < 2 ? "0" : "").append(G) - .append(B.length() < 2 ? "0" : "").append(B) - .toString(); + return (R.length() < 2 ? "0" : "") + R + (G.length() < 2 ? "0" : "") + G + (B.length() < 2 ? "0" : "") + B; } /** diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/annotate/ShowAllAffectedGenericAction.java b/platform/vcs-api/src/com/intellij/openapi/vcs/annotate/ShowAllAffectedGenericAction.java index feb9988d3c32..f8ae000b3b93 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/annotate/ShowAllAffectedGenericAction.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/annotate/ShowAllAffectedGenericAction.java @@ -96,8 +96,7 @@ public class ShowAllAffectedGenericAction extends AnAction { } private static String failedText(VirtualFile virtualFile, VcsRevisionNumber revision) { - return new StringBuilder().append("Show all affected files for ").append(virtualFile.getPath()).append(" at ") - .append(revision.asString()).append(" failed").toString(); + return "Show all affected files for " + virtualFile.getPath() + " at " + revision.asString() + " failed"; } @Override diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsChangeDetailsManager.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsChangeDetailsManager.java index 0de56dc1eaf5..ddf8e002b5c9 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsChangeDetailsManager.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsChangeDetailsManager.java @@ -303,9 +303,7 @@ public class VcsChangeDetailsManager { } private static String changeDescription(Change o) { - return new StringBuilder().append(ChangesUtil.getFilePath(o).getName()).append(" (").append( - o.getBeforeRevision() == null - ? "New" : beforeRevisionText(o)).append(")").toString(); + return ChangesUtil.getFilePath(o).getName() + " (" + (o.getBeforeRevision() == null ? "New" : beforeRevisionText(o)) + ")"; } private static String beforeRevisionText(Change o) { diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/ApplyPatchAction.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/ApplyPatchAction.java index f843dadf15ad..28b3c17313ab 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/ApplyPatchAction.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/ApplyPatchAction.java @@ -206,9 +206,10 @@ public class ApplyPatchAction extends DumbAwareAction { final VirtualFile file, ApplyPatchForBaseRevisionTexts texts, boolean readonly) { - final SimpleDiffRequest simpleRequest = new SimpleDiffRequest(project, new StringBuilder().append("Result Of Patch Apply To ") - .append(file.getName()).append(" (").append(file.getParent() == null ? file.getPath() : file.getParent().getPath()).append(")") - .toString()); + final SimpleDiffRequest simpleRequest = + new SimpleDiffRequest(project, "Result Of Patch Apply To " + file.getName() + " (" + + (file.getParent() == null ? file.getPath() : file.getParent().getPath()) + + ")"); final DocumentImpl patched = new DocumentImpl(texts.getPatched()); patched.setReadOnly(false); diff --git a/plugins/git4idea/src/git4idea/history/wholeTree/UsersFilterAction.java b/plugins/git4idea/src/git4idea/history/wholeTree/UsersFilterAction.java index 5d5bf6fe591d..f60ceea8ff7c 100644 --- a/plugins/git4idea/src/git4idea/history/wholeTree/UsersFilterAction.java +++ b/plugins/git4idea/src/git4idea/history/wholeTree/UsersFilterAction.java @@ -224,7 +224,7 @@ public class UsersFilterAction extends BasePopupAction { } private String getMeText(final String name) { - return new StringBuilder().append("me ( ").append(name).append(" )").toString(); + return "me ( " + name + " )"; } @Override diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn17/dialogs/UpgradeFormatDialog.java b/plugins/svn4idea/src/org/jetbrains/idea/svn17/dialogs/UpgradeFormatDialog.java index ce2580e197ce..890300075dac 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn17/dialogs/UpgradeFormatDialog.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn17/dialogs/UpgradeFormatDialog.java @@ -81,8 +81,7 @@ public class UpgradeFormatDialog extends DialogWrapper { } protected String getTopMessage(final String label) { - return SvnBundle.message(new StringBuilder().append("label.configure.").append(label).append(".label").toString(), - ApplicationNamesInfo.getInstance().getFullProductName()); + return SvnBundle.message("label.configure." + label + ".label", ApplicationNamesInfo.getInstance().getFullProductName()); } @Nullable @@ -113,11 +112,11 @@ public class UpgradeFormatDialog extends DialogWrapper { panel.add(topLabel, gb); gb.gridy += 1; - myUpgradeNoneButton = new JRadioButton(SvnBundle.message(new StringBuilder().append("radio.configure.").append(label).append(".none").toString())); - myUpgradeAutoButton = new JRadioButton(SvnBundle.message(new StringBuilder().append("radio.configure.").append(label).append(".auto").toString())); - myUpgradeAuto15Button = new JRadioButton(SvnBundle.message(new StringBuilder().append("radio.configure.").append(label).append(".auto.15format").toString())); - myUpgradeAuto16Button = new JRadioButton(SvnBundle.message(new StringBuilder().append("radio.configure.").append(label).append(".auto.16format").toString())); - myUpgradeAuto17Button = new JRadioButton(SvnBundle.message(new StringBuilder().append("radio.configure.").append(label).append(".auto.17format").toString())); + myUpgradeNoneButton = new JRadioButton(SvnBundle.message("radio.configure." + label + ".none")); + myUpgradeAutoButton = new JRadioButton(SvnBundle.message("radio.configure." + label + ".auto")); + myUpgradeAuto15Button = new JRadioButton(SvnBundle.message("radio.configure." + label + ".auto.15format")); + myUpgradeAuto16Button = new JRadioButton(SvnBundle.message("radio.configure." + label + ".auto.16format")); + myUpgradeAuto17Button = new JRadioButton(SvnBundle.message("radio.configure." + label + ".auto.17format")); ButtonGroup group = new ButtonGroup(); group.add(myUpgradeNoneButton); diff --git a/plugins/svn4ideaOld/src/org/jetbrains/idea/svn/dialogs/UpgradeFormatDialog.java b/plugins/svn4ideaOld/src/org/jetbrains/idea/svn/dialogs/UpgradeFormatDialog.java index 8146e78bf67a..bd5d8a3de3b2 100644 --- a/plugins/svn4ideaOld/src/org/jetbrains/idea/svn/dialogs/UpgradeFormatDialog.java +++ b/plugins/svn4ideaOld/src/org/jetbrains/idea/svn/dialogs/UpgradeFormatDialog.java @@ -78,8 +78,7 @@ public class UpgradeFormatDialog extends DialogWrapper { } protected String getTopMessage(final String label) { - return SvnBundle.message(new StringBuilder().append("label.configure.").append(label).append(".label").toString(), - ApplicationNamesInfo.getInstance().getFullProductName()); + return SvnBundle.message("label.configure." + label + ".label", ApplicationNamesInfo.getInstance().getFullProductName()); } @Nullable @@ -110,10 +109,10 @@ public class UpgradeFormatDialog extends DialogWrapper { panel.add(topLabel, gb); gb.gridy += 1; - myUpgradeNoneButton = new JRadioButton(SvnBundle.message(new StringBuilder().append("radio.configure.").append(label).append(".none").toString())); - myUpgradeAutoButton = new JRadioButton(SvnBundle.message(new StringBuilder().append("radio.configure.").append(label).append(".auto").toString())); - myUpgradeAuto15Button = new JRadioButton(SvnBundle.message(new StringBuilder().append("radio.configure.").append(label).append(".auto.15format").toString())); - myUpgradeAuto16Button = new JRadioButton(SvnBundle.message(new StringBuilder().append("radio.configure.").append(label).append(".auto.16format").toString())); + myUpgradeNoneButton = new JRadioButton(SvnBundle.message("radio.configure." + label + ".none")); + myUpgradeAutoButton = new JRadioButton(SvnBundle.message("radio.configure." + label + ".auto")); + myUpgradeAuto15Button = new JRadioButton(SvnBundle.message("radio.configure." + label + ".auto.15format")); + myUpgradeAuto16Button = new JRadioButton(SvnBundle.message("radio.configure." + label + ".auto.16format")); ButtonGroup group = new ButtonGroup(); group.add(myUpgradeNoneButton); From 50ec1964f4aac6ff3b14724f4b0a081a33f64ce8 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 2 Feb 2012 13:48:13 +0400 Subject: [PATCH 06/40] NPE --- .../ExternalAnnotationsManagerImpl.java | 67 ++++++++++++------- 1 file changed, 44 insertions(+), 23 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java index bac7e47a1e48..b86759580bca 100644 --- a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java +++ b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java @@ -78,18 +78,19 @@ import java.awt.event.ActionEvent; import java.io.IOException; import java.util.*; import java.util.List; +import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicReference; public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { - public static final Icon ICON = IconLoader.getIcon("/modules/annotation.png"); + @NotNull public static final Icon ICON = IconLoader.getIcon("/modules/annotation.png"); private static final Logger LOG = Logger.getInstance("#" + ExternalAnnotationsManagerImpl.class.getName()); - private final Map> myExternalAnnotations = new ConcurrentWeakValueHashMap>(); - private final AtomicReference myHasAnyAnnotationsRoots = new AtomicReference(ThreeState.UNSURE); - private static final List NULL = new ArrayList(); + @NotNull private final ConcurrentMap> myExternalAnnotations = new ConcurrentWeakValueHashMap>(); + @NotNull private final AtomicReference myHasAnyAnnotationsRoots = new AtomicReference(ThreeState.UNSURE); + @NotNull private static final List NULL = new ArrayList(); private final PsiManager myPsiManager; - public ExternalAnnotationsManagerImpl(final Project project, final PsiManager psiManager) { + public ExternalAnnotationsManagerImpl(@NotNull final Project project, final PsiManager psiManager) { myPsiManager = psiManager; final MessageBusConnection connection = project.getMessageBus().connect(project); connection.subscribe(ProjectTopics.PROJECT_ROOTS, new ModuleRootListener() { @@ -132,7 +133,7 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { } @NotNull - private Map collectExternalAnnotations(final PsiModifierListOwner listOwner) { + private Map collectExternalAnnotations(@NotNull final PsiModifierListOwner listOwner) { if (hasAnyAnnotationsRoots() == ThreeState.NO) return Collections.emptyMap(); final Map result = new HashMap(); final List files = findExternalAnnotationsFile(listOwner); @@ -179,6 +180,7 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { return result; } + @Nullable private static String getExternalName(PsiModifierListOwner listOwner, boolean showParamName) { return PsiFormatUtil.getExternalName(listOwner, showParamName, Integer.MAX_VALUE); } @@ -222,9 +224,14 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { } } - private void setupRootAndAnnotateExternally(final OrderEntry entry, final Project project, final PsiModifierListOwner listOwner, - final String annotationFQName, - final PsiFile fromFile, final String packageName, final VirtualFile virtualFile, final PsiNameValuePair[] value) { + private void setupRootAndAnnotateExternally(@NotNull final OrderEntry entry, + @NotNull Project project, + @NotNull final PsiModifierListOwner listOwner, + @NotNull final String annotationFQName, + @NotNull final PsiFile fromFile, + @NotNull final String packageName, + @NotNull final VirtualFile virtualFile, + final PsiNameValuePair[] value) { final FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFolderDescriptor(); descriptor.setTitle(ProjectBundle.message("external.annotations.root.chooser.title", entry.getPresentableName())); descriptor.setDescription(ProjectBundle.message("external.annotations.root.chooser.description")); @@ -245,7 +252,10 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { if (annotationsXml != null) { final List createdFiles = new ArrayList(); createdFiles.add(annotationsXml); - myExternalAnnotations.put(getFQN(packageName, virtualFile), createdFiles); + String fqn = getFQN(packageName, virtualFile); + if (fqn != null) { + myExternalAnnotations.put(fqn, createdFiles); + } } annotateExternally(listOwner, annotationFQName, annotationsXml, fromFile, value); } @@ -253,20 +263,25 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { }.execute(); } - private void chooseRootAndAnnotateExternally(final PsiModifierListOwner listOwner, final String annotationFQName, @NotNull final PsiFile fromFile, - final Project project, final String packageName, final VirtualFile virtualFile, - final VirtualFile[] virtualFiles, final PsiNameValuePair[] value) { + private void chooseRootAndAnnotateExternally(@NotNull final PsiModifierListOwner listOwner, + @NotNull final String annotationFQName, + @NotNull final PsiFile fromFile, + @NotNull final Project project, + @NotNull final String packageName, + final VirtualFile virtualFile, + @NotNull VirtualFile[] virtualFiles, + final PsiNameValuePair[] value) { if (virtualFiles.length > 1) { JBPopupFactory.getInstance().createListPopup(new BaseListPopupStep("Annotation Roots", virtualFiles) { @Override - public PopupStep onChosen(final VirtualFile file, final boolean finalChoice) { + public PopupStep onChosen(@NotNull final VirtualFile file, final boolean finalChoice) { annotateExternally(file, listOwner, project, packageName, virtualFile, annotationFQName, fromFile, value); return FINAL_CHOICE; } @NotNull @Override - public String getTextFor(final VirtualFile value) { + public String getTextFor(@NotNull final VirtualFile value) { return value.getPresentableUrl(); } @@ -292,8 +307,8 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { return VfsUtil.toVirtualFileArray(result); } - private void annotateExternally(final VirtualFile file, final PsiModifierListOwner listOwner, final Project project, - final String packageName, + private void annotateExternally(@NotNull final VirtualFile file, @NotNull final PsiModifierListOwner listOwner, final Project project, + @NotNull final String packageName, final VirtualFile virtualFile, final String annotationFQName, @NotNull final PsiFile fromFile, @@ -371,6 +386,7 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { return false; } + @NotNull public AnnotationPlace chooseAnnotationsPlace(@NotNull final PsiElement element) { if (!element.isPhysical()) return AnnotationPlace.IN_CODE; //element just created if (!element.getManager().isInProject(element)) return AnnotationPlace.EXTERNAL; @@ -432,7 +448,7 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { return AnnotationPlace.IN_CODE; } - private void appendChosenAnnotationsRoot(final OrderEntry entry, final VirtualFile vFile) { + private void appendChosenAnnotationsRoot(@NotNull final OrderEntry entry, @NotNull final VirtualFile vFile) { if (entry instanceof LibraryOrderEntry) { Library library = ((LibraryOrderEntry)entry).getLibrary(); LOG.assertTrue(library != null); @@ -459,7 +475,8 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { private static void annotateExternally(final PsiModifierListOwner listOwner, final String annotationFQName, @Nullable final XmlFile xmlFile, - @NotNull PsiFile codeUsageFile, PsiNameValuePair[] values) { + @NotNull PsiFile codeUsageFile, + PsiNameValuePair[] values) { if (xmlFile == null) return; try { final XmlDocument document = xmlFile.getDocument(); @@ -498,13 +515,14 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { } @NonNls - private static String createAnnotationTag(String annotationFQName, PsiNameValuePair[] values) { + private static String createAnnotationTag(String annotationFQName, @Nullable PsiNameValuePair[] values) { @NonNls String text; if (values != null) { text = " \n"; text += StringUtil.join(values, new Function() { + @NotNull @Override - public String fun(PsiNameValuePair pair) { + public String fun(@NotNull PsiNameValuePair pair) { if (pair.getName() != null) { return ""; } @@ -520,7 +538,7 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { } @Nullable - private XmlFile createAnnotationsXml(VirtualFile root, @NonNls @NotNull String packageName) { + private XmlFile createAnnotationsXml(@NotNull VirtualFile root, @NonNls @NotNull String packageName) { final String[] dirs = packageName.split("[\\.]"); for (String dir : dirs) { if (dir.isEmpty()) break; @@ -564,6 +582,7 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { final String packageName = javaFile.getPackageName(); final VirtualFile virtualFile = containingFile.getVirtualFile(); String fqn = getFQN(packageName, virtualFile); + if (fqn == null) return null; final List files = myExternalAnnotations.get(fqn); if (files == NULL) return null; if (files != null) { @@ -611,7 +630,7 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { } @Nullable - private static String getNormalizedExternalName(PsiModifierListOwner owner) { + private static String getNormalizedExternalName(@NotNull PsiModifierListOwner owner) { String externalName = getExternalName(owner, true); if (externalName != null) { if (owner instanceof PsiParameter && owner.getParent() instanceof PsiParameterList) { @@ -657,10 +676,12 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { return ADD_IN_CODE; } + @NotNull protected String getCancelActionName() { return CommonBundle.getCancelButtonText(); } + @NotNull @SuppressWarnings({"NonStaticInitializer"}) protected Action[] createActions() { final Action okAction = getOKAction(); From b3f0920e5e1ad227f3d23b972c7c387ef4f1c860 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Thu, 2 Feb 2012 12:29:10 +0400 Subject: [PATCH 07/40] EA-32857 - NPE: XmlUtil.findPrefixByQualifiedName --- .../intellij/xml/impl/schema/XmlElementDescriptorImpl.java | 4 +++- xml/impl/src/com/intellij/xml/util/XmlUtil.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/xml/impl/src/com/intellij/xml/impl/schema/XmlElementDescriptorImpl.java b/xml/impl/src/com/intellij/xml/impl/schema/XmlElementDescriptorImpl.java index cda043cd5d9b..67792b784993 100644 --- a/xml/impl/src/com/intellij/xml/impl/schema/XmlElementDescriptorImpl.java +++ b/xml/impl/src/com/intellij/xml/impl/schema/XmlElementDescriptorImpl.java @@ -103,7 +103,9 @@ public class XmlElementDescriptorImpl implements XmlElementDescriptor, PsiWritab } public String getNamespace(){ - final String namespacePrefix = XmlUtil.findPrefixByQualifiedName(getName(null)); + String name = getName(); + if (name == null) return XmlUtil.EMPTY_URI; + final String namespacePrefix = XmlUtil.findPrefixByQualifiedName(name); final XmlNSDescriptorImpl xmlNSDescriptor = (XmlNSDescriptorImpl)getNSDescriptor(); if(xmlNSDescriptor == null || myDescriptorTag == null) return XmlUtil.EMPTY_URI; return "".equals(namespacePrefix) ? diff --git a/xml/impl/src/com/intellij/xml/util/XmlUtil.java b/xml/impl/src/com/intellij/xml/util/XmlUtil.java index 348137ad3027..97dea31b9573 100644 --- a/xml/impl/src/com/intellij/xml/util/XmlUtil.java +++ b/xml/impl/src/com/intellij/xml/util/XmlUtil.java @@ -1506,7 +1506,7 @@ public class XmlUtil { return contextTag.getNamespaceByPrefix(prefix); } - public static String findPrefixByQualifiedName(String name) { + public static String findPrefixByQualifiedName(@NotNull String name) { final int prefixEnd = name.indexOf(':'); if (prefixEnd > 0) { return name.substring(0, prefixEnd); From 0575af5b11bed9f9fd759682aa82af8effddcff0 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Thu, 2 Feb 2012 12:30:05 +0400 Subject: [PATCH 08/40] typo --- platform/lang-api/src/com/intellij/facet/FacetManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/lang-api/src/com/intellij/facet/FacetManager.java b/platform/lang-api/src/com/intellij/facet/FacetManager.java index 18963cb539ce..7d211a73d30b 100644 --- a/platform/lang-api/src/com/intellij/facet/FacetManager.java +++ b/platform/lang-api/src/com/intellij/facet/FacetManager.java @@ -32,7 +32,7 @@ public abstract class FacetManager implements FacetModel { } /** - * Creates the interface for modifiyng set of facets in the module. Call {@link ModifiableFacetModel#commit()} when modification is finished + * Creates the interface for modifying set of facets in the module. Call {@link ModifiableFacetModel#commit()} when modification is finished * @return the modifiable facet model */ @NotNull From 9f850ea25717d6fadbc2a6d504f5dd3253470ed0 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Thu, 2 Feb 2012 12:30:25 +0400 Subject: [PATCH 09/40] typo --- platform/lang-api/src/com/intellij/facet/FacetManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/lang-api/src/com/intellij/facet/FacetManager.java b/platform/lang-api/src/com/intellij/facet/FacetManager.java index 7d211a73d30b..01abe00e369c 100644 --- a/platform/lang-api/src/com/intellij/facet/FacetManager.java +++ b/platform/lang-api/src/com/intellij/facet/FacetManager.java @@ -40,7 +40,7 @@ public abstract class FacetManager implements FacetModel { @NotNull public abstract F createFacet(@NotNull FacetType type, @NotNull String name, - @NotNull C cofiguration, @Nullable Facet underlying); + @NotNull C configuration, @Nullable Facet underlying); @NotNull From 4adec35589626c68a234d1a14054235907247798 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Thu, 2 Feb 2012 12:34:32 +0400 Subject: [PATCH 10/40] EA-32657 - NPE: ChangeUtil.copyElement --- .../src/com/intellij/psi/impl/source/tree/ChangeUtil.java | 5 ++--- .../src/com/intellij/psi/impl/source/xml/XmlTagImpl.java | 4 +++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/tree/ChangeUtil.java b/platform/core-impl/src/com/intellij/psi/impl/source/tree/ChangeUtil.java index 44d85d47fd22..b72ce1e1f1a8 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/tree/ChangeUtil.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/tree/ChangeUtil.java @@ -39,11 +39,10 @@ import com.intellij.psi.impl.source.SourceTreeToPsiMap; import com.intellij.psi.impl.source.codeStyle.CodeEditUtil; import com.intellij.util.CharTable; import com.intellij.util.IncorrectOperationException; -import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.HashMap; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.List; import java.util.Map; public class ChangeUtil { @@ -119,7 +118,7 @@ public class ChangeUtil { return element; } - public static TreeElement copyElement(TreeElement original, CharTable table) { + public static TreeElement copyElement(@NotNull TreeElement original, CharTable table) { CompositeElement treeParent = original.getTreeParent(); return copyElement(original, treeParent == null ? null : treeParent.getPsi(), table); } diff --git a/xml/impl/src/com/intellij/psi/impl/source/xml/XmlTagImpl.java b/xml/impl/src/com/intellij/psi/impl/source/xml/XmlTagImpl.java index cdf1f1b58dc0..f1f183e3893d 100644 --- a/xml/impl/src/com/intellij/psi/impl/source/xml/XmlTagImpl.java +++ b/xml/impl/src/com/intellij/psi/impl/source/xml/XmlTagImpl.java @@ -500,7 +500,9 @@ public class XmlTagImpl extends XmlElementImpl implements XmlTag { final CharTable charTableByTree = SharedImplUtil.findCharTableByTree(tag); ASTNode child = XmlChildRole.START_TAG_NAME_FINDER.findChild(tag); LOG.assertTrue(child != null, "It seems '" + name + "' is not a valid tag name"); - tag.replaceChild(child, ChangeUtil.copyElement((TreeElement)XmlChildRole.START_TAG_NAME_FINDER.findChild(dummyTag), charTableByTree)); + TreeElement tagElement = (TreeElement)XmlChildRole.START_TAG_NAME_FINDER.findChild(dummyTag); + LOG.assertTrue(tagElement != null, "What's wrong with it? '" + name + "'"); + tag.replaceChild(child, ChangeUtil.copyElement(tagElement, charTableByTree)); final ASTNode childByRole = XmlChildRole.CLOSING_TAG_NAME_FINDER.findChild(tag); if (childByRole != null) { final TreeElement treeElement = (TreeElement)XmlChildRole.CLOSING_TAG_NAME_FINDER.findChild(dummyTag); From 447a26a49cd4b556599053f3d3d7d3b787958a29 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Thu, 2 Feb 2012 12:44:10 +0400 Subject: [PATCH 11/40] diagnostics for EA-33236 - SIOOBE: XmlUtil.getCharFromEntityRef --- xml/impl/src/com/intellij/xml/util/XmlUtil.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/xml/impl/src/com/intellij/xml/util/XmlUtil.java b/xml/impl/src/com/intellij/xml/util/XmlUtil.java index 97dea31b9573..65ba16a7c8ed 100644 --- a/xml/impl/src/com/intellij/xml/util/XmlUtil.java +++ b/xml/impl/src/com/intellij/xml/util/XmlUtil.java @@ -376,7 +376,12 @@ public class XmlUtil { public static char getCharFromEntityRef(@NonNls String text) { //LOG.assertTrue(text.startsWith("&#") && text.endsWith(";")); if (text.charAt(1) != '#') { - text = text.substring(1, text.length() - 1); + try { + text = text.substring(1, text.length() - 1); + } + catch (StringIndexOutOfBoundsException e) { + LOG.error("Cannot parse ref: '" + text + "'", e); + } return XmlTagUtil.getCharacterByEntityName(text); } text = text.substring(2, text.length() - 1); From 3ee444a4b4d2206b417e18a1398094713f453ab8 Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Wed, 1 Feb 2012 19:30:27 +0400 Subject: [PATCH 12/40] force adding separator at beginning --- .../openapi/actionSystem/impl/ActionToolbarImpl.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionToolbarImpl.java b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionToolbarImpl.java index bb1f727859fb..d3498b76d8fa 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionToolbarImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionToolbarImpl.java @@ -106,6 +106,7 @@ public class ActionToolbarImpl extends JPanel implements ActionToolbar { private JComponent myTargetComponent; private boolean myReservePlaceAutoPopupIcon = true; + private boolean myAddSeparatorFirst; private WeakTimerListener myWeakTimerListener; @SuppressWarnings({"FieldCanBeLocal"}) private ActionToolbarImpl.MyTimerListener myTimerListener; @@ -215,6 +216,9 @@ public class ActionToolbarImpl extends JPanel implements ActionToolbar { } private void fillToolBar(final List actions, boolean layoutSecondaries) { + if (myAddSeparatorFirst) { + add(new MySeparator()); + } for (int i = 0; i < actions.size(); i++) { final AnAction action = actions.get(i); if (action instanceof Separator && isNavBar()) { @@ -1196,4 +1200,9 @@ public class ActionToolbarImpl extends JPanel implements ActionToolbar { updateActions(false, false, true); } + + public void setAddSeparatorFirst(boolean addSeparatorFirst) { + myAddSeparatorFirst = addSeparatorFirst; + updateActions(false, false, true); + } } From 06d39abd4460073d3828ced9dff28c31832f49e0 Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Wed, 1 Feb 2012 19:45:49 +0400 Subject: [PATCH 13/40] threads dropdown combined with actions --- .../debugger/ui/DebuggerSessionTab.java | 38 ------------ .../com/intellij/debugger/ui/FramesPanel.java | 62 +++++++++++++++++-- .../xdebugger/impl/frame/XFramesView.java | 38 ++++++++++-- .../xdebugger/impl/ui/XDebugSessionTab.java | 8 --- 4 files changed, 90 insertions(+), 56 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java b/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java index 4294ffb81e7b..a85e50a2834e 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java @@ -45,7 +45,6 @@ import com.intellij.execution.ui.ExecutionConsoleEx; import com.intellij.execution.ui.RunContentDescriptor; import com.intellij.execution.ui.actions.CloseAction; import com.intellij.execution.ui.layout.PlaceInGrid; -import com.intellij.ide.CommonActionsManager; import com.intellij.ide.actions.ContextHelpAction; import com.intellij.idea.ActionsBundle; import com.intellij.openapi.Disposable; @@ -76,7 +75,6 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.DebuggerSessionTab"); private static final Icon WATCH_RETURN_VALUES_ICON = IconLoader.getIcon("/debugger/watchLastReturnValue.png"); - private static final Icon FILTER_STACK_FRAMES_ICON = IconLoader.getIcon("/debugger/class_filter.png"); private static final Icon AUTO_VARS_ICONS = IconLoader.getIcon("/debugger/autoVariablesMode.png"); private final VariablesPanel myVariablesPanel; @@ -166,14 +164,6 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos framesContent.setCloseable(false); framesContent.setAlertIcon(breakpointAlert); - final DefaultActionGroup framesGroup = new DefaultActionGroup(); - - CommonActionsManager actionsManager = CommonActionsManager.getInstance(); - framesGroup.add(actionsManager.createPrevOccurenceAction(myFramesPanel.getOccurenceNavigator())); - framesGroup.add(actionsManager.createNextOccurenceAction(myFramesPanel.getOccurenceNavigator())); - framesGroup.add(new ShowLibraryFramesAction()); - - framesContent.setActions(framesGroup, ActionPlaces.DEBUGGER_TOOLBAR, myFramesPanel.getFramesList()); myUi.addContent(framesContent, 0, PlaceInGrid.left, false); // variables @@ -571,34 +561,6 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos } } - private class ShowLibraryFramesAction extends ToggleAction { - private volatile boolean myShouldShow; - private static final String ourTextWhenShowIsOn = "Hide Frames from Libraries"; - private static final String ourTextWhenShowIsOff = "Show All Frames"; - - public ShowLibraryFramesAction() { - super("", "", FILTER_STACK_FRAMES_ICON); - myShouldShow = DebuggerSettings.getInstance().SHOW_LIBRARY_STACKFRAMES; - } - - public void update(final AnActionEvent e) { - super.update(e); - final Presentation presentation = e.getPresentation(); - final boolean shouldShow = !(Boolean)presentation.getClientProperty(SELECTED_PROPERTY); - presentation.setText(shouldShow ? ourTextWhenShowIsOn : ourTextWhenShowIsOff); - } - - public boolean isSelected(AnActionEvent e) { - return !myShouldShow; - } - - public void setSelected(AnActionEvent e, boolean enabled) { - myShouldShow = !enabled; - DebuggerSettings.getInstance().SHOW_LIBRARY_STACKFRAMES = myShouldShow; - myFramesPanel.setShowLibraryFrames(myShouldShow); - } - } - private class WatchLastMethodReturnValueAction extends ToggleAction { private volatile boolean myWatchesReturnValues; private final String myTextEnable; diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/FramesPanel.java b/java/debugger/impl/src/com/intellij/debugger/ui/FramesPanel.java index ba0dda3c046e..bcde86b2c743 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/FramesPanel.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/FramesPanel.java @@ -41,22 +41,25 @@ import com.intellij.debugger.ui.impl.watch.MethodsTracker; import com.intellij.debugger.ui.impl.watch.StackFrameDescriptorImpl; import com.intellij.debugger.ui.impl.watch.ThreadDescriptorImpl; import com.intellij.debugger.ui.tree.render.DescriptorLabelListener; +import com.intellij.ide.CommonActionsManager; import com.intellij.ide.OccurenceNavigator; import com.intellij.openapi.Disposable; -import com.intellij.openapi.actionSystem.ActionManager; -import com.intellij.openapi.actionSystem.ActionPopupMenu; -import com.intellij.openapi.actionSystem.DefaultActionGroup; +import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.actionSystem.impl.ActionToolbarImpl; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.ComboBoxWithWidePopup; import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.util.IconLoader; import com.intellij.ui.PopupHandler; import com.intellij.ui.ScrollPaneFactory; +import com.intellij.ui.components.panels.Wrapper; import com.intellij.util.Alarm; import com.sun.jdi.ObjectCollectedException; import com.sun.jdi.VMDisconnectedException; import javax.swing.*; +import javax.swing.border.EmptyBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import java.awt.*; @@ -71,6 +74,8 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; public class FramesPanel extends UpdatableDebuggerView { + private static final Icon FILTER_STACK_FRAMES_ICON = IconLoader.getIcon("/debugger/class_filter.png"); + private final JComboBox myThreadsCombo; private final FramesList myFramesList; private final ThreadsListener myThreadsListener; @@ -106,10 +111,31 @@ public class FramesPanel extends UpdatableDebuggerView { registerThreadsPopupMenu(myFramesList); setBorder(null); - add(myThreadsCombo, BorderLayout.NORTH); + + final ActionToolbar toolbar = createToolbar(); + Wrapper threads = new Wrapper(); + threads.add(toolbar.getComponent(), BorderLayout.EAST); + threads.add(myThreadsCombo, BorderLayout.CENTER); + add(threads, BorderLayout.NORTH); add(ScrollPaneFactory.createScrollPane(myFramesList), BorderLayout.CENTER); } + private ActionToolbar createToolbar() { + final DefaultActionGroup framesGroup = new DefaultActionGroup(); + framesGroup.addSeparator(); + + CommonActionsManager actionsManager = CommonActionsManager.getInstance(); + framesGroup.add(actionsManager.createPrevOccurenceAction(getOccurenceNavigator())); + framesGroup.add(actionsManager.createNextOccurenceAction(getOccurenceNavigator())); + framesGroup.add(new ShowLibraryFramesAction()); + + final ActionToolbar toolbar = ActionManager.getInstance().createActionToolbar(ActionPlaces.DEBUGGER_TOOLBAR, framesGroup, true); + toolbar.setReservePlaceAutoPopupIcon(false); + ((ActionToolbarImpl)toolbar).setAddSeparatorFirst(true); + toolbar.getComponent().setBorder(new EmptyBorder(1, 0, 0, 0)); + return toolbar; + } + public DebuggerStateManager getContextManager() { return myStateManager; } @@ -630,4 +656,32 @@ public class FramesPanel extends UpdatableDebuggerView { public FramesList getFramesList() { return myFramesList; } + + private class ShowLibraryFramesAction extends ToggleAction { + private volatile boolean myShouldShow; + private static final String ourTextWhenShowIsOn = "Hide Frames from Libraries"; + private static final String ourTextWhenShowIsOff = "Show All Frames"; + + public ShowLibraryFramesAction() { + super("", "", FILTER_STACK_FRAMES_ICON); + myShouldShow = DebuggerSettings.getInstance().SHOW_LIBRARY_STACKFRAMES; + } + + public void update(final AnActionEvent e) { + super.update(e); + final Presentation presentation = e.getPresentation(); + final boolean shouldShow = !(Boolean)presentation.getClientProperty(SELECTED_PROPERTY); + presentation.setText(shouldShow ? ourTextWhenShowIsOn : ourTextWhenShowIsOff); + } + + public boolean isSelected(AnActionEvent e) { + return !myShouldShow; + } + + public void setSelected(AnActionEvent e, boolean enabled) { + myShouldShow = !enabled; + DebuggerSettings.getInstance().SHOW_LIBRARY_STACKFRAMES = myShouldShow; + setShowLibraryFrames(myShouldShow); + } + } } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XFramesView.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XFramesView.java index b3f3a5b3786f..d9f83fc1b4f5 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XFramesView.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XFramesView.java @@ -16,9 +16,16 @@ package com.intellij.xdebugger.impl.frame; import com.google.common.collect.Sets; +import com.intellij.ide.CommonActionsManager; import com.intellij.openapi.Disposable; +import com.intellij.openapi.actionSystem.ActionManager; +import com.intellij.openapi.actionSystem.ActionPlaces; +import com.intellij.openapi.actionSystem.ActionToolbar; +import com.intellij.openapi.actionSystem.DefaultActionGroup; +import com.intellij.openapi.actionSystem.impl.ActionToolbarImpl; import com.intellij.openapi.application.ApplicationManager; import com.intellij.ui.ScrollPaneFactory; +import com.intellij.ui.components.panels.Wrapper; import com.intellij.util.containers.HashMap; import com.intellij.xdebugger.XDebugSession; import com.intellij.xdebugger.frame.XExecutionStack; @@ -27,6 +34,7 @@ import com.intellij.xdebugger.frame.XSuspendContext; import org.jetbrains.annotations.NotNull; import javax.swing.*; +import javax.swing.border.EmptyBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import java.awt.*; @@ -54,11 +62,6 @@ public class XFramesView extends XDebugViewBase { myMainPanel = new JPanel(new BorderLayout()); - myThreadComboBox = new JComboBox(); - myThreadComboBox.setRenderer(new ThreadComboBoxRenderer(myThreadComboBox)); - myThreadComboBox.addItemListener(new MyItemListener()); - myMainPanel.add(myThreadComboBox, BorderLayout.NORTH); - myFramesList = new XDebuggerFramesList(session.getProject()); myFramesList.addListSelectionListener(new ListSelectionListener() { public void valueChanged(final ListSelectionEvent e) { @@ -76,9 +79,33 @@ public class XFramesView extends XDebugViewBase { } }); myMainPanel.add(ScrollPaneFactory.createScrollPane(myFramesList), BorderLayout.CENTER); + + myThreadComboBox = new JComboBox(); + myThreadComboBox.setRenderer(new ThreadComboBoxRenderer(myThreadComboBox)); + myThreadComboBox.addItemListener(new MyItemListener()); + final ActionToolbar toolbar = createToolbar(); + Wrapper threadsPanel = new Wrapper(); + threadsPanel.add(toolbar.getComponent(), BorderLayout.EAST); + threadsPanel.add(myThreadComboBox, BorderLayout.CENTER); + myMainPanel.add(threadsPanel, BorderLayout.NORTH); + rebuildView(SessionEvent.RESUMED); } + private ActionToolbar createToolbar() { + final DefaultActionGroup framesGroup = new DefaultActionGroup(); + + CommonActionsManager actionsManager = CommonActionsManager.getInstance(); + framesGroup.add(actionsManager.createPrevOccurenceAction(getFramesList())); + framesGroup.add(actionsManager.createNextOccurenceAction(getFramesList())); + + final ActionToolbar toolbar = ActionManager.getInstance().createActionToolbar(ActionPlaces.DEBUGGER_TOOLBAR, framesGroup, true); + toolbar.setReservePlaceAutoPopupIcon(false); + ((ActionToolbarImpl)toolbar).setAddSeparatorFirst(true); + toolbar.getComponent().setBorder(new EmptyBorder(1, 0, 0, 0)); + return toolbar; + } + private StackFramesListBuilder getOrCreateBuilder(XExecutionStack executionStack) { StackFramesListBuilder builder = myBuilders.get(executionStack); if (builder == null) { @@ -121,7 +148,6 @@ public class XFramesView extends XDebugViewBase { } XExecutionStack activeExecutionStack = suspendContext.getActiveExecutionStack(); myThreadComboBox.setSelectedItem(activeExecutionStack); - myThreadComboBox.setVisible(executionStacks.length != 1); updateFrames(activeExecutionStack); myListenersEnabled = true; } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java index 6a0c734fb28b..9e901e50efce 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java @@ -29,7 +29,6 @@ import com.intellij.execution.ui.ExecutionConsole; import com.intellij.execution.ui.RunContentDescriptor; import com.intellij.execution.ui.actions.CloseAction; import com.intellij.execution.ui.layout.PlaceInGrid; -import com.intellij.ide.CommonActionsManager; import com.intellij.ide.actions.ContextHelpAction; import com.intellij.openapi.actionSystem.ActionGroup; import com.intellij.openapi.actionSystem.ActionManager; @@ -110,13 +109,6 @@ public class XDebugSessionTab extends DebuggerSessionTabBase { XDebuggerBundle.message("debugger.session.tab.frames.title"), XDebuggerUIConstants.FRAMES_TAB_ICON, null); framesContent.setCloseable(false); - final DefaultActionGroup framesGroup = new DefaultActionGroup(); - - CommonActionsManager actionsManager = CommonActionsManager.getInstance(); - framesGroup.add(actionsManager.createPrevOccurenceAction(framesView.getFramesList())); - framesGroup.add(actionsManager.createNextOccurenceAction(framesView.getFramesList())); - - framesContent.setActions(framesGroup, ActionPlaces.DEBUGGER_TOOLBAR, framesView.getFramesList()); return framesContent; } From 8a7f3cb7f0aff9ef79f944ac284793095135c63e Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Thu, 2 Feb 2012 11:26:35 +0400 Subject: [PATCH 14/40] watches toolbar using ToolbarDecorator --- .../debugger/ui/DebuggerSessionTab.java | 5 --- .../debugger/ui/impl/MainWatchPanel.java | 40 +++++++++++++++++-- .../intellij/debugger/ui/impl/WatchPanel.java | 7 +++- .../xdebugger/impl/frame/XWatchesView.java | 37 +++++++++++++++-- .../xdebugger/impl/ui/XDebugSessionTab.java | 2 - 5 files changed, 76 insertions(+), 15 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java b/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java index a85e50a2834e..29ca342908a5 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java @@ -151,11 +151,6 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos XDebuggerUIConstants.WATCHES_TAB_ICON, null); watches.setCloseable(false); watches.setAlertIcon(breakpointAlert); - final DefaultActionGroup watchesGroup = new DefaultActionGroup(); - addAction(watchesGroup, DebuggerActions.NEW_WATCH); - addAction(watchesGroup, XDebuggerActions.ADD_TO_WATCH); - addAction(watchesGroup, DebuggerActions.REMOVE_WATCH); - watches.setActions(watchesGroup, ActionPlaces.DEBUGGER_TOOLBAR, myWatchPanel.getTree()); myUi.addContent(watches, 0, PlaceInGrid.right, false); // frames diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/MainWatchPanel.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/MainWatchPanel.java index 08a719fdd627..314e360d2442 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/MainWatchPanel.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/MainWatchPanel.java @@ -20,20 +20,20 @@ */ package com.intellij.debugger.ui.impl; +import com.intellij.debugger.DebuggerBundle; import com.intellij.debugger.actions.AddToWatchActionHandler; import com.intellij.debugger.actions.DebuggerActions; import com.intellij.debugger.engine.evaluation.CodeFragmentKind; +import com.intellij.debugger.engine.evaluation.DefaultCodeFragmentFactory; import com.intellij.debugger.engine.evaluation.TextWithImports; import com.intellij.debugger.engine.evaluation.TextWithImportsImpl; -import com.intellij.debugger.engine.evaluation.DefaultCodeFragmentFactory; import com.intellij.debugger.impl.DebuggerContextImpl; import com.intellij.debugger.impl.DebuggerStateManager; import com.intellij.debugger.impl.PositionUtil; import com.intellij.debugger.ui.DebuggerExpressionComboBox; -import com.intellij.debugger.ui.impl.watch.DebuggerTreeNodeImpl; import com.intellij.debugger.ui.impl.watch.DebuggerTreeInplaceEditor; +import com.intellij.debugger.ui.impl.watch.DebuggerTreeNodeImpl; import com.intellij.debugger.ui.impl.watch.WatchItemDescriptor; -import com.intellij.debugger.DebuggerBundle; import com.intellij.ide.DataManager; import com.intellij.ide.dnd.DnDEvent; import com.intellij.ide.dnd.DnDManager; @@ -43,7 +43,10 @@ import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; +import com.intellij.ui.AnActionButton; +import com.intellij.ui.AnActionButtonRunnable; import com.intellij.ui.ListenerUtil; +import com.intellij.ui.ToolbarDecorator; import javax.swing.*; import java.awt.*; @@ -205,4 +208,35 @@ public class MainWatchPanel extends WatchPanel implements DataProvider { }; editor.show(); } + + @Override + protected JComponent createTreePanel(final WatchDebuggerTree tree) { + final ToolbarDecorator decorator = ToolbarDecorator.createDecorator(tree); + decorator.setAddAction(new AnActionButtonRunnable() { + @Override + public void run(AnActionButton button) { + executeAction(DebuggerActions.NEW_WATCH, tree); + } + }); + // TODO[den]: add "Add to watches action" + decorator.setRemoveAction(new AnActionButtonRunnable() { + @Override + public void run(AnActionButton button) { + executeAction(DebuggerActions.REMOVE_WATCH, tree); + } + }); + final JPanel panel = decorator.createPanel(); + panel.setBorder(null); + return panel; + } + + private static void executeAction(final String watch, final WatchDebuggerTree tree) { + AnAction action = ActionManager.getInstance().getAction(watch); + Presentation presentation = action.getTemplatePresentation().clone(); + DataContext context = DataManager.getInstance().getDataContext(tree); + + AnActionEvent actionEvent = + new AnActionEvent(null, context, ActionPlaces.DEBUGGER_TOOLBAR, presentation, ActionManager.getInstance(), 0); + action.actionPerformed(actionEvent); + } } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/WatchPanel.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/WatchPanel.java index 3823e5d312fb..8d9cefcb25f7 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/WatchPanel.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/WatchPanel.java @@ -35,6 +35,7 @@ import com.intellij.openapi.project.Project; import com.intellij.ui.ScrollPaneFactory; import org.jetbrains.annotations.NonNls; +import javax.swing.*; import java.awt.*; import java.util.Enumeration; @@ -43,11 +44,15 @@ public abstract class WatchPanel extends DebuggerTreePanel { public WatchPanel(Project project, DebuggerStateManager stateManager) { super(project, stateManager); - add(ScrollPaneFactory.createScrollPane(getWatchTree()), BorderLayout.CENTER); + add(createTreePanel(getWatchTree()), BorderLayout.CENTER); registerDisposable(DebuggerAction.installEditAction(getWatchTree(), DebuggerActions.EDIT_NODE_SOURCE)); overrideShortcut(getWatchTree(), DebuggerActions.COPY_VALUE, CommonShortcuts.getCopy()); } + protected JComponent createTreePanel(final WatchDebuggerTree tree) { + return ScrollPaneFactory.createScrollPane(tree); + } + protected DebuggerTree createTreeView() { return new WatchDebuggerTree(getProject()); } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XWatchesView.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XWatchesView.java index 0451f92dc09b..ea2d9f01d5bc 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XWatchesView.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XWatchesView.java @@ -15,13 +15,15 @@ */ package com.intellij.xdebugger.impl.frame; +import com.intellij.ide.DataManager; import com.intellij.ide.dnd.DnDEvent; import com.intellij.ide.dnd.DnDManager; import com.intellij.ide.dnd.DnDNativeTarget; import com.intellij.openapi.Disposable; -import com.intellij.openapi.actionSystem.ActionManager; -import com.intellij.openapi.actionSystem.CommonShortcuts; -import com.intellij.openapi.actionSystem.CustomShortcutSet; +import com.intellij.openapi.actionSystem.*; +import com.intellij.ui.AnActionButton; +import com.intellij.ui.AnActionButtonRunnable; +import com.intellij.ui.ToolbarDecorator; import com.intellij.util.ArrayUtil; import com.intellij.util.ui.tree.TreeUtil; import com.intellij.xdebugger.XDebugSession; @@ -56,6 +58,7 @@ public class XWatchesView extends XDebugViewBase implements DnDNativeTarget { private XDebuggerTreeRestorer myTreeRestorer; private final WatchesRootNode myRootNode; private final XDebugSessionData mySessionData; + private final JPanel myDecoratedPanel; public XWatchesView(final XDebugSession session, final Disposable parentDisposable, final XDebugSessionData sessionData) { super(session, parentDisposable); @@ -76,10 +79,36 @@ public class XWatchesView extends XDebugViewBase implements DnDNativeTarget { myRootNode = new WatchesRootNode(tree, sessionData.getWatchExpressions()); tree.setRoot(myRootNode, false); + final ToolbarDecorator decorator = ToolbarDecorator.createDecorator(myTreePanel.getTree()).disableUpDownActions(); + decorator.setAddAction(new AnActionButtonRunnable() { + @Override + public void run(AnActionButton button) { + executeAction(XDebuggerActions.XNEW_WATCH); + } + }); + decorator.setRemoveAction(new AnActionButtonRunnable() { + @Override + public void run(AnActionButton button) { + executeAction(XDebuggerActions.XREMOVE_WATCH); + } + }); + myDecoratedPanel = decorator.createPanel(); + myDecoratedPanel.setBorder(null); + myTreePanel.getTree().getEmptyText().setText(XDebuggerBundle.message("debugger.no.watches")); } + private void executeAction(final String watch) { + AnAction action = ActionManager.getInstance().getAction(watch); + Presentation presentation = action.getTemplatePresentation().clone(); + DataContext context = DataManager.getInstance().getDataContext(myTreePanel.getTree()); + + AnActionEvent actionEvent = + new AnActionEvent(null, context, ActionPlaces.DEBUGGER_TOOLBAR, presentation, ActionManager.getInstance(), 0); + action.actionPerformed(actionEvent); + } + public void addWatchExpression(@NotNull String expression, int index, final boolean navigateToWatchNode) { XDebuggerEvaluator evaluator = null; XStackFrame stackFrame = mySession.getCurrentStackFrame(); @@ -128,7 +157,7 @@ public class XWatchesView extends XDebugViewBase implements DnDNativeTarget { } public JPanel getMainPanel() { - return myTreePanel.getMainPanel(); + return myDecoratedPanel; } public void removeWatches(final List nodes) { diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java index 9e901e50efce..28fcef27bc2f 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java @@ -97,8 +97,6 @@ public class XDebugSessionTab extends DebuggerSessionTabBase { XDebuggerBundle.message("debugger.session.tab.watches.title"), XDebuggerUIConstants.WATCHES_TAB_ICON, null); watchesContent.setCloseable(false); - ActionGroup group = getActionGroup(XDebuggerActions.WATCHES_TREE_TOOLBAR_GROUP); - watchesContent.setActions(group, ActionPlaces.DEBUGGER_TOOLBAR, myWatchesView.getTree()); return watchesContent; } From 1a47dc662cc6f78cf488cc5b90d5eec721a4c7dc Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Thu, 2 Feb 2012 12:51:13 +0400 Subject: [PATCH 15/40] variables settings actions reorganized --- .../debugger/ui/DebuggerSessionTab.java | 24 ++++----- .../ui/layout/LayoutViewOptions.java | 2 + .../ui/layout/impl/RunnerContentUi.java | 5 ++ .../ui/layout/impl/RunnerLayoutUiImpl.java | 10 ++++ .../src/idea/LangActions.xml | 15 +++--- .../xdebugger/impl/ui/XDebugSessionTab.java | 49 +++++++++++++++++-- 6 files changed, 84 insertions(+), 21 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java b/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java index 29ca342908a5..b259f4fe85a9 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java @@ -137,6 +137,8 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos stepping.add(actionManager.getAction(DebuggerActions.POP_FRAME)); stepping.addSeparator(); stepping.add(actionManager.getAction(DebuggerActions.RUN_TO_CURSOR)); + stepping.addSeparator(); + stepping.add(actionManager.getAction(DebuggerActions.EVALUATE_EXPRESSION)); myUi.getOptions().setTopToolbar(stepping, ActionPlaces.DEBUGGER_TOOLBAR); @@ -168,11 +170,6 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos XDebuggerUIConstants.VARIABLES_TAB_ICON, null); vars.setCloseable(false); vars.setAlertIcon(breakpointAlert); - final DefaultActionGroup varsGroup = new DefaultActionGroup(); - addAction(varsGroup, DebuggerActions.EVALUATE_EXPRESSION); - varsGroup.add(new WatchLastMethodReturnValueAction()); - varsGroup.add(new AutoVarsSwitchAction()); - vars.setActions(varsGroup, ActionPlaces.DEBUGGER_TOOLBAR, myVariablesPanel.getTree()); myUi.addContent(vars, 0, PlaceInGrid.center, false); // threads @@ -301,14 +298,16 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos addAction(group, DebuggerActions.DUMP_THREADS); group.addSeparator(); - final AnAction[] layout = myUi.getOptions().getLayoutActionsList(); - final AnAction layoutGroup = myUi.getOptions().getLayoutActions(); + group.add(myUi.getOptions().getLayoutActions()); + + final AnAction[] commonSettings = myUi.getOptions().getSettingsActionsList(); + final AnAction commonSettingsList = myUi.getOptions().getSettingsActions(); final DefaultActionGroup settings = new DefaultActionGroup("DebuggerSettings", true) { @Override public void update(AnActionEvent e) { e.getPresentation().setText(ActionsBundle.message("group.XDebugger.settings.text")); - e.getPresentation().setIcon(layoutGroup.getTemplatePresentation().getIcon()); + e.getPresentation().setIcon(commonSettingsList.getTemplatePresentation().getIcon()); } @Override @@ -316,12 +315,15 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos return true; } }; - for (AnAction each : layout) { + for (AnAction each : commonSettings) { settings.add(each); } - if (layout.length > 0) { + if (commonSettings.length > 0) { settings.addSeparator(); } + settings.add(new WatchLastMethodReturnValueAction()); + settings.add(new AutoVarsSwitchAction()); + settings.addSeparator(); addActionToGroup(settings, XDebuggerActions.AUTO_TOOLTIP); group.add(settings); @@ -563,7 +565,7 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos private final String myMyTextDisable; public WatchLastMethodReturnValueAction() { - super("", DebuggerBundle.message("action.watch.method.return.value.description"), WATCH_RETURN_VALUES_ICON); + super("", DebuggerBundle.message("action.watch.method.return.value.description"), null); myWatchesReturnValues = DebuggerSettings.getInstance().WATCH_RETURN_VALUES; myTextEnable = DebuggerBundle.message("action.watches.method.return.value.enable"); myMyTextDisable = DebuggerBundle.message("action.watches.method.return.value.disable"); diff --git a/platform/lang-api/src/com/intellij/execution/ui/layout/LayoutViewOptions.java b/platform/lang-api/src/com/intellij/execution/ui/layout/LayoutViewOptions.java index 900d4b929a93..d0faa6782ec0 100644 --- a/platform/lang-api/src/com/intellij/execution/ui/layout/LayoutViewOptions.java +++ b/platform/lang-api/src/com/intellij/execution/ui/layout/LayoutViewOptions.java @@ -50,4 +50,6 @@ public interface LayoutViewOptions { LayoutViewOptions setAdditionalFocusActions(ActionGroup group); + AnAction getSettingsActions(); + AnAction[] getSettingsActionsList(); } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java index e31d8a32d3cd..f256405b29e1 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java @@ -69,6 +69,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac QuickActionProvider, DockContainer.Dialog { @NonNls public static final String LAYOUT = "Runner.Layout"; + @NonNls public static final String SETTINGS = "XDebugger.Settings"; @NonNls public static final String VIEW_POPUP = "Runner.View.Popup"; @NonNls public static final String VIEW_TOOLBAR = "Runner.View.Toolbar"; @@ -690,6 +691,10 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac } } + public ActionGroup getSettingsActions() { + return (ActionGroup)myActionManager.getAction(SETTINGS); + } + private static void moveFollowingTabs(int index, final JBRunnerTabs tabs) { for (TabInfo info : tabs.getTabs()) { final TabImpl tab = getTabFor(info); diff --git a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerLayoutUiImpl.java b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerLayoutUiImpl.java index 3560b1c25a17..584d919fb087 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerLayoutUiImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerLayoutUiImpl.java @@ -293,6 +293,16 @@ public class RunnerLayoutUiImpl implements Disposable, RunnerLayoutUi, LayoutSta return this; } + @Override + public AnAction getSettingsActions() { + return myContentUI.getSettingsActions(); + } + + public AnAction[] getSettingsActionsList() { + final ActionGroup group = (ActionGroup)getSettingsActions(); + return group.getChildren(null); + } + public Content[] getContents() { Content[] contents = new Content[getContentManager().getContentCount()]; for (int i = 0; i < contents.length; i++) { diff --git a/platform/platform-resources/src/idea/LangActions.xml b/platform/platform-resources/src/idea/LangActions.xml index 55c7d4b531c0..b3689548f07b 100644 --- a/platform/platform-resources/src/idea/LangActions.xml +++ b/platform/platform-resources/src/idea/LangActions.xml @@ -671,7 +671,7 @@ - + @@ -726,12 +726,15 @@ - - - - - + + + + + + + diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java index 28fcef27bc2f..f3dadf64bf25 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java @@ -30,10 +30,8 @@ import com.intellij.execution.ui.RunContentDescriptor; import com.intellij.execution.ui.actions.CloseAction; import com.intellij.execution.ui.layout.PlaceInGrid; import com.intellij.ide.actions.ContextHelpAction; -import com.intellij.openapi.actionSystem.ActionGroup; -import com.intellij.openapi.actionSystem.ActionManager; -import com.intellij.openapi.actionSystem.ActionPlaces; -import com.intellij.openapi.actionSystem.DefaultActionGroup; +import com.intellij.idea.ActionsBundle; +import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; import com.intellij.ui.content.Content; @@ -46,6 +44,7 @@ import com.intellij.xdebugger.impl.frame.XDebugViewBase; import com.intellij.xdebugger.impl.frame.XFramesView; import com.intellij.xdebugger.impl.frame.XVariablesView; import com.intellij.xdebugger.impl.frame.XWatchesView; +import com.intellij.xdebugger.impl.ui.tree.actions.SortValuesToggleAction; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -162,6 +161,31 @@ public class XDebugSessionTab extends DebuggerSessionTabBase { leftToolbar.addSeparator(); leftToolbar.add(myUi.getOptions().getLayoutActions()); + final AnAction[] commonSettings = myUi.getOptions().getSettingsActionsList(); + final AnAction commonSettingsList = myUi.getOptions().getSettingsActions(); + + final DefaultActionGroup settings = new DefaultActionGroup("DebuggerSettings", commonSettings.length > 0) { + @Override + public void update(AnActionEvent e) { + e.getPresentation().setText(ActionsBundle.message("group.XDebugger.settings.text")); + e.getPresentation().setIcon(commonSettingsList.getTemplatePresentation().getIcon()); + } + + @Override + public boolean isDumbAware() { + return true; + } + }; + for (AnAction each : commonSettings) { + settings.add(each); + } + if (commonSettings.length > 0) { + settings.addSeparator(); + } + settings.add(new ToggleSortValuesAction(commonSettings.length == 0)); + + leftToolbar.add(settings); + leftToolbar.addSeparator(); @@ -192,4 +216,21 @@ public class XDebugSessionTab extends DebuggerSessionTabBase { public RunContentDescriptor getRunContentDescriptor() { return myRunContentDescriptor; } + + private static class ToggleSortValuesAction extends SortValuesToggleAction { + private final boolean myShowIcon; + + private ToggleSortValuesAction(boolean showIcon) { + copyFrom(ActionManager.getInstance().getAction(XDebuggerActions.TOGGLE_SORT_VALUES)); + myShowIcon = showIcon; + } + + @Override + public void update(AnActionEvent e) { + super.update(e); + if (!myShowIcon) { + e.getPresentation().setIcon(null); + } + } + } } From 2a6d8bb49affb1497932f0b5f99898850d36dc0e Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Thu, 2 Feb 2012 14:15:02 +0400 Subject: [PATCH 16/40] RUBY-10022 FreeBSD support --- .../src/com/intellij/execution/process/UnixProcessManager.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/platform/util/src/com/intellij/execution/process/UnixProcessManager.java b/platform/util/src/com/intellij/execution/process/UnixProcessManager.java index 4a85fe333337..965953f761b2 100644 --- a/platform/util/src/com/intellij/execution/process/UnixProcessManager.java +++ b/platform/util/src/com/intellij/execution/process/UnixProcessManager.java @@ -178,6 +178,9 @@ public class UnixProcessManager { else if (SystemInfo.isMac) { return new String[]{"ps", "-ax", "-E", "-o", commandLineOnly ? "command" : "ppid,pid,command"}; } + else if (SystemInfo.isFreeBSD) { + return new String[]{"ps", "-ax", "-e", "-o", commandLineOnly ? "command" : "ppid,pid,command"}; + } else { throw new IllegalStateException(System.getProperty("os.name") + " is not supported."); } From 196fc914e87fd170eb1980b206f7f1f364fe6766 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 2 Feb 2012 11:46:37 +0100 Subject: [PATCH 17/40] build number 114 --- build.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.txt b/build.txt index bc0a1e4cdb1f..eb14fd6d4b05 100644 --- a/build.txt +++ b/build.txt @@ -1 +1 @@ -112.SNAPSHOT +114.SNAPSHOT From 0f66a80dd3f354d5d7a5c5f0e3930f359d61389b Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Thu, 2 Feb 2012 14:49:52 +0400 Subject: [PATCH 18/40] Git: don't seek repository for a library file in all cases - only for branches action and widget. --- .../git4idea/repo/GitRepositoryManager.java | 48 +---------------- .../git4idea/ui/branch/GitBranchUiUtil.java | 51 ++++++++++++++++++- .../git4idea/ui/branch/GitBranchesAction.java | 2 +- 3 files changed, 51 insertions(+), 50 deletions(-) diff --git a/plugins/git4idea/src/git4idea/repo/GitRepositoryManager.java b/plugins/git4idea/src/git4idea/repo/GitRepositoryManager.java index eb6276183333..e6a3148a49c5 100644 --- a/plugins/git4idea/src/git4idea/repo/GitRepositoryManager.java +++ b/plugins/git4idea/src/git4idea/repo/GitRepositoryManager.java @@ -19,11 +19,9 @@ import com.intellij.openapi.Disposable; import com.intellij.openapi.components.AbstractProjectComponent; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.*; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.vcs.ProjectLevelVcsManager; import com.intellij.openapi.vcs.VcsListener; -import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.ArrayUtil; import git4idea.GitVcs; @@ -48,7 +46,6 @@ public final class GitRepositoryManager extends AbstractProjectComponent impleme private final Set myListeners = new HashSet(); private final ReentrantReadWriteLock REPO_LOCK = new ReentrantReadWriteLock(); - private final ProjectFileIndex myFileIndex; public static GitRepositoryManager getInstance(@NotNull Project project) { return ServiceManager.getService(project, GitRepositoryManager.class); @@ -59,7 +56,6 @@ public final class GitRepositoryManager extends AbstractProjectComponent impleme myVcsManager = ProjectLevelVcsManager.getInstance(myProject); myVcs = GitVcs.getInstance(myProject); assert myVcs != null; - myFileIndex = ProjectRootManager.getInstance(myProject).getFileIndex(); } @Override @@ -103,53 +99,11 @@ public final class GitRepositoryManager extends AbstractProjectComponent impleme */ @Nullable public GitRepository getRepositoryForFile(@NotNull VirtualFile file) { - final VirtualFile vcsRoot = getVcsRootFor(file); + final VirtualFile vcsRoot = myVcsManager.getVcsRootFor(file); if (vcsRoot == null) { return null; } return getRepositoryForRoot(vcsRoot); } - @Nullable - private VirtualFile getVcsRootFor(@NotNull VirtualFile file) { - if (myFileIndex.isInLibrarySource(file) || myFileIndex.isInLibraryClasses(file)) { - return getVcsRootForLibraryFile(file); - } - return myVcsManager.getVcsRootFor(file); - } - - @Nullable - private VirtualFile getVcsRootForLibraryFile(@NotNull VirtualFile file) { - // for a file inside .jar/.zip consider the .jar/.zip file itself - VirtualFile root = myVcsManager.getVcsRootFor(VfsUtilCore.getVirtualFileForJar(file)); - if (root != null) { - return root; - } - - // for other libs which don't have jars inside the project dir (such as JDK) take the owner module of the lib - List entries = myFileIndex.getOrderEntriesForFile(file); - Set libraryRoots = new HashSet(); - for (OrderEntry entry : entries) { - if (entry instanceof LibraryOrderEntry || entry instanceof JdkOrderEntry) { - libraryRoots.add(myVcsManager.getVcsRootFor(entry.getOwnerModule().getModuleFile())); - } - } - - if (libraryRoots.size() == 0) { - return null; - } - - // if the lib is used in several modules, take the top module - // (for modules of the same level we can't guess anything => take the first one) - Iterator libIterator = libraryRoots.iterator(); - VirtualFile topLibraryRoot = libIterator.next(); - while (libIterator.hasNext()) { - VirtualFile libRoot = libIterator.next(); - if (VfsUtilCore.isAncestor(libRoot, topLibraryRoot, true)) { - topLibraryRoot = libRoot; - } - } - return topLibraryRoot; - } - /** * @return all repositories tracked by the manager. */ diff --git a/plugins/git4idea/src/git4idea/ui/branch/GitBranchUiUtil.java b/plugins/git4idea/src/git4idea/ui/branch/GitBranchUiUtil.java index 93d89b800a1c..2c99add965a4 100644 --- a/plugins/git4idea/src/git4idea/ui/branch/GitBranchUiUtil.java +++ b/plugins/git4idea/src/git4idea/ui/branch/GitBranchUiUtil.java @@ -22,6 +22,7 @@ import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.fileEditor.TextEditor; import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.*; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.vcs.AbstractVcs; import com.intellij.openapi.vcs.ProjectLevelVcsManager; @@ -41,7 +42,7 @@ import org.intellij.images.editor.ImageFileEditor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Collection; +import java.util.*; /** * UI Utilities specific for Git branch features. @@ -165,11 +166,57 @@ public class GitBranchUiUtil { GitRepositoryManager manager = GitRepositoryManager.getInstance(project); VirtualFile file = getSelectedFile(project); if (file != null) { - return manager.getRepositoryForFile(file); + return manager.getRepositoryForRoot(getVcsRootFor(project, file)); } return manager.getRepositoryForRoot(guessGitRoot(project)); } + @Nullable + public static VirtualFile getVcsRootFor(@NotNull Project project, @NotNull VirtualFile file) { + ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex(); + if (fileIndex.isInLibrarySource(file) || fileIndex.isInLibraryClasses(file)) { + return getVcsRootForLibraryFile(project, file); + } + return ProjectLevelVcsManager.getInstance(project).getVcsRootFor(file); + } + + @Nullable + private static VirtualFile getVcsRootForLibraryFile(@NotNull Project project, @NotNull VirtualFile file) { + ProjectLevelVcsManager vcsManager = ProjectLevelVcsManager.getInstance(project); + // for a file inside .jar/.zip consider the .jar/.zip file itself + VirtualFile root = vcsManager.getVcsRootFor(VfsUtilCore.getVirtualFileForJar(file)); + if (root != null) { + return root; + } + + // for other libs which don't have jars inside the project dir (such as JDK) take the owner module of the lib + List entries = ProjectRootManager.getInstance(project).getFileIndex().getOrderEntriesForFile(file); + Set libraryRoots = new HashSet(); + for (OrderEntry entry : entries) { + if (entry instanceof LibraryOrderEntry || entry instanceof JdkOrderEntry) { + libraryRoots.add(vcsManager.getVcsRootFor(entry.getOwnerModule().getModuleFile())); + } + } + + if (libraryRoots.size() == 0) { + return null; + } + + // if the lib is used in several modules, take the top module + // (for modules of the same level we can't guess anything => take the first one) + Iterator libIterator = libraryRoots.iterator(); + VirtualFile topLibraryRoot = libIterator.next(); + while (libIterator.hasNext()) { + VirtualFile libRoot = libIterator.next(); + if (VfsUtilCore.isAncestor(libRoot, topLibraryRoot, true)) { + topLibraryRoot = libRoot; + } + } + return topLibraryRoot; + } + + + @Nullable private static VirtualFile guessGitRoot(@NotNull Project project) { ProjectLevelVcsManager vcsManager = ProjectLevelVcsManager.getInstance(project); diff --git a/plugins/git4idea/src/git4idea/ui/branch/GitBranchesAction.java b/plugins/git4idea/src/git4idea/ui/branch/GitBranchesAction.java index ab5125abf8b9..3cc34f861b8c 100644 --- a/plugins/git4idea/src/git4idea/ui/branch/GitBranchesAction.java +++ b/plugins/git4idea/src/git4idea/ui/branch/GitBranchesAction.java @@ -41,7 +41,7 @@ public class GitBranchesAction extends DumbAwareAction { VirtualFile file = e.getData(PlatformDataKeys.VIRTUAL_FILE); GitRepository repository = (file == null ? GitBranchUiUtil.getCurrentRepository(project): - repositoryManager.getRepositoryForFile(file)); + repositoryManager.getRepositoryForRoot(GitBranchUiUtil.getVcsRootFor(project,file))); if (repository == null) { return; } From a90fcec870afebd26501ccbbcc68bada8424bcec Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Thu, 2 Feb 2012 14:55:55 +0400 Subject: [PATCH 19/40] IDEA-80255 Cosmetics (extra dot) in GitBranchOperation rollback messages --- plugins/git4idea/src/git4idea/branch/GitBranchOperation.java | 2 +- .../git4idea/src/git4idea/branch/GitDeleteBranchOperation.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/git4idea/src/git4idea/branch/GitBranchOperation.java b/plugins/git4idea/src/git4idea/branch/GitBranchOperation.java index 1116915687cd..2c2d519fe3f1 100644 --- a/plugins/git4idea/src/git4idea/branch/GitBranchOperation.java +++ b/plugins/git4idea/src/git4idea/branch/GitBranchOperation.java @@ -156,7 +156,7 @@ abstract class GitBranchOperation { UIUtil.invokeAndWaitIfNeeded(new Runnable() { @Override public void run() { - String description = "" + message + ".
" + getRollbackProposal() + ""; + String description = "" + message + "
" + getRollbackProposal() + ""; ok.set(Messages.OK == MessageManager.showYesNoDialog(myProject, description, title, "Rollback", "Don't rollback", Messages.getErrorIcon())); } diff --git a/plugins/git4idea/src/git4idea/branch/GitDeleteBranchOperation.java b/plugins/git4idea/src/git4idea/branch/GitDeleteBranchOperation.java index dd75f9342d96..dc2b5ef1fcdc 100644 --- a/plugins/git4idea/src/git4idea/branch/GitDeleteBranchOperation.java +++ b/plugins/git4idea/src/git4idea/branch/GitDeleteBranchOperation.java @@ -88,7 +88,7 @@ class GitDeleteBranchOperation extends GitBranchOperation { } } else { - fatalError(getErrorTitle(), "This branch is not fully merged to " + myCurrentBranch); + fatalError(getErrorTitle(), "This branch is not fully merged to " + myCurrentBranch + "."); fatalErrorHappened = true; } } From 93b4e5c8bf8746b4ed1cb79eda6c0880b4e04d77 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 31 Jan 2012 12:19:01 +0400 Subject: [PATCH 20/40] Updater in CE project --- .idea/ant.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.idea/ant.xml b/.idea/ant.xml index 2581ca3fe84c..2debdc230402 100644 --- a/.idea/ant.xml +++ b/.idea/ant.xml @@ -2,6 +2,14 @@ + + + + + + + + From 7169ebb7ae5d79e188c08633ac97c24e688ac25d Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 1 Feb 2012 17:49:41 +0400 Subject: [PATCH 21/40] More symlink tests --- .../vfs/local/SymLinkHandlingTest.java | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/SymLinkHandlingTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/SymLinkHandlingTest.java index 461375ebbd1f..c76e5a112113 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/SymLinkHandlingTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/SymLinkHandlingTest.java @@ -55,6 +55,24 @@ public class SymLinkHandlingTest extends LightPlatformLangTestCase { final File selfLinkFile = createTempLink("self_link", "self_link"); final VirtualFile selfLinkVFile = refreshAndFind(selfLinkFile); assertNull(selfLinkVFile); + + final File pointLinkFile = createTempLink(".", "point_link"); + final VirtualFile pointLinkVFile = refreshAndFind(pointLinkFile); + assertNotNull(pointLinkVFile); + assertEquals(0, pointLinkVFile.getChildren().length); + + final File circularDir1 = FileUtil.createTempDirectory("dir1.", null); + final File circularDir2 = FileUtil.createTempDirectory("dir2.", null); + final File circularLink1 = createTempLink(circularDir2.getAbsolutePath(), circularDir1 + File.separator + "link"); + final File circularLink2 = createTempLink(circularDir1.getAbsolutePath(), circularDir2 + File.separator + "link"); + final VirtualFile circularLink1VFile = refreshAndFind(circularLink1); + final VirtualFile circularLink2VFile = refreshAndFind(circularLink2); + assertNotNull(circularLink1VFile); + assertNotNull(circularLink2VFile); + assertEquals(1, circularLink1VFile.getChildren().length); + assertEquals(1, circularLink2VFile.getChildren().length); + assertEquals(0, circularLink1VFile.getChildren()[0].getChildren().length); + assertEquals(0, circularLink2VFile.getChildren()[0].getChildren().length); } public void testTargetIsWritable() throws Exception { @@ -171,7 +189,9 @@ public class SymLinkHandlingTest extends LightPlatformLangTestCase { // todo[r.sh] use NIO2 API after migration to JDK 7 private static File createTempLink(final String target, final String link) throws InterruptedException, ExecutionException { - final File linkFile = new File(FileUtil.getTempDirectory(), link); + final boolean isAbsolute = SystemInfo.isUnix && link.startsWith("/") || + SystemInfo.isWindows && link.matches("^[c-zC-Z]:.*$"); + final File linkFile = isAbsolute ? new File(link) : new File(FileUtil.getTempDirectory(), link); assertTrue(link, !linkFile.exists() || linkFile.delete()); final File parentDir = linkFile.getParentFile(); assertTrue("link=" + link + ", parent=" + parentDir, parentDir != null && (parentDir.isDirectory() || parentDir.mkdirs())); @@ -185,9 +205,9 @@ public class SymLinkHandlingTest extends LightPlatformLangTestCase { else { commandLine = new GeneralCommandLine("ln", "-s", target, linkFile.getAbsolutePath()); } - final Process process = commandLine.createProcess(); - final int res = process.waitFor(); - assertTrue(commandLine.getCommandLineString() + ": " + res, res == 0); + final int res = commandLine.createProcess().waitFor(); + assertEquals(commandLine.getCommandLineString(), 0, res); + final File targetFile = new File(target); assertEquals("target=" + target + ", link=" + linkFile, targetFile.exists(), linkFile.exists()); return linkFile; From 705756ceb6a1270d9f1861603c4aece9e538648c Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Thu, 2 Feb 2012 13:23:42 +0400 Subject: [PATCH 22/40] Cleanup --- .../openapi/vfs/newvfs/impl/VirtualDirectoryImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualDirectoryImpl.java b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualDirectoryImpl.java index 6ff87f199cb1..e28e5e496034 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualDirectoryImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualDirectoryImpl.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. @@ -64,7 +64,7 @@ import java.util.*; * @author max */ public class VirtualDirectoryImpl extends VirtualFileSystemEntry { - private static final boolean ALT_SYMLINK_HANDLING = "true".equals(System.getProperty("idea.io.alt.symlink")); + private static final boolean ALT_SYMLINK_HANDLING = "true".equalsIgnoreCase(System.getProperty("idea.io.alt.symlink")); private static final VirtualFileSystemEntry NULL_VIRTUAL_FILE = new VirtualFileImpl("*?;%NULL", null, -42) { public String toString() { From 28b0ae03c7072e5230b2c870c45ed0a9024506e1 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Thu, 2 Feb 2012 10:35:38 +0100 Subject: [PATCH 23/40] cosmetics --- .../jetbrains/ether/IncrementalTestCase.java | 64 +++++++++++++------ 1 file changed, 44 insertions(+), 20 deletions(-) diff --git a/jps/jps-builders/testSrc/org/jetbrains/ether/IncrementalTestCase.java b/jps/jps-builders/testSrc/org/jetbrains/ether/IncrementalTestCase.java index 992c6883f1c7..a28814e37b73 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/ether/IncrementalTestCase.java +++ b/jps/jps-builders/testSrc/org/jetbrains/ether/IncrementalTestCase.java @@ -15,7 +15,6 @@ */ package org.jetbrains.ether; -import com.intellij.openapi.application.PathManager; import com.intellij.openapi.application.ex.PathManagerEx; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.SystemInfo; @@ -31,7 +30,6 @@ import org.jetbrains.jps.Sdk; import org.jetbrains.jps.api.CanceledStatus; import org.jetbrains.jps.idea.IdeaProjectLoader; import org.jetbrains.jps.incremental.*; -import org.jetbrains.jps.incremental.java.JavaBuilder; import org.jetbrains.jps.incremental.storage.BuildDataManager; import org.jetbrains.jps.incremental.storage.ProjectTimestamps; import org.jetbrains.jps.server.ClasspathBootstrap; @@ -154,8 +152,12 @@ public abstract class IncrementalTestCase extends TestCase { @Override protected void tearDown() throws Exception { - super.tearDown(); - delete(new File(workDir)); + try { + super.tearDown(); + } + finally { + delete(new File(workDir)); + } } private String getProjectName() { @@ -199,7 +201,7 @@ public abstract class IncrementalTestCase extends TestCase { if (files != null) { for (File f : files) { - copy(f, new File(output.getPath() + File.separator + f.getName())); + copy(f, new File(output.getPath(), f.getName())); } } } @@ -208,16 +210,26 @@ public abstract class IncrementalTestCase extends TestCase { } } else if (input.isFile()) { - final FileReader in = new FileReader(input); - final FileWriter out = new FileWriter(output); + FileReader in = null; + FileWriter out = null; try { + in = new FileReader(input); + out = new FileWriter(output); int c; while ((c = in.read()) != -1) out.write(c); } finally { - in.close(); - out.close(); + try { + if (in != null) { + in.close(); + } + } + finally { + if (out != null) { + out.close(); + } + } } } } @@ -241,7 +253,7 @@ public abstract class IncrementalTestCase extends TestCase { final String basename = pathSep == -1 ? postfix : postfix.substring(pathSep + 1); final String path = getWorkDir() + File.separator + (pathSep == -1 ? "src" : postfix.substring(0, pathSep).replace('-', File.separatorChar)); - final File output = new File(path + File.separator + basename); + final File output = new File(path, basename); if (copy) { copy(input, output); @@ -275,7 +287,7 @@ public abstract class IncrementalTestCase extends TestCase { final Sdk jdk = project.createSdk("JavaSDK", "IDEA jdk", System.getProperty("java.home"), null); final List paths = new LinkedList(); - + paths.add(FileUtil.toSystemIndependentName(ClasspathBootstrap.getResourcePath(Object.class).getCanonicalPath())); jdk.setClasspath(paths); @@ -285,20 +297,32 @@ public abstract class IncrementalTestCase extends TestCase { final ProjectDescriptor projectDescriptor = new ProjectDescriptor(projectPath, project, new FSState(true), new ProjectTimestamps(projectName), new BuildDataManager(projectName, true)); - final IncProjectBuilder builder = new IncProjectBuilder(projectDescriptor, BuilderRegistry.getInstance(), CanceledStatus.NULL); + try { - builder.build(new AllProjectScope(project, true), false, true); + new IncProjectBuilder( + projectDescriptor, BuilderRegistry.getInstance(), CanceledStatus.NULL + ).build( + new AllProjectScope(project, true), false, true + ); - modify(); + modify(); - if (SystemInfo.isUnix) { - Thread.sleep(1000); + if (SystemInfo.isUnix) { + Thread.sleep(1000L); + } + + new IncProjectBuilder( + projectDescriptor, BuilderRegistry.getInstance(), CanceledStatus.NULL + ).build( + new AllProjectScope(project, false), true, false + ); + + FileAssert.assertEquals(new File(getBaseDir() + ".log"), new File(getWorkDir() + ".log")); + } + finally { + projectDescriptor.release(); } - builder.build(new AllProjectScope(project, false), true, false); - projectDescriptor.release(); - - FileAssert.assertEquals(new File(getBaseDir() + ".log"), new File(getWorkDir() + ".log")); } } From 3855911ae2084a29825d888e08b1e6ca6858b94e Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Wed, 1 Feb 2012 15:37:02 +0400 Subject: [PATCH 24/40] Optimization of calculation MavenProjectChanges. --- .../idea/maven/project/MavenProject.java | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.java index cb5a81b73cdd..93afbfdd96d9 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.java @@ -896,25 +896,23 @@ public class MavenProject { MavenProjectChanges result = new MavenProjectChanges(); - result.packaging |= !Comparing.equal(myPackaging, other.myPackaging); + result.packaging = !Comparing.equal(myPackaging, other.myPackaging); - result.output |= !Comparing.equal(myFinalName, other.myFinalName); - result.output |= !Comparing.equal(myBuildDirectory, other.myBuildDirectory); - result.output |= !Comparing.equal(myOutputDirectory, other.myOutputDirectory); - result.output |= !Comparing.equal(myTestOutputDirectory, other.myTestOutputDirectory); + result.output = !Comparing.equal(myFinalName, other.myFinalName) + || !Comparing.equal(myBuildDirectory, other.myBuildDirectory) + || !Comparing.equal(myOutputDirectory, other.myOutputDirectory) + || !Comparing.equal(myTestOutputDirectory, other.myTestOutputDirectory); - result.sources |= !Comparing.equal(mySources, other.mySources); - result.sources |= !Comparing.equal(myTestSources, other.myTestSources); - result.sources |= !Comparing.equal(myResources, other.myResources); - result.sources |= !Comparing.equal(myTestResources, other.myTestResources); + result.sources = !Comparing.equal(mySources, other.mySources) + || !Comparing.equal(myTestSources, other.myTestSources) + || !Comparing.equal(myResources, other.myResources) + || !Comparing.equal(myTestResources, other.myTestResources); boolean repositoryChanged = !Comparing.equal(myLocalRepository, other.myLocalRepository); - result.dependencies |= repositoryChanged; - result.dependencies |= !Comparing.equal(myDependencies, other.myDependencies); + result.dependencies = repositoryChanged || !Comparing.equal(myDependencies, other.myDependencies); - result.plugins |= repositoryChanged; - result.plugins |= !Comparing.equal(myPlugins, other.myPlugins); + result.plugins = repositoryChanged || !Comparing.equal(myPlugins, other.myPlugins); return result; } From 4dba29422e9899775d636ee85bf3f8497e93759e Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Wed, 1 Feb 2012 15:40:27 +0400 Subject: [PATCH 25/40] Minor code change. --- .../idea/maven/dom/references/MavenPropertyPsiReference.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReference.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReference.java index dbdf23ca459f..1dbbd29ab12b 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReference.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReference.java @@ -31,6 +31,7 @@ import com.intellij.util.ArrayUtil; import com.intellij.util.Function; import com.intellij.util.IncorrectOperationException; import com.intellij.util.PlatformIcons; +import com.intellij.util.containers.CollectionFactory; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.xml.DomElement; import com.intellij.util.xml.DomUtil; @@ -51,13 +52,12 @@ import org.jetbrains.idea.maven.vfs.MavenPropertiesVirtualFileSystem; import javax.swing.*; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Set; public class MavenPropertyPsiReference extends MavenPsiReference { private static final Set BASEDIR_PROPS = - new THashSet(Arrays.asList("basedir", "project.basedir", "pom.basedir", "baseUri", "project.baseUri", "pom.baseUri")); + CollectionFactory.newTroveSet("basedir", "project.basedir", "pom.basedir", "baseUri", "project.baseUri", "pom.baseUri"); private static final String TIMESTAMP_PROP = "maven.build.timestamp"; From aac78256f6c6143b08c680871fbfa27f8f244f81 Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Thu, 2 Feb 2012 15:22:09 +0400 Subject: [PATCH 26/40] IDEA-80626 (error on maven-resources-plugin in pom.xml) --- .../MavenPluginConfigurationDomExtender.java | 82 ++++--- .../idea/maven/dom/plugin/MavenDomMojo.java | 3 + .../2.5/maven-resources-plugin-2.5.jar | 0 .../2.5/maven-resources-plugin-2.5.jar.sha1 | 1 + .../2.5/maven-resources-plugin-2.5.pom | 203 ++++++++++++++++++ .../2.5/maven-resources-plugin-2.5.pom.sha1 | 1 + ...nExtensionCompletionAndResolutionTest.java | 3 +- ...avenPluginCompletionAndResolutionTest.java | 58 ++++- 8 files changed, 314 insertions(+), 37 deletions(-) create mode 100644 plugins/maven/src/test/data/plugins/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.jar create mode 100644 plugins/maven/src/test/data/plugins/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.jar.sha1 create mode 100644 plugins/maven/src/test/data/plugins/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.pom create mode 100644 plugins/maven/src/test/data/plugins/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.pom.sha1 diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenPluginConfigurationDomExtender.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenPluginConfigurationDomExtender.java index 2414a8852270..85689bea5aa5 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenPluginConfigurationDomExtender.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenPluginConfigurationDomExtender.java @@ -89,12 +89,13 @@ public class MavenPluginConfigurationDomExtender extends DomExtender d2.getRequiringLevel(); + } + private static void fillParameterData(String name, ParameterData data, MavenDomMojo mojo) { XmlTag config = mojo.getConfiguration().getXmlTag(); if (config == null) return; @@ -153,15 +164,27 @@ public class MavenPluginConfigurationDomExtender extends DomExtender annotationType() { + return Required.class; + } + }); } } @@ -181,43 +204,32 @@ public class MavenPluginConfigurationDomExtender extends DomExtender collectionClasses = Arrays.asList("java.util.List", - "java.util.Set", - "java.util.Collection"); - return collectionClasses.contains(type); + return type.equals("java.util.List") || type.equals("java.util.Set") || type.equals("java.util.Collection"); } public static class ParameterData { - public MavenDomParameter parameter; + public final MavenDomParameter parameter; public @Nullable String defaultValue; public @Nullable String expression; private ParameterData(MavenDomParameter parameter) { this.parameter = parameter; } - } - - private static class MyRequired implements Required { - private final String myRequired; - - public MyRequired(String required) { - myRequired = required; + + @NotNull + public MavenDomMojo getMojo() { + return (MavenDomMojo)parameter.getParent().getParent(); } - public boolean value() { - return Boolean.valueOf(myRequired); - } + public int getRequiringLevel() { + if (!Boolean.parseBoolean(parameter.getRequired().getStringValue())) return 0; - public boolean nonEmpty() { - return false; - } + if (!StringUtil.isEmptyOrSpaces(defaultValue) || !StringUtil.isEmptyOrSpaces(expression)) { + return 1; + } - public boolean identifier() { - return false; - } - - public Class annotationType() { - return Required.class; + return 2; } } + } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/plugin/MavenDomMojo.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/plugin/MavenDomMojo.java index 93eef0da0547..6df04f0965d1 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/plugin/MavenDomMojo.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/plugin/MavenDomMojo.java @@ -23,6 +23,9 @@ public interface MavenDomMojo extends MavenDomElement { @NotNull GenericDomValue getGoal(); + @NotNull + GenericDomValue getPhase(); + @NotNull MavenDomParameters getParameters(); diff --git a/plugins/maven/src/test/data/plugins/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.jar b/plugins/maven/src/test/data/plugins/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.jar new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/plugins/maven/src/test/data/plugins/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.jar.sha1 b/plugins/maven/src/test/data/plugins/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.jar.sha1 new file mode 100644 index 000000000000..66f7045df9cb --- /dev/null +++ b/plugins/maven/src/test/data/plugins/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.jar.sha1 @@ -0,0 +1 @@ +4d0907396ac6a770e05c81f6e8ed6348740f86a0 diff --git a/plugins/maven/src/test/data/plugins/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.pom b/plugins/maven/src/test/data/plugins/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.pom new file mode 100644 index 000000000000..f74aea0ce484 --- /dev/null +++ b/plugins/maven/src/test/data/plugins/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.pom @@ -0,0 +1,203 @@ + + + + + + 4.0.0 + + + maven-plugins + org.apache.maven.plugins + 19 + ../maven-plugins/pom.xml + + + maven-resources-plugin + 2.5 + maven-plugin + + Maven Resources Plugin + + The Resources Plugin handles the copying of project resources to the output + directory. There are two different kinds of resources: main resources and test resources. The + difference is that the main resources are the resources associated to the main + source code while the test resources are associated to the test source code. + Thus, this allows the separation of resources for the main source code and its + unit tests. + + 2001 + + + ${mavenVersion} + + + + scm:svn:http://svn.apache.org/repos/asf/maven/plugins/tags/maven-resources-plugin-2.5 + scm:svn:https://svn.apache.org/repos/asf/maven/plugins/tags/maven-resources-plugin-2.5 + http://svn.apache.org/viewvc/maven/plugins/tags/maven-resources-plugin-2.5 + + + JIRA + http://jira.codehaus.org/browse/MRESOURCES + + + + 1.0 + 2.0.6 + + + + + org.apache.maven + maven-plugin-api + ${mavenVersion} + + + org.apache.maven + maven-project + ${mavenVersion} + + + org.apache.maven + maven-core + ${mavenVersion} + + + org.apache.maven + maven-artifact + ${mavenVersion} + + + org.apache.maven + maven-settings + ${mavenVersion} + + + org.apache.maven + maven-model + ${mavenVersion} + + + org.apache.maven + maven-monitor + ${mavenVersion} + + + + org.codehaus.plexus + plexus-container-default + 1.0-alpha-9-stable-1 + + + + org.codehaus.plexus + plexus-utils + 2.0.5 + + + + org.apache.maven.shared + maven-filtering + ${mavenFilteringVersion} + + + + org.codehaus.plexus + plexus-interpolation + 1.13 + + + + org.apache.maven.shared + maven-plugin-testing-harness + 1.0-beta-1 + test + + + commons-io + commons-io + 1.4 + test + + + + + + run-its + + + + org.apache.maven.plugins + maven-jar-plugin + + + + test-jar + + + + + + org.codehaus.plexus + plexus-maven-plugin + + + + test-descriptor + + + + + + org.apache.maven.plugins + maven-invoker-plugin + + true + src/it + + **/pom.xml + + verify + ${project.build.directory}/local-repo + + clean + process-test-resources + + src/it/settings.xml + ${project.build.directory}/it + + fromExecProps + + + + + integration-test + + install + run + + + + + + + + + diff --git a/plugins/maven/src/test/data/plugins/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.pom.sha1 b/plugins/maven/src/test/data/plugins/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.pom.sha1 new file mode 100644 index 000000000000..ed141e784c90 --- /dev/null +++ b/plugins/maven/src/test/data/plugins/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.pom.sha1 @@ -0,0 +1 @@ +2d44c4a29ea56775c87002edb5aa23aab47e71ac diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenExtensionCompletionAndResolutionTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenExtensionCompletionAndResolutionTest.java index abb177cb9160..c0d3a9cee077 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenExtensionCompletionAndResolutionTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenExtensionCompletionAndResolutionTest.java @@ -65,7 +65,7 @@ public class MavenExtensionCompletionAndResolutionTest extends MavenDomWithIndic " " + ""); - assertCompletionVariants(myProjectPom, "maven-compiler-plugin", "maven-war-plugin", "maven-eclipse-plugin", "maven-surefire-plugin"); + assertCompletionVariants(myProjectPom, "maven-compiler-plugin", "maven-war-plugin", "maven-eclipse-plugin", "maven-surefire-plugin", "maven-resources-plugin"); } public void testArtifactWithoutGroupCompletion() throws Exception { @@ -86,6 +86,7 @@ public class MavenExtensionCompletionAndResolutionTest extends MavenDomWithIndic "maven-war-plugin", "maven-surefire-plugin", "build-helper-maven-plugin", + "maven-resources-plugin", "maven-eclipse-plugin"); } diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenPluginCompletionAndResolutionTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenPluginCompletionAndResolutionTest.java index eaea5c74b3c3..b98768519a1e 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenPluginCompletionAndResolutionTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/dom/MavenPluginCompletionAndResolutionTest.java @@ -71,7 +71,7 @@ public class MavenPluginCompletionAndResolutionTest extends MavenDomWithIndicesT " " + ""); - assertCompletionVariants(myProjectPom, "maven-compiler-plugin", "maven-war-plugin", "maven-surefire-plugin", "maven-eclipse-plugin"); + assertCompletionVariants(myProjectPom, "maven-compiler-plugin", "maven-war-plugin", "maven-surefire-plugin", "maven-eclipse-plugin", "maven-resources-plugin"); } public void testArtifactWithoutGroupCompletion() throws Exception { @@ -92,6 +92,7 @@ public class MavenPluginCompletionAndResolutionTest extends MavenDomWithIndicesT "maven-war-plugin", "build-helper-maven-plugin", "maven-surefire-plugin", + "maven-resources-plugin", "maven-eclipse-plugin"); } @@ -902,4 +903,59 @@ public class MavenPluginCompletionAndResolutionTest extends MavenDomWithIndicesT assertCompletionVariants(myProjectPom); } + + public void testRequiringParameter() throws Throwable { + createProjectPom("test" + + "project" + + "1" + + + "" + + " " + + " \n" + + " maven-resources-plugin\n" + + " \n" + + " <outputDirectory/>\n" + + " \n" + + " \n" + + + " \n" + + " maven-resources-plugin\n" + + "" + + " \n" + + " aaa\n" + + " \n" + + " \n" + + + " \n" + + " maven-resources-plugin\n" + + "" + + " \n" + + " \n" + + " \n" + + + " \n" + + " maven-resources-plugin\n" + + " " + + " " + + " " + + " copy-resources" + + " resources" + + " " + + " <configuration>\n" + + " \n" + + " " + + " " + + " " + + "" + + " \n" + + " \n" + + " \n" + + + + " " + + ""); + + checkHighlighting(); + } + } From 5224c54b624603192e4bb4a62b878553344e45a6 Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Thu, 2 Feb 2012 15:18:32 +0400 Subject: [PATCH 27/40] faster core jar vfs --- .../openapi/vfs/impl/jar/CoreJarHandler.java | 41 ++++++++------ .../vfs/impl/jar/CoreJarVirtualFile.java | 56 +++++-------------- 2 files changed, 38 insertions(+), 59 deletions(-) diff --git a/platform/core-impl/src/com/intellij/openapi/vfs/impl/jar/CoreJarHandler.java b/platform/core-impl/src/com/intellij/openapi/vfs/impl/jar/CoreJarHandler.java index c2650490286c..741c1b9584ca 100644 --- a/platform/core-impl/src/com/intellij/openapi/vfs/impl/jar/CoreJarHandler.java +++ b/platform/core-impl/src/com/intellij/openapi/vfs/impl/jar/CoreJarHandler.java @@ -25,30 +25,39 @@ import java.util.Map; * @author yole */ public class CoreJarHandler extends JarHandlerBase { - private final Map myFileMap = new HashMap(); + private final CoreJarFileSystem myFileSystem; + private final VirtualFile myRoot; public CoreJarHandler(CoreJarFileSystem fileSystem, String path) { super(path); myFileSystem = fileSystem; + + Map entries = new HashMap(); + + for (EntryInfo info : getEntriesMap().values()) { + getOrCreateFile(info, entries); + } + + myRoot = getOrCreateFile(getEntryInfo(""), entries); + } + + private CoreJarVirtualFile getOrCreateFile(EntryInfo info, Map entries) { + CoreJarVirtualFile answer = entries.get(info); + if (answer == null) { + answer = new CoreJarVirtualFile(this, info, getOrCreateFile(info.parent, entries)); + entries.put(info, answer); + } + + return answer; } @Nullable public VirtualFile findFileByPath(String pathInJar) { - if (getZip() == null) { - return null; - } - VirtualFile file = myFileMap.get(pathInJar); - if (file == null) { - if (pathInJar.length() > 0) { - EntryInfo entryInfo = getEntryInfo(pathInJar); - if (entryInfo == null) { - return null; - } - } - file = new CoreJarVirtualFile(myFileSystem, this, pathInJar); - myFileMap.put(pathInJar, file); - } - return file; + return myRoot != null ? myRoot.findFileByRelativePath(pathInJar) : null; + } + + public CoreJarFileSystem getFileSystem() { + return myFileSystem; } } diff --git a/platform/core-impl/src/com/intellij/openapi/vfs/impl/jar/CoreJarVirtualFile.java b/platform/core-impl/src/com/intellij/openapi/vfs/impl/jar/CoreJarVirtualFile.java index c2969d9edc09..e5ea5d2d4e68 100644 --- a/platform/core-impl/src/com/intellij/openapi/vfs/impl/jar/CoreJarVirtualFile.java +++ b/platform/core-impl/src/com/intellij/openapi/vfs/impl/jar/CoreJarVirtualFile.java @@ -23,44 +23,40 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; -import java.util.List; /** * @author yole */ public class CoreJarVirtualFile extends VirtualFile { - private final CoreJarFileSystem myFileSystem; private final CoreJarHandler myHandler; - private final String myPathInJar; private final VirtualFile myParent; - private VirtualFile[] myChildren; + private final ArrayList myChildren = new ArrayList(); + private final JarHandlerBase.EntryInfo myEntry; - public CoreJarVirtualFile(CoreJarFileSystem fileSystem, CoreJarHandler handler, String pathInJar) { - myFileSystem = fileSystem; + public CoreJarVirtualFile(CoreJarHandler handler, JarHandlerBase.EntryInfo entry, CoreJarVirtualFile parent) { myHandler = handler; - myPathInJar = pathInJar; - myParent = calcParent(); + myParent = parent; + myEntry = entry; + + parent.myChildren.add(this); } @NotNull @Override public String getName() { - final int lastSlash = myPathInJar.lastIndexOf('/'); - if (lastSlash < 0) { - return myPathInJar; - } - return myPathInJar.substring(lastSlash+1); + return myEntry.shortName; } @NotNull @Override public VirtualFileSystem getFileSystem() { - return myFileSystem; + return myHandler.getFileSystem(); } @Override public String getPath() { - return myHandler.myBasePath + "!/" + myPathInJar; + if (myParent == null) return myHandler.myBasePath + "!/"; + return myParent.getPath() + "/" + myEntry.shortName; } @Override @@ -70,7 +66,7 @@ public class CoreJarVirtualFile extends VirtualFile { @Override public boolean isDirectory() { - return myHandler.isDirectory(this); + return myEntry.isDirectory; } @Override @@ -83,35 +79,9 @@ public class CoreJarVirtualFile extends VirtualFile { return myParent; } - private VirtualFile calcParent() { - if (myPathInJar.length() == 0) { - return null; - } - int lastSlash = myPathInJar.lastIndexOf('/'); - if (lastSlash < 0) { - return myHandler.findFileByPath(""); - } - return myHandler.findFileByPath(myPathInJar.substring(0, lastSlash)); - } - @Override public VirtualFile[] getChildren() { - VirtualFile[] answer = myChildren; - if (answer == null) { - answer = calcChildren(); - myChildren = answer; - } - return answer; - } - - private VirtualFile[] calcChildren() { - List result = new ArrayList(); - final String[] children = myHandler.list(this); - for (String child : children) { - final VirtualFile childFile = myPathInJar.isEmpty() ? myHandler.findFileByPath(child) : myHandler.findFileByPath(myPathInJar + "/" + child); - result.add(childFile); - } - return result.toArray(new VirtualFile[result.size()]); + return myChildren.toArray(new VirtualFile[myChildren.size()]); } @NotNull From e35b58a06364e55ca678d0150dfa1b9a83dd182e Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 2 Feb 2012 15:22:54 +0400 Subject: [PATCH 28/40] wording --- .../com/intellij/refactoring/actions/RenameFileAction.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/actions/RenameFileAction.java b/java/java-impl/src/com/intellij/refactoring/actions/RenameFileAction.java index 1e0008cb867d..1a3244595e6d 100644 --- a/java/java-impl/src/com/intellij/refactoring/actions/RenameFileAction.java +++ b/java/java-impl/src/com/intellij/refactoring/actions/RenameFileAction.java @@ -27,7 +27,7 @@ import com.intellij.refactoring.rename.PsiElementRenameHandler; * @author ven */ public class RenameFileAction extends AnAction implements DumbAware { - public static final String RENAME_FILE = "Rename File"; + public static final String RENAME_FILE = "Rename File..."; public void actionPerformed(final AnActionEvent e) { final PsiFile file = e.getData(LangDataKeys.PSI_FILE); @@ -47,7 +47,7 @@ public class RenameFileAction extends AnAction implements DumbAware { presentation.setVisible(enabled); if (enabled) { presentation.setText(RENAME_FILE); - presentation.setDescription(RENAME_FILE); + presentation.setDescription("Rename selected file"); } } } From d25595f40996c4b823736ff57c47d1261492e038 Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Thu, 2 Feb 2012 15:48:23 +0400 Subject: [PATCH 29/40] NPE --- .../src/com/intellij/openapi/vfs/impl/jar/CoreJarHandler.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/core-impl/src/com/intellij/openapi/vfs/impl/jar/CoreJarHandler.java b/platform/core-impl/src/com/intellij/openapi/vfs/impl/jar/CoreJarHandler.java index 741c1b9584ca..4df4ce644252 100644 --- a/platform/core-impl/src/com/intellij/openapi/vfs/impl/jar/CoreJarHandler.java +++ b/platform/core-impl/src/com/intellij/openapi/vfs/impl/jar/CoreJarHandler.java @@ -45,7 +45,8 @@ public class CoreJarHandler extends JarHandlerBase { private CoreJarVirtualFile getOrCreateFile(EntryInfo info, Map entries) { CoreJarVirtualFile answer = entries.get(info); if (answer == null) { - answer = new CoreJarVirtualFile(this, info, getOrCreateFile(info.parent, entries)); + EntryInfo parentEntry = info.parent; + answer = new CoreJarVirtualFile(this, info, parentEntry != null ? getOrCreateFile(parentEntry, entries) : null); entries.put(info, answer); } From 254e5eb6ee4e89096f8872e2c1f2399834152209 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 31 Jan 2012 17:34:51 +0400 Subject: [PATCH 30/40] EA-32882 fix already disposed --- .../android/compiler/AndroidCompileUtil.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java index 858500668f22..726a42a95bc2 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java @@ -35,6 +35,7 @@ import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.*; import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.io.FileUtil; @@ -351,14 +352,24 @@ public class AndroidCompileUtil { } public static void generate(final Module module, final GeneratingCompiler compiler) { - module.getProject().getComponent(AndroidProjectComponent.class).runIfNotInCompilation(new Runnable() { + final Project project = module.getProject(); + final AndroidProjectComponent component = ApplicationManager.getApplication().runReadAction(new Computable() { + @Nullable + @Override + public AndroidProjectComponent compute() { + return !project.isDisposed() ? project.getComponent(AndroidProjectComponent.class) : null; + } + }); + if (component == null) { + return; + } + component.runIfNotInCompilation(new Runnable() { @Override public void run() { assert !ApplicationManager.getApplication().isDispatchThread(); final CompileContext[] contextWrapper = new CompileContext[1]; ApplicationManager.getApplication().runReadAction(new Runnable() { public void run() { - Project project = module.getProject(); if (project.isDisposed()) return; CompilerTask task = new CompilerTask(project, true, "Android auto-generation", true); CompileScope scope = new ModuleCompileScope(module, false); From 0781701fdcedab28797432234c4772fe66104d9d Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 31 Jan 2012 17:54:20 +0400 Subject: [PATCH 31/40] EA_32364 fix AIOOBE --- .../jetbrains/android/util/AndroidUtils.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/util/AndroidUtils.java b/plugins/android/src/org/jetbrains/android/util/AndroidUtils.java index 12615f7ae66e..9bc4c6a0675a 100644 --- a/plugins/android/src/org/jetbrains/android/util/AndroidUtils.java +++ b/plugins/android/src/org/jetbrains/android/util/AndroidUtils.java @@ -455,12 +455,15 @@ public class AndroidUtils { LOG.info(commandLine.getCommandLineString()); OSProcessHandler handler = new OSProcessHandler(commandLine.createProcess(), ""); + final StringBuffer buffer = new StringBuffer(); + final ProcessAdapter listener = new ProcessAdapter() { + public void onTextAvailable(final ProcessEvent event, final Key outputType) { + buffer.append(event.getText()); + } + }; + if (timeout == null || timeout > 0) { - handler.addProcessListener(new ProcessAdapter() { - public void onTextAvailable(final ProcessEvent event, final Key outputType) { - messageBuilder.append(event.getText()); - } - }); + handler.addProcessListener(listener); } handler.startNotify(); @@ -483,7 +486,9 @@ public class AndroidUtils { } if (timeout == null || timeout > 0) { - String message = messageBuilder.toString(); + handler.removeProcessListener(listener); + final String message = buffer.toString(); + messageBuilder.append(message); LOG.info(message); } From 529656f7eefb3125541199ec277f72d2bfbeff6f Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 31 Jan 2012 18:36:43 +0400 Subject: [PATCH 32/40] fix condition for local attributes map invalidation --- .../facet/AndroidResourceFilesListener.java | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidResourceFilesListener.java b/plugins/android/src/org/jetbrains/android/facet/AndroidResourceFilesListener.java index 27d7809494f8..e422429d59a3 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidResourceFilesListener.java +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidResourceFilesListener.java @@ -16,6 +16,7 @@ package org.jetbrains.android.facet; +import com.android.resources.ResourceFolderType; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.compiler.GeneratingCompiler; import com.intellij.openapi.module.Module; @@ -31,6 +32,7 @@ import org.jetbrains.android.compiler.*; import org.jetbrains.android.dom.manifest.Manifest; import org.jetbrains.android.fileTypes.AndroidIdlFileType; import org.jetbrains.android.fileTypes.AndroidRenderscriptFileType; +import org.jetbrains.android.util.AndroidResourceUtil; import org.jetbrains.android.util.AndroidUtils; import org.jetbrains.android.util.ResourceEntry; import org.jetbrains.annotations.NotNull; @@ -147,7 +149,7 @@ class AndroidResourceFilesListener extends VirtualFileAdapter { final GeneratingCompiler compilerToRun = ApplicationManager.getApplication().runReadAction(new Computable() { @Nullable public GeneratingCompiler compute() { - return computeCompilerToRun(); + return computeCompilerToRunAndInvalidateLocalAttributesMap(); } }); @@ -175,7 +177,7 @@ class AndroidResourceFilesListener extends VirtualFileAdapter { } @Nullable - private GeneratingCompiler computeCompilerToRun() { + private GeneratingCompiler computeCompilerToRunAndInvalidateLocalAttributesMap() { if (myFacet.isDisposed()) { return null; } @@ -197,10 +199,18 @@ class AndroidResourceFilesListener extends VirtualFileAdapter { return null; } - parent = parent.getParent(); + final VirtualFile gp = parent.getParent(); + + final VirtualFile resourceDir = AndroidRootUtil.getResourceDir(module); + + if (gp == resourceDir && + ResourceFolderType.VALUES.getName().equals(AndroidResourceUtil.getResourceTypeByDirName(parent.getName()))) { + myFacet.getLocalResourceManager().invalidateAttributeDefinitions(); + } + if (AndroidAptCompiler.isToCompileModule(module, myFacet.getConfiguration()) && - (myFacet.getConfiguration().REGENERATE_R_JAVA && parent == AndroidRootUtil.getResourceDir(module) || - AndroidRootUtil.getManifestFile(module) == file)) { + (myFacet.getConfiguration().REGENERATE_R_JAVA && (gp == resourceDir || + AndroidRootUtil.getManifestFile(module) == file))) { final Manifest manifest = myFacet.getManifest(); final String aPackage = manifest != null ? manifest.getPackage().getValue() : null; @@ -209,8 +219,6 @@ class AndroidResourceFilesListener extends VirtualFileAdapter { AndroidCompileUtil.removeDuplicatingClasses(myModule, myCachedPackage, AndroidUtils.R_CLASS_NAME, null, aptGenDirPath); } myCachedPackage = aPackage; - myFacet.getLocalResourceManager().invalidateAttributeDefinitions(); - return new AndroidAptCompiler(); } From 88c3faf7298d67addf67a60eaf98d39ca4c95f6d Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 31 Jan 2012 18:40:45 +0400 Subject: [PATCH 33/40] clean up --- .../android/dom/converters/ResourceReferenceConverter.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/android/src/org/jetbrains/android/dom/converters/ResourceReferenceConverter.java b/plugins/android/src/org/jetbrains/android/dom/converters/ResourceReferenceConverter.java index 28d55346b78c..cbb6dacf8c61 100644 --- a/plugins/android/src/org/jetbrains/android/dom/converters/ResourceReferenceConverter.java +++ b/plugins/android/src/org/jetbrains/android/dom/converters/ResourceReferenceConverter.java @@ -21,6 +21,7 @@ import com.intellij.openapi.command.undo.UndoUtil; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiReference; @@ -122,7 +123,7 @@ public class ResourceReferenceConverter extends ResolvingConverter Date: Tue, 31 Jan 2012 19:30:32 +0400 Subject: [PATCH 34/40] IDEA-64487 do not suggest resource types, which there are no resources in project --- .../ResourceReferenceConverter.java | 30 ++++++++++-- .../LocalResourceManager.java | 47 +++++++++++++++++-- 2 files changed, 71 insertions(+), 6 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/dom/converters/ResourceReferenceConverter.java b/plugins/android/src/org/jetbrains/android/dom/converters/ResourceReferenceConverter.java index cbb6dacf8c61..4e2d2eee87a4 100644 --- a/plugins/android/src/org/jetbrains/android/dom/converters/ResourceReferenceConverter.java +++ b/plugins/android/src/org/jetbrains/android/dom/converters/ResourceReferenceConverter.java @@ -22,6 +22,7 @@ import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiReference; @@ -31,8 +32,8 @@ import com.intellij.psi.xml.XmlTag; import com.intellij.util.ArrayUtil; import com.intellij.util.PsiNavigateUtil; import com.intellij.util.xml.*; -import org.jetbrains.android.dom.ResourceType; import org.jetbrains.android.dom.AdditionalConverter; +import org.jetbrains.android.dom.ResourceType; import org.jetbrains.android.dom.resources.Item; import org.jetbrains.android.dom.resources.ResourceElement; import org.jetbrains.android.dom.resources.ResourceValue; @@ -111,7 +112,8 @@ public class ResourceReferenceConverter extends ResolvingConverter recommendedTypes = getResourceTypes(context); + + final Set recommendedTypes = getResourceTypes(context); // hack to check if it is a real id attribute if (recommendedTypes.contains("id") && recommendedTypes.size() == 1) { @@ -138,12 +140,17 @@ public class ResourceReferenceConverter extends ResolvingConverter filteringSet = SYSTEM_RESOURCE_PACKAGE.equals(resourcePackage) + ? null + : getResourceTypesInCurrentModule(facet); + for (String type : ResourceManager.REFERABLE_RESOURCE_TYPES) { String typePrefix = getTypePrefix(resourcePackage, type); if (value.startsWith(typePrefix)) { addResourceReferenceValues(facet, type, resourcePackage, result, true); } - else if (recommendedTypes.contains(type)) { + else if (recommendedTypes.contains(type) && + (filteringSet == null || filteringSet.contains(type))) { result.add(ResourceValue.literal(typePrefix)); } } @@ -158,6 +165,23 @@ public class ResourceReferenceConverter extends ResolvingConverter getResourceTypesInCurrentModule(@NotNull AndroidFacet facet) { + final Set result = new HashSet(); + final LocalResourceManager manager = facet.getLocalResourceManager(); + + for (VirtualFile resSubdir : manager.getResourceSubdirs(null)) { + final String resType = AndroidResourceUtil.getResourceTypeByDirName(resSubdir.getName()); + + if (resType != null && com.android.resources.ResourceType.getEnum(resType) != null) { + result.add(resType); + } + } + + result.addAll(manager.getValueResourceTypes()); + return result; + } @NotNull private String getTypePrefix(String resourcePackage, String type) { diff --git a/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java b/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java index 5a7a1f8d265f..750a3f0c882c 100644 --- a/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java +++ b/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java @@ -17,6 +17,7 @@ package org.jetbrains.android.resourceManagers; import com.android.AndroidConstants; +import com.android.resources.ResourceType; import com.intellij.CommonBundle; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; @@ -27,10 +28,14 @@ import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; +import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.xml.XmlFile; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.HashMap; import com.intellij.util.containers.HashSet; +import com.intellij.util.indexing.FileBasedIndex; import org.jetbrains.android.AndroidFileTemplateProvider; +import org.jetbrains.android.AndroidValueResourcesIndex; import org.jetbrains.android.actions.CreateResourceFileAction; import org.jetbrains.android.dom.attrs.AttributeDefinitions; import org.jetbrains.android.dom.resources.Attr; @@ -42,13 +47,12 @@ import org.jetbrains.android.facet.AndroidRootUtil; import org.jetbrains.android.util.AndroidBundle; import org.jetbrains.android.util.AndroidResourceUtil; import org.jetbrains.android.util.AndroidUtils; +import org.jetbrains.android.util.ResourceEntry; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; +import java.util.*; import static org.jetbrains.android.util.AndroidUtils.loadDomElement; @@ -135,6 +139,43 @@ public class LocalResourceManager extends ResourceManager { return facet != null ? facet.getLocalResourceManager() : null; } + @NotNull + public Set getValueResourceTypes() { + final Map> file2Types = new HashMap>(); + final FileBasedIndex index = FileBasedIndex.getInstance(); + final GlobalSearchScope scope = GlobalSearchScope.projectScope(myModule.getProject()); + + for (String resourceType : ResourceType.getNames()) { + final ResourceEntry typeMarkerEntry = AndroidValueResourcesIndex.createTypeMarkerEntry(resourceType); + + for (Set entrySet : index.getValues(AndroidValueResourcesIndex.INDEX_ID, typeMarkerEntry, scope)) { + for (ResourceEntry entry : entrySet) { + final Collection files = index.getContainingFiles(AndroidValueResourcesIndex.INDEX_ID, entry, scope); + + for (VirtualFile file : files) { + Set resourcesInFile = file2Types.get(file); + + if (resourcesInFile == null) { + resourcesInFile = new HashSet(); + file2Types.put(file, resourcesInFile); + } + resourcesInFile.add(entry.getType()); + } + } + } + } + final Set result = new HashSet(); + + for (VirtualFile file : getAllValueResourceFiles()) { + final Set types = file2Types.get(file); + + if (types != null) { + result.addAll(types); + } + } + return result; + } + @NotNull public AttributeDefinitions getAttributeDefinitions() { if (myAttrDefs == null) { From ac23b07e8241fe46b691ea69170697e008062159 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 31 Jan 2012 19:32:42 +0400 Subject: [PATCH 35/40] update tests --- .../org/jetbrains/android/dom/AndroidLayoutDomTest.java | 5 +---- .../org/jetbrains/android/dom/AndroidManifestDomTest.java | 7 +------ 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLayoutDomTest.java b/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLayoutDomTest.java index ebf4b0d9ac74..c326a2ae1dc2 100644 --- a/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLayoutDomTest.java +++ b/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLayoutDomTest.java @@ -9,7 +9,6 @@ import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; -import com.intellij.util.ArrayUtil; import java.io.IOException; import java.util.ArrayList; @@ -116,9 +115,7 @@ public class AndroidLayoutDomTest extends AndroidDomTest { public void testResourceCompletion() throws Throwable { doTestCompletionVariants("av3.xml", "@color/", "@android:", "@drawable/"); - List list = getAllResources(); - list.add("@android:"); - doTestCompletionVariants("av8.xml", ArrayUtil.toStringArray(list)); + doTestCompletionVariants("av8.xml", "@android:", "@anim/", "@color/", "@dimen/", "@drawable/", "@id/", "@layout/", "@string/", "@style/"); } public void testLocalResourceCompletion1() throws Throwable { diff --git a/plugins/android/testSrc/org/jetbrains/android/dom/AndroidManifestDomTest.java b/plugins/android/testSrc/org/jetbrains/android/dom/AndroidManifestDomTest.java index 0175d09e004d..5e06bc821029 100644 --- a/plugins/android/testSrc/org/jetbrains/android/dom/AndroidManifestDomTest.java +++ b/plugins/android/testSrc/org/jetbrains/android/dom/AndroidManifestDomTest.java @@ -1,11 +1,8 @@ package org.jetbrains.android.dom; import com.android.sdklib.SdkConstants; -import com.intellij.util.ArrayUtil; import org.jetbrains.android.inspections.AndroidUnknownAttributeInspection; -import java.util.List; - /** * @author coyote */ @@ -73,9 +70,7 @@ public class AndroidManifestDomTest extends AndroidDomTest { } public void testResourceCompletion3() throws Throwable { - List list = getAllResources(); - list.add("@android:"); - doTestCompletionVariants("av4.xml", ArrayUtil.toStringArray(list)); + doTestCompletionVariants("av4.xml", "@android:", "@anim/", "@color/", "@dimen/", "@drawable/", "@id/", "@string/", "@style/"); } public void testTagNameCompletion1() throws Throwable { From 1e09a09e791c7e6d0e56cfcab24ea93dfb01d331 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Wed, 1 Feb 2012 17:48:04 +0400 Subject: [PATCH 36/40] do not pack class files from dependent android app modules into apk --- .../src/org/jetbrains/android/facet/AndroidRootUtil.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidRootUtil.java b/plugins/android/src/org/jetbrains/android/facet/AndroidRootUtil.java index 34b5b2f15aa4..9633ed4c480a 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidRootUtil.java +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidRootUtil.java @@ -256,7 +256,8 @@ public class AndroidRootUtil { } } } - else { + // do not support android-app->android-app compile dependencies + else if (facet == null) { if (!outputDirs.contains(classDir) && classDir != null && classDir.exists()) { outputDirs.add(classDir); } From e80f4109bb96c2d9fd1322c14d874c0b45ffd60d Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Wed, 1 Feb 2012 17:48:42 +0400 Subject: [PATCH 37/40] android: install compile-dependent android apps too --- .../jetbrains/android/run/AndroidRunConfigurationBase.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationBase.java b/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationBase.java index ab6a6a3ab281..9675f7469784 100644 --- a/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationBase.java +++ b/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationBase.java @@ -31,7 +31,6 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.DependencyScope; import com.intellij.openapi.roots.ModuleOrderEntry; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.OrderEntry; @@ -158,7 +157,8 @@ public abstract class AndroidRunConfigurationBase extends ModuleBasedConfigurati TARGET_SELECTION_MODE = mode.name(); } - private static boolean fillRuntimeAndTestDependencies(@NotNull Module module, @NotNull Map module2PackageName) { + private static boolean fillRuntimeAndTestDependencies(@NotNull Module module, + @NotNull Map module2PackageName) { for (OrderEntry entry : ModuleRootManager.getInstance(module).getOrderEntries()) { if (entry instanceof ModuleOrderEntry) { ModuleOrderEntry moduleOrderEntry = (ModuleOrderEntry)entry; @@ -167,8 +167,7 @@ public abstract class AndroidRunConfigurationBase extends ModuleBasedConfigurati AndroidFacet depFacet = AndroidFacet.getInstance(depModule); if (depFacet != null && !module2PackageName.containsKey(depFacet) && - !depFacet.getConfiguration().LIBRARY_PROJECT && - moduleOrderEntry.getScope() != DependencyScope.COMPILE) { + !depFacet.getConfiguration().LIBRARY_PROJECT) { String packageName = getPackageName(depFacet); if (packageName == null) { return false; From 2d59b764163f3fa880341d3028069803b8909123 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Wed, 1 Feb 2012 17:49:44 +0400 Subject: [PATCH 38/40] fix running proguard --- .../android/compiler/AndroidDexCompiler.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompiler.java index 95fe18f85242..21e042f5c5ba 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompiler.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompiler.java @@ -105,11 +105,6 @@ public class AndroidDexCompiler implements ClassPostProcessingCompiler { } } } - - private static boolean shouldRunProguard(@NotNull AndroidFacet facet, @NotNull CompileContext context) { - return AndroidCompileUtil.isReleaseBuild(context) && - AndroidCompileUtil.getProguardConfigFile(facet) != null; - } private static final class PrepareAction implements Computable { private final CompileContext myContext; @@ -129,7 +124,10 @@ public class AndroidDexCompiler implements ClassPostProcessingCompiler { Collection files; - if (shouldRunProguard(facet, myContext)) { + final boolean shouldRunProguard = myContext.getCompileScope(). + getUserData(AndroidProguardCompiler.PROGUARD_CFG_PATH_KEY) != null; + + if (shouldRunProguard) { final VirtualFile obfuscatedSourcesJar = dexOutputDir.findChild(AndroidProguardCompiler.PROGUARD_OUTPUT_JAR_NAME); if (obfuscatedSourcesJar == null) { myContext.addMessage(CompilerMessageCategory.INFORMATION, "Dex won't be launched for module " + @@ -166,10 +164,10 @@ public class AndroidDexCompiler implements ClassPostProcessingCompiler { } } - VirtualFile outputDirForTests = extension.getCompilerOutputPathForTests(); + VirtualFile outputDirForTests = extension.getCompilerOutputPathForTests(); - if (outputDirForTests != null) { - addModuleOutputDir(files, outputDirForTests); + if (outputDirForTests != null) { + addModuleOutputDir(files, outputDirForTests); } } From a176ef425ad82b4e04b078a4f3bf270104c7b057 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Wed, 1 Feb 2012 19:27:44 +0400 Subject: [PATCH 39/40] VFs can be non-unique in jar fs, use paths instead --- .../android/sdk/AndroidSdkConfigurableForm.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkConfigurableForm.java b/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkConfigurableForm.java index 64916c814fc5..f51c00b5a798 100644 --- a/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkConfigurableForm.java +++ b/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkConfigurableForm.java @@ -76,10 +76,17 @@ class AndroidSdkConfigurableForm { final IAndroidTarget target = (IAndroidTarget)e.getItem(); List roots = AndroidSdkUtils.getLibraryRootsForTarget(target, mySdkLocation); - Map configuredRoots = new HashMap(); + Map configuredRoots = new HashMap(); for (OrderRootType type : OrderRootType.getAllTypes()) { - configuredRoots.put(type, sdkModificator.getRoots(type)); + final VirtualFile[] oldRoots = sdkModificator.getRoots(type); + final String[] oldRootPaths = new String[oldRoots.length]; + + for (int i = 0; i < oldRootPaths.length; i++) { + oldRootPaths[i] = oldRoots[i].getPath(); + } + + configuredRoots.put(type, oldRootPaths); } for (OrderRoot root : roots) { @@ -87,8 +94,8 @@ class AndroidSdkConfigurableForm { sdkModificator.removeRoot(root.getFile(), root.getType()); } else { - VirtualFile[] configuredRootsForType = configuredRoots.get(root.getType()); - if (ArrayUtil.find(configuredRootsForType, root.getFile()) == -1) { + String[] configuredRootsForType = configuredRoots.get(root.getType()); + if (ArrayUtil.find(configuredRootsForType, root.getFile().getPath()) == -1) { sdkModificator.addRoot(root.getFile(), root.getType()); } } From 793ad0d11a1d2f6fdd2cb10656c27ca77b347dd9 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Thu, 2 Feb 2012 15:59:36 +0400 Subject: [PATCH 40/40] IDEA-80640 setting if include test code and resources into apk --- .../messages/AndroidBundle.properties | 3 +- .../android/compiler/AndroidDexCompiler.java | 2 + .../android/compiler/AndroidIdlCompiler.java | 2 +- .../compiler/AndroidPackagingCompiler.java | 17 ++++--- .../facet/AndroidFacetConfiguration.java | 2 + .../android/facet/AndroidFacetEditorTab.form | 20 ++++++--- .../android/facet/AndroidFacetEditorTab.java | 7 +++ .../android/facet/AndroidRootUtil.java | 10 +---- .../newProject/AndroidModuleBuilder.java | 1 + .../android/run/AndroidRunConfiguration.java | 7 ++- .../run/AndroidRunConfigurationBase.java | 2 +- .../android/run/AndroidRunningState.java | 5 +-- .../testing/AndroidTestRunConfiguration.java | 44 ++++++++++++++++++- 13 files changed, 89 insertions(+), 33 deletions(-) diff --git a/plugins/android/resources/messages/AndroidBundle.properties b/plugins/android/resources/messages/AndroidBundle.properties index 4ed608cd7172..b32689f9ade4 100644 --- a/plugins/android/resources/messages/AndroidBundle.properties +++ b/plugins/android/resources/messages/AndroidBundle.properties @@ -322,4 +322,5 @@ android.lint.inspections.set.to.wrap.content=Replace size attribute with 'wrap_c android.lint.inspections.add.permission.attribute=Add 'permission' attribute android.lint.inspections.add.input.type.attribute=Add 'inputType' attribute android.lint.inspections.remove.unnecessary.view=Remove unnecessary view -android.lint.inspections.replace.with.suggested.characters=Replace with suggested characters \ No newline at end of file +android.lint.inspections.replace.with.suggested.characters=Replace with suggested characters +android.facet.settings.pack.test.sources=Include test code and resources into APK \ No newline at end of file diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompiler.java index 21e042f5c5ba..1be64ac6c0d4 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompiler.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompiler.java @@ -164,10 +164,12 @@ public class AndroidDexCompiler implements ClassPostProcessingCompiler { } } + if (facet.getConfiguration().PACK_TEST_CODE) { VirtualFile outputDirForTests = extension.getCompilerOutputPathForTests(); if (outputDirForTests != null) { addModuleOutputDir(files, outputDirForTests); + } } } diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidIdlCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidIdlCompiler.java index 594e6a40429c..dddc60b173d4 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidIdlCompiler.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidIdlCompiler.java @@ -226,7 +226,7 @@ public class AndroidIdlCompiler implements SourceGeneratingCompiler { } try { - VirtualFile[] sourceRoots = AndroidPackagingCompiler.getSourceRootsForModuleAndDependencies(idlItem.myModule); + VirtualFile[] sourceRoots = AndroidPackagingCompiler.getSourceRootsForModuleAndDependencies(idlItem.myModule, false); final String[] sourceRootPaths = AndroidCompileUtil.toOsPaths(sourceRoots); final Map> messages = AndroidIdl diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidPackagingCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidPackagingCompiler.java index 9fa3535efe81..d39188ed8012 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidPackagingCompiler.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidPackagingCompiler.java @@ -65,11 +65,14 @@ public class AndroidPackagingCompiler implements PackagingCompiler { return VirtualFile.EMPTY_ARRAY; } - private static void fillSourceRoots(@NotNull Module module, @NotNull Set visited, @NotNull Set result) { + private static void fillSourceRoots(@NotNull Module module, + @NotNull Set visited, + @NotNull Set result, + boolean includingTests) { visited.add(module); VirtualFile resDir = AndroidRootUtil.getResourceDir(module); ModuleRootManager manager = ModuleRootManager.getInstance(module); - for (VirtualFile sourceRoot : manager.getSourceRoots()) { + for (VirtualFile sourceRoot : manager.getSourceRoots(includingTests)) { if (resDir != sourceRoot) { result.add(sourceRoot); } @@ -78,10 +81,10 @@ public class AndroidPackagingCompiler implements PackagingCompiler { if (entry instanceof ModuleOrderEntry) { ModuleOrderEntry moduleOrderEntry = (ModuleOrderEntry)entry; DependencyScope scope = moduleOrderEntry.getScope(); - if (scope == DependencyScope.COMPILE || scope == DependencyScope.TEST) { + if (scope == DependencyScope.COMPILE) { Module depModule = moduleOrderEntry.getModule(); if (depModule != null && !visited.contains(depModule)) { - fillSourceRoots(depModule, visited, result); + fillSourceRoots(depModule, visited, result, false); } } } @@ -89,9 +92,9 @@ public class AndroidPackagingCompiler implements PackagingCompiler { } @NotNull - public static VirtualFile[] getSourceRootsForModuleAndDependencies(@NotNull Module module) { + public static VirtualFile[] getSourceRootsForModuleAndDependencies(@NotNull Module module, boolean includingTests) { Set result = new HashSet(); - fillSourceRoots(module, new HashSet(), result); + fillSourceRoots(module, new HashSet(), result, includingTests); return VfsUtil.toVirtualFileArray(result); } @@ -102,7 +105,7 @@ public class AndroidPackagingCompiler implements PackagingCompiler { AndroidFacet facet = AndroidFacet.getInstance(module); if (facet != null && !facet.getConfiguration().LIBRARY_PROJECT) { VirtualFile manifestFile = AndroidRootUtil.getManifestFileForCompiler(facet); - VirtualFile[] sourceRoots = getSourceRootsForModuleAndDependencies(module); + VirtualFile[] sourceRoots = getSourceRootsForModuleAndDependencies(module, facet.getConfiguration().PACK_TEST_CODE); if (manifestFile != null) { AndroidFacetConfiguration configuration = facet.getConfiguration(); VirtualFile outputDir = AndroidDexCompiler.getOutputDirectoryForDex(module); diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidFacetConfiguration.java b/plugins/android/src/org/jetbrains/android/facet/AndroidFacetConfiguration.java index 1e400ddc4cba..510911d99ac0 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidFacetConfiguration.java +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidFacetConfiguration.java @@ -81,6 +81,8 @@ public class AndroidFacetConfiguration implements FacetConfiguration { public String CUSTOM_DEBUG_KEYSTORE_PATH = ""; + public boolean PACK_TEST_CODE = false; + private AndroidFacet myFacet = null; public void init(@NotNull Module module, @NotNull VirtualFile contentRoot) { diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.form b/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.form index 73c9b53d0f2d..c588020758ea 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.form +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.form @@ -115,8 +115,8 @@ - - + + @@ -124,7 +124,7 @@ - + @@ -198,11 +198,11 @@ - + - + @@ -237,7 +237,7 @@ - + @@ -297,6 +297,14 @@ + + + + + + + + diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.java b/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.java index dbbdfa6fc0e2..658462b9787c 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.java +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.java @@ -93,6 +93,7 @@ public class AndroidFacetEditorTab extends FacetEditorTab { private JLabel myRGenPathLabel; private TextFieldWithBrowseButton myCustomDebugKeystoreField; private JBLabel myCustomKeystoreLabel; + private JCheckBox myIncludeTestCodeAndCheckBox; public AndroidFacetEditorTab(FacetEditorContext context, AndroidFacetConfiguration androidFacetConfiguration) { final Project project = context.getProject(); @@ -282,6 +283,9 @@ public class AndroidFacetEditorTab extends FacetEditorTab { if (!myConfiguration.CUSTOM_DEBUG_KEYSTORE_PATH.equals(getSelectedCustomKeystorePath())) { return true; } + if (myConfiguration.PACK_TEST_CODE != myIncludeTestCodeAndCheckBox.isSelected()) { + return true; + } return false; } @@ -390,6 +394,8 @@ public class AndroidFacetEditorTab extends FacetEditorTab { myConfiguration.RUN_PROCESS_RESOURCES_MAVEN_TASK = myRunProcessResourcesRadio.isSelected(); myConfiguration.GENERATE_UNSIGNED_APK = myGenerateUnsignedApk.isSelected(); + + myConfiguration.PACK_TEST_CODE = myIncludeTestCodeAndCheckBox.isSelected(); boolean useCustomAptSrc = myUseCustomSourceDirectoryRadio.isSelected(); @@ -513,6 +519,7 @@ public class AndroidFacetEditorTab extends FacetEditorTab { myCompileResourcesByIdeRadio.setSelected(!myConfiguration.RUN_PROCESS_RESOURCES_MAVEN_TASK); myGenerateUnsignedApk.setSelected(myConfiguration.GENERATE_UNSIGNED_APK); + myIncludeTestCodeAndCheckBox.setSelected(myConfiguration.PACK_TEST_CODE); updateAptPanel(); diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidRootUtil.java b/plugins/android/src/org/jetbrains/android/facet/AndroidRootUtil.java index 9633ed4c480a..0b7a0410bb6d 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidRootUtil.java +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidRootUtil.java @@ -257,14 +257,8 @@ public class AndroidRootUtil { } } // do not support android-app->android-app compile dependencies - else if (facet == null) { - if (!outputDirs.contains(classDir) && classDir != null && classDir.exists()) { - outputDirs.add(classDir); - } - VirtualFile classDirForTests = extension.getCompilerOutputPathForTests(); - if (!outputDirs.contains(classDirForTests) && classDirForTests != null && classDirForTests.exists()) { - outputDirs.add(classDirForTests); - } + else if (facet == null && !outputDirs.contains(classDir) && classDir != null && classDir.exists()) { + outputDirs.add(classDir); } } fillExternalLibrariesAndModules(depModule, outputDirs, libraries, visited, !libraryProject || exportedLibrariesOnly); diff --git a/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java b/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java index 35a6e6e89c82..672a47f4bb79 100644 --- a/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java +++ b/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java @@ -128,6 +128,7 @@ public class AndroidModuleBuilder extends JavaModuleBuilder { if (myProjectType == ProjectType.TEST) { assert myTestedModule != null; + facet.getConfiguration().PACK_TEST_CODE = true; ModuleOrderEntry entry = rootModel.addModuleOrderEntry(myTestedModule); entry.setScope(DependencyScope.PROVIDED); } diff --git a/plugins/android/src/org/jetbrains/android/run/AndroidRunConfiguration.java b/plugins/android/src/org/jetbrains/android/run/AndroidRunConfiguration.java index 436dbf46988b..ce0a5c8cf1c6 100644 --- a/plugins/android/src/org/jetbrains/android/run/AndroidRunConfiguration.java +++ b/plugins/android/src/org/jetbrains/android/run/AndroidRunConfiguration.java @@ -92,11 +92,10 @@ public class AndroidRunConfiguration extends AndroidRunConfigurationBase impleme } @Override - public RunProfileState getState(@NotNull Executor executor, @NotNull ExecutionEnvironment env) throws ExecutionException { - RunProfileState state = super.getState(executor, env); + public AndroidRunningState getState(@NotNull Executor executor, @NotNull ExecutionEnvironment env) throws ExecutionException { + AndroidRunningState state = super.getState(executor, env); if (state != null) { - assert state instanceof AndroidRunningState; - ((AndroidRunningState)state).setDeploy(DEPLOY); + state.setDeploy(DEPLOY); } return state; } diff --git a/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationBase.java b/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationBase.java index 9675f7469784..54e28b8b1012 100644 --- a/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationBase.java +++ b/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationBase.java @@ -183,7 +183,7 @@ public abstract class AndroidRunConfigurationBase extends ModuleBasedConfigurati return true; } - public RunProfileState getState(@NotNull final Executor executor, @NotNull ExecutionEnvironment env) throws ExecutionException { + public AndroidRunningState getState(@NotNull final Executor executor, @NotNull ExecutionEnvironment env) throws ExecutionException { final Module module = getConfigurationModule().getModule(); if (module == null) { throw new ExecutionException("Module is not found"); diff --git a/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java b/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java index 4f6233148d6f..976b7eb14a90 100644 --- a/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java +++ b/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java @@ -218,10 +218,6 @@ public abstract class AndroidRunningState implements RunProfileState, AndroidDeb return myLock; } - public AndroidFacet getAndroidFacet() { - return myFacet; - } - public String getPackageName() { return myPackageName; } @@ -230,6 +226,7 @@ public abstract class AndroidRunningState implements RunProfileState, AndroidDeb return myFacet.getModule(); } + @NotNull public AndroidFacet getFacet() { return myFacet; } diff --git a/plugins/android/src/org/jetbrains/android/run/testing/AndroidTestRunConfiguration.java b/plugins/android/src/org/jetbrains/android/run/testing/AndroidTestRunConfiguration.java index 9f64c41095cc..210a3984fc4d 100644 --- a/plugins/android/src/org/jetbrains/android/run/testing/AndroidTestRunConfiguration.java +++ b/plugins/android/src/org/jetbrains/android/run/testing/AndroidTestRunConfiguration.java @@ -28,6 +28,7 @@ import com.intellij.execution.Executor; import com.intellij.execution.configurations.*; import com.intellij.execution.junit.JUnitUtil; import com.intellij.execution.process.ProcessOutputTypes; +import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.execution.testframework.sm.SMTestRunnerConnectionUtil; import com.intellij.execution.testframework.ui.BaseTestsOutputConsoleView; import com.intellij.execution.ui.ConsoleView; @@ -35,6 +36,8 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.options.SettingsEditor; import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ModuleRootManager; +import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Disposer; import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiClass; @@ -43,6 +46,7 @@ import com.intellij.psi.PsiPackage; import org.jetbrains.android.dom.manifest.Instrumentation; import org.jetbrains.android.dom.manifest.Manifest; import org.jetbrains.android.facet.AndroidFacet; +import org.jetbrains.android.facet.AndroidFacetConfiguration; import org.jetbrains.android.run.AndroidApplicationLauncher; import org.jetbrains.android.run.AndroidRunConfigurationBase; import org.jetbrains.android.run.AndroidRunConfigurationEditor; @@ -108,6 +112,44 @@ public class AndroidTestRunConfiguration extends AndroidRunConfigurationBase { } } + @Override + public AndroidRunningState getState(@NotNull Executor executor, @NotNull ExecutionEnvironment env) throws ExecutionException { + final AndroidRunningState state = super.getState(executor, env); + + if (state == null) { + return null; + } + + final AndroidFacet facet = state.getFacet(); + final AndroidFacetConfiguration configuration = facet.getConfiguration(); + + if (!configuration.PACK_TEST_CODE) { + final Module module = facet.getModule(); + final int count = getTestSourceRootCount(module); + + if (count > 0) { + final String message = "Code and resources under test source " + (count > 1 ? "roots" : "root") + + " aren't included into debug APK.\nWould you like to include them and recompile " + + module.getName() + " module?" + "\n(You may change this option in Android facet settings later)"; + final int result = + Messages.showYesNoCancelDialog(getProject(), message, "Test code not included into APK", Messages.getQuestionIcon()); + + if (result == Messages.YES) { + configuration.PACK_TEST_CODE = true; + } + else if (result == Messages.CANCEL) { + return null; + } + } + } + return state; + } + + private static int getTestSourceRootCount(@NotNull Module module) { + final ModuleRootManager manager = ModuleRootManager.getInstance(module); + return manager.getSourceRoots(true).length - manager.getSourceRoots(false).length; + } + private void checkTestMethod() throws RuntimeConfigurationException { JavaRunConfigurationModule configurationModule = getConfigurationModule(); final PsiClass testClass = @@ -166,7 +208,7 @@ public class AndroidTestRunConfiguration extends AndroidRunConfigurationBase { BaseTestsOutputConsoleView consoleView = SMTestRunnerConnectionUtil .createAndAttachConsole("Android", state.getProcessHandler(), properties, state.getRunnerSettings(), state.getConfigurationSettings() ); - Disposer.register(state.getAndroidFacet().getModule().getProject(), consoleView); + Disposer.register(state.getFacet().getModule().getProject(), consoleView); return consoleView; }