diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java
index c081d03ff391..b803bc1d126d 100644
--- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java
+++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java
@@ -740,7 +740,7 @@ public class JavaCompletionUtil {
newElement = CodeInsightUtilBase.forcePsiPostprocessAndRestoreElement(newElement);
if (newElement != null) {
newEndOffset = newElement.getTextRange().getEndOffset();
- if (newElement instanceof PsiJavaCodeReferenceElement) {
+ if (newElement instanceof PsiJavaCodeReferenceElement && !(newElement instanceof PsiReferenceExpression)) {
PsiReferenceParameterList parameterList = ((PsiJavaCodeReferenceElement)newElement).getParameterList();
if (parameterList != null) {
newEndOffset = parameterList.getTextRange().getStartOffset();
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");
}
}
}
diff --git a/java/java-tests/testData/codeInsight/completion/normal/ClassNameDot.java b/java/java-tests/testData/codeInsight/completion/normal/ClassNameDot.java
new file mode 100644
index 000000000000..9646474f789a
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/completion/normal/ClassNameDot.java
@@ -0,0 +1,5 @@
+class Foo {
+ {
+ FIStr
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/completion/normal/ClassNameDot_after.java b/java/java-tests/testData/codeInsight/completion/normal/ClassNameDot_after.java
new file mode 100644
index 000000000000..33dc5773ce85
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/completion/normal/ClassNameDot_after.java
@@ -0,0 +1,7 @@
+import java.io.FileInputStream;
+
+class Foo {
+ {
+ FileInputStream.
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy
index e5203e7f1069..4adf38e80a35 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy
@@ -1264,4 +1264,6 @@ public class ListUtils {
public void testPackageInMemberType() { doTest() }
+ public void testClassNameDot() { doTest('.') }
+
}
diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java
index 11ef36a2f3f1..7ddfdc33a493 100644
--- a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java
+++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java
@@ -166,6 +166,8 @@ public class IncProjectBuilder {
context.processMessage(new ProgressMessage("Running 'after' tasks"));
runTasks(context, myBuilderRegistry.getAfterTasks());
+
+ context.processMessage(new ProgressMessage("Finished, saving caches..."));
}
private CompileContext createContext(CompileScope scope, boolean isMake, final boolean isProjectRebuild) throws ProjectBuildException {
diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java
index 9383724a555e..152a5fca45e1 100644
--- a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java
+++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java
@@ -727,7 +727,7 @@ public class JavaBuilder extends ModuleLevelBuilder {
myContext.processMessage(new ProgressMessage("Parsing sources..."));
}
else {
- if (!message.startsWith("total")) {
+ if (!message.startsWith("total ") && !message.startsWith("loading ") && !message.startsWith("wrote ")) {
myContext.processMessage(new ProgressMessage(FileUtil.toSystemDependentName(message)));
}
}
diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java b/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java
index c500c9d1b09a..23c124d3c631 100644
--- a/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java
+++ b/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java
@@ -1433,11 +1433,12 @@ public class Mappings {
debug("Dependent file: ", depFile);
final Collection depClusters = mySourceFileToUsages.get(depFile);
-
- for (UsageRepr.Cluster depCluster : depClusters) {
- final Set depUsages = depCluster.getUsages();
-
- if (depUsages != null) {
+ if (depClusters != null) {
+ for (UsageRepr.Cluster depCluster : depClusters) {
+ final Set depUsages = depCluster.getUsages();
+ if (depUsages == null) {
+ continue;
+ }
final Set usages = new HashSet(depUsages);
usages.retainAll(affectedUsages);
@@ -1512,15 +1513,17 @@ public class Mappings {
myClassToSubclasses.removeFrom(superSomething, cr.name);
}
- for (UsageRepr.Cluster cluster : clusters) {
- final Set usages = cluster.getUsages();
- if (usages != null) {
- for (UsageRepr.Usage u : usages) {
- if (u instanceof UsageRepr.ClassUsage) {
- final Set residents = cluster.getResidence(u);
+ if (clusters != null) {
+ for (UsageRepr.Cluster cluster : clusters) {
+ final Set usages = cluster.getUsages();
+ if (usages != null) {
+ for (UsageRepr.Usage u : usages) {
+ if (u instanceof UsageRepr.ClassUsage) {
+ final Set residents = cluster.getResidence(u);
- if (residents != null && residents.contains(cr.name)) {
- myClassToClassDependency.removeFrom(((UsageRepr.ClassUsage)u).className, cr.name);
+ if (residents != null && residents.contains(cr.name)) {
+ myClassToClassDependency.removeFrom(((UsageRepr.ClassUsage)u).className, cr.name);
+ }
}
}
}
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..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
@@ -25,30 +25,40 @@ 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) {
+ EntryInfo parentEntry = info.parent;
+ answer = new CoreJarVirtualFile(this, info, parentEntry != null ? getOrCreateFile(parentEntry, entries) : null);
+ 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..3827ecc2da66 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,51 @@ 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;
+
+ if (parent != null) {
+ 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 + "!/";
+
+ String parentPath = myParent.getPath();
+ StringBuilder answer = new StringBuilder(parentPath.length() + 1 + myEntry.shortName.length());
+ answer.append(parentPath);
+ if (answer.charAt(answer.length() - 1) != '/') {
+ answer.append('/');
+ }
+ answer.append(myEntry.shortName);
+
+ return answer.toString();
}
@Override
@@ -70,7 +77,7 @@ public class CoreJarVirtualFile extends VirtualFile {
@Override
public boolean isDirectory() {
- return myHandler.isDirectory(this);
+ return myEntry.isDirectory;
}
@Override
@@ -83,35 +90,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
diff --git a/platform/lang-api/src/com/intellij/openapi/module/ModifiableModuleModel.java b/platform/lang-api/src/com/intellij/openapi/module/ModifiableModuleModel.java
index bf7df2e7e171..4f33e81c9f68 100644
--- a/platform/lang-api/src/com/intellij/openapi/module/ModifiableModuleModel.java
+++ b/platform/lang-api/src/com/intellij/openapi/module/ModifiableModuleModel.java
@@ -137,4 +137,6 @@ public interface ModifiableModuleModel {
boolean hasModuleGroups();
void setModuleGroupPath(Module module, String[] groupPath);
+
+ void setModuleFilePath(Module module, String oldPath, String newFilePath);
}
diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/LiveTemplateCompletionContributor.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/LiveTemplateCompletionContributor.java
index 8679d726deb0..6c1bc1123a2b 100644
--- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/LiveTemplateCompletionContributor.java
+++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/LiveTemplateCompletionContributor.java
@@ -47,7 +47,7 @@ public class LiveTemplateCompletionContributor extends CompletionContributor {
final PsiFile file = parameters.getPosition().getContainingFile();
final int offset = parameters.getOffset();
final List templates = listApplicableTemplates(file, offset);
- if (Registry.is("show.live.templates.in.completion")) {
+ if (showAllTemplates()) {
final Ref templatesShown = Ref.create(false);
result.runRemainingContributors(parameters, new Consumer() {
@@ -78,6 +78,11 @@ public class LiveTemplateCompletionContributor extends CompletionContributor {
});
}
+ @SuppressWarnings("MethodMayBeStatic") //for Kotlin
+ protected boolean showAllTemplates() {
+ return Registry.is("show.live.templates.in.completion");
+ }
+
private static void ensureTemplatesShown(Ref templatesShown, List templates, CompletionResultSet result) {
if (!templatesShown.get()) {
templatesShown.set(true);
diff --git a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/GridCellImpl.java b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/GridCellImpl.java
index 1350d5fa0468..c85261cd83f8 100644
--- a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/GridCellImpl.java
+++ b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/GridCellImpl.java
@@ -449,9 +449,8 @@ public class GridCellImpl implements GridCell {
}
}
- private ActionCallback restore(Content content) {
+ ActionCallback restore(Content content) {
myMinimizedContents.remove(content);
- myContext.getContentManager().addContent(content);
return new ActionCallback.Done();
}
}
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 f256405b29e1..81f6cb266d6b 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
@@ -695,6 +695,27 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac
return (ActionGroup)myActionManager.getAction(SETTINGS);
}
+ public ContentManager getContentManager(Content content) {
+ if (hasContent(myManager, content)) {
+ return myManager;
+ }
+ for (RunnerContentUi child : myChildren) {
+ if (hasContent(child.myManager, content)) {
+ return child.myManager;
+ }
+ }
+ return myManager;
+ }
+
+ private static boolean hasContent(ContentManager manager, Content content) {
+ for (Content c : manager.getContents()) {
+ if (c == content) {
+ return true;
+ }
+ }
+ return false;
+ }
+
private static void moveFollowingTabs(int index, final JBRunnerTabs tabs) {
for (TabInfo info : tabs.getTabs()) {
final TabImpl tab = getTabFor(info);
@@ -1305,6 +1326,9 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac
final GridImpl grid = getGridFor(content, false);
if (grid == null) {
getStateFor(content).assignTab(myLayoutSettings.getOrCreateTab(-1));
+ } else {
+ //noinspection ConstantConditions
+ ((GridCellImpl)findCellFor(content)).restore(content);
}
getStateFor(content).setMinimizedInGrid(false);
myManager.addContent(content);
diff --git a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerLayout.java b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerLayout.java
index 851d3a42944c..2f6dbc88635c 100644
--- a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerLayout.java
+++ b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerLayout.java
@@ -174,7 +174,7 @@ public class RunnerLayout {
}
public boolean isToolbarHorizontal() {
- return myGeneral.horizontalToolbar;
+ return false;
}
public void setToolbarHorizontal(boolean horizontal) {
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 584d919fb087..c850e815f0e2 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
@@ -169,7 +169,11 @@ public class RunnerLayoutUiImpl implements Disposable, RunnerLayoutUi, LayoutSta
public ActionCallback selectAndFocus(@Nullable final Content content, boolean requestFocus, final boolean forced, boolean implicit) {
if (content == null) return new ActionCallback.Rejected();
- return getContentManager().setSelectedContent(content, requestFocus || shouldRequestFocus(), forced, implicit);
+ return getContentManager(content).setSelectedContent(content, requestFocus || shouldRequestFocus(), forced, implicit);
+ }
+
+ private ContentManager getContentManager(@NotNull Content content) {
+ return myContentUI.getContentManager(content);
}
private boolean shouldRequestFocus() {
diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/RenameModuleHandler.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/RenameModuleHandler.java
index 98e956b9f60c..2ec203bf6131 100644
--- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/RenameModuleHandler.java
+++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/RenameModuleHandler.java
@@ -22,6 +22,10 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.command.CommandProcessor;
+import com.intellij.openapi.command.undo.BasicUndoableAction;
+import com.intellij.openapi.command.undo.UndoManager;
+import com.intellij.openapi.command.undo.UndoableAction;
+import com.intellij.openapi.command.undo.UnexpectedUndoException;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.module.ModifiableModuleModel;
@@ -37,6 +41,7 @@ import com.intellij.psi.PsiFile;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.refactoring.rename.RenameHandler;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
/**
* @author dsl
@@ -86,6 +91,41 @@ public class RenameModuleHandler implements RenameHandler, TitledHandler {
}
public boolean canClose(final String inputString) {
+ final String oldName = myModule.getName();
+ final ModifiableModuleModel modifiableModel = renameModule(inputString);
+ if (modifiableModel == null) return false;
+ final Ref success = Ref.create(Boolean.TRUE);
+ CommandProcessor.getInstance().executeCommand(myProject, new Runnable() {
+ public void run() {
+ UndoableAction action = new BasicUndoableAction() {
+ public void undo() throws UnexpectedUndoException {
+ final ModifiableModuleModel modifiableModel = renameModule(oldName);
+ if (modifiableModel != null) {
+ modifiableModel.commit();
+ }
+ }
+
+ @Override
+ public void redo() throws UnexpectedUndoException {
+ final ModifiableModuleModel modifiableModel = renameModule(inputString);
+ if (modifiableModel != null) {
+ modifiableModel.commit();
+ }
+ }
+ };
+ UndoManager.getInstance(myProject).undoableActionPerformed(action);
+ ApplicationManager.getApplication().runWriteAction(new Runnable() {
+ public void run() {
+ modifiableModel.commit();
+ }
+ });
+ }
+ }, IdeBundle.message("command.renaming.module", oldName), null);
+ return success.get().booleanValue();
+ }
+
+ @Nullable
+ private ModifiableModuleModel renameModule(String inputString) {
final ModifiableModuleModel modifiableModel = ModuleManager.getInstance(myProject).getModifiableModel();
try {
modifiableModel.renameModule(myModule, inputString);
@@ -93,19 +133,9 @@ public class RenameModuleHandler implements RenameHandler, TitledHandler {
catch (ModuleWithNameAlreadyExists moduleWithNameAlreadyExists) {
Messages.showErrorDialog(myProject, IdeBundle.message("error.module.already.exists", inputString),
IdeBundle.message("title.rename.module"));
- return false;
+ return null;
}
- final Ref success = Ref.create(Boolean.TRUE);
- CommandProcessor.getInstance().executeCommand(myProject, new Runnable() {
- public void run() {
- ApplicationManager.getApplication().runWriteAction(new Runnable() {
- public void run() {
- modifiableModel.commit();
- }
- });
- }
- }, IdeBundle.message("command.renaming.module", myModule.getName()), null);
- return success.get().booleanValue();
+ return modifiableModel;
}
}
diff --git a/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleImpl.java b/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleImpl.java
index 423711e8b47c..f8dda219271d 100644
--- a/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleImpl.java
+++ b/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleImpl.java
@@ -29,6 +29,7 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.extensions.AreaInstance;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.extensions.Extensions;
+import com.intellij.openapi.module.ModifiableModuleModel;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleComponent;
import com.intellij.openapi.module.impl.scopes.ModuleWithDependenciesScope;
@@ -36,6 +37,7 @@ import com.intellij.openapi.module.impl.scopes.ModuleWithDependentsScope;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.impl.storage.ClasspathStorage;
import com.intellij.openapi.util.Comparing;
+import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.*;
import com.intellij.psi.search.GlobalSearchScope;
@@ -329,6 +331,20 @@ public class ModuleImpl extends ComponentManagerImpl implements Module {
final Object requestor = event.getRequestor();
if (MODULE_RENAMING_REQUESTOR.equals(requestor)) return;
if (!VirtualFile.PROP_NAME.equals(event.getPropertyName())) return;
+
+ final VirtualFile parent = event.getParent();
+ if (parent != null) {
+ final String parentPath = parent.getPath();
+ final String ancestorPath = parentPath + "/" + event.getOldValue();
+ final String moduleFilePath = getModuleFilePath();
+ if (VfsUtil.isAncestor(new File(ancestorPath), new File(moduleFilePath), true)) {
+ final String newValue = (String)event.getNewValue();
+ final String relativePath = FileUtil.getRelativePath(ancestorPath, moduleFilePath, '/');
+ final String newFilePath = parentPath + "/" + newValue + "/" + relativePath;
+ setModuleFilePath(moduleFilePath, newFilePath);
+ }
+ }
+
final VirtualFile moduleFile = getModuleFile();
if (moduleFile == null) return;
if (moduleFile.equals(event.getFile())) {
@@ -336,6 +352,29 @@ public class ModuleImpl extends ComponentManagerImpl implements Module {
ModuleManagerImpl.getInstanceImpl(getProject()).fireModuleRenamedByVfsEvent(ModuleImpl.this);
}
}
+
+ private void setModuleFilePath(String moduleFilePath, String newFilePath) {
+ ClasspathStorage.modulePathChanged(ModuleImpl.this, newFilePath);
+
+ final ModifiableModuleModel modifiableModel = ModuleManagerImpl.getInstanceImpl(getProject()).getModifiableModel();
+ modifiableModel.setModuleFilePath(ModuleImpl.this, moduleFilePath, newFilePath);
+ modifiableModel.commit();
+
+ getStateStore().setModuleFilePath(newFilePath);
+ }
+
+ @Override
+ public void fileMoved(VirtualFileMoveEvent event) {
+ final VirtualFile oldParent = event.getOldParent();
+ final VirtualFile newParent = event.getNewParent();
+ final String dirName = event.getFileName();
+ final String ancestorPath = oldParent.getPath() + "/" + dirName;
+ final String moduleFilePath = getModuleFilePath();
+ if (VfsUtil.isAncestor(new File(ancestorPath), new File(moduleFilePath), true)) {
+ final String relativePath = FileUtil.getRelativePath(ancestorPath, moduleFilePath, '/');
+ setModuleFilePath(moduleFilePath, newParent.getPath() + "/" + dirName + "/" + relativePath);
+ }
+ }
}
protected MutablePicoContainer createPicoContainer() {
diff --git a/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleManagerImpl.java b/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleManagerImpl.java
index 9cec66af96d5..4c7b91dcb961 100644
--- a/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleManagerImpl.java
+++ b/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleManagerImpl.java
@@ -919,6 +919,12 @@ public class ModuleManagerImpl extends ModuleManager implements ProjectComponent
myModuleGroupPath.put(module, groupPath);
}
}
+
+ @Override
+ public void setModuleFilePath(Module module, String oldPath, String newFilePath) {
+ myPathToModule.remove(oldPath);
+ myPathToModule.put(newFilePath, module);
+ }
}
private void commitModel(final ModuleModelImpl moduleModel, final Runnable runnable) {
diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorage.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorage.java
index 934b00982e0b..e4c70d8f3651 100644
--- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorage.java
+++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorage.java
@@ -328,6 +328,10 @@ public class ClasspathStorage implements StateStorage {
getProvider(getStorageType(module)).moduleRenamed(module, newName);
}
+ public static void modulePathChanged(Module module, String path) {
+ getProvider(getStorageType(module)).modulePathChanged(module, path);
+ }
+
private static class DefaultStorageProvider implements ClasspathStorageProvider {
@NonNls
public String getID() {
@@ -356,6 +360,10 @@ public class ClasspathStorage implements StateStorage {
public String getContentRoot(ModifiableRootModel model) {
return null;
}
+
+ @Override
+ public void modulePathChanged(Module module, String path) {
+ }
}
public static class UnsupportedStorageProvider implements ClasspathStorageProvider {
@@ -406,5 +414,10 @@ public class ClasspathStorage implements StateStorage {
public String getContentRoot(ModifiableRootModel model) {
return null;
}
+
+ @Override
+ public void modulePathChanged(Module module, String path) {
+ throw new UnsupportedOperationException(getDescription());
+ }
}
}
diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorageProvider.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorageProvider.java
index 66ef390a49d0..20935866199b 100644
--- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorageProvider.java
+++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorageProvider.java
@@ -53,6 +53,8 @@ public interface ClasspathStorageProvider {
String getContentRoot(ModifiableRootModel model);
+ void modulePathChanged(Module module, String path);
+
interface ClasspathConverter {
FileSet getFileSet();
diff --git a/platform/platform-api/src/com/intellij/ide/diff/DirDiffSettings.java b/platform/platform-api/src/com/intellij/ide/diff/DirDiffSettings.java
index d37ccdea1c8a..592607973708 100644
--- a/platform/platform-api/src/com/intellij/ide/diff/DirDiffSettings.java
+++ b/platform/platform-api/src/com/intellij/ide/diff/DirDiffSettings.java
@@ -38,6 +38,7 @@ public class DirDiffSettings {
public boolean showNewOnTarget = true;
public boolean showCompareModes = true;
public CompareMode compareMode = CompareMode.CONTENT;
+ public double compareTimestampAccuracy = 0;
public boolean showInFrame = true; // in dialog otherwise
diff --git a/platform/platform-api/src/com/intellij/openapi/ui/ComboBox.java b/platform/platform-api/src/com/intellij/openapi/ui/ComboBox.java
index 87a7b96aeb3e..b84c801e1b21 100644
--- a/platform/platform-api/src/com/intellij/openapi/ui/ComboBox.java
+++ b/platform/platform-api/src/com/intellij/openapi/ui/ComboBox.java
@@ -197,22 +197,10 @@ public class ComboBox extends ComboBoxWithWidePopup implements AWTEventListener
myMinimumAndPreferredWidth = minimumAndPreferredWidth;
}
- @Nullable
- private static DialogWrapperDialog getParentDialog(Component c) {
- do {
- if (c == null || c instanceof DialogWrapperDialog) {
- return (DialogWrapperDialog)c;
- }
- c = c.getParent();
- }
- while (true);
- }
-
private void registerCancelOnEscape() {
registerKeyboardAction(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
- final DialogWrapperDialog dialogWrapperDialog = getParentDialog(ComboBox.this);
- final DialogWrapper dialogWrapper = dialogWrapperDialog == null ? null : dialogWrapperDialog.getDialogWrapper();
+ final DialogWrapper dialogWrapper = DialogWrapper.findInstance(ComboBox.this);
if (isPopupVisible()) {
setPopupVisible(false);
diff --git a/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapper.java b/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapper.java
index ccd09e11ce14..093a628d51a7 100644
--- a/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapper.java
+++ b/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapper.java
@@ -1573,6 +1573,17 @@ public abstract class DialogWrapper {
}, 300, null);
}
+ @Nullable
+ public static DialogWrapper findInstance(Component c) {
+ while (c != null){
+ if (c instanceof DialogWrapperDialog) {
+ return ((DialogWrapperDialog)c).getDialogWrapper();
+ }
+ c = c.getParent();
+ }
+ return null;
+ }
+
private void updateHeightForErrorText() {
if (getRootPane() == null) return;
diff --git a/platform/platform-impl/src/com/intellij/notification/EventLog.java b/platform/platform-impl/src/com/intellij/notification/EventLog.java
index 310e5544c0e8..0ba18358cf37 100644
--- a/platform/platform-impl/src/com/intellij/notification/EventLog.java
+++ b/platform/platform-impl/src/com/intellij/notification/EventLog.java
@@ -46,6 +46,7 @@ import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.ui.awt.RelativePoint;
import com.intellij.ui.content.Content;
import com.intellij.ui.content.ContentFactory;
+import com.intellij.util.containers.CollectionFactory;
import com.intellij.util.containers.hash.LinkedHashMap;
import com.intellij.util.text.CharArrayUtil;
import org.jetbrains.annotations.NonNls;
@@ -58,6 +59,7 @@ import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.regex.Matcher;
@@ -74,6 +76,7 @@ public class EventLog implements Notifications {
private static final String A_CLOSING = "";
private static final Pattern TAG_PATTERN = Pattern.compile("<[^>]*>");
private static final Pattern A_PATTERN = Pattern.compile("]* )?href=[\"\']([^>]*)[\"\'][^>]*>");
+ private static final Set NEW_LINES = CollectionFactory.newSet("
", "", "
", "", "
", "");
public EventLog() {
ApplicationManager.getApplication().getMessageBus().connect().subscribe(Notifications.TOPIC, this);
@@ -188,11 +191,7 @@ public class EventLog implements Notifications {
}
hasHtml = true;
- if ("
".equals(tagStart) ||
- "".equals(tagStart) ||
- "
".equals(tagStart) ||
- "".equals(tagStart) ||
- "
".equals(tagStart)) {
+ if (NEW_LINES.contains(tagStart)) {
lineSeparators.add(document.createRangeMarker(TextRange.from(document.getTextLength(), 0)));
}
else if (!"".equals(tagStart) && !"".equals(tagStart) && !"".equals(tagStart) && !"".equals(tagStart)) {
@@ -219,7 +218,7 @@ public class EventLog implements Notifications {
if (offset < document.getTextLength()) {
boolean spaceAfter = Character.isWhitespace(document.getCharsSequence().charAt(offset));
int next = CharArrayUtil.shiftForward(document.getCharsSequence(), offset, " \t");
- if (next < document.getTextLength() && Character.isUpperCase(document.getCharsSequence().charAt(next))) {
+ if (next < document.getTextLength() && !Character.isLowerCase(document.getCharsSequence().charAt(next))) {
document.insertString(offset, (spaceBefore ? "" : " ") + "//" + (spaceAfter ? "" : " "));
continue;
}
diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/Win32LocalFileSystem.java b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/Win32LocalFileSystem.java
index c69ca7f5379c..81e6f06cf1c4 100644
--- a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/Win32LocalFileSystem.java
+++ b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/win32/Win32LocalFileSystem.java
@@ -20,6 +20,7 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.impl.local.LocalFileSystemBase;
+import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.NotNull;
import java.io.FileNotFoundException;
@@ -91,6 +92,10 @@ public class Win32LocalFileSystem extends LocalFileSystemBase {
@NotNull
@Override
public String[] list(@NotNull VirtualFile file) {
+ if (isInvalidSymLink(file)) {
+ return ArrayUtil.EMPTY_STRING_ARRAY;
+ }
+
try {
String[] strings = myKernel.list(file.getPath());
if (checkMe && !Arrays.asList(strings).equals(Arrays.asList(super.list(file)))) {
diff --git a/platform/platform-tests/testSrc/com/intellij/notification/EventLogTest.groovy b/platform/platform-tests/testSrc/com/intellij/notification/EventLogTest.groovy
index e15a4d732592..5c0c049b42a9 100644
--- a/platform/platform-tests/testSrc/com/intellij/notification/EventLogTest.groovy
+++ b/platform/platform-tests/testSrc/com/intellij/notification/EventLogTest.groovy
@@ -68,4 +68,10 @@ class EventLogTest extends LightPlatformTestCase {
assert entry.message == 'link: content (show balloon)'
}
+ public void testVariousNewlines() throws Exception {
+ assert EventLog.formatForLog(new Notification("xxx", 'title', "foo
bar", NotificationType.ERROR)).message == 'title: foo bar'
+ assert EventLog.formatForLog(new Notification("xxx", 'title', "foo
/bar", NotificationType.ERROR)).message == 'title: foo // /bar'
+ assert EventLog.formatForLog(new Notification("xxx", 'title', "foo
Bar", NotificationType.ERROR)).message == 'title: foo // Bar'
+ }
+
}
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 c76e5a112113..a3ea474cd6c9 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
@@ -44,7 +44,10 @@ public class SymLinkHandlingTest extends LightPlatformLangTestCase {
}
public void testBadLinksAreIgnored() throws Exception {
- if (!SystemInfo.areSymLinksSupported) return;
+ if (!SystemInfo.areSymLinksSupported) {
+ System.out.println("Test not passed");
+ return;
+ }
final File missingFile = new File(FileUtil.getTempDirectory(), "missing_file");
assertTrue(missingFile.getAbsolutePath(), !missingFile.exists() || missingFile.delete());
diff --git a/platform/util/src/com/intellij/execution/process/UnixProcessManager.java b/platform/util/src/com/intellij/execution/process/UnixProcessManager.java
index 965953f761b2..73b60845b61e 100644
--- a/platform/util/src/com/intellij/execution/process/UnixProcessManager.java
+++ b/platform/util/src/com/intellij/execution/process/UnixProcessManager.java
@@ -152,7 +152,7 @@ public class UnixProcessManager {
result = false;
}
- StringBuffer errorStr = new StringBuffer();
+ StringBuilder errorStr = new StringBuilder();
while ((s = stdError.readLine()) != null) {
errorStr.append(s).append("\n");
}
@@ -172,24 +172,21 @@ public class UnixProcessManager {
}
public static String[] getPSCmd(boolean commandLineOnly) {
+ String psCommand = "/bin/ps";
+ if (!new File(psCommand).isFile()) {
+ psCommand = "ps";
+ }
if (SystemInfo.isLinux) {
- return new String[]{"ps", "-e", "e", "--format", commandLineOnly ? "%a" : "%P%p%a"};
+ return new String[]{psCommand, "-e", "--format", commandLineOnly ? "%a" : "%P%p%a"};
}
- 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 if (SystemInfo.isMac || SystemInfo.isFreeBSD) {
+ return new String[]{psCommand, "-ax", "-o", commandLineOnly ? "command" : "ppid,pid,command"};
}
else {
throw new IllegalStateException(System.getProperty("os.name") + " is not supported.");
}
}
- public static boolean containsMarker(@NotNull String environ, @NotNull String uid) {
- return environ.contains(uid);
- }
-
@NotNull
public static String readProcEnviron(int child_pid) throws FileNotFoundException {
StringBuffer res = new StringBuffer();
diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DTree.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DTree.java
index fc0aadd8898e..55f79ac29eb4 100644
--- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DTree.java
+++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DTree.java
@@ -162,7 +162,7 @@ public class DTree {
dtype = isEqual(src, trg) ? DType.EQUAL : DType.CHANGED;
break;
case TIMESTAMP:
- dtype = src.getTimeStamp() == trg.getTimeStamp() ? DType.EQUAL : DType.CHANGED;
+ dtype = Math.abs(src.getTimeStamp() - trg.getTimeStamp()) <= settings.compareTimestampAccuracy ? DType.EQUAL : DType.CHANGED;
break;
}
}
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/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);
diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidDexCompiler.java
index 95fe18f85242..1be64ac6c0d4 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,12 @@ public class AndroidDexCompiler implements ClassPostProcessingCompiler {
}
}
- VirtualFile outputDirForTests = extension.getCompilerOutputPathForTests();
+ if (facet.getConfiguration().PACK_TEST_CODE) {
+ VirtualFile outputDirForTests = extension.getCompilerOutputPathForTests();
- if (outputDirForTests != null) {
- addModuleOutputDir(files, outputDirForTests);
+ 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/dom/converters/ResourceReferenceConverter.java b/plugins/android/src/org/jetbrains/android/dom/converters/ResourceReferenceConverter.java
index 28d55346b78c..4e2d2eee87a4 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,8 @@ 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.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiReference;
@@ -30,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;
@@ -110,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) {
@@ -122,7 +125,7 @@ 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));
}
}
@@ -157,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/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/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();
}
diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidRootUtil.java b/plugins/android/src/org/jetbrains/android/facet/AndroidRootUtil.java
index 34b5b2f15aa4..0b7a0410bb6d 100644
--- a/plugins/android/src/org/jetbrains/android/facet/AndroidRootUtil.java
+++ b/plugins/android/src/org/jetbrains/android/facet/AndroidRootUtil.java
@@ -256,14 +256,9 @@ public class AndroidRootUtil {
}
}
}
- else {
- 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);
- }
+ // do not support android-app->android-app compile dependencies
+ 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/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) {
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 ab6a6a3ab281..54e28b8b1012 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;
@@ -184,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;
}
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());
}
}
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);
}
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 {
diff --git a/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseClasspathStorageProvider.java b/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseClasspathStorageProvider.java
index 6a26285225b3..28471448c01d 100644
--- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseClasspathStorageProvider.java
+++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseClasspathStorageProvider.java
@@ -103,6 +103,14 @@ public class EclipseClasspathStorageProvider implements ClasspathStorageProvider
return model.getContentRoots()[0].getPath();
}
+ @Override
+ public void modulePathChanged(Module module, String path) {
+ final EclipseModuleManager moduleManager = EclipseModuleManager.getInstance(module);
+ if (moduleManager != null) {
+ moduleManager.setDocumentSet(null);
+ }
+ }
+
public static void registerFiles(final CachedXmlDocumentSet fileCache, final Module module, final String moduleRoot, final String storageRoot) {
fileCache.register(EclipseXml.CLASSPATH_FILE, storageRoot);
fileCache.register(EclipseXml.PROJECT_FILE, storageRoot);
diff --git a/plugins/git4idea/src/git4idea/push/GitPushResult.java b/plugins/git4idea/src/git4idea/push/GitPushResult.java
index 5cb5542a358f..3d327d591431 100644
--- a/plugins/git4idea/src/git4idea/push/GitPushResult.java
+++ b/plugins/git4idea/src/git4idea/push/GitPushResult.java
@@ -264,11 +264,7 @@ class GitPushResult {
notificationType = NotificationType.WARNING;
} else {
notificationType = NotificationType.INFORMATION;
- if (pushedCommitsNumber == 0) { // happens on new branch creation
- title = "Pushed successfully";
- } else {
- title = "Pushed " + pushedCommitsNumber + " " + StringUtil.pluralize("commit", pushedCommitsNumber);
- }
+ title = "Push successful";
}
String errorReport = reportForGroup(groupedResult.myErrorResults, GroupedResult.Type.ERROR);
diff --git a/plugins/junit/src/com/intellij/execution/junit/TestClass.java b/plugins/junit/src/com/intellij/execution/junit/TestClass.java
index 25acd5c5fa45..5fe8a2b08b87 100644
--- a/plugins/junit/src/com/intellij/execution/junit/TestClass.java
+++ b/plugins/junit/src/com/intellij/execution/junit/TestClass.java
@@ -16,7 +16,10 @@
package com.intellij.execution.junit;
-import com.intellij.execution.*;
+import com.intellij.execution.ExecutionBundle;
+import com.intellij.execution.ExecutionException;
+import com.intellij.execution.JavaExecutionUtil;
+import com.intellij.execution.ProgramRunnerUtil;
import com.intellij.execution.configurations.*;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
@@ -24,9 +27,7 @@ import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiPackage;
-import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.refactoring.listeners.RefactoringElementListener;
-import com.intellij.rt.execution.junit.JUnitStarter;
class TestClass extends TestObject {
public TestClass(final Project project,
@@ -41,11 +42,6 @@ class TestClass extends TestObject {
final JUnitConfiguration.Data data = myConfiguration.getPersistentData();
RunConfigurationModule module = myConfiguration.getConfigurationModule();
configureModule(myJavaParameters, module, data.getMainClassName());
- final Project project = module.getProject();
- final PsiClass psiClass = JavaExecutionUtil.findMainClass(project, data.getMainClassName(), GlobalSearchScope.allScope(project));
- if (JUnitUtil.isJUnit4TestClass(psiClass)) {
- myJavaParameters.getProgramParametersList().add(JUnitStarter.JUNIT4_PARAMETER);
- }
myJavaParameters.getProgramParametersList().add(data.getMainClassName());
}
diff --git a/plugins/junit/src/com/intellij/execution/junit/TestMethod.java b/plugins/junit/src/com/intellij/execution/junit/TestMethod.java
index e84c0ff0bc7a..8ad7f6245043 100644
--- a/plugins/junit/src/com/intellij/execution/junit/TestMethod.java
+++ b/plugins/junit/src/com/intellij/execution/junit/TestMethod.java
@@ -25,11 +25,9 @@ import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiPackage;
-import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.refactoring.listeners.RefactoringElementAdapter;
import com.intellij.refactoring.listeners.RefactoringElementListener;
import com.intellij.refactoring.listeners.UndoRefactoringElementListener;
-import com.intellij.rt.execution.junit.JUnitStarter;
import org.jetbrains.annotations.NotNull;
class TestMethod extends TestObject {
@@ -45,8 +43,6 @@ class TestMethod extends TestObject {
final JUnitConfiguration.Data data = myConfiguration.getPersistentData();
RunConfigurationModule module = myConfiguration.getConfigurationModule();
configureModule(getJavaParameters(), module, data.getMainClassName());
- addJUnit4Parameter(data, module.getProject());
-
getJavaParameters().getProgramParametersList().add(data.getMainClassName() + "," + data.getMethodName());
}
@@ -54,23 +50,6 @@ class TestMethod extends TestObject {
super.initialize();
}
- protected void addJUnit4Parameter(final JUnitConfiguration.Data data, Project project) {
- final PsiClass psiClass = JavaExecutionUtil.findMainClass(project, data.getMainClassName(), GlobalSearchScope.allScope(project));
- LOG.assertTrue(psiClass != null);
- if (JUnitUtil.isJUnit4TestClass(psiClass)) {
- myJavaParameters.getProgramParametersList().add(JUnitStarter.JUNIT4_PARAMETER);
- return;
- }
- final String methodName = data.getMethodName();
- PsiMethod[] methods = psiClass.findMethodsByName(methodName, true);
- for (PsiMethod method : methods) {
- if (JUnitUtil.isTestAnnotated(method)) {
- myJavaParameters.getProgramParametersList().add(JUnitStarter.JUNIT4_PARAMETER);
- break;
- }
- }
- }
-
public String suggestActionName() {
return ProgramRunnerUtil.shortenName(myConfiguration.getPersistentData().METHOD_NAME, 2) + "()";
}
diff --git a/plugins/junit/src/com/intellij/execution/junit/TestMethods.java b/plugins/junit/src/com/intellij/execution/junit/TestMethods.java
index 46610b5decb1..14fe7cb6cbcf 100644
--- a/plugins/junit/src/com/intellij/execution/junit/TestMethods.java
+++ b/plugins/junit/src/com/intellij/execution/junit/TestMethods.java
@@ -33,7 +33,6 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiMethod;
-import com.intellij.rt.execution.junit.JUnitStarter;
import com.intellij.util.Function;
import java.util.Collection;
@@ -58,7 +57,6 @@ public class TestMethods extends TestMethod {
final JUnitConfiguration.Data data = myConfiguration.getPersistentData();
RunConfigurationModule module = myConfiguration.getConfigurationModule();
final Project project = module.getProject();
- addJUnit4Parameter(data, project);
final ExecutionException[] exception = new ExecutionException[1];
ApplicationManager.getApplication().runReadAction(new Runnable() {
public void run() {
@@ -92,21 +90,6 @@ public class TestMethods extends TestMethod {
}, data.getPackageName(), true, false);
}
- protected void addJUnit4Parameter(final JUnitConfiguration.Data data, Project project) {
- for (AbstractTestProxy failedTest : myFailedTests) {
- Location location = failedTest.getLocation(project);
- if (!(location instanceof MethodLocation)) continue;
- if (JUnitUtil.isJUnit4TestClass(((MethodLocation)location).getContainingClass())) {
- myJavaParameters.getProgramParametersList().add(JUnitStarter.JUNIT4_PARAMETER);
- return;
- }
- PsiMethod method = ((MethodLocation)location).getPsiElement();
- if (JUnitUtil.isTestAnnotated(method)) {
- myJavaParameters.getProgramParametersList().add(JUnitStarter.JUNIT4_PARAMETER);
- return;
- }
- }
- }
public String suggestActionName() {
return ActionsBundle.message("action.RerunFailedTests.text");
diff --git a/plugins/junit/src/com/intellij/execution/junit/TestObject.java b/plugins/junit/src/com/intellij/execution/junit/TestObject.java
index b3a288099cb6..c8ba4cafcc8a 100644
--- a/plugins/junit/src/com/intellij/execution/junit/TestObject.java
+++ b/plugins/junit/src/com/intellij/execution/junit/TestObject.java
@@ -399,7 +399,6 @@ public abstract class TestObject implements JavaCommandLine {
final PrintWriter writer = new PrintWriter(myTempFile, "UTF-8");
try {
- writer.println(junit4 ? JUnitStarter.JUNIT4_PARAMETER : "-junit3");
writer.println(packageName);
final List testNames = new ArrayList();
for (final T element : elements) {
diff --git a/plugins/junit_rt/src/com/intellij/junit3/TestRunnerUtil.java b/plugins/junit_rt/src/com/intellij/junit3/TestRunnerUtil.java
index db09301dbab4..e6b94fb176b8 100644
--- a/plugins/junit_rt/src/com/intellij/junit3/TestRunnerUtil.java
+++ b/plugins/junit_rt/src/com/intellij/junit3/TestRunnerUtil.java
@@ -51,7 +51,6 @@ public class TestRunnerUtil {
BufferedReader reader = new BufferedReader(new FileReader(suiteClassName.substring(1)));
Vector vector;
try {
- reader.readLine(); //skip junit4/junit3 parameter
suiteName = reader.readLine();
vector = new Vector();
String line;
diff --git a/plugins/junit_rt/src/com/intellij/junit4/JUnit4TestRunnerUtil.java b/plugins/junit_rt/src/com/intellij/junit4/JUnit4TestRunnerUtil.java
index 95cf1181ab5d..75a4d4d32af7 100644
--- a/plugins/junit_rt/src/com/intellij/junit4/JUnit4TestRunnerUtil.java
+++ b/plugins/junit_rt/src/com/intellij/junit4/JUnit4TestRunnerUtil.java
@@ -17,8 +17,6 @@ package com.intellij.junit4;
import org.junit.Ignore;
import org.junit.internal.AssumptionViolatedException;
-import org.junit.internal.builders.AllDefaultPossibilitiesBuilder;
-import org.junit.internal.builders.AnnotatedBuilder;
import org.junit.internal.requests.ClassRequest;
import org.junit.internal.runners.model.EachTestNotifier;
import org.junit.runner.Description;
@@ -29,14 +27,11 @@ import org.junit.runner.manipulation.Filter;
import org.junit.runner.notification.RunNotifier;
import org.junit.runners.BlockJUnit4ClassRunner;
import org.junit.runners.Parameterized;
-import org.junit.runners.ParentRunner;
import org.junit.runners.model.FrameworkMethod;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.MessageFormat;
import java.util.*;
@@ -60,7 +55,6 @@ public class JUnit4TestRunnerUtil {
final Map classMethods = new HashMap();
BufferedReader reader = new BufferedReader(new FileReader(suiteClassName.substring(1)));
try {
- reader.readLine(); //skip junit4/junit3 parameter
final String packageName = reader.readLine();
String line;
diff --git a/plugins/junit_rt/src/com/intellij/rt/execution/junit/JUnitStarter.java b/plugins/junit_rt/src/com/intellij/rt/execution/junit/JUnitStarter.java
index f492409c9e18..376f1e749890 100644
--- a/plugins/junit_rt/src/com/intellij/rt/execution/junit/JUnitStarter.java
+++ b/plugins/junit_rt/src/com/intellij/rt/execution/junit/JUnitStarter.java
@@ -32,7 +32,6 @@ import java.util.Vector;
public class JUnitStarter {
public static final int VERSION = 5;
public static final String IDE_VERSION = "-ideVersion";
- public static final String JUNIT4_PARAMETER = "-junit4";
private static final String SOCKET = "-socket";
private static String ourForkMode;
private static String ourCommandFileName;
@@ -65,17 +64,12 @@ public class JUnitStarter {
}
private static boolean processParameters(Vector args, final List listeners) {
- boolean isJunit4 = false;
- String tempFilePath = null;
Vector result = new Vector(args.size());
for (int i = 0; i < args.size(); i++) {
String arg = (String)args.get(i);
if (arg.startsWith(IDE_VERSION)) {
//ignore
}
- else if (arg.equals(JUNIT4_PARAMETER)){
- isJunit4 = true;
- }
else {
if (arg.startsWith("@@@")) {
final int pos = arg.indexOf(',');
@@ -96,8 +90,6 @@ public class JUnitStarter {
}
}
continue;
- } else if (arg.startsWith("@")) {
- tempFilePath = arg.substring(1);
} else if (arg.startsWith(SOCKET)) {
final int port = Integer.parseInt(arg.substring(SOCKET.length()));
try {
@@ -114,37 +106,25 @@ public class JUnitStarter {
e.printStackTrace();
}
- isJunit4 = isJUnit4(isJunit4, tempFilePath);
continue;
}
result.addElement(arg);
}
}
- if (tempFilePath != null && !args.contains(SOCKET)) {
- isJunit4 = isJUnit4(isJunit4, tempFilePath);
- }
args.removeAllElements();
for (int i = 0; i < result.size(); i++) {
String arg = (String)result.get(i);
args.addElement(arg);
}
- return isJunit4;
- }
-
- private static boolean isJUnit4(boolean junit4, String tempFilePath) {
+ final String forceJUnit3 = System.getProperty("idea.force.junit3");
+ if (forceJUnit3 != null && Boolean.valueOf(forceJUnit3).booleanValue()) return false;
try {
- BufferedReader reader = new BufferedReader(new FileReader(tempFilePath));
- try {
- junit4 |= JUNIT4_PARAMETER.equals(reader.readLine());
- }
- finally {
- reader.close();
- }
+ Class.forName("org.junit.Test");
+ return true;
}
- catch (IOException e) {
- e.printStackTrace();
+ catch (ClassNotFoundException e) {
+ return false;
}
- return junit4;
}
public static boolean checkVersion(String[] args, SegmentedOutputStream notifications) {
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 extends Annotation> annotationType() {
- return Required.class;
+ return 2;
}
}
+
}
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/model/completion/MavenSmartCompletionContributor.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/model/completion/MavenSmartCompletionContributor.java
index 52c2b2616f71..e4b1c51c854b 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/model/completion/MavenSmartCompletionContributor.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/model/completion/MavenSmartCompletionContributor.java
@@ -20,12 +20,9 @@ import com.intellij.codeInsight.completion.CompletionContributor;
import com.intellij.codeInsight.completion.CompletionParameters;
import com.intellij.codeInsight.completion.CompletionResultSet;
import com.intellij.codeInsight.completion.CompletionType;
-import com.intellij.codeInsight.lookup.LookupElement;
-import com.intellij.codeInsight.lookup.LookupElementBuilder;
+import com.intellij.openapi.application.AccessToken;
import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.util.Computable;
import com.intellij.psi.PsiElement;
-import com.intellij.psi.PsiNamedElement;
import com.intellij.psi.PsiReference;
import com.intellij.psi.impl.source.xml.TagNameReference;
import com.intellij.psi.xml.XmlText;
@@ -46,12 +43,8 @@ public class MavenSmartCompletionContributor extends CompletionContributor {
public void fillCompletionVariants(final CompletionParameters parameters, CompletionResultSet result) {
if (parameters.getCompletionType() != CompletionType.SMART) return;
- Collection> variants = ApplicationManager.getApplication().runReadAction(new Computable>() {
- @Override
- public Collection> compute() {
- return getVariants(parameters);
- }
- });
+ Collection> variants = getVariants(parameters);
+
MavenPropertyCompletionContributor.addVariants(variants, result);
}
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/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";
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenFoldersImporter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenFoldersImporter.java
index 8a8073d2d34d..2cf3f3aed5bc 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenFoldersImporter.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenFoldersImporter.java
@@ -15,7 +15,8 @@
*/
package org.jetbrains.idea.maven.importing;
-import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.application.AccessToken;
+import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.project.Project;
@@ -29,7 +30,6 @@ import org.jetbrains.idea.maven.project.MavenImportingSettings;
import org.jetbrains.idea.maven.project.MavenProject;
import org.jetbrains.idea.maven.project.MavenProjectsManager;
import org.jetbrains.idea.maven.utils.Path;
-import org.jetbrains.idea.maven.utils.Url;
import java.io.File;
import java.util.ArrayList;
@@ -45,31 +45,33 @@ public class MavenFoldersImporter {
final MavenProjectsManager manager = MavenProjectsManager.getInstance(project);
final MavenImportingSettings settings = manager.getImportingSettings();
- ApplicationManager.getApplication().runWriteAction(new Runnable() {
- public void run() {
- List rootModels = new ArrayList();
- for (Module each : ModuleManager.getInstance(project).getModules()) {
- MavenProject mavenProject = manager.findProject(each);
- if (mavenProject == null) continue;
+ AccessToken accessToken = WriteAction.start();
+ try {
+ List rootModels = new ArrayList();
+ for (Module each : ModuleManager.getInstance(project).getModules()) {
+ MavenProject mavenProject = manager.findProject(each);
+ if (mavenProject == null) continue;
- MavenRootModelAdapter a = new MavenRootModelAdapter(mavenProject, each, new MavenDefaultModifiableModelsProvider(project));
- new MavenFoldersImporter(mavenProject, settings, a).config(updateTargetFoldersOnly);
+ MavenRootModelAdapter a = new MavenRootModelAdapter(mavenProject, each, new MavenDefaultModifiableModelsProvider(project));
+ new MavenFoldersImporter(mavenProject, settings, a).config(updateTargetFoldersOnly);
- ModifiableRootModel model = a.getRootModel();
- if (model.isChanged()) {
- rootModels.add(model);
- }
- else {
- model.dispose();
- }
+ ModifiableRootModel model = a.getRootModel();
+ if (model.isChanged()) {
+ rootModels.add(model);
}
-
- if (!rootModels.isEmpty()) {
- ModifiableRootModel[] modelsArray = rootModels.toArray(new ModifiableRootModel[rootModels.size()]);
- ProjectRootManager.getInstance(project).multiCommit(modelsArray);
+ else {
+ model.dispose();
}
}
- });
+
+ if (!rootModels.isEmpty()) {
+ ModifiableRootModel[] modelsArray = rootModels.toArray(new ModifiableRootModel[rootModels.size()]);
+ ProjectRootManager.getInstance(project).multiCommit(modelsArray);
+ }
+ }
+ finally {
+ accessToken.finish();
+ }
}
public MavenFoldersImporter(MavenProject mavenProject, MavenImportingSettings settings, MavenRootModelAdapter model) {
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenIndicesManager.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenIndicesManager.java
index 4d06f837f9a1..383ac1124ea9 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenIndicesManager.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenIndicesManager.java
@@ -16,6 +16,7 @@
package org.jetbrains.idea.maven.indices;
import com.intellij.openapi.Disposable;
+import com.intellij.openapi.application.AccessToken;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.extensions.Extensions;
@@ -283,14 +284,15 @@ public class MavenIndicesManager {
private static MavenGeneralSettings getMavenSettings(@NotNull final Project project, @NotNull MavenProgressIndicator indicator)
throws MavenProcessCanceledException {
+ MavenGeneralSettings settings;
- MavenGeneralSettings settings = ApplicationManager.getApplication().runReadAction(new Computable() {
- @Override
- public MavenGeneralSettings compute() {
- if (project.isDisposed()) return null;
- return MavenProjectsManager.getInstance(project).getGeneralSettings();
- }
- });
+ AccessToken accessToken = ApplicationManager.getApplication().acquireReadActionLock();
+ try {
+ settings = project.isDisposed() ? null : MavenProjectsManager.getInstance(project).getGeneralSettings();
+ }
+ finally {
+ accessToken.finish();
+ }
if (settings == null) {
// project was closed
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;
}
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java
index 8ed52326939a..4dfb559d7484 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java
@@ -16,6 +16,7 @@
package org.jetbrains.idea.maven.project;
import com.intellij.ide.startup.StartupManagerEx;
+import com.intellij.openapi.application.AccessToken;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.components.SettingsSavingComponent;
@@ -403,11 +404,13 @@ public class MavenProjectsManager extends MavenSimpleProjectComponent
}
public boolean isMavenizedModule(final Module m) {
- return ApplicationManager.getApplication().runReadAction(new Computable() {
- public Boolean compute() {
- return "true".equals(m.getOptionValue(getMavenizedModuleOptionName()));
- }
- });
+ AccessToken accessToken = ApplicationManager.getApplication().acquireReadActionLock();
+ try {
+ return "true".equals(m.getOptionValue(getMavenizedModuleOptionName()));
+ }
+ finally {
+ accessToken.finish();
+ }
}
public void setMavenizedModules(Collection modules, boolean mavenized) {
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorArtifactsDownloadingTask.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorArtifactsDownloadingTask.java
index 5bc207ee652b..ddf7b4630d9f 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorArtifactsDownloadingTask.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorArtifactsDownloadingTask.java
@@ -15,7 +15,8 @@
*/
package org.jetbrains.idea.maven.project;
-import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.application.AccessToken;
+import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ex.ProjectRootManagerEx;
import com.intellij.openapi.util.AsyncResult;
@@ -58,11 +59,13 @@ public class MavenProjectsProcessorArtifactsDownloadingTask implements MavenProj
// todo: hack to update all file pointers.
MavenUtil.invokeLater(project, new Runnable() {
public void run() {
- ApplicationManager.getApplication().runWriteAction(new Runnable() {
- public void run() {
- ProjectRootManagerEx.getInstanceEx(project).makeRootsChange(EmptyRunnable.getInstance(), false, true);
- }
- });
+ AccessToken accessToken = WriteAction.start();
+ try {
+ ProjectRootManagerEx.getInstanceEx(project).makeRootsChange(EmptyRunnable.getInstance(), false, true);
+ }
+ finally {
+ accessToken.finish();
+ }
}
});
}
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.java
index 7a2b61135328..2cd984935388 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.java
@@ -15,10 +15,10 @@
*/
package org.jetbrains.idea.maven.project;
+import com.intellij.openapi.application.AccessToken;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
-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;
@@ -645,27 +645,29 @@ public class MavenProjectsTree {
private MavenProjectTimestamp calculateTimestamp(final MavenProject mavenProject,
final Collection explicitProfiles,
final MavenGeneralSettings generalSettings) {
- return ApplicationManager.getApplication().runReadAction(new Computable() {
- public MavenProjectTimestamp compute() {
- long pomTimestamp = getFileTimestamp(mavenProject.getFile());
- MavenProject parent = findParent(mavenProject);
- long parentLastReadStamp = parent == null ? -1 : parent.getLastReadStamp();
- VirtualFile profilesXmlFile = mavenProject.getProfilesXmlFile();
- long profilesTimestamp = getFileTimestamp(profilesXmlFile);
+ AccessToken accessToken = ApplicationManager.getApplication().acquireReadActionLock();
+ try {
+ long pomTimestamp = getFileTimestamp(mavenProject.getFile());
+ MavenProject parent = findParent(mavenProject);
+ long parentLastReadStamp = parent == null ? -1 : parent.getLastReadStamp();
+ VirtualFile profilesXmlFile = mavenProject.getProfilesXmlFile();
+ long profilesTimestamp = getFileTimestamp(profilesXmlFile);
- long userSettingsTimestamp = getFileTimestamp(generalSettings.getEffectiveUserSettingsFile());
- long globalSettingsTimestamp = getFileTimestamp(generalSettings.getEffectiveGlobalSettingsFile());
+ long userSettingsTimestamp = getFileTimestamp(generalSettings.getEffectiveUserSettingsFile());
+ long globalSettingsTimestamp = getFileTimestamp(generalSettings.getEffectiveGlobalSettingsFile());
- int profilesHashCode = explicitProfiles.hashCode();
+ int profilesHashCode = explicitProfiles.hashCode();
- return new MavenProjectTimestamp(pomTimestamp,
- parentLastReadStamp,
- profilesTimestamp,
- userSettingsTimestamp,
- globalSettingsTimestamp,
- profilesHashCode);
- }
- });
+ return new MavenProjectTimestamp(pomTimestamp,
+ parentLastReadStamp,
+ profilesTimestamp,
+ userSettingsTimestamp,
+ globalSettingsTimestamp,
+ profilesHashCode);
+ }
+ finally {
+ accessToken.finish();
+ }
}
private static long getFileTimestamp(VirtualFile file) {
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenEnvironmentRegistrar.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenEnvironmentRegistrar.java
index b778be3751be..90daa24baf34 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenEnvironmentRegistrar.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenEnvironmentRegistrar.java
@@ -17,8 +17,10 @@
package org.jetbrains.idea.maven.utils;
import com.intellij.ide.highlighter.XmlFileType;
+import com.intellij.openapi.application.AccessToken;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.PathMacros;
+import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.components.ApplicationComponent;
import com.intellij.openapi.fileTypes.FileTypeManager;
import org.jetbrains.annotations.NotNull;
@@ -42,12 +44,14 @@ public class MavenEnvironmentRegistrar implements ApplicationComponent {
private void registerFileTypes() {
// we should not change file types in unit test mode
if (ApplicationManager.getApplication().isUnitTestMode()) return;
- ApplicationManager.getApplication().runWriteAction(new Runnable() {
- @Override
- public void run() {
- FileTypeManager.getInstance().associateExtension(XmlFileType.INSTANCE, MavenConstants.POM_EXTENSION);
- }
- });
+
+ AccessToken accessToken = WriteAction.start();
+ try {
+ FileTypeManager.getInstance().associateExtension(XmlFileType.INSTANCE, MavenConstants.POM_EXTENSION);
+ }
+ finally {
+ accessToken.finish();
+ }
}
private void registerPathVariable() {
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenJDOMUtil.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenJDOMUtil.java
index a7162adf0e72..707fae5105a6 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenJDOMUtil.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenJDOMUtil.java
@@ -15,8 +15,8 @@
*/
package org.jetbrains.idea.maven.utils;
+import com.intellij.openapi.application.AccessToken;
import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.JDOMUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.CharsetToolkit;
@@ -38,19 +38,24 @@ import static com.intellij.openapi.util.text.StringUtil.isEmptyOrSpaces;
public class MavenJDOMUtil {
@Nullable
public static Element read(final VirtualFile file, @Nullable final ErrorHandler handler) {
- String text = ApplicationManager.getApplication().runReadAction(new Computable() {
- public String compute() {
- if (!file.isValid()) return null;
- try {
- return VfsUtil.loadText(file);
- }
- catch (IOException e) {
- if (handler != null) handler.onReadError(e);
- return null;
- }
+ String text;
+
+ AccessToken accessToken = ApplicationManager.getApplication().acquireReadActionLock();
+ try {
+ if (!file.isValid()) return null;
+
+ try {
+ text = VfsUtil.loadText(file);
}
- });
- if (text == null) return null;
+ catch (IOException e) {
+ if (handler != null) handler.onReadError(e);
+ return null;
+ }
+ }
+ finally {
+ accessToken.finish();
+ }
+
return doRead(text, handler);
}
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenProblemFileHighlighter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenProblemFileHighlighter.java
index 49eb62bdcaff..20b2b3293c0b 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenProblemFileHighlighter.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenProblemFileHighlighter.java
@@ -15,9 +15,9 @@
*/
package org.jetbrains.idea.maven.utils;
+import com.intellij.openapi.application.AccessToken;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
-import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
@@ -32,11 +32,13 @@ public class MavenProblemFileHighlighter implements Condition {
}
public boolean value(final VirtualFile file) {
- return ApplicationManager.getApplication().runReadAction(new Computable() {
- public Boolean compute() {
- PsiFile psiFile = PsiManager.getInstance(myProject).findFile(file);
- return psiFile != null && MavenDomUtil.isMavenFile(psiFile);
- }
- });
+ AccessToken accessToken = ApplicationManager.getApplication().acquireReadActionLock();
+ try {
+ PsiFile psiFile = PsiManager.getInstance(myProject).findFile(file);
+ return psiFile != null && MavenDomUtil.isMavenFile(psiFile);
+ }
+ finally {
+ accessToken.finish();
+ }
}
}
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenRehighlighter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenRehighlighter.java
index 265b0b24beb4..e51a3ab0b80c 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenRehighlighter.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenRehighlighter.java
@@ -16,6 +16,7 @@
package org.jetbrains.idea.maven.utils;
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer;
+import com.intellij.openapi.application.AccessToken;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.editor.Document;
@@ -94,13 +95,14 @@ public class MavenRehighlighter extends MavenSimpleProjectComponent {
}
public static void rehighlight(final Project project, final MavenProject mavenProject) {
- ApplicationManager.getApplication().runReadAction(new Runnable() {
- @Override
- public void run() {
- if (project.isDisposed()) return;
- ServiceManager.getService(project, MavenRehighlighter.class).myQueue.queue(new MyUpdate(project, mavenProject));
- }
- });
+ AccessToken accessToken = ApplicationManager.getApplication().acquireReadActionLock();
+ try {
+ if (project.isDisposed()) return;
+ ServiceManager.getService(project, MavenRehighlighter.class).myQueue.queue(new MyUpdate(project, mavenProject));
+ }
+ finally {
+ accessToken.finish();
+ }
}
private static class MyUpdate extends Update {
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/library/RepositoryAttachHandler.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/library/RepositoryAttachHandler.java
index 3c2c5d14d320..83b1ffb1795a 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/library/RepositoryAttachHandler.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/library/RepositoryAttachHandler.java
@@ -18,8 +18,10 @@ package org.jetbrains.idea.maven.utils.library;
import com.intellij.notification.Notification;
import com.intellij.notification.NotificationType;
import com.intellij.notification.Notifications;
+import com.intellij.openapi.application.AccessToken;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
+import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.progress.Task;
@@ -85,17 +87,19 @@ public class RepositoryAttachHandler {
public boolean process(final List artifacts) {
final boolean nothingRetrieved = artifacts.isEmpty();
if (!nothingRetrieved) {
- ApplicationManager.getApplication().runWriteAction(new Runnable() {
- public void run() {
- final List roots = createRoots(artifacts, copyTo);
- result.set(new NewLibraryConfiguration(coord, RepositoryLibraryType.getInstance(), new RepositoryLibraryProperties(coord)) {
- @Override
- public void addRoots(@NotNull LibraryEditor editor) {
- editor.addRoots(roots);
- }
- });
- }
- });
+ AccessToken accessToken = WriteAction.start();
+ try {
+ final List roots = createRoots(artifacts, copyTo);
+ result.set(new NewLibraryConfiguration(coord, RepositoryLibraryType.getInstance(), new RepositoryLibraryProperties(coord)) {
+ @Override
+ public void addRoots(@NotNull LibraryEditor editor) {
+ editor.addRoots(roots);
+ }
+ });
+ }
+ finally {
+ accessToken.finish();
+ }
}
final StringBuilder sb = new StringBuilder();
final String title;
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectBuilder.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectBuilder.java
index b531f5382496..613dc2789961 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectBuilder.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectBuilder.java
@@ -15,6 +15,7 @@
*/
package org.jetbrains.idea.maven.wizards;
+import com.intellij.openapi.application.AccessToken;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.module.ModifiableModuleModel;
import com.intellij.openapi.module.Module;
@@ -25,7 +26,6 @@ import com.intellij.openapi.projectRoots.JavaSdk;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.ui.configuration.ModulesConfigurator;
import com.intellij.openapi.roots.ui.configuration.ModulesProvider;
-import com.intellij.openapi.util.Computable;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.packaging.artifacts.ModifiableArtifactModel;
@@ -236,24 +236,26 @@ public class MavenProjectBuilder extends ProjectImportBuilder {
}
private MavenWorkspaceSettings getDirectProjectsSettings() {
- return ApplicationManager.getApplication().runReadAction(new Computable() {
- @Override
- public MavenWorkspaceSettings compute() {
- return MavenWorkspaceSettingsComponent.getInstance(getProject()).getState();
- }
- });
+ AccessToken accessToken = ApplicationManager.getApplication().acquireReadActionLock();
+ try {
+ return MavenWorkspaceSettingsComponent.getInstance(getProject()).getState();
+ }
+ finally {
+ accessToken.finish();
+ }
}
@NotNull
private Project getProject() {
- return ApplicationManager.getApplication().runReadAction(new Computable() {
- @Override
- public Project compute() {
- Project result = isUpdate() ? getProjectToUpdate() : null;
- if (result == null || result.isDisposed()) result = ProjectManager.getInstance().getDefaultProject();
- return result;
- }
- });
+ AccessToken accessToken = ApplicationManager.getApplication().acquireReadActionLock();
+ try {
+ Project result = isUpdate() ? getProjectToUpdate() : null;
+ if (result == null || result.isDisposed()) result = ProjectManager.getInstance().getDefaultProject();
+ return result;
+ }
+ finally {
+ accessToken.finish();
+ }
}
public void setFiles(List files) {
diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenImportingTestCase.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenImportingTestCase.java
index 8f4550408c9b..13b1770f6776 100644
--- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenImportingTestCase.java
+++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenImportingTestCase.java
@@ -20,6 +20,7 @@ import com.intellij.compiler.CompilerManagerImpl;
import com.intellij.compiler.CompilerWorkspaceConfiguration;
import com.intellij.compiler.impl.ModuleCompileScope;
import com.intellij.compiler.impl.TranslatingCompilerFilesMonitor;
+import com.intellij.openapi.application.AccessToken;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.compiler.*;
import com.intellij.openapi.module.Module;
@@ -291,13 +292,15 @@ public abstract class MavenImportingTestCase extends MavenTestCase {
}
protected Module getModule(final String name) {
- Module m = ApplicationManager.getApplication().runReadAction(new Computable() {
- public Module compute() {
- return ModuleManager.getInstance(myProject).findModuleByName(name);
- }
- });
- assertNotNull("Module " + name + " not found", m);
- return m;
+ AccessToken accessToken = ApplicationManager.getApplication().acquireReadActionLock();
+ try {
+ Module m = ModuleManager.getInstance(myProject).findModuleByName(name);
+ assertNotNull("Module " + name + " not found", m);
+ return m;
+ }
+ finally {
+ accessToken.finish();
+ }
}
private ContentEntry getContentRoot(String moduleName) {
diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/DependenciesImportingTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/DependenciesImportingTest.java
index e2aeb5b866ac..d5ac1ec9cb63 100644
--- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/DependenciesImportingTest.java
+++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/DependenciesImportingTest.java
@@ -15,7 +15,9 @@
*/
package org.jetbrains.idea.maven.importing;
+import com.intellij.openapi.application.AccessToken;
import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.roots.*;
import com.intellij.openapi.roots.impl.libraries.ProjectLibraryTable;
@@ -2047,11 +2049,13 @@ public class DependenciesImportingTest extends MavenImportingTestCase {
}
private Library createProjectLibrary(final String libraryName) {
- return ApplicationManager.getApplication().runWriteAction(new Computable() {
- public Library compute() {
- return ProjectLibraryTable.getInstance(myProject).createLibrary(libraryName);
- }
- });
+ AccessToken accessToken = WriteAction.start();
+ try {
+ return ProjectLibraryTable.getInstance(myProject).createLibrary(libraryName);
+ }
+ finally {
+ accessToken.finish();
+ }
}
private void createAndAddProjectLibrary(final String moduleName, final String libraryName) {
diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/designSurface/GuiEditor.java b/plugins/ui-designer/src/com/intellij/uiDesigner/designSurface/GuiEditor.java
index fa1f228af021..cdbeeedd4d67 100644
--- a/plugins/ui-designer/src/com/intellij/uiDesigner/designSurface/GuiEditor.java
+++ b/plugins/ui-designer/src/com/intellij/uiDesigner/designSurface/GuiEditor.java
@@ -129,6 +129,7 @@ public final class GuiEditor extends JPanel implements DataProvider {
private final Document myDocument;
final MainProcessor myProcessor;
+ @NotNull private final JScrollPane myScrollPane;
/**
* This layered pane contains all layers to lay components out and to
* show all necessary decoration items
@@ -302,11 +303,12 @@ public final class GuiEditor extends JPanel implements DataProvider {
gbc.gridy = 1;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
- final JScrollPane scrollPane = ScrollPaneFactory.createScrollPane(myLayeredPane);
- scrollPane.setBackground(Color.WHITE);
- panel.add(scrollPane, gbc);
- myHorzCaptionPanel.attachToScrollPane(scrollPane);
- myVertCaptionPanel.attachToScrollPane(scrollPane);
+
+ myScrollPane = ScrollPaneFactory.createScrollPane(myLayeredPane);
+ myScrollPane.setBackground(Color.WHITE);
+ panel.add(myScrollPane, gbc);
+ myHorzCaptionPanel.attachToScrollPane(myScrollPane);
+ myVertCaptionPanel.attachToScrollPane(myScrollPane);
myValidCard.add(panel, BorderLayout.CENTER);
@@ -319,7 +321,7 @@ public final class GuiEditor extends JPanel implements DataProvider {
myPsiTreeChangeListener = new MyPsiTreeChangeListener();
PsiManager.getInstance(module.getProject()).addPsiTreeChangeListener(myPsiTreeChangeListener);
- myQuickFixManager = new QuickFixManagerImpl(this, myGlassLayer, scrollPane.getViewport());
+ myQuickFixManager = new QuickFixManagerImpl(this, myGlassLayer, myScrollPane.getViewport());
myDropTargetListener = new DesignDropTargetListener(this);
if (!ApplicationManager.getApplication().isHeadlessEnvironment()) {
@@ -987,7 +989,9 @@ public final class GuiEditor extends JPanel implements DataProvider {
width += 50;
height += 40;
- return new Dimension(width, height);
+ Rectangle bounds = myScrollPane.getViewport().getBounds();
+
+ return new Dimension(Math.max(width, bounds.width), Math.max(height, bounds.height));
}
public Dimension getPreferredScrollableViewportSize() {