Merge "Now Gradle plug-in "quick fix" uses the "recommended version", instead of "latest version"." into idea133
automerge: bb7c7bd
* commit 'bb7c7bdd119da6de85b6013e0c60dc34f0844f2b':
Now Gradle plug-in "quick fix" uses the "recommended version", instead of "latest version".
diff --git a/adt-branding/src/idea/AndroidStudioApplicationInfo.xml b/adt-branding/src/idea/AndroidStudioApplicationInfo.xml
index d5db933..540521c 100755
--- a/adt-branding/src/idea/AndroidStudioApplicationInfo.xml
+++ b/adt-branding/src/idea/AndroidStudioApplicationInfo.xml
@@ -16,7 +16,7 @@
<component>
<version codename="Preview" major="0" minor="6.2" eap="true"/>
<company name="Google Inc." url="http://developer.android.com"/>
- <build number="__BUILD_NUMBER__" date="__BUILD_DATE__" apiVersion="135.909"/>
+ <build number="__BUILD_NUMBER__" date="__BUILD_DATE__" apiVersion="138.538"/>
<install-over minbuild="0.1" maxbuild="999.999999" version="0"/>
<logo url="/artwork/studio_splash.png" textcolor="cccccc" progressColor="ffaa16" progressY="238" progressTailIcon="/community_progress_tail.png"/>
<about url="/artwork/studio_about.png" foreground="cccccc"/>
diff --git a/android/android.iml b/android/android.iml
index eecdd96..cbdec53 100755
--- a/android/android.iml
+++ b/android/android.iml
@@ -74,6 +74,7 @@
</orderEntry>
<orderEntry type="module" module-name="testutils" scope="TEST" />
<orderEntry type="library" scope="TEST" name="Eclipse" level="project" />
+ <orderEntry type="module" module-name="properties-psi-api" />
</component>
</module>
diff --git a/android/common/android-common.iml b/android/common/android-common.iml
index e5e2a70..c333245 100644
--- a/android/common/android-common.iml
+++ b/android/common/android-common.iml
@@ -4,8 +4,7 @@
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
- <sourceFolder url="file://$MODULE_DIR$/../rt/resources" isTestSource="false" />
- <sourceFolder url="file://$MODULE_DIR$/resources" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/testSrc" isTestSource="true" />
</content>
<orderEntry type="inheritedJdk" />
diff --git a/android/common/src/org/jetbrains/android/util/AndroidCommonUtils.java b/android/common/src/org/jetbrains/android/util/AndroidCommonUtils.java
index 70956af..41f11ee 100644
--- a/android/common/src/org/jetbrains/android/util/AndroidCommonUtils.java
+++ b/android/common/src/org/jetbrains/android/util/AndroidCommonUtils.java
@@ -286,7 +286,7 @@
path = path.substring(1);
}
- files.add(new Pair<File, String>(file, path));
+ files.add(Pair.create(file, path));
}
}
diff --git a/android/jps-plugin/testSrc/org/jetbrains/jps/android/AndroidBuilderTest.java b/android/jps-plugin/testSrc/org/jetbrains/jps/android/AndroidBuilderTest.java
index ca42b78..d0a2a2f 100644
--- a/android/jps-plugin/testSrc/org/jetbrains/jps/android/AndroidBuilderTest.java
+++ b/android/jps-plugin/testSrc/org/jetbrains/jps/android/AndroidBuilderTest.java
@@ -1253,7 +1253,7 @@
executor.addRegexPathPatternPrefix("COMBINED_ASSETS_TMP", FileUtil.toSystemIndependentName(tempDirectory) +
"/android_combined_assets\\d*tmp");
executor.addRegexPathPatternPrefix("COMBINED_RESOURCES_TMP", FileUtil.toSystemIndependentName(tempDirectory) +
- "/android_combined_resources\\d*tmp");
+ "/android_combined_resources\\d*tmp");
executor.addRegexPathPatternPrefix("CLASSPATH_TMP", FileUtil.toSystemIndependentName(tempDirectory) + "/classpath\\d*\\.tmp");
executor.addRegexPathPattern("JAVA_PATH", ".*/java");
executor.addRegexPathPattern("IDEA_RT_PATH", ".*/idea_rt.jar");
diff --git a/android/src/META-INF/eclipse.xml b/android/src/META-INF/eclipse.xml
index 7c724d1..f360d6e 100644
--- a/android/src/META-INF/eclipse.xml
+++ b/android/src/META-INF/eclipse.xml
@@ -1,5 +1,5 @@
<idea-plugin url="http://www.jetbrains.com/idea">
- <extensions xmlns="org.jetbrains.idea.eclipse">
+ <extensions defaultExtensionNs="org.jetbrains.idea.eclipse">
<natureImporter implementation="org.jetbrains.android.newProject.AndroidEclipseNatureImporter"/>
</extensions>
</idea-plugin>
diff --git a/android/src/META-INF/maven-support.xml b/android/src/META-INF/maven-support.xml
index 20d9537..2285902 100644
--- a/android/src/META-INF/maven-support.xml
+++ b/android/src/META-INF/maven-support.xml
@@ -1,12 +1,8 @@
<idea-plugin url="http://www.jetbrains.com/idea">
- <extensions xmlns="org.jetbrains.idea.maven">
+ <extensions defaultExtensionNs="org.jetbrains.idea.maven">
<importer implementation="org.jetbrains.android.maven.AndroidFacetImporter1"/>
<importer implementation="org.jetbrains.android.maven.AndroidFacetImporter2"/>
</extensions>
- <extensions defaultExtensionNs="com.intellij">
- <compiler implementation="org.jetbrains.android.compiler.AndroidExternalApklibExtractingCompiler" order="first"/>
- <compiler implementation="org.jetbrains.android.compiler.AndroidMavenResourcesCompiler" order="first"/>
- </extensions>
<extensions defaultExtensionNs="org.jetbrains">
<android.mavenProvider implementation="org.jetbrains.android.maven.AndroidMavenProviderImpl"/>
</extensions>
diff --git a/android/src/META-INF/plugin.xml b/android/src/META-INF/plugin.xml
index 03ec8fe..6f4cdd0 100755
--- a/android/src/META-INF/plugin.xml
+++ b/android/src/META-INF/plugin.xml
@@ -1,4 +1,4 @@
-<idea-plugin version="2" xmlns:xi="http://www.w3.org/2001/XInclude">
+<idea-plugin version="2">
<name>Android Support</name>
<id>org.jetbrains.android</id>
<description>
@@ -217,19 +217,6 @@
<projectTemplatesFactory implementation="com.android.tools.idea.wizard.TemplateWizardProjectTemplateFactory"/>
<projectTemplatesFactory implementation="org.jetbrains.android.newProject.AndroidProjectTemplatesFactory"/>
- <compiler implementation="org.jetbrains.android.compiler.AndroidIncludingCompiler"/>
- <compiler implementation="org.jetbrains.android.compiler.AndroidRenderscriptCompiler"/>
- <compiler implementation="org.jetbrains.android.compiler.AndroidBuildConfigGeneratingCompiler"/>
- <compiler implementation="org.jetbrains.android.compiler.AndroidAptCompiler"/>
- <compiler implementation="org.jetbrains.android.compiler.AndroidIdlCompiler"/>
- <compiler implementation="org.jetbrains.android.compiler.AndroidLibraryPackagingCompiler"/>
- <compiler implementation="org.jetbrains.android.compiler.AndroidProguardCompiler"/>
- <compiler implementation="org.jetbrains.android.compiler.AndroidDexCompiler"/>
- <compiler implementation="org.jetbrains.android.compiler.AndroidPngFilesCachingCompiler"/>
- <compiler implementation="org.jetbrains.android.compiler.AndroidResourcesPackagingCompiler"/>
- <compiler implementation="org.jetbrains.android.compiler.AndroidPackagingCompiler"/>
- <compiler.makeDependencyProcessor implementation="org.jetbrains.android.compiler.AndroidDependencyProcessor"/>
-
<completion.contributor language="XML" implementationClass="org.jetbrains.android.AndroidCompletionContributor"
id="compositieAttributeValues" order="first"/>
<completion.contributor language="JAVA" implementationClass="org.jetbrains.android.AndroidJavaCompletionContributor" order="first"/>
@@ -583,7 +570,7 @@
<editorNotificationProvider implementation="org.jetbrains.android.projectView.ResourceQualifierSwitcher"/>
-->
- <treeStructureProvider implementation="com.android.tools.idea.gradle.projectView.AndroidTreeStructureProvider" order="last"/>
+ <treeStructureProvider id="android" implementation="com.android.tools.idea.gradle.projectView.AndroidTreeStructureProvider" order="last"/>
<treeStructureProvider implementation="com.android.tools.idea.navigator.packageview.AndroidPackageViewProvider" order="last"/>
<spellchecker.bundledDictionaryProvider implementation="org.jetbrains.android.spellchecker.AndroidBundledDictionaryProvider"/>
@@ -616,8 +603,6 @@
<!-- Layout editor -->
- <xi:include href="/META-INF/DesignerCorePlugin.xml" xpointer="xpointer(/idea-plugin/*)"/>
-
<extensions defaultExtensionNs="com.intellij">
<fileEditorProvider implementation="com.intellij.android.designer.AndroidDesignerEditorProvider"/>
diff --git a/android/src/com/android/tools/idea/configurations/Configuration.java b/android/src/com/android/tools/idea/configurations/Configuration.java
index 8f95741..8e567b6 100644
--- a/android/src/com/android/tools/idea/configurations/Configuration.java
+++ b/android/src/com/android/tools/idea/configurations/Configuration.java
@@ -30,6 +30,7 @@
import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.module.Module;
+import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
@@ -271,7 +272,7 @@
*/
@NotNull
public static Configuration copyCompatible(@NotNull Configuration source, @NotNull Configuration destination) {
- assert source.myFile != destination.myFile; // This method is intended to sync configurations for resource variations
+ assert !Comparing.equal(source.myFile, destination.myFile); // This method is intended to sync configurations for resource variations
FolderConfiguration editedConfig = destination.getEditedConfig();
diff --git a/android/src/com/android/tools/idea/configurations/ConfigurationAction.java b/android/src/com/android/tools/idea/configurations/ConfigurationAction.java
index 6568ebb..e6635c5 100644
--- a/android/src/com/android/tools/idea/configurations/ConfigurationAction.java
+++ b/android/src/com/android/tools/idea/configurations/ConfigurationAction.java
@@ -27,6 +27,7 @@
import com.intellij.openapi.fileEditor.impl.text.TextEditorProvider;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.vfs.VirtualFile;
import icons.AndroidIcons;
import org.jetbrains.android.facet.AndroidFacet;
@@ -144,7 +145,7 @@
sb.append(FILE_ARROW);
String folderName = better.getParent().getName();
if (folderName.equals(FD_RES_LAYOUT)) {
- if (file != null && file.getParent() != better.getParent()) {
+ if (file != null && !Comparing.equal(file.getParent(), better.getParent())) {
sb.append(FD_RES_LAYOUT);
sb.append(File.separatorChar);
}
diff --git a/android/src/com/android/tools/idea/configurations/ConfigurationMatcher.java b/android/src/com/android/tools/idea/configurations/ConfigurationMatcher.java
index f13edad..b845798 100644
--- a/android/src/com/android/tools/idea/configurations/ConfigurationMatcher.java
+++ b/android/src/com/android/tools/idea/configurations/ConfigurationMatcher.java
@@ -561,7 +561,7 @@
if (activeEditor != null) {
FileDocumentManager documentManager = FileDocumentManager.getInstance();
VirtualFile file = documentManager.getFile(activeEditor.getDocument());
- if (file != null && file != myFile && file.getFileType() == StdFileTypes.XML
+ if (file != null && !file.equals(myFile) && file.getFileType() == StdFileTypes.XML
&& ResourceHelper.getFolderType(myFile) == ResourceHelper.getFolderType(file)) {
Configuration configuration = myManager.getConfiguration(file);
FolderConfiguration fullConfig = configuration.getFullConfig();
diff --git a/android/src/com/android/tools/idea/configurations/ConfigurationMenuAction.java b/android/src/com/android/tools/idea/configurations/ConfigurationMenuAction.java
index 86912d0..517929c 100644
--- a/android/src/com/android/tools/idea/configurations/ConfigurationMenuAction.java
+++ b/android/src/com/android/tools/idea/configurations/ConfigurationMenuAction.java
@@ -89,7 +89,7 @@
if (variations.size() > 1) {
for (VirtualFile file : variations) {
String title = String.format("Switch to %1$s", file.getParent().getName());
- group.add(new SwitchToVariationAction(title, project, file, virtualFile == file));
+ group.add(new SwitchToVariationAction(title, project, file, virtualFile.equals(file)));
}
group.addSeparator();
}
diff --git a/android/src/com/android/tools/idea/ddms/screenshot/DeviceArtPainter.java b/android/src/com/android/tools/idea/ddms/screenshot/DeviceArtPainter.java
index 1ccb4ea..7c906ba 100644
--- a/android/src/com/android/tools/idea/ddms/screenshot/DeviceArtPainter.java
+++ b/android/src/com/android/tools/idea/ddms/screenshot/DeviceArtPainter.java
@@ -24,6 +24,7 @@
import com.google.common.collect.Maps;
import com.intellij.openapi.application.PathManager;
import com.intellij.reference.SoftReference;
+import com.intellij.ui.Gray;
import com.intellij.util.PathUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -290,7 +291,7 @@
@SuppressWarnings("UndesirableClassUsage") // Don't need Retina image here, and it's more expensive
BufferedImage result = new BufferedImage(framedWidth, framedHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = result.createGraphics();
- g.setColor(new Color(128, 0, 0, 0));
+ g.setColor(Gray.TRANSPARENT);
g.fillRect(0, 0, result.getWidth(), result.getHeight());
g.drawImage(scaledImage, screenX, screenY, null);
BufferedImage scaledFrameImage = ImageUtils.scale(frameImage, downScale, downScale, 0, 0);
@@ -349,7 +350,7 @@
@SuppressWarnings("UndesirableClassUsage") // Don't need Retina image here, and it's more expensive
BufferedImage composite = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = composite.createGraphics();
- g.setColor(new Color(0, 0, 0, 0));
+ g.setColor(Gray.TRANSPARENT);
g.fillRect(0, 0, composite.getWidth(), composite.getHeight());
NinePatch ninePatch = NinePatch.load(image, true, false);
@@ -787,7 +788,7 @@
@SuppressWarnings("UndesirableClassUsage") // Don't need Retina image here, and it's more expensive
BufferedImage composite = new BufferedImage(myFrameWidth, myFrameHeight, BufferedImage.TYPE_INT_ARGB);
Graphics g = composite.createGraphics();
- g.setColor(new Color(0, 0, 0, 0));
+ g.setColor(Gray.TRANSPARENT);
g.fillRect(0, 0, composite.getWidth(), composite.getHeight());
Graphics2D g2d = (Graphics2D)g;
diff --git a/android/src/com/android/tools/idea/gradle/eclipse/AdtImportLocationStep.java b/android/src/com/android/tools/idea/gradle/eclipse/AdtImportLocationStep.java
index ab8c4ec..42c4803 100644
--- a/android/src/com/android/tools/idea/gradle/eclipse/AdtImportLocationStep.java
+++ b/android/src/com/android/tools/idea/gradle/eclipse/AdtImportLocationStep.java
@@ -74,8 +74,8 @@
descriptor.setDescription("Pick a directory to import the given Eclipse Android project into");
myDestDirText.addBrowseFolderListener(new TextBrowseFolderListener(descriptor) {
@Override
- protected void onFileChoosen(@NotNull VirtualFile chosenFile) {
- super.onFileChoosen(chosenFile);
+ protected void onFileChosen(@NotNull VirtualFile chosenFile) {
+ super.onFileChosen(chosenFile);
myIsPathChangedByUser = true;
}
diff --git a/android/src/com/android/tools/idea/gradle/projectView/AndroidTreeStructureProvider.java b/android/src/com/android/tools/idea/gradle/projectView/AndroidTreeStructureProvider.java
index 2aa3451..819ef0f 100644
--- a/android/src/com/android/tools/idea/gradle/projectView/AndroidTreeStructureProvider.java
+++ b/android/src/com/android/tools/idea/gradle/projectView/AndroidTreeStructureProvider.java
@@ -16,10 +16,13 @@
package com.android.tools.idea.gradle.projectView;
import com.google.common.collect.Lists;
+import com.intellij.facet.ProjectFacetManager;
import com.intellij.ide.projectView.TreeStructureProvider;
import com.intellij.ide.projectView.ViewSettings;
import com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode;
import com.intellij.ide.util.treeView.AbstractTreeNode;
+import com.intellij.openapi.project.Project;
+import org.jetbrains.android.facet.AndroidFacet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -32,6 +35,11 @@
public Collection<AbstractTreeNode> modify(@NotNull AbstractTreeNode parent,
@NotNull Collection<AbstractTreeNode> children,
ViewSettings settings) {
+ final Project project = parent.getProject();
+
+ if (project == null || !ProjectFacetManager.getInstance(project).hasFacets(AndroidFacet.ID)) {
+ return children;
+ }
List<AbstractTreeNode> newChildren = Lists.newArrayList();
for (AbstractTreeNode child : children) {
// We replace the default "directory node" with our own, to control the text displayed by the node.
diff --git a/android/src/com/android/tools/idea/gradle/util/Projects.java b/android/src/com/android/tools/idea/gradle/util/Projects.java
index 940f8dd..0a4db63 100644
--- a/android/src/com/android/tools/idea/gradle/util/Projects.java
+++ b/android/src/com/android/tools/idea/gradle/util/Projects.java
@@ -22,8 +22,6 @@
import com.android.tools.idea.gradle.facet.JavaGradleFacet;
import com.android.tools.idea.gradle.messages.ProjectSyncMessages;
import com.android.tools.idea.startup.AndroidStudioSpecificInitializer;
-import com.intellij.compiler.CompilerWorkspaceConfiguration;
-import com.intellij.compiler.options.ExternalBuildOptionListener;
import com.intellij.ide.DataManager;
import com.intellij.ide.impl.ProjectUtil;
import com.intellij.ide.projectView.ProjectView;
@@ -42,7 +40,6 @@
import com.intellij.openapi.wm.WindowManager;
import com.intellij.openapi.wm.ex.IdeFrameEx;
import com.intellij.openapi.wm.impl.IdeFrameImpl;
-import com.intellij.util.messages.MessageBus;
import org.jetbrains.android.facet.AndroidFacet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -191,17 +188,6 @@
if (!AndroidStudioSpecificInitializer.isAndroidStudio()) {
AndroidGradleBuildConfiguration.getInstance(project).USE_EXPERIMENTAL_FASTER_BUILD = false;
}
-
- CompilerWorkspaceConfiguration workspaceConfiguration = CompilerWorkspaceConfiguration.getInstance(project);
- boolean wasUsingExternalMake = workspaceConfiguration.useOutOfProcessBuild();
- if (!wasUsingExternalMake) {
- String format = "Enabled 'External Build' for Android project '%1$s'. Otherwise, the project will not be built with Gradle";
- String msg = String.format(format, project.getName());
- LOG.info(msg);
- workspaceConfiguration.USE_OUT_OF_PROCESS_BUILD = true;
- MessageBus messageBus = project.getMessageBus();
- messageBus.syncPublisher(ExternalBuildOptionListener.TOPIC).externalBuildOptionChanged(true);
- }
}
}
diff --git a/android/src/com/android/tools/idea/rendering/GutterIconCache.java b/android/src/com/android/tools/idea/rendering/GutterIconCache.java
index 9efef0b..7710531 100644
--- a/android/src/com/android/tools/idea/rendering/GutterIconCache.java
+++ b/android/src/com/android/tools/idea/rendering/GutterIconCache.java
@@ -17,6 +17,7 @@
import com.google.common.collect.Maps;
import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.ui.Gray;
import com.intellij.util.RetinaImage;
import com.intellij.util.ui.UIUtil;
import icons.AndroidIcons;
@@ -111,7 +112,7 @@
BufferedImage bg = UIUtil.createImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_ARGB);
Graphics g = bg.getGraphics();
//noinspection UseJBColor
- g.setColor(new Color(255, 255, 255, 0));
+ g.setColor(Gray.TRANSPARENT);
g.fillRect(0, 0, bg.getWidth(), bg.getHeight());
//noinspection ConstantConditions
UIUtil.drawImage(g, image, 0, 0, null);
diff --git a/android/src/com/android/tools/idea/rendering/IncludeReference.java b/android/src/com/android/tools/idea/rendering/IncludeReference.java
index e1e208d..f117074 100644
--- a/android/src/com/android/tools/idea/rendering/IncludeReference.java
+++ b/android/src/com/android/tools/idea/rendering/IncludeReference.java
@@ -135,7 +135,7 @@
// consider prepending layout/ on ids that don't have it (to make the display
// more uniform) or ripping out all layout[-constraint] prefixes out and
// instead prepending @ etc.
- if (myToFile != null && myToFile.getParent() == myFromFile.getParent()) {
+ if (myToFile != null && myToFile.getParent() != null && myToFile.getParent().equals(myFromFile.getParent())) {
return myFromFile.getName();
}
diff --git a/android/src/com/android/tools/idea/rendering/RenderService.java b/android/src/com/android/tools/idea/rendering/RenderService.java
index 2e08172..e215840 100644
--- a/android/src/com/android/tools/idea/rendering/RenderService.java
+++ b/android/src/com/android/tools/idea/rendering/RenderService.java
@@ -44,6 +44,7 @@
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.ModuleRootManager;
+import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.roots.ui.configuration.ProjectSettingsService;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.vfs.VirtualFile;
@@ -610,7 +611,7 @@
myIncludedWithin = layout != null ? IncludeReference.get(myModule, myPsiFile, resolver) : IncludeReference.NONE;
}
if (myIncludedWithin != IncludeReference.NONE) {
- assert myIncludedWithin.getToFile() == myPsiFile.getVirtualFile();
+ assert Comparing.equal(myIncludedWithin.getToFile(), myPsiFile.getVirtualFile());
// TODO: Validate that we're really including the same layout here!
//ResourceValue contextLayout = resolver.findResValue(myIncludedWithin.getFromResourceUrl(), false /* forceFrameworkOnly*/);
//if (contextLayout != null) {
diff --git a/android/src/com/android/tools/idea/rendering/ResourceFolderRepository.java b/android/src/com/android/tools/idea/rendering/ResourceFolderRepository.java
index 2818270..e058fa1 100644
--- a/android/src/com/android/tools/idea/rendering/ResourceFolderRepository.java
+++ b/android/src/com/android/tools/idea/rendering/ResourceFolderRepository.java
@@ -375,7 +375,7 @@
PsiDirectory parentDirectory = directory.getParentDirectory();
if (parentDirectory != null) {
VirtualFile dir = parentDirectory.getVirtualFile();
- return dir == myResourceDir;
+ return dir.equals(myResourceDir);
}
}
return false;
diff --git a/android/src/com/android/tools/idea/rendering/multi/RenderPreview.java b/android/src/com/android/tools/idea/rendering/multi/RenderPreview.java
index e8e0d32..1a110e7 100644
--- a/android/src/com/android/tools/idea/rendering/multi/RenderPreview.java
+++ b/android/src/com/android/tools/idea/rendering/multi/RenderPreview.java
@@ -36,7 +36,7 @@
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
-import com.intellij.openapi.util.Pair;
+import com.intellij.openapi.util.Couple;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.psi.xml.XmlFile;
@@ -971,10 +971,10 @@
}
final int xf = x + 5;
final int yf = y + HEADER_HEIGHT + fontBaseline;
- painter.draw(gc, new PairFunction<Integer, Integer, Pair<Integer, Integer>>() {
+ painter.draw(gc, new PairFunction<Integer, Integer, Couple<Integer>>() {
@Override
- public Pair<Integer, Integer> fun(Integer width, Integer height) {
- return Pair.create(xf, yf);
+ public Couple<Integer> fun(Integer width, Integer height) {
+ return Couple.of(xf, yf);
}
});
gc.setClip(prevClip);
diff --git a/android/src/com/android/tools/idea/rendering/multi/RenderPreviewManager.java b/android/src/com/android/tools/idea/rendering/multi/RenderPreviewManager.java
index ad1defc..9719633 100644
--- a/android/src/com/android/tools/idea/rendering/multi/RenderPreviewManager.java
+++ b/android/src/com/android/tools/idea/rendering/multi/RenderPreviewManager.java
@@ -42,6 +42,7 @@
import com.intellij.openapi.fileEditor.OpenFileDescriptor;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.xml.XmlFile;
@@ -1279,7 +1280,7 @@
* Updates the configuration preview thumbnails
*/
public void renderPreviews() {
- if (myRenderContext.getVirtualFile() != myCurrentFile) {
+ if (!Comparing.equal(myRenderContext.getVirtualFile(), myCurrentFile)) {
recomputePreviews(true);
return;
}
diff --git a/android/src/com/android/tools/idea/templates/TemplateManager.java b/android/src/com/android/tools/idea/templates/TemplateManager.java
index 03f5022..d7eaa6b 100644
--- a/android/src/com/android/tools/idea/templates/TemplateManager.java
+++ b/android/src/com/android/tools/idea/templates/TemplateManager.java
@@ -22,6 +22,7 @@
import com.google.common.collect.*;
import com.google.common.io.Files;
import com.intellij.ide.actions.NonEmptyActionGroup;
+import com.intellij.ide.IdeView;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.diagnostic.Logger;
@@ -412,12 +413,13 @@
NonEmptyActionGroup categoryGroup = new NonEmptyActionGroup() {
@Override
public void update(AnActionEvent e) {
+ IdeView view = LangDataKeys.IDE_VIEW.getData(e.getDataContext());
final Module module = LangDataKeys.MODULE.getData(e.getDataContext());
final AndroidFacet facet = module != null ? AndroidFacet.getInstance(module) : null;
Presentation presentation = e.getPresentation();
boolean isProjectReady = facet != null && facet.getIdeaAndroidProject() != null;
presentation.setText(category + (isProjectReady ? "" : " (Project not ready)"));
- presentation.setVisible(getChildrenCount() > 0 && facet != null && facet.isGradleProject());
+ presentation.setVisible(getChildrenCount() > 0 && view != null && facet != null && facet.isGradleProject());
}
};
categoryGroup.setPopup(true);
@@ -480,8 +482,8 @@
if (newMetadata != null) {
String title = newMetadata.getTitle();
if (title == null || (newMetadata.getCategory() == null &&
- myCategoryTable.columnKeySet().contains(title) &&
- myCategoryTable.get(CATEGORY_OTHER, title) == null)) {
+ myCategoryTable.columnKeySet().contains(title) &&
+ myCategoryTable.get(CATEGORY_OTHER, title) == null)) {
// If this template is uncategorized, and we already have a template of this name that has a category,
// that is NOT "Other," then ignore this new template since it's undoubtedly older.
return;
diff --git a/android/src/com/intellij/android/designer/AndroidDesignerEditor.java b/android/src/com/intellij/android/designer/AndroidDesignerEditor.java
index adaa209..f77e5a5 100644
--- a/android/src/com/intellij/android/designer/AndroidDesignerEditor.java
+++ b/android/src/com/intellij/android/designer/AndroidDesignerEditor.java
@@ -22,6 +22,7 @@
import com.intellij.designer.designSurface.DesignerEditorPanel;
import com.intellij.designer.inspection.DesignerBackgroundEditorHighlighter;
import com.intellij.openapi.module.Module;
+import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
@@ -39,11 +40,14 @@
@Override
@Nullable
- protected Module findModule(final Project project, final VirtualFile file) {
- Module module = super.findModule(project, file);
+ protected Module findModule(Project project, VirtualFile file) {
+ Module module = ModuleUtilCore.findModuleForFile(file, project);
if (module == null) {
module = AndroidPsiUtils.getModuleSafely(project, file);
}
+ if (module == null) {
+ throw new IllegalArgumentException("No module for file " + file + " in project " + project);
+ }
return module;
}
diff --git a/android/src/com/intellij/android/designer/inspection/ErrorAnalyzer.java b/android/src/com/intellij/android/designer/inspection/ErrorAnalyzer.java
index 41bda64..67a9b3e 100644
--- a/android/src/com/intellij/android/designer/inspection/ErrorAnalyzer.java
+++ b/android/src/com/intellij/android/designer/inspection/ErrorAnalyzer.java
@@ -184,7 +184,7 @@
}
}
- return new Pair<RadComponent, String>(result[0], propertyName);
+ return Pair.create(result[0], propertyName);
}
private static Pair<XmlTag, XmlAttribute> extractTag(PsiElement element) {
@@ -203,6 +203,6 @@
element = element.getParent();
}
- return new Pair<XmlTag, XmlAttribute>(tag, attribute);
+ return Pair.create(tag, attribute);
}
}
diff --git a/android/src/com/intellij/android/designer/model/IdManager.java b/android/src/com/intellij/android/designer/model/IdManager.java
index 648aa00..ad73333 100644
--- a/android/src/com/intellij/android/designer/model/IdManager.java
+++ b/android/src/com/intellij/android/designer/model/IdManager.java
@@ -160,7 +160,7 @@
}
else if (idValue != null && myIdList.contains(idValue)) {
createId(viewComponent);
- replaceList.add(new Pair<Pair<String, String>, String>(
+ replaceList.add(Pair.create(
new Pair<String, String>(ID_PREFIX + idValue, NEW_ID_PREFIX + idValue),
viewComponent.getId()));
}
diff --git a/android/src/org/jetbrains/android/AndroidPlugin.java b/android/src/org/jetbrains/android/AndroidPlugin.java
index d2ae876..5c9a5d9 100644
--- a/android/src/org/jetbrains/android/AndroidPlugin.java
+++ b/android/src/org/jetbrains/android/AndroidPlugin.java
@@ -15,8 +15,6 @@
*/
package org.jetbrains.android;
-import com.android.tools.idea.templates.TemplateManager;
-import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.components.ApplicationComponent;
import org.jetbrains.android.sdk.AndroidSdkData;
import org.jetbrains.annotations.NotNull;
@@ -34,17 +32,6 @@
@Override
public void initComponent() {
- createDynamicTemplateMenu();
- }
-
- public static void createDynamicTemplateMenu() {
- DefaultActionGroup newGroup = (DefaultActionGroup)ActionManager.getInstance().getAction("NewGroup");
- newGroup.addSeparator();
- final ActionGroup menu = TemplateManager.getInstance().getTemplateCreationMenu(null);
-
- if (menu != null) {
- newGroup.add(menu, new Constraints(Anchor.AFTER, "NewFromTemplate"));
- }
}
@Override
diff --git a/android/src/org/jetbrains/android/AndroidSdkResolveScopeProvider.java b/android/src/org/jetbrains/android/AndroidSdkResolveScopeProvider.java
index 91d364b..22d5ea8 100644
--- a/android/src/org/jetbrains/android/AndroidSdkResolveScopeProvider.java
+++ b/android/src/org/jetbrains/android/AndroidSdkResolveScopeProvider.java
@@ -11,7 +11,6 @@
import org.jetbrains.android.augment.AndroidInternalRClass;
import org.jetbrains.android.sdk.AndroidSdkType;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
/**
* @author Eugene.Kudelevsky
@@ -39,19 +38,6 @@
mySdk = jdkOrderEntry.getJdk();
}
- @Nullable
- @Override
- protected VirtualFile getFileRoot(@NotNull VirtualFile file) {
- final VirtualFile resultFromSuper = super.getFileRoot(file);
-
- if (resultFromSuper != null) {
- return resultFromSuper;
- }
- return myIndex.isInLibrarySource(file)
- ? myIndex.getSourceRootForFile(file)
- : null;
- }
-
@Override
public boolean isForceSearchingInLibrarySources() {
return true;
diff --git a/android/src/org/jetbrains/android/actions/AndroidProcessChooserDialog.java b/android/src/org/jetbrains/android/actions/AndroidProcessChooserDialog.java
index 3af93ae..d001f6e 100644
--- a/android/src/org/jetbrains/android/actions/AndroidProcessChooserDialog.java
+++ b/android/src/org/jetbrains/android/actions/AndroidProcessChooserDialog.java
@@ -39,7 +39,6 @@
import com.intellij.psi.xml.XmlElement;
import com.intellij.ui.DoubleClickListener;
import com.intellij.ui.JBDefaultTreeCellRenderer;
-import com.intellij.ui.ListSpeedSearch;
import com.intellij.ui.TreeSpeedSearch;
import com.intellij.ui.components.JBCheckBox;
import com.intellij.ui.content.Content;
@@ -464,10 +463,6 @@
private static RunnerAndConfigurationSettings createRunConfiguration(Project project, String debugPort) {
final RemoteConfigurationType remoteConfigurationType = RemoteConfigurationType.getInstance();
- if (remoteConfigurationType == null) {
- LOG.error("Cannot create remote configuration");
- }
-
final ConfigurationFactory factory = remoteConfigurationType.getFactory();
final RunnerAndConfigurationSettings runSettings =
RunManager.getInstance(project).createRunConfiguration(getRunConfigurationName(debugPort), factory);
diff --git a/android/src/org/jetbrains/android/compiler/AndroidAptCompiler.java b/android/src/org/jetbrains/android/compiler/AndroidAptCompiler.java
deleted file mode 100644
index 45c3e5e..0000000
--- a/android/src/org/jetbrains/android/compiler/AndroidAptCompiler.java
+++ /dev/null
@@ -1,417 +0,0 @@
-/*
- * Copyright 2000-2010 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jetbrains.android.compiler;
-
-import com.android.SdkConstants;
-import com.android.sdklib.IAndroidTarget;
-import com.intellij.compiler.CompilerWorkspaceConfiguration;
-import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.compiler.*;
-import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.module.Module;
-import com.intellij.openapi.module.ModuleManager;
-import com.intellij.openapi.util.Comparing;
-import com.intellij.openapi.util.Computable;
-import com.intellij.openapi.util.io.FileUtil;
-import com.intellij.openapi.vfs.LocalFileSystem;
-import com.intellij.openapi.vfs.VirtualFile;
-import org.jetbrains.android.compiler.tools.AndroidApt;
-import org.jetbrains.android.dom.manifest.Manifest;
-import org.jetbrains.android.facet.AndroidFacet;
-import org.jetbrains.android.facet.AndroidFacetConfiguration;
-import org.jetbrains.android.facet.AndroidRootUtil;
-import org.jetbrains.android.maven.AndroidMavenUtil;
-import org.jetbrains.android.sdk.AndroidPlatform;
-import org.jetbrains.android.util.AndroidBundle;
-import org.jetbrains.android.util.AndroidCommonUtils;
-import org.jetbrains.android.util.AndroidUtils;
-import org.jetbrains.android.util.JavaFilesFilter;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.File;
-import java.io.IOException;
-import java.util.*;
-
-/**
- * Apt compiler.
- *
- * @author Alexey Efimov
- */
-public class AndroidAptCompiler implements SourceGeneratingCompiler {
- private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.compiler.AndroidAptCompiler");
- private static final GenerationItem[] EMPTY_GENERATION_ITEM_ARRAY = {};
-
- @Nullable
- @Override
- public VirtualFile getPresentableFile(CompileContext context, Module module, VirtualFile outputRoot, VirtualFile generatedFile) {
- return null;
- }
-
- public static boolean isToCompileModule(Module module, AndroidFacetConfiguration configuration) {
- if (CompilerWorkspaceConfiguration.getInstance(module.getProject()).useOutOfProcessBuild()) {
- return true;
- }
- if (!(configuration.getState().RUN_PROCESS_RESOURCES_MAVEN_TASK && AndroidMavenUtil.isMavenizedModule(module))) {
- return true;
- }
- return false;
- }
-
- @Override
- public GenerationItem[] getGenerationItems(CompileContext context) {
- return ApplicationManager.getApplication().runReadAction(new PrepareAction(context));
- }
-
- @Override
- public GenerationItem[] generate(final CompileContext context, final GenerationItem[] items, VirtualFile outputRootDirectory) {
- if (items != null && items.length > 0) {
- context.getProgressIndicator().setText(AndroidBundle.message("android.compile.messages.generating.r.java"));
-
- if (!context.getProject().isDisposed()) {
- return doGenerate(context, items, outputRootDirectory);
- }
- }
- return EMPTY_GENERATION_ITEM_ARRAY;
- }
-
- private static GenerationItem[] doGenerate(final CompileContext context, GenerationItem[] items, VirtualFile outputRootDirectory) {
- if (items == null || items.length == 0) {
- return EMPTY_GENERATION_ITEM_ARRAY;
- }
-
- final String genRootPath = FileUtil.toSystemDependentName(outputRootDirectory.getPath());
- final File genRootDir = new File(genRootPath);
-
- List<GenerationItem> results = new ArrayList<GenerationItem>(items.length);
- boolean toRefresh = false;
-
- for (GenerationItem item : items) {
- if (item instanceof AptGenerationItem) {
- final AptGenerationItem aptItem = (AptGenerationItem)item;
-
- if (!AndroidCompileUtil.isModuleAffected(context, aptItem.myModule)) {
- continue;
- }
-
- File tmpOutputDir = null;
- try {
- tmpOutputDir = FileUtil.createTempDirectory("android_apt_output", "tmp");
- Map<CompilerMessageCategory, List<String>> messages = AndroidCompileUtil.toCompilerMessageCategoryKeys(AndroidApt.compile(
- aptItem.myAndroidTarget, aptItem.myPlatformToolsRevision, aptItem.myManifestFile.getPath(),
- aptItem.myPackage, tmpOutputDir.getPath(), aptItem.myResourcesPaths, aptItem.myLibraryPackages,
- aptItem.myNonConstantFields, aptItem.myProguardCfgOutputFileOsPath));
-
- if (aptItem.myProguardCfgOutputFileOsPath != null) {
- LocalFileSystem.getInstance().refreshAndFindFileByIoFile(new File(aptItem.myProguardCfgOutputFileOsPath));
- }
- toRefresh = true;
- AndroidCompileUtil.addMessages(context, messages, aptItem.myModule);
-
- if (messages.get(CompilerMessageCategory.ERROR).isEmpty()) {
- if (!AndroidCommonUtils.directoriesContainSameContent(tmpOutputDir, genRootDir, JavaFilesFilter.INSTANCE)) {
- if (genRootDir.exists() && !FileUtil.delete(genRootDir)) {
- context.addMessage(CompilerMessageCategory.ERROR, "Cannot delete directory " + genRootPath, null, -1, -1);
- continue;
- }
- final File parent = genRootDir.getParentFile();
- if (parent != null && !parent.exists() && !parent.mkdirs()) {
- context.addMessage(CompilerMessageCategory.ERROR, "Cannot create directory " + parent.getPath(), null, -1, -1);
- continue;
- }
- // we use copyDir instead of moveDirWithContent here, because tmp directory may be located on other disk and
- // moveDirWithContent doesn't work for such case
- FileUtil.copyDir(tmpOutputDir, genRootDir);
- AndroidCompileUtil.markDirty(outputRootDirectory, true);
- }
- results.add(aptItem);
- }
- }
- catch (final IOException e) {
- LOG.info(e);
- ApplicationManager.getApplication().runReadAction(new Runnable() {
- @Override
- public void run() {
- if (context.getProject().isDisposed()) return;
- context.addMessage(CompilerMessageCategory.ERROR, "I/O error: " + e.getMessage(), null, -1, -1);
- }
- });
- }
- finally {
- if (tmpOutputDir != null) {
- FileUtil.delete(tmpOutputDir);
- }
- }
- }
- }
-
- if (toRefresh) {
- outputRootDirectory.refresh(false, true);
- }
- return results.toArray(new GenerationItem[results.size()]);
- }
-
- @Override
- @NotNull
- public String getDescription() {
- return FileUtil.getNameWithoutExtension(SdkConstants.FN_AAPT);
- }
-
- @Override
- public boolean validateConfiguration(CompileScope scope) {
- return true;
- }
-
- @Override
- public ValidityState createValidityState(DataInput is) throws IOException {
- return new MyValidityState(is);
- }
-
- @Nullable
- public static VirtualFile getResourceDirForApkCompiler(@NotNull AndroidFacet facet) {
- return facet.getProperties().USE_CUSTOM_APK_RESOURCE_FOLDER
- ? getCustomResourceDirForApt(facet)
- : AndroidRootUtil.getResourceDir(facet);
- }
-
- final static class AptGenerationItem implements GenerationItem {
- final Module myModule;
- final VirtualFile myManifestFile;
- final String[] myResourcesPaths;
- final IAndroidTarget myAndroidTarget;
-
- final String myPackage;
- final String[] myLibraryPackages;
- final boolean myNonConstantFields;
-
- final int myPlatformToolsRevision;
- private final MyValidityState myValidityState;
- private final String myProguardCfgOutputFileOsPath;
-
- private AptGenerationItem(@NotNull Module module,
- @NotNull VirtualFile manifestFile,
- @NotNull String[] resourcesPaths,
- @NotNull IAndroidTarget target,
- int platformToolsRevision,
- @NotNull String aPackage,
- @NotNull String[] libPackages,
- boolean nonConstantFields,
- @Nullable String proguardCfgOutputFileOsPath) {
- myModule = module;
- myManifestFile = manifestFile;
- myResourcesPaths = resourcesPaths;
- myAndroidTarget = target;
- myPackage = aPackage;
- myLibraryPackages = libPackages;
- myNonConstantFields = nonConstantFields;
- myPlatformToolsRevision = platformToolsRevision;
- myProguardCfgOutputFileOsPath = proguardCfgOutputFileOsPath;
- myValidityState = new MyValidityState(myModule, Collections.<String>emptySet(), myPlatformToolsRevision, myNonConstantFields,
- proguardCfgOutputFileOsPath != null ? proguardCfgOutputFileOsPath : "");
- }
-
- @Override
- public String getPath() {
- return "FAKE";
- }
-
- @Override
- public ValidityState getValidityState() {
- return myValidityState;
- }
-
- @Override
- public Module getModule() {
- return myModule;
- }
-
- @Override
- public boolean isTestSource() {
- return false;
- }
- }
-
- @Nullable
- public static VirtualFile getCustomResourceDirForApt(@NotNull AndroidFacet facet) {
- return AndroidRootUtil.getFileByRelativeModulePath(facet.getModule(), facet.getProperties().CUSTOM_APK_RESOURCE_FOLDER, false);
- }
-
- private static final class PrepareAction implements Computable<GenerationItem[]> {
- private final CompileContext myContext;
-
- public PrepareAction(CompileContext context) {
- myContext = context;
- }
-
- @Override
- public GenerationItem[] compute() {
- if (myContext.getProject().isDisposed()) {
- return EMPTY_GENERATION_ITEM_ARRAY;
- }
- Module[] modules = ModuleManager.getInstance(myContext.getProject()).getModules();
- List<GenerationItem> items = new ArrayList<GenerationItem>();
- for (Module module : modules) {
- AndroidFacet facet = AndroidFacet.getInstance(module);
- if (facet != null) {
- AndroidFacetConfiguration configuration = facet.getConfiguration();
- if (!isToCompileModule(module, configuration) ||
- AndroidCompileUtil.isLibraryWithBadCircularDependency(facet)) {
- continue;
- }
-
- final AndroidPlatform platform = configuration.getAndroidPlatform();
- if (platform == null) {
- myContext.addMessage(CompilerMessageCategory.ERROR,
- AndroidBundle.message("android.compilation.error.specify.platform", module.getName()), null, -1, -1);
- continue;
- }
-
- final IAndroidTarget target = platform.getTarget();
- final int platformToolsRevision = platform.getSdkData().getPlatformToolsRevision();
-
- String[] resPaths = AndroidCompileUtil.collectResourceDirs(facet, false, myContext);
- if (resPaths.length <= 0) {
- continue;
- }
-
- VirtualFile manifestFile = AndroidRootUtil.getManifestFileForCompiler(facet);
- if (manifestFile == null) {
- myContext.addMessage(CompilerMessageCategory.ERROR,
- AndroidBundle.message("android.compilation.error.manifest.not.found", module.getName()), null, -1, -1);
- continue;
- }
-
- Manifest manifest = AndroidUtils.loadDomElement(module, manifestFile, Manifest.class);
- if (manifest == null) {
- myContext.addMessage(CompilerMessageCategory.ERROR, "Cannot parse file", manifestFile.getUrl(), -1, -1);
- continue;
- }
-
- String packageName = manifest.getPackage().getValue();
- if (packageName != null) {
- packageName = packageName.trim();
- }
- if (packageName == null || packageName.length() <= 0) {
- myContext.addMessage(CompilerMessageCategory.ERROR, AndroidBundle.message("package.not.found.error"), manifestFile.getUrl(),
- -1, -1);
- continue;
- }
-
- if (!AndroidCommonUtils.contains2Identifiers(packageName)) {
- final String message = "[" + module.getName() + "] Package name must contain at least 2 segments";
- myContext.addMessage(facet.isLibraryProject() ? CompilerMessageCategory.WARNING : CompilerMessageCategory.ERROR,
- message, manifestFile.getUrl(), -1, -1);
- continue;
- }
- final String[] libPackages = AndroidCompileUtil.getLibPackages(module, packageName);
-
- final Module circularDepLibWithSamePackage = AndroidCompileUtil.findCircularDependencyOnLibraryWithSamePackage(facet);
- if (circularDepLibWithSamePackage != null && !facet.isLibraryProject()) {
- myContext.addMessage(CompilerMessageCategory.WARNING,
- AndroidBundle.message("android.compilation.warning.circular.app.dependency",
- packageName, module.getName(),
- circularDepLibWithSamePackage.getName()), null, -1, -1);
- }
- final boolean generateNonFinalFields = facet.isLibraryProject() || circularDepLibWithSamePackage != null;
-
- final VirtualFile outputDirForDex = AndroidDexCompiler.getOutputDirectoryForDex(module);
- final String proguardCfgOutputFileOsPath =
- AndroidCompileUtil.getProguardConfigFilePathIfShouldRun(facet, myContext) != null
- ? FileUtil.toSystemDependentName(outputDirForDex.getPath() + '/' + AndroidCommonUtils.PROGUARD_CFG_OUTPUT_FILE_NAME)
- : null;
-
- items.add(new AptGenerationItem(module, manifestFile, resPaths, target, platformToolsRevision, packageName, libPackages,
- generateNonFinalFields, proguardCfgOutputFileOsPath));
- }
- }
- return items.toArray(new GenerationItem[items.size()]);
- }
- }
-
- private static class MyValidityState extends ResourceNamesValidityState {
- private final String myCustomGenPathR;
- private final Set<String> myNonExistingFiles;
- private final int myPlatformToolsRevision;
- private final boolean myNonConstantFields;
- private final String myProguardCfgOutputFileOsPath;
-
- MyValidityState(@NotNull Module module,
- @NotNull Set<String> nonExistingFiles,
- int platformToolsRevision,
- boolean nonConstantFields,
- @NotNull String proguardCfgOutputFileOsPath) {
- super(module);
- myNonExistingFiles = nonExistingFiles;
- myPlatformToolsRevision = platformToolsRevision;
- myNonConstantFields = nonConstantFields;
- myProguardCfgOutputFileOsPath = proguardCfgOutputFileOsPath;
- AndroidFacet facet = AndroidFacet.getInstance(module);
- if (facet == null) {
- myCustomGenPathR = "";
- return;
- }
- AndroidFacetConfiguration configuration = facet.getConfiguration();
- myCustomGenPathR = configuration.getState().GEN_FOLDER_RELATIVE_PATH_APT;
- }
-
- public MyValidityState(DataInput is) throws IOException {
- super(is);
- String path = is.readUTF();
- myCustomGenPathR = path != null ? path : "";
-
- myNonExistingFiles = Collections.emptySet();
- myPlatformToolsRevision = is.readInt();
- myNonConstantFields = is.readBoolean();
- myProguardCfgOutputFileOsPath = is.readUTF();
- }
-
- @Override
- public boolean equalsTo(ValidityState otherState) {
- if (!(otherState instanceof MyValidityState)) {
- return false;
- }
-
- final MyValidityState otherState1 = (MyValidityState)otherState;
- if (!otherState1.myNonExistingFiles.equals(myNonExistingFiles)) {
- return false;
- }
- if (myPlatformToolsRevision != otherState1.myPlatformToolsRevision) {
- return false;
- }
- if (myNonConstantFields != otherState1.myNonConstantFields) {
- return false;
- }
- if (!Comparing.equal(myProguardCfgOutputFileOsPath, otherState1.myProguardCfgOutputFileOsPath)) {
- return false;
- }
- if (!super.equalsTo(otherState)) {
- return false;
- }
- return Comparing.equal(myCustomGenPathR, otherState1.myCustomGenPathR);
- }
-
- @Override
- public void save(DataOutput os) throws IOException {
- super.save(os);
- os.writeUTF(myCustomGenPathR);
- os.writeInt(myPlatformToolsRevision);
- os.writeBoolean(myNonConstantFields);
- os.writeUTF(myProguardCfgOutputFileOsPath);
- }
- }
-}
diff --git a/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java b/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java
index d022de3..ba84ba0 100644
--- a/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java
+++ b/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java
@@ -15,13 +15,11 @@
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.roots.*;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.io.FileUtil;
-import com.intellij.openapi.vfs.LocalFileSystem;
-import com.intellij.openapi.vfs.ReadonlyStatusHandler;
-import com.intellij.openapi.vfs.VfsUtilCore;
-import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.openapi.vfs.*;
import com.intellij.psi.search.FilenameIndex;
import com.intellij.util.containers.HashMap;
import com.intellij.util.containers.HashSet;
@@ -62,7 +60,6 @@
}
switch (mode) {
case AAPT:
- return AndroidAptCompiler.isToCompileModule(facet.getModule(), facet.getConfiguration());
case AIDL:
case RENDERSCRIPT:
case BUILDCONFIG:
@@ -487,7 +484,7 @@
return null;
}
- final VirtualFile[] sourceRoots = AndroidPackagingCompiler.getSourceRootsForModuleAndDependencies(module, false);
+ final VirtualFile[] sourceRoots = getSourceRootsForModuleAndDependencies(module, false);
final String[] sourceRootOsPaths = AndroidCompileUtil.toOsPaths(sourceRoots);
final String outFileOsPath = FileUtil.toSystemDependentName(
@@ -618,7 +615,7 @@
final VirtualFile vTempOutDir = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(tempOutDir);
final String depFolderPath =
- vTempOutDir != null ? AndroidRenderscriptCompiler.getDependencyFolder(context.getProject(), file, vTempOutDir) : null;
+ vTempOutDir != null ? getDependencyFolder(context.getProject(), file, vTempOutDir) : null;
final Map<CompilerMessageCategory, List<String>> messages = AndroidCompileUtil.toCompilerMessageCategoryKeys(
AndroidRenderscript
@@ -693,13 +690,8 @@
ApplicationManager.getApplication().invokeAndWait(new Runnable() {
@Override
public void run() {
- ApplicationManager.getApplication().runReadAction(new Runnable() {
- @Override
- public void run() {
- run[0] = !project.isDisposed() &&
- ReadonlyStatusHandler.ensureFilesWritable(project, filesToCheck.toArray(new VirtualFile[filesToCheck.size()]));
- }
- });
+ run[0] = !project.isDisposed() &&
+ ReadonlyStatusHandler.ensureFilesWritable(project, filesToCheck.toArray(new VirtualFile[filesToCheck.size()]));
}
}, ModalityState.defaultModalityState());
@@ -724,6 +716,61 @@
}
}
+ private static void fillSourceRoots(@NotNull Module module,
+ @NotNull Set<Module> visited,
+ @NotNull Set<VirtualFile> result,
+ boolean includingTests) {
+ visited.add(module);
+ final AndroidFacet facet = AndroidFacet.getInstance(module);
+ VirtualFile resDir = facet != null ? AndroidRootUtil.getResourceDir(facet) : null;
+ ModuleRootManager manager = ModuleRootManager.getInstance(module);
+ for (VirtualFile sourceRoot : manager.getSourceRoots(includingTests)) {
+ if (!Comparing.equal(resDir, sourceRoot)) {
+ result.add(sourceRoot);
+ }
+ }
+ for (OrderEntry entry : manager.getOrderEntries()) {
+ if (entry instanceof ModuleOrderEntry) {
+ ModuleOrderEntry moduleOrderEntry = (ModuleOrderEntry)entry;
+ DependencyScope scope = moduleOrderEntry.getScope();
+ if (scope == DependencyScope.COMPILE) {
+ Module depModule = moduleOrderEntry.getModule();
+ if (depModule != null && !visited.contains(depModule)) {
+ fillSourceRoots(depModule, visited, result, false);
+ }
+ }
+ }
+ }
+ }
+
+ @NotNull
+ public static VirtualFile[] getSourceRootsForModuleAndDependencies(@NotNull Module module, boolean includingTests) {
+ Set<VirtualFile> result = new HashSet<VirtualFile>();
+ fillSourceRoots(module, new HashSet<Module>(), result, includingTests);
+ return VfsUtil.toVirtualFileArray(result);
+ }
+
+ @Nullable
+ static String getDependencyFolder(@NotNull final Project project,
+ @NotNull final VirtualFile sourceFile,
+ @NotNull final VirtualFile genFolder) {
+ final ProjectFileIndex index = ProjectRootManager.getInstance(project).getFileIndex();
+
+ final VirtualFile sourceRoot = index.getSourceRootForFile(sourceFile);
+ if (sourceRoot == null) {
+ return null;
+ }
+
+ final VirtualFile parent = sourceFile.getParent();
+ if (Comparing.equal(parent, sourceRoot)) {
+ return genFolder.getPath();
+ }
+
+ final String relativePath = VfsUtilCore.getRelativePath(sourceFile.getParent(), sourceRoot, '/');
+ assert relativePath != null;
+ return genFolder.getPath() + '/' + relativePath;
+ }
+
private static class AptAutogenerationItem {
final String myPackage;
final String myOutputDirOsPath;
diff --git a/android/src/org/jetbrains/android/compiler/AndroidBuildConfigGeneratingCompiler.java b/android/src/org/jetbrains/android/compiler/AndroidBuildConfigGeneratingCompiler.java
deleted file mode 100644
index 3614248..0000000
--- a/android/src/org/jetbrains/android/compiler/AndroidBuildConfigGeneratingCompiler.java
+++ /dev/null
@@ -1,224 +0,0 @@
-package org.jetbrains.android.compiler;
-
-import com.android.sdklib.internal.build.BuildConfigGenerator;
-import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.compiler.*;
-import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.module.Module;
-import com.intellij.openapi.module.ModuleManager;
-import com.intellij.openapi.util.Computable;
-import com.intellij.openapi.util.Ref;
-import com.intellij.openapi.util.io.FileUtil;
-import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.util.xml.NanoXmlUtil;
-import org.jetbrains.android.facet.AndroidFacet;
-import org.jetbrains.android.facet.AndroidRootUtil;
-import org.jetbrains.android.util.AndroidBundle;
-import org.jetbrains.android.util.AndroidCommonUtils;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Eugene.Kudelevsky
- */
-public class AndroidBuildConfigGeneratingCompiler implements SourceGeneratingCompiler {
- private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.compiler.AndroidBuildConfigGeneratingCompiler");
- private static final String MANIFEST_LOCATION = NanoXmlUtil.createLocation("manifest");
-
- @Nullable
- @Override
- public VirtualFile getPresentableFile(CompileContext context, Module module, VirtualFile outputRoot, VirtualFile generatedFile) {
- return null;
- }
-
- @Override
- public GenerationItem[] getGenerationItems(final CompileContext context) {
- return ApplicationManager.getApplication().runReadAction(new Computable<GenerationItem[]>() {
- @Override
- public GenerationItem[] compute() {
- final List<GenerationItem> result = new ArrayList<GenerationItem>();
-
- for (Module module : ModuleManager.getInstance(context.getProject()).getModules()) {
- final AndroidFacet facet = AndroidFacet.getInstance(module);
- if (facet == null || AndroidCompileUtil.isLibraryWithBadCircularDependency(facet)) {
- continue;
- }
-
- final VirtualFile manifestFile = AndroidRootUtil.getManifestFileForCompiler(facet);
- if (manifestFile == null) {
- context.addMessage(CompilerMessageCategory.ERROR,
- AndroidBundle.message("android.compilation.error.manifest.not.found", module.getName()), null, -1, -1);
- continue;
- }
-
- String packageName;
- try {
- // we cannot use DOM here because custom manifest file can be excluded (ex. it can be located in /target/ folder)
- packageName = parsePackageName(manifestFile);
- }
- catch (IOException e) {
- context.addMessage(CompilerMessageCategory.ERROR, "I/O error: " + e.getMessage(), null, -1, -1);
- continue;
- }
-
- if (packageName != null) {
- packageName = packageName.trim();
- }
- if (packageName == null || packageName.length() <= 0) {
- context.addMessage(CompilerMessageCategory.ERROR, AndroidBundle.message("package.not.found.error"), manifestFile.getUrl(),
- -1, -1);
- continue;
- }
- final boolean debug = !AndroidCompileUtil.isReleaseBuild(context);
- result.add(new MyGenerationItem(module, packageName, debug));
-
- for (String libPackage : AndroidCompileUtil.getLibPackages(module, packageName)) {
- result.add(new MyGenerationItem(module, libPackage, debug));
- }
- }
- return result.toArray(new GenerationItem[result.size()]);
- }
- });
- }
-
- @Override
- public GenerationItem[] generate(CompileContext context,
- GenerationItem[] items,
- VirtualFile outputRootDirectory) {
- if (items == null || items.length == 0) {
- return new GenerationItem[0];
- }
- context.getProgressIndicator().setText("Generating BuildConfig.java...");
-
- final String genFolderOsPath = FileUtil.toSystemDependentName(outputRootDirectory.getPath());
- final List<GenerationItem> result = new ArrayList<GenerationItem>();
-
- for (GenerationItem item : items) {
- final MyGenerationItem genItem = (MyGenerationItem)item;
- final BuildConfigGenerator generator = new BuildConfigGenerator(genFolderOsPath, genItem.myPackage, genItem.myDebug);
- try {
- generator.generate();
- result.add(genItem);
- }
- catch (IOException e) {
- context.addMessage(CompilerMessageCategory.ERROR, "I/O error: " + e.getMessage(), null, -1, -1);
- LOG.info(e);
- }
- }
-
- if (result.size() > 0) {
- AndroidCompileUtil.markDirtyAndRefresh(outputRootDirectory, true);
- }
- return result.toArray(new GenerationItem[result.size()]);
- }
-
- @Nullable
- private static String parsePackageName(@NotNull VirtualFile manifestFile) throws IOException {
- final Ref<String> packageNameRef = Ref.create(null);
-
- NanoXmlUtil.parse(manifestFile.getInputStream(), new NanoXmlUtil.BaseXmlBuilder() {
- @Override
- public void addAttribute(String key, String nsPrefix, String nsURI, String value, String type)
- throws Exception {
- super.addAttribute(key, nsPrefix, nsURI, value, type);
-
- if (AndroidCommonUtils.PACKAGE_MANIFEST_ATTRIBUTE.equals(key) &&
- MANIFEST_LOCATION.equals(getLocation())) {
- packageNameRef.set(value);
- stop();
- }
- }
-
- @Override
- public void elementAttributesProcessed(String name, String nsPrefix, String nsURI) throws Exception {
- super.elementAttributesProcessed(name, nsPrefix, nsURI);
- stop();
- }
- });
- return packageNameRef.get();
- }
-
- @NotNull
- @Override
- public String getDescription() {
- return "Android BuildConfig Generator";
- }
-
- @Override
- public boolean validateConfiguration(CompileScope scope) {
- return true;
- }
-
- @Override
- public ValidityState createValidityState(DataInput in) throws IOException {
- return new MyValidityState(in);
- }
-
- private static class MyGenerationItem implements GenerationItem {
- final Module myModule;
- final String myPackage;
- final boolean myDebug;
-
- private MyGenerationItem(@NotNull Module module, @NotNull String aPackage, boolean debug) {
- myModule = module;
- myPackage = aPackage;
- myDebug = debug;
- }
-
- @Override
- public String getPath() {
- return myPackage.replace('.', '/') + '/' + BuildConfigGenerator.BUILD_CONFIG_NAME;
- }
-
- @Override
- public ValidityState getValidityState() {
- return new MyValidityState(myPackage, myDebug);
- }
-
- @Override
- public Module getModule() {
- return myModule;
- }
-
- @Override
- public boolean isTestSource() {
- return false;
- }
- }
-
- private static class MyValidityState implements ValidityState {
- private final String myPackage;
- private boolean myDebug;
-
- private MyValidityState(DataInput in) throws IOException {
- myPackage = in.readUTF();
- myDebug = in.readBoolean();
- }
-
- private MyValidityState(@NotNull String aPackage, boolean debug) {
- myPackage = aPackage;
- myDebug = debug;
- }
-
- @Override
- public boolean equalsTo(ValidityState otherState) {
- if (!(otherState instanceof MyValidityState)) {
- return false;
- }
- final MyValidityState otherState1 = (MyValidityState)otherState;
- return otherState1.myPackage.equals(myPackage) && otherState1.myDebug == myDebug;
- }
-
- @Override
- public void save(DataOutput out) throws IOException {
- out.writeUTF(myPackage);
- out.writeBoolean(myDebug);
- }
- }
-}
\ No newline at end of file
diff --git a/android/src/org/jetbrains/android/compiler/AndroidBuildTargetScopeProvider.java b/android/src/org/jetbrains/android/compiler/AndroidBuildTargetScopeProvider.java
index 7ec9b17..e786b8c 100644
--- a/android/src/org/jetbrains/android/compiler/AndroidBuildTargetScopeProvider.java
+++ b/android/src/org/jetbrains/android/compiler/AndroidBuildTargetScopeProvider.java
@@ -35,7 +35,7 @@
return true;
}
}
- final String proguardCfgPathsStr = scope.getUserData(AndroidProguardCompiler.PROGUARD_CFG_PATHS_KEY);
+ final String proguardCfgPathsStr = scope.getUserData(AndroidCompileUtil.PROGUARD_CFG_PATHS_KEY);
if (proguardCfgPathsStr != null && proguardCfgPathsStr.length() > 0) {
return true;
}
diff --git a/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java b/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java
index 19ea7f9..0592afc 100644
--- a/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java
+++ b/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java
@@ -30,12 +30,13 @@
import com.intellij.notification.NotificationType;
import com.intellij.notification.Notifications;
import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.compiler.*;
-import com.intellij.openapi.compiler.Compiler;
+import com.intellij.openapi.compiler.CompileContext;
+import com.intellij.openapi.compiler.CompileScope;
+import com.intellij.openapi.compiler.CompilerManager;
+import com.intellij.openapi.compiler.CompilerMessageCategory;
import com.intellij.openapi.compiler.options.ExcludeEntryDescription;
import com.intellij.openapi.compiler.options.ExcludedEntriesConfiguration;
import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.module.ModifiableModuleModel;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
@@ -52,7 +53,6 @@
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.*;
-import com.intellij.openapi.vfs.newvfs.NewVirtualFile;
import com.intellij.packaging.artifacts.Artifact;
import com.intellij.packaging.artifacts.ArtifactProperties;
import com.intellij.packaging.impl.compiler.ArtifactCompileScope;
@@ -99,6 +99,7 @@
@NonNls public static final String OLD_PROGUARD_CFG_FILE_NAME = "proguard.cfg";
public static final String UNSIGNED_SUFFIX = ".unsigned";
+ public static Key<String> PROGUARD_CFG_PATHS_KEY = Key.create(AndroidCommonUtils.PROGUARD_CFG_PATHS_OPTION);
private AndroidCompileUtil() {
}
@@ -459,7 +460,7 @@
if (project.isDisposed()) return;
CompilerTask task = new CompilerTask(project, "Android auto-generation", true, false, true, true);
CompileScope scope = new ModuleCompileScope(module, false);
- contextWrapper[0] = new CompileContextImpl(project, task, scope, null, false, false);
+ contextWrapper[0] = new CompileContextImpl(project, task, scope, false, false);
}
});
CompileContext context = contextWrapper[0];
@@ -526,51 +527,6 @@
}
}
- @NotNull
- public static String[] collectResourceDirs(AndroidFacet facet, boolean collectResCacheDirs, @Nullable CompileContext context) {
- final Project project = facet.getModule().getProject();
- final IntermediateOutputCompiler pngFilesCachingCompiler =
- collectResCacheDirs ? Extensions.findExtension(Compiler.EP_NAME, project, AndroidPngFilesCachingCompiler.class) : null;
-
- if (collectResCacheDirs) {
- assert pngFilesCachingCompiler != null;
- }
-
- final List<String> result = new ArrayList<String>();
-
- doCollectResourceDirs(facet, collectResCacheDirs, result, context);
-
- for (AndroidFacet depFacet : AndroidUtils.getAllAndroidDependencies(facet.getModule(), true)) {
- doCollectResourceDirs(depFacet, collectResCacheDirs, result, context);
- }
- return ArrayUtil.toStringArray(result);
- }
-
- private static void doCollectResourceDirs(AndroidFacet facet, boolean collectResCacheDirs, List<String> result, CompileContext context) {
- final Module module = facet.getModule();
-
- if (collectResCacheDirs) {
- final AndroidPlatform platform = facet.getConfiguration().getAndroidPlatform();
- final int platformToolsRevision = platform != null ? platform.getSdkData().getPlatformToolsRevision() : -1;
-
- if (platformToolsRevision < 0 || platformToolsRevision > 7) {
- // png cache is supported since platform-tools-r8
- final String resCacheDirOsPath = findResourcesCacheDirectory(module, false, context);
- if (resCacheDirOsPath != null) {
- result.add(resCacheDirOsPath);
- }
- else {
- LOG.info("PNG cache not found for module " + module.getName());
- }
- }
- }
-
- final VirtualFile resourcesDir = AndroidAptCompiler.getResourceDirForApkCompiler(facet);
- if (resourcesDir != null) {
- result.add(resourcesDir.getPath());
- }
- }
-
@Nullable
public static String findResourcesCacheDirectory(@NotNull Module module, boolean createIfNotFound, @Nullable CompileContext context) {
final Project project = module.getProject();
@@ -685,22 +641,10 @@
(createIfNotExist ? genRootsToCreate : genRootsToInit).add(renderscriptGenRootPath);
}
- if (AndroidAptCompiler.isToCompileModule(module, facet.getConfiguration())) {
- final String aptGenRootPath = AndroidRootUtil.getAptGenSourceRootPath(facet);
+ final String aptGenRootPath = AndroidRootUtil.getAptGenSourceRootPath(facet);
- if (aptGenRootPath != null) {
- genRootsToCreate.add(aptGenRootPath);
- }
- }
- else {
- // we need to include generated-sources/r to compilation, because it contains R.java generated by Maven,
- // which should be used in Maven-based resource processing mode
- final VirtualFile aptSourceRoot = initializeGenSourceRoot(model, AndroidRootUtil.getAptGenSourceRootPath(facet),
- true, false, modelChangedFlag);
- if (aptSourceRoot != null) {
- excludeAllBuildConfigsFromCompilation(facet, aptSourceRoot);
- }
- includeAaptGenSourceRootToCompilation(facet);
+ if (aptGenRootPath != null) {
+ genRootsToCreate.add(aptGenRootPath);
}
final String aidlGenRootPath = AndroidRootUtil.getAidlGenSourceRootPath(facet);
@@ -773,12 +717,6 @@
if (sourceRoot != null && excludeInNonExternalMode) {
final Module module = model.getModule();
final CompilerWorkspaceConfiguration config = CompilerWorkspaceConfiguration.getInstance(module.getProject());
-
- // In JPS generated roots are excluded by AndroidExcludeJavaSourceRootProvider,
- // so we don't need to mark them in the project model
- if (!config.useOutOfProcessBuild()) {
- excludeFromCompilation(module.getProject(), sourceRoot);
- }
}
return sourceRoot;
}
@@ -850,7 +788,7 @@
@Nullable
public static ProguardRunningOptions getProguardConfigFilePathIfShouldRun(@NotNull AndroidFacet facet, CompileContext context) {
// wizard
- String pathsStr = context.getCompileScope().getUserData(AndroidProguardCompiler.PROGUARD_CFG_PATHS_KEY);
+ String pathsStr = context.getCompileScope().getUserData(PROGUARD_CFG_PATHS_KEY);
if (pathsStr != null) {
final String[] paths = pathsStr.split(File.pathSeparator);
@@ -965,48 +903,13 @@
@Nullable
public static String getUnsignedApkPath(@NotNull AndroidFacet facet) {
- final boolean useCompileServer = CompilerWorkspaceConfiguration.getInstance(
- facet.getModule().getProject()).useOutOfProcessBuild();
- final String apkPath = AndroidRootUtil.getApkPath(facet);
-
- if (apkPath != null) {
- return useCompileServer
- ? apkPath
- : AndroidCommonUtils.addSuffixToFileName(apkPath, UNSIGNED_SUFFIX);
- }
- return null;
- }
-
- @Nullable
- public static <T> T handleExceptionError(@NotNull CompileContext context,
- @NotNull String messagePrefix,
- @NotNull Exception e) {
- reportException(context, messagePrefix, e);
- return null;
+ return AndroidRootUtil.getApkPath(facet);
}
public static void reportException(@NotNull CompileContext context, @NotNull String messagePrefix, @NotNull Exception e) {
context.addMessage(CompilerMessageCategory.ERROR, messagePrefix + e.getClass().getSimpleName() + ": " + e.getMessage(), null, -1, -1);
}
- public static void markDirtyAndRefresh(VirtualFile f, boolean recursively) {
- markDirty(f, recursively);
- f.refresh(false, recursively);
- }
-
- public static void markDirty(VirtualFile f, boolean recursively) {
- if (f instanceof NewVirtualFile) {
- final NewVirtualFile newF = (NewVirtualFile)f;
-
- if (recursively) {
- newF.markDirtyRecursively();
- }
- else {
- newF.markDirty();
- }
- }
- }
-
@Nullable
public static String getAaptManifestPackage(@NotNull AndroidFacet facet) {
if (facet.getProperties().USE_CUSTOM_MANIFEST_PACKAGE) {
diff --git a/android/src/org/jetbrains/android/compiler/AndroidDependencyProcessor.java b/android/src/org/jetbrains/android/compiler/AndroidDependencyProcessor.java
deleted file mode 100644
index 024e099..0000000
--- a/android/src/org/jetbrains/android/compiler/AndroidDependencyProcessor.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.jetbrains.android.compiler;
-
-import com.intellij.compiler.DependencyProcessor;
-import com.intellij.compiler.make.*;
-import com.intellij.facet.ProjectFacetManager;
-import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.compiler.CompileContext;
-import com.intellij.openapi.compiler.ex.CompileContextEx;
-import com.intellij.openapi.project.Project;
-import com.intellij.psi.*;
-import com.intellij.psi.search.GlobalSearchScope;
-import com.intellij.util.containers.HashSet;
-import org.jetbrains.android.facet.AndroidFacet;
-import org.jetbrains.android.util.AndroidCommonUtils;
-import org.jetbrains.annotations.Nullable;
-
-import java.io.File;
-import java.util.Collection;
-import java.util.Set;
-
-/**
- * @author Eugene.Kudelevsky
- */
-public class AndroidDependencyProcessor implements DependencyProcessor {
- @Override
- public void processDependencies(final CompileContext context, int classQualifiedName, final CachingSearcher searcher)
- throws CacheCorruptedException {
- if (!(context instanceof CompileContextEx)) {
- return;
- }
- final Project project = context.getProject();
-
- if (!ProjectFacetManager.getInstance(project).hasFacets(AndroidFacet.ID)) {
- return;
- }
- final DependencyCache depCache = ((CompileContextEx)context).getDependencyCache();
- final Cache cache = depCache.getCache();
- final String path = cache.getPath(classQualifiedName);
- final String classFileName = new File(path).getName();
-
- if (!AndroidCommonUtils.R_PATTERN.matcher(classFileName).matches()) {
- return;
- }
- final String qName = depCache.resolve(classQualifiedName);
- final int idx = qName.indexOf('$');
- final String topLevelClassName = idx < 0 ? qName : qName.substring(0, idx);
- final Set<String> qNamesToMark = new HashSet<String>();
-
- ApplicationManager.getApplication().runReadAction(new Runnable() {
- @Override
- public void run() {
- final PsiClass[] classes =
- JavaPsiFacade.getInstance(project).findClasses(topLevelClassName, GlobalSearchScope.projectScope(project));
-
- for (PsiClass aClass : classes) {
- final Collection<PsiReference> references = searcher.findReferences(aClass, true);
-
- for (PsiReference reference : references) {
- final PsiClass ownerClass = getOwnerClass(reference.getElement());
- if (ownerClass != null && !ownerClass.equals(aClass)) {
- final String ownerClassQName = ownerClass.getQualifiedName();
-
- if (ownerClassQName != null) {
- qNamesToMark.add(ownerClassQName);
- }
- }
- }
- }
- }
- });
-
- for (String toMark : qNamesToMark) {
- final int qualifiedName = depCache.getSymbolTable().getId(toMark);
- depCache.markClass(qualifiedName);
- }
- }
-
- @Nullable
- private static PsiClass getOwnerClass(PsiElement element) {
- while (!(element instanceof PsiFile) && element != null) {
- if (element instanceof PsiClass && element.getParent() instanceof PsiJavaFile) {
- return (PsiClass)element;
- }
- element = element.getParent();
- }
- return null;
- }
-}
diff --git a/android/src/org/jetbrains/android/compiler/AndroidExternalApklibExtractingCompiler.java b/android/src/org/jetbrains/android/compiler/AndroidExternalApklibExtractingCompiler.java
deleted file mode 100644
index c6235be..0000000
--- a/android/src/org/jetbrains/android/compiler/AndroidExternalApklibExtractingCompiler.java
+++ /dev/null
@@ -1,249 +0,0 @@
-package org.jetbrains.android.compiler;
-
-import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.compiler.*;
-import com.intellij.openapi.compiler.ex.CompileContextEx;
-import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.module.Module;
-import com.intellij.openapi.module.ModuleManager;
-import com.intellij.openapi.util.Computable;
-import com.intellij.openapi.util.io.FileUtil;
-import com.intellij.openapi.vfs.LocalFileSystem;
-import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.util.containers.HashSet;
-import com.intellij.util.io.ZipUtil;
-import org.jetbrains.android.facet.AndroidFacet;
-import org.jetbrains.android.facet.AndroidRootUtil;
-import org.jetbrains.android.maven.AndroidExternalApklibDependenciesManager;
-import org.jetbrains.android.maven.AndroidMavenUtil;
-import org.jetbrains.android.util.AndroidBundle;
-import org.jetbrains.android.util.AndroidUtils;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.io.DataInput;
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Eugene.Kudelevsky
- */
-public class AndroidExternalApklibExtractingCompiler implements SourceGeneratingCompiler {
- private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.compiler.AndroidExternalApklibExtractingCompiler");
-
- @Nullable
- @Override
- public VirtualFile getPresentableFile(CompileContext context, Module module, VirtualFile outputRoot, VirtualFile generatedFile) {
- return null;
- }
-
- @Override
- public GenerationItem[] getGenerationItems(final CompileContext context) {
- return ApplicationManager.getApplication().runReadAction(new Computable<GenerationItem[]>() {
- @Override
- public GenerationItem[] compute() {
- final List<GenerationItem> result = new ArrayList<GenerationItem>();
-
- for (Module module : ModuleManager.getInstance(context.getProject()).getModules()) {
- final AndroidFacet facet = AndroidFacet.getInstance(module);
- if (facet == null || !facet.isLibraryProject()) {
- continue;
- }
-
- final String mavenIdStr = AndroidMavenUtil.getMavenIdStringByExtApklibModule(facet.getModule());
- if (mavenIdStr == null) {
- continue;
- }
-
- final AndroidExternalApklibDependenciesManager manager =
- AndroidExternalApklibDependenciesManager.getInstance(context.getProject());
- final String artifactFilePath = manager.getArtifactFilePath(mavenIdStr);
-
- if (artifactFilePath == null) {
- context.addMessage(CompilerMessageCategory.ERROR,
- "Cannot find artifact file for generated module " + module.getName() + ". Try to force reimport Maven model",
- null, -1, -1);
- continue;
- }
-
- final VirtualFile root = AndroidRootUtil.getMainContentRoot(facet);
- if (root == null) {
- context.addMessage(CompilerMessageCategory.ERROR, "Cannot find main root in generated module containing AndroidManifest.xml" +
- module.getName() +
- ". Try to force reimport Maven model", null, -1, -1);
- continue;
- }
-
- result.add(new MyGenerationItem(module, FileUtil.toSystemDependentName(root.getPath()),
- FileUtil.toSystemDependentName(artifactFilePath)));
- }
-
- return result.toArray(new GenerationItem[result.size()]);
- }
- });
- }
-
- @Override
- public GenerationItem[] generate(CompileContext context,
- GenerationItem[] items,
- VirtualFile outputRootDirectory) {
- if (items == null || items.length == 0) {
- return new GenerationItem[0];
- }
-
- context.getProgressIndicator().setText(AndroidBundle.message("android.compile.messages.processing.external.apklib.dependencies"));
-
- final GenerationItem[] generatedItems = doGenerate(context, items);
- final Set<VirtualFile> generatedVFiles = new HashSet<VirtualFile>();
- final HashSet<VirtualFile> visited = new HashSet<VirtualFile>();
-
- for (GenerationItem item : generatedItems) {
- final MyGenerationItem genItem = (MyGenerationItem)item;
- final File contentRoot = new File(genItem.getGenContentRootPath());
- final VirtualFile vContentRoot = LocalFileSystem.getInstance().findFileByIoFile(contentRoot);
-
- if (vContentRoot != null) {
- vContentRoot.refresh(false, true);
- final VirtualFile vSrcRoot = vContentRoot.findChild(AndroidMavenUtil.APK_LIB_ARTIFACT_SOURCE_ROOT);
-
- if (vSrcRoot != null) {
- AndroidCompileUtil.markDirty(vSrcRoot, true);
- AndroidUtils.collectFiles(vSrcRoot, visited, generatedVFiles);
- }
- }
- }
-
- if (context instanceof CompileContextEx) {
- ((CompileContextEx)context).markGenerated(generatedVFiles);
- }
-
- return generatedItems;
- }
-
- private static GenerationItem[] doGenerate(CompileContext context, GenerationItem[] items) {
- final List<GenerationItem> result = new ArrayList<GenerationItem>();
-
- for (GenerationItem item : items) {
- final Module module = item.getModule();
-
- if (!AndroidCompileUtil.isModuleAffected(context, module)) {
- continue;
- }
-
- final MyGenerationItem genItem = (MyGenerationItem)item;
-
- final String artifactPath = genItem.getArtifactPath();
- final File artifactFile = new File(artifactPath);
-
- if (!artifactFile.exists()) {
- context.addMessage(CompilerMessageCategory.ERROR, "Cannot find file " + artifactPath, null, -1, -1);
- continue;
- }
-
- if (!artifactFile.isFile()) {
- context.addMessage(CompilerMessageCategory.ERROR, artifactPath + " is not file", null, -1, -1);
- continue;
- }
-
- final String genContentRootPath = ((MyGenerationItem)item).getGenContentRootPath();
- final File genContentRootFile = new File(genContentRootPath);
-
- if (genContentRootFile.exists()) {
- if (!FileUtil.delete(genContentRootFile)) {
- context.addMessage(CompilerMessageCategory.ERROR, "Cannot delete old directory: " + genContentRootPath, null, -1, -1);
- continue;
- }
- }
-
- if (!genContentRootFile.mkdir()) {
- context.addMessage(CompilerMessageCategory.ERROR, "Cannot create directory " + genContentRootPath, null, -1, -1);
- continue;
- }
-
- try {
- ZipUtil.extract(artifactFile, genContentRootFile, null);
- }
- catch (IOException e) {
- final String message = e.getMessage();
- if (message == null) {
- context.addMessage(CompilerMessageCategory.ERROR, "Unknown I/O error", null, -1, -1);
- LOG.error(e);
- }
- else {
- context.addMessage(CompilerMessageCategory.ERROR, message, null, -1, -1);
- LOG.info(e);
- }
- continue;
- }
-
- result.add(genItem);
- }
-
- return result.toArray(new GenerationItem[result.size()]);
- }
-
- @NotNull
- @Override
- public String getDescription() {
- return "Android External Apklib Extracting Compiler";
- }
-
- @Override
- public boolean validateConfiguration(CompileScope scope) {
- return true;
- }
-
- @Override
- public ValidityState createValidityState(DataInput in) throws IOException {
- return TimestampValidityState.load(in);
- }
-
- private static class MyGenerationItem implements GenerationItem {
- private final Module myModule;
- private final String myGenContentRootPath;
- private final String myArtifactPath;
- private final TimestampValidityState myValidityState;
-
- private MyGenerationItem(@NotNull Module module, @NotNull String genContentRootPath, @NotNull String artifactPath) {
- myModule = module;
- myGenContentRootPath = genContentRootPath;
- myArtifactPath = artifactPath;
- myValidityState = new TimestampValidityState(new File(myArtifactPath).lastModified());
- }
-
- @Nullable
- @Override
- public String getPath() {
- return myGenContentRootPath;
- }
-
- @Override
- public ValidityState getValidityState() {
- return myValidityState;
- }
-
- @Override
- @NotNull
- public Module getModule() {
- return myModule;
- }
-
- @Override
- public boolean isTestSource() {
- return false;
- }
-
- @NotNull
- public String getGenContentRootPath() {
- return myGenContentRootPath;
- }
-
- @NotNull
- public String getArtifactPath() {
- return myArtifactPath;
- }
- }
-}
diff --git a/android/src/org/jetbrains/android/compiler/AndroidIdlCompiler.java b/android/src/org/jetbrains/android/compiler/AndroidIdlCompiler.java
deleted file mode 100644
index 90d7e5c..0000000
--- a/android/src/org/jetbrains/android/compiler/AndroidIdlCompiler.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright 2000-2010 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jetbrains.android.compiler;
-
-import com.android.sdklib.IAndroidTarget;
-import com.android.SdkConstants;
-import com.intellij.facet.FacetManager;
-import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.compiler.*;
-import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.module.Module;
-import com.intellij.openapi.project.Project;
-import com.intellij.openapi.roots.ProjectFileIndex;
-import com.intellij.openapi.roots.ProjectRootManager;
-import com.intellij.openapi.util.Computable;
-import com.intellij.openapi.util.io.FileUtil;
-import com.intellij.openapi.vfs.VirtualFile;
-import org.jetbrains.android.compiler.tools.AndroidIdl;
-import org.jetbrains.android.facet.AndroidFacet;
-import org.jetbrains.android.facet.AndroidRootUtil;
-import org.jetbrains.android.fileTypes.AndroidIdlFileType;
-import org.jetbrains.android.util.AndroidBundle;
-import org.jetbrains.android.util.AndroidUtils;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.io.DataInput;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Android IDL compiler.
- *
- * @author Alexey Efimov
- */
-public class AndroidIdlCompiler implements SourceGeneratingCompiler {
- private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.compiler.AndroidIdlCompiler");
-
- private static final GenerationItem[] EMPTY_GENERATION_ITEM_ARRAY = {};
-
- private final Project myProject;
-
- public AndroidIdlCompiler(Project project) {
- myProject = project;
- }
-
- @Nullable
- @Override
- public VirtualFile getPresentableFile(CompileContext context, Module module, VirtualFile outputRoot, VirtualFile generatedFile) {
- return null;
- }
-
- @Override
- public GenerationItem[] getGenerationItems(CompileContext context) {
- return ApplicationManager.getApplication().runReadAction(new PrepareAction(context));
- }
-
- @Override
- public GenerationItem[] generate(CompileContext context, GenerationItem[] items, VirtualFile outputRootDirectory) {
- if (items != null && items.length > 0) {
- context.getProgressIndicator().setText("Generating AIDL files...");
- return doGenerate(context, items, outputRootDirectory);
- }
- return EMPTY_GENERATION_ITEM_ARRAY;
- }
-
- @Override
- @NotNull
- public String getDescription() {
- return FileUtil.getNameWithoutExtension(SdkConstants.FN_AIDL);
- }
-
- @Override
- public boolean validateConfiguration(CompileScope scope) {
- return true;
- }
-
- @Override
- @Nullable
- public ValidityState createValidityState(DataInput is) throws IOException {
- return TimestampValidityState.load(is);
- }
-
- private final static class IdlGenerationItem implements GenerationItem {
- final Module myModule;
- final VirtualFile myFile;
- final boolean myTestSource;
- final IAndroidTarget myAndroidTarget;
- final String myPackageName;
- private final TimestampValidityState myValidityState;
-
- public IdlGenerationItem(@NotNull Module module,
- @NotNull VirtualFile file,
- boolean testSource,
- @NotNull IAndroidTarget androidTarget,
- @NotNull String packageName) {
- myModule = module;
- myFile = file;
- myTestSource = testSource;
- myAndroidTarget = androidTarget;
- myPackageName = packageName;
- myValidityState = new TimestampValidityState(myFile.getTimeStamp());
- }
-
- @Override
- @Nullable
- public String getPath() {
- return myPackageName.replace('.', '/') + '/' + myFile.getNameWithoutExtension() + ".java";
- }
-
- @Override
- @Nullable
- public ValidityState getValidityState() {
- return myValidityState;
- }
-
- @Override
- public Module getModule() {
- return myModule;
- }
-
- @Override
- public boolean isTestSource() {
- return myTestSource;
- }
- }
-
- private final class PrepareAction implements Computable<GenerationItem[]> {
- private final CompileContext myContext;
-
- public PrepareAction(CompileContext context) {
- myContext = context;
- }
-
- @Override
- public GenerationItem[] compute() {
- if (myContext.getProject().isDisposed()) {
- return EMPTY_GENERATION_ITEM_ARRAY;
- }
- VirtualFile[] files = myContext.getProjectCompileScope().getFiles(AndroidIdlFileType.ourFileType, true);
- List<GenerationItem> items = new ArrayList<GenerationItem>(files.length);
- for (VirtualFile file : files) {
- Module module = myContext.getModuleByFile(file);
- AndroidFacet facet = FacetManager.getInstance(module).getFacetByType(AndroidFacet.ID);
- if (facet != null) {
- IAndroidTarget target = facet.getConfiguration().getAndroidTarget();
- if (target == null) {
- myContext.addMessage(CompilerMessageCategory.ERROR,
- AndroidBundle.message("android.compilation.error.specify.platform", module.getName()), null, -1, -1);
- continue;
- }
- String packageName = AndroidUtils.computePackageName(module, file);
- if (packageName == null) {
- myContext.addMessage(CompilerMessageCategory.ERROR, "Cannot compute package for file", file.getUrl(), -1, -1);
- continue;
- }
-
- addItem(file, facet, target, packageName, items);
- }
- }
- return items.toArray(new GenerationItem[items.size()]);
- }
-
- private void addItem(VirtualFile file,
- AndroidFacet facet,
- IAndroidTarget target,
- String packageName,
- List<GenerationItem> items) {
- Module module = facet.getModule();
- String sourceRootPath = AndroidRootUtil.getAidlGenSourceRootPath(facet);
- if (sourceRootPath == null) {
- myContext.addMessage(CompilerMessageCategory.ERROR,
- AndroidBundle.message("android.compilation.error.apt.gen.not.specified", module.getName()), null, -1, -1);
- return;
- }
- ProjectFileIndex fileIndex = ProjectRootManager.getInstance(myProject).getFileIndex();
- items.add(new IdlGenerationItem(module, file, fileIndex.isInTestSourceContent(file), target, packageName));
- }
- }
-
- private static GenerationItem[] doGenerate(final CompileContext context, GenerationItem[] items, VirtualFile outputRootDirectory) {
- if (context.getProject().isDisposed()) {
- return EMPTY_GENERATION_ITEM_ARRAY;
- }
- List<GenerationItem> results = new ArrayList<GenerationItem>(items.length);
- boolean toRefresh = false;
-
- for (GenerationItem item : items) {
- if (item instanceof IdlGenerationItem) {
- final IdlGenerationItem idlItem = (IdlGenerationItem)item;
-
- if (!AndroidCompileUtil.isModuleAffected(context, idlItem.myModule)) {
- continue;
- }
-
- try {
- VirtualFile[] sourceRoots = AndroidPackagingCompiler.getSourceRootsForModuleAndDependencies(idlItem.myModule, false);
- final String[] sourceRootPaths = AndroidCompileUtil.toOsPaths(sourceRoots);
-
- final String outFilePath = FileUtil.toSystemDependentName(
- outputRootDirectory.getPath() + '/' + idlItem.myPackageName.replace('.', '/') + '/' +
- idlItem.myFile.getNameWithoutExtension() + ".java");
-
- final Map<CompilerMessageCategory, List<String>> messages = AndroidCompileUtil.toCompilerMessageCategoryKeys(
- AndroidIdl.execute(idlItem.myAndroidTarget, idlItem.myFile.getPath(), outFilePath, sourceRootPaths));
-
- ApplicationManager.getApplication().runReadAction(new Runnable() {
- @Override
- public void run() {
- if (context.getProject().isDisposed()) return;
- addMessages(context, messages, idlItem.myFile.getUrl());
- }
- });
- if (messages.get(CompilerMessageCategory.ERROR).isEmpty()) {
- toRefresh = true;
- results.add(idlItem);
- }
- }
- catch (final IOException e) {
- LOG.info(e);
- ApplicationManager.getApplication().runReadAction(new Runnable() {
- @Override
- public void run() {
- if (context.getProject().isDisposed()) return;
- context.addMessage(CompilerMessageCategory.ERROR, e.getMessage(), idlItem.myFile.getUrl(), -1, -1);
- }
- });
- }
- }
- }
-
- if (toRefresh) {
- AndroidCompileUtil.markDirtyAndRefresh(outputRootDirectory, true);
- }
- return results.toArray(new GenerationItem[results.size()]);
- }
-
- private static void addMessages(CompileContext context, Map<CompilerMessageCategory, List<String>> messages, String url) {
- for (CompilerMessageCategory category : messages.keySet()) {
- List<String> messageList = messages.get(category);
- for (String message : messageList) {
- context.addMessage(category, message, url, -1, -1);
- }
- }
- }
-}
\ No newline at end of file
diff --git a/android/src/org/jetbrains/android/compiler/AndroidIncludingCompiler.java b/android/src/org/jetbrains/android/compiler/AndroidIncludingCompiler.java
deleted file mode 100644
index 2d41738..0000000
--- a/android/src/org/jetbrains/android/compiler/AndroidIncludingCompiler.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Copyright 2000-2010 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jetbrains.android.compiler;
-
-import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.compiler.*;
-import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.fileTypes.StdFileTypes;
-import com.intellij.openapi.module.Module;
-import com.intellij.openapi.roots.ContentIterator;
-import com.intellij.openapi.roots.ModuleFileIndex;
-import com.intellij.openapi.roots.ModuleRootManager;
-import com.intellij.openapi.util.Comparing;
-import com.intellij.openapi.util.Computable;
-import com.intellij.openapi.util.io.FileUtil;
-import com.intellij.openapi.vfs.LocalFileSystem;
-import com.intellij.openapi.vfs.VfsUtilCore;
-import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.util.containers.HashMap;
-import org.jetbrains.android.facet.AndroidFacet;
-import org.jetbrains.android.facet.AndroidRootUtil;
-import org.jetbrains.android.sdk.AndroidPlatform;
-import org.jetbrains.android.util.AndroidBundle;
-import org.jetbrains.android.util.AndroidUtils;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.io.DataInput;
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Eugene.Kudelevsky
- */
-public class AndroidIncludingCompiler implements SourceGeneratingCompiler {
- private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.compiler.AndroidIncludingCompiler");
-
- @Nullable
- @Override
- public VirtualFile getPresentableFile(CompileContext context, Module module, VirtualFile outputRoot, VirtualFile generatedFile) {
- String generatedFileRelativePath = VfsUtilCore.getRelativePath(generatedFile, outputRoot, '/');
- if (generatedFileRelativePath == null) {
- return null;
- }
-
- for (AndroidFacet depFacet : AndroidUtils.getAllAndroidDependencies(module, true)) {
- String genSrcRootPath = AndroidRootUtil.getAptGenSourceRootPath(depFacet);
- VirtualFile genSrcRoot = genSrcRootPath != null ? LocalFileSystem.getInstance().findFileByPath(genSrcRootPath) : null;
- VirtualFile[] srcRoots = ModuleRootManager.getInstance(depFacet.getModule()).getSourceRoots();
-
- for (VirtualFile depSourceRoot : srcRoots) {
- if (!Comparing.equal(depSourceRoot, genSrcRoot)) {
- VirtualFile file = depSourceRoot.findFileByRelativePath(generatedFileRelativePath);
- if (file != null) {
- return file;
- }
- }
- }
- }
-
- return null;
- }
-
- @Override
- public GenerationItem[] getGenerationItems(final CompileContext context) {
- return ApplicationManager.getApplication().runReadAction(new Computable<GenerationItem[]>() {
- @Override
- public GenerationItem[] compute() {
- List<MyItem> result = new ArrayList<MyItem>();
-
- for (Module module : context.getProjectCompileScope().getAffectedModules()) {
- AndroidFacet facet = AndroidFacet.getInstance(module);
- if (facet != null && facet.isLibraryProject()) {
- continue;
- }
-
- Map<String, MyItem> qName2Item = new HashMap<String, MyItem>();
- for (AndroidFacet depFacet : AndroidUtils.getAllAndroidDependencies(module, true)) {
- final AndroidPlatform platform = depFacet.getConfiguration().getAndroidPlatform();
-
- final int platformToolsRevision = platform != null ? platform.getSdkData().getPlatformToolsRevision() : -1;
- if (platformToolsRevision < 0 || platformToolsRevision > 7) {
- // "including" style building of library projects is deprecated since platform-tools-r8
- continue;
- }
-
- final String aptGenSrcRootPath = AndroidRootUtil.getAptGenSourceRootPath(depFacet);
- final VirtualFile aptGenSrcRoot = aptGenSrcRootPath != null
- ? LocalFileSystem.getInstance().findFileByPath(aptGenSrcRootPath)
- : null;
-
- final String aidlGenSrcRootPath = AndroidRootUtil.getAidlGenSourceRootPath(depFacet);
- final VirtualFile aidlGenSrcRoot = aidlGenSrcRootPath != null
- ? LocalFileSystem.getInstance().findFileByPath(aidlGenSrcRootPath)
- : null;
-
- VirtualFile[] srcRoots = ModuleRootManager.getInstance(depFacet.getModule()).getSourceRoots();
-
- for (VirtualFile depSourceRoot : srcRoots) {
- if (!Comparing.equal(depSourceRoot, aptGenSrcRoot) && !Comparing.equal(depSourceRoot, aidlGenSrcRoot)) {
- collectCompilableFiles(module, depFacet.getModule(), context, depSourceRoot, qName2Item);
- }
- }
- }
- result.addAll(qName2Item.values());
- }
- return result.toArray(new MyItem[result.size()]);
- }
- });
- }
-
- private static void collectCompilableFiles(final Module module,
- final Module depModule,
- final CompileContext context,
- @NotNull final VirtualFile sourceRoot,
- final Map<String, MyItem> relativePath2GenItem) {
-
- ModuleFileIndex fileIndex = ModuleRootManager.getInstance(depModule).getFileIndex();
-
- fileIndex.iterateContentUnderDirectory(sourceRoot, new ContentIterator() {
- @Override
- public boolean processFile(VirtualFile fileOrDir) {
- if (fileOrDir.isDirectory()) {
- return true;
- }
- if (fileOrDir.getFileType() == StdFileTypes.JAVA) {
- String relativePath = VfsUtilCore.getRelativePath(fileOrDir, sourceRoot, '/');
- LOG.assertTrue(relativePath != null);
- MyItem existingItem = relativePath2GenItem.get(relativePath);
- if (existingItem != null) {
- String path1 = FileUtil.toSystemDependentName(existingItem.mySourceFile.getPath());
- String path2 = FileUtil.toSystemDependentName(fileOrDir.getPath());
- context.addMessage(CompilerMessageCategory.ERROR, "Duplicate file for " + relativePath +
- "\nOrigin 1: " + path1 +
- "\nOrigin 2: " + path2, null, -1, -1);
- return false;
- }
- relativePath2GenItem.put(relativePath, new MyItem(module, fileOrDir, relativePath));
- }
- return true;
- }
- });
- }
-
- @Override
- public GenerationItem[] generate(CompileContext context, GenerationItem[] items, VirtualFile outputRootDirectory) {
- if (items.length > 0) {
- context.getProgressIndicator().setText(AndroidBundle.message("android.compile.messages.copying.sources.from.libraries"));
- }
- List<GenerationItem> result = new ArrayList<GenerationItem>();
- boolean toRefresh = false;
- for (GenerationItem item : items) {
-
- if (!AndroidCompileUtil.isModuleAffected(context, ((MyItem)item).myModule)) {
- continue;
- }
- toRefresh = true;
- String fromPath = ((MyItem)item).mySourceFile.getPath();
- File from = new File(fromPath);
- File to = new File(outputRootDirectory.getPath() + '/' + item.getPath());
- try {
- FileUtil.copy(from, to);
- result.add(item);
- }
- catch (IOException e) {
- LOG.info(e);
- String message = "Cannot copy file " + from.getPath() + " to " + to.getPath() + "\nI/O error" +
- (e.getMessage() != null ? ": " + e.getMessage() : "");
- context.addMessage(CompilerMessageCategory.ERROR, message, null, -1, -1);
- }
- }
-
- if (toRefresh) {
- AndroidCompileUtil.markDirtyAndRefresh(outputRootDirectory, true);
- }
- return result.toArray(new GenerationItem[result.size()]);
- }
-
- @NotNull
- @Override
- public String getDescription() {
- return "Android Including Compiler";
- }
-
- @Override
- public boolean validateConfiguration(CompileScope scope) {
- return true;
- }
-
- @Override
- public ValidityState createValidityState(DataInput in) throws IOException {
- return TimestampValidityState.load(in);
- }
-
- private static class MyItem implements GenerationItem {
- final Module myModule;
- final VirtualFile mySourceFile;
- final String mySourceRelativePath;
- private final TimestampValidityState myValidityState;
-
- private MyItem(Module module, VirtualFile sourceFile, String sourceRelativePath) {
- myModule = module;
- mySourceFile = sourceFile;
- mySourceRelativePath = sourceRelativePath;
- myValidityState = new TimestampValidityState(mySourceFile.getTimeStamp());
- }
-
- @Override
- public String getPath() {
- return mySourceRelativePath;
- }
-
- @Nullable
- @Override
- public ValidityState getValidityState() {
- return myValidityState;
- }
-
- @Override
- public Module getModule() {
- return myModule;
- }
-
- @Override
- public boolean isTestSource() {
- return false;
- }
- }
-}
diff --git a/android/src/org/jetbrains/android/compiler/AndroidLibraryPackagingCompiler.java b/android/src/org/jetbrains/android/compiler/AndroidLibraryPackagingCompiler.java
deleted file mode 100644
index 85a113a..0000000
--- a/android/src/org/jetbrains/android/compiler/AndroidLibraryPackagingCompiler.java
+++ /dev/null
@@ -1,170 +0,0 @@
-package org.jetbrains.android.compiler;
-
-import com.intellij.compiler.impl.CompilerUtil;
-import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.compiler.*;
-import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.module.Module;
-import com.intellij.openapi.module.ModuleManager;
-import com.intellij.openapi.roots.CompilerModuleExtension;
-import com.intellij.openapi.util.Computable;
-import com.intellij.openapi.util.io.FileUtil;
-import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.util.ArrayUtil;
-import com.intellij.util.containers.HashSet;
-import org.jetbrains.android.facet.AndroidFacet;
-import org.jetbrains.android.util.AndroidCommonUtils;
-import org.jetbrains.annotations.NotNull;
-
-import java.io.DataInput;
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * @author Eugene.Kudelevsky
- */
-public class AndroidLibraryPackagingCompiler implements ClassPostProcessingCompiler {
- private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.compiler.AndroidLibraryPackagingCompiler");
-
- @NotNull
- @Override
- public ProcessingItem[] getProcessingItems(final CompileContext context) {
- return ApplicationManager.getApplication().runReadAction(new Computable<ProcessingItem[]>() {
- @Override
- public ProcessingItem[] compute() {
- final List<ProcessingItem> result = new ArrayList<ProcessingItem>();
-
- for (Module module : ModuleManager.getInstance(context.getProject()).getModules()) {
- final AndroidFacet facet = AndroidFacet.getInstance(module);
- if (facet == null || !facet.isLibraryProject()) {
- continue;
- }
-
- final CompilerModuleExtension extension = CompilerModuleExtension.getInstance(module);
- LOG.assertTrue(extension != null);
-
- final VirtualFile classesDir = extension.getCompilerOutputPath();
- if (classesDir == null) {
- continue;
- }
- final HashSet<VirtualFile> firstPackageDirs = new HashSet<VirtualFile>();
- AndroidDexCompiler.addModuleOutputDir(firstPackageDirs, classesDir);
-
- if (firstPackageDirs.size() == 0) {
- continue;
- }
-
- final VirtualFile outputDirectory = AndroidDexCompiler.getOutputDirectoryForDex(module);
- if (outputDirectory == null) {
- LOG.error("Cannot find output directory for dex");
- continue;
- }
- result.add(new MyProcessingItem(module, firstPackageDirs.toArray(new VirtualFile[firstPackageDirs.size()]), outputDirectory));
- }
- return result.toArray(new ProcessingItem[result.size()]);
- }
- });
- }
-
- @Override
- public ProcessingItem[] process(CompileContext context, ProcessingItem[] items) {
- if (!AndroidCompileUtil.isFullBuild(context) || items == null || items.length == 0) {
- return ProcessingItem.EMPTY_ARRAY;
- }
-
- context.getProgressIndicator().setText("Packaging library modules...");
- final List<MyProcessingItem> result = new ArrayList<MyProcessingItem>();
-
- for (ProcessingItem item : items) {
- final MyProcessingItem processingItem = (MyProcessingItem)item;
-
- if (!AndroidCompileUtil.isModuleAffected(context, processingItem.getModule())) {
- continue;
- }
-
- final String[] classesDirOsPaths = AndroidCompileUtil.toOsPaths(processingItem.getClassDirectories());
- final String outputJarOsPath = FileUtil.toSystemDependentName(processingItem.getOutputDirectory().getPath() + '/' +
- AndroidCommonUtils.CLASSES_JAR_FILE_NAME);
-
- final File outputJarFile = new File(outputJarOsPath);
- try {
- AndroidCommonUtils.packClassFilesIntoJar(ArrayUtil.EMPTY_STRING_ARRAY, classesDirOsPaths, outputJarFile);
- CompilerUtil.refreshIOFile(outputJarFile);
- result.add(processingItem);
- }
- catch (IOException e) {
- if (e.getMessage() == null) {
- LOG.error(e);
- }
- else {
- LOG.info(e);
- context.addMessage(CompilerMessageCategory.ERROR, "Cannot pack sources of module " +
- processingItem.getModule().getName() +
- " to " +
- outputJarFile.getName() +
- ": " +
- e.getMessage(), null, -1, -1);
- }
- }
- }
- return result.toArray(new MyProcessingItem[result.size()]);
- }
-
- @NotNull
- @Override
- public String getDescription() {
- return "Android Library Packaging Compiler";
- }
-
- @Override
- public boolean validateConfiguration(CompileScope scope) {
- return true;
- }
-
- @Override
- public ValidityState createValidityState(DataInput in) throws IOException {
- return new ClassesAndJarsValidityState(in);
- }
-
- private static class MyProcessingItem implements ProcessingItem {
- private final Module myModule;
- private final VirtualFile[] myClassDirectories;
- private final VirtualFile myOutputDirectory;
-
- private MyProcessingItem(@NotNull Module module, @NotNull VirtualFile[] classDirectories, @NotNull VirtualFile directory) {
- assert classDirectories.length > 0;
- myOutputDirectory = directory;
- myClassDirectories = classDirectories;
- myModule = module;
- }
-
- @NotNull
- @Override
- public VirtualFile getFile() {
- return myClassDirectories[0].getParent();
- }
-
- @Override
- public ValidityState getValidityState() {
- return new ClassesAndJarsValidityState(Arrays.asList(myClassDirectories));
- }
-
- @NotNull
- public Module getModule() {
- return myModule;
- }
-
- @NotNull
- public VirtualFile[] getClassDirectories() {
- return myClassDirectories;
- }
-
- @NotNull
- public VirtualFile getOutputDirectory() {
- return myOutputDirectory;
- }
- }
-}
diff --git a/android/src/org/jetbrains/android/compiler/AndroidMavenResourcesCompiler.java b/android/src/org/jetbrains/android/compiler/AndroidMavenResourcesCompiler.java
deleted file mode 100644
index d8f6b86..0000000
--- a/android/src/org/jetbrains/android/compiler/AndroidMavenResourcesCompiler.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Copyright 2000-2010 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jetbrains.android.compiler;
-
-import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.compiler.*;
-import com.intellij.openapi.compiler.ex.CompileContextEx;
-import com.intellij.openapi.module.Module;
-import com.intellij.openapi.module.ModuleManager;
-import com.intellij.openapi.util.Computable;
-import com.intellij.openapi.util.io.FileUtil;
-import com.intellij.openapi.vfs.LocalFileSystem;
-import com.intellij.openapi.vfs.VirtualFile;
-import org.jetbrains.android.compiler.tools.AndroidMavenExecutor;
-import org.jetbrains.android.dom.manifest.Manifest;
-import org.jetbrains.android.facet.AndroidFacet;
-import org.jetbrains.android.facet.AndroidRootUtil;
-import org.jetbrains.android.maven.AndroidMavenProvider;
-import org.jetbrains.android.maven.AndroidMavenUtil;
-import org.jetbrains.android.util.AndroidCommonUtils;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.jetbrains.idea.maven.project.MavenProject;
-import org.jetbrains.idea.maven.project.MavenProjectsManager;
-
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Eugene.Kudelevsky
- */
-public class AndroidMavenResourcesCompiler implements SourceGeneratingCompiler {
- private static final GenerationItem[] EMPTY_GENERATION_ITEM_ARRAY = {};
-
- @Override
- public VirtualFile getPresentableFile(CompileContext context, Module module, VirtualFile outputRoot, VirtualFile generatedFile) {
- return null;
- }
-
- @Override
- public GenerationItem[] getGenerationItems(CompileContext context) {
- return ApplicationManager.getApplication().runReadAction(new PrepareAction(context));
- }
-
- @Override
- public GenerationItem[] generate(final CompileContext context, final GenerationItem[] items, VirtualFile outputRootDirectory) {
- if (items != null && items.length > 0) {
- context.getProgressIndicator().setText("Processing resources by Maven...");
- Computable<GenerationItem[]> computation = new Computable<GenerationItem[]>() {
- @Override
- public GenerationItem[] compute() {
- if (context.getProject().isDisposed()) {
- return EMPTY_GENERATION_ITEM_ARRAY;
- }
- return doGenerate(context, items);
- }
- };
- GenerationItem[] generationItems = computation.compute();
- List<VirtualFile> generatedVFiles = new ArrayList<VirtualFile>();
- for (GenerationItem item : generationItems) {
- File generatedFile = ((MyGenerationItem)item).myGeneratedFile;
- if (generatedFile != null) {
- final VirtualFile vFile = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(generatedFile);
- if (vFile != null) {
- AndroidCompileUtil.markDirtyAndRefresh(vFile, false);
- generatedVFiles.add(vFile);
- }
- }
- }
- if (context instanceof CompileContextEx) {
- ((CompileContextEx)context).markGenerated(generatedVFiles);
- }
- return generationItems;
- }
- return EMPTY_GENERATION_ITEM_ARRAY;
- }
-
- private static GenerationItem[] doGenerate(final CompileContext context, GenerationItem[] items) {
- List<GenerationItem> results = new ArrayList<GenerationItem>(items.length);
- for (GenerationItem item : items) {
- if (item instanceof MyGenerationItem) {
- final MyGenerationItem genItem = (MyGenerationItem)item;
-
- if (!AndroidCompileUtil.isModuleAffected(context, genItem.myModule)) {
- continue;
- }
-
- Map<CompilerMessageCategory, List<String>> messages = AndroidMavenExecutor.generateResources(genItem.myModule);
- AndroidCompileUtil.addMessages(context, messages, genItem.myModule);
- if (messages.get(CompilerMessageCategory.ERROR).isEmpty()) {
- results.add(genItem);
- }
- if (genItem.myGeneratedFile.exists()) {
- ApplicationManager.getApplication().runReadAction(new Runnable() {
- @Override
- public void run() {
- String className = FileUtil.getNameWithoutExtension(genItem.myGeneratedFile);
- AndroidCompileUtil.removeDuplicatingClasses(genItem.myModule, genItem.myPackage, className, genItem.myGeneratedFile,
- genItem.mySourceRootPath);
- }
- });
- }
- }
- }
- return results.toArray(new GenerationItem[results.size()]);
- }
-
- @Override
- @NotNull
- public String getDescription() {
- return "Android Maven Resources Compiler";
- }
-
- @Override
- public boolean validateConfiguration(CompileScope scope) {
- return true;
- }
-
- @Override
- public ValidityState createValidityState(DataInput is) throws IOException {
- return new MyValidityState(is);
- }
-
- private final static class MyGenerationItem implements GenerationItem {
- final Module myModule;
- final String myPackage;
- final File myGeneratedFile;
- final String mySourceRootPath;
- private final MyValidityState myValidityState;
-
- private MyGenerationItem(@NotNull Module module, @NotNull String aPackage, @NotNull String sourceRootPath) {
- myModule = module;
- myPackage = aPackage;
- myGeneratedFile =
- new File(sourceRootPath, aPackage.replace('.', File.separatorChar) + File.separator + AndroidCommonUtils.R_JAVA_FILENAME);
- mySourceRootPath = sourceRootPath;
- myValidityState = new MyValidityState(myModule);
- }
-
- @Override
- @Nullable
- public String getPath() {
- return myPackage.replace('.', '/') + '/' + AndroidCommonUtils.R_JAVA_FILENAME;
- }
-
- @Override
- public ValidityState getValidityState() {
- return myValidityState;
- }
-
- @Override
- public Module getModule() {
- return myModule;
- }
-
- @Override
- public boolean isTestSource() {
- return false;
- }
- }
-
- private static class MyValidityState extends ResourceNamesValidityState {
- private final long[] myMavenArtifactsTimespamps;
-
- private MyValidityState(Module module) {
- super(module);
- AndroidMavenProvider mavenProvider = AndroidMavenUtil.getMavenProvider();
- assert mavenProvider != null;
- List<File> files = mavenProvider.getMavenDependencyArtifactFiles(module);
- myMavenArtifactsTimespamps = new long[files.size()];
- for (int i = 0, filesSize = files.size(); i < filesSize; i++) {
- myMavenArtifactsTimespamps[i] = files.get(i).lastModified();
- }
- }
-
- public MyValidityState(DataInput is) throws IOException {
- super(is);
- int c = is.readInt();
- myMavenArtifactsTimespamps = new long[c];
- for (int i = 0; i < c; i++) {
- myMavenArtifactsTimespamps[i] = is.readLong();
- }
- }
-
- @Override
- public boolean equalsTo(ValidityState otherState) {
- if (!super.equalsTo(otherState)) {
- return false;
- }
- if (!(otherState instanceof MyValidityState)) {
- return false;
- }
- return Arrays.equals(myMavenArtifactsTimespamps, ((MyValidityState)otherState).myMavenArtifactsTimespamps);
- }
-
- @Override
- public void save(DataOutput out) throws IOException {
- super.save(out);
- out.writeInt(myMavenArtifactsTimespamps.length);
- for (long timespamp : myMavenArtifactsTimespamps) {
- out.writeLong(timespamp);
- }
- }
- }
-
- private static final class PrepareAction implements Computable<GenerationItem[]> {
- private final CompileContext myContext;
-
- public PrepareAction(CompileContext context) {
- myContext = context;
- }
-
- @Override
- public GenerationItem[] compute() {
- if (myContext.getProject().isDisposed()) {
- return EMPTY_GENERATION_ITEM_ARRAY;
- }
- Module[] modules = ModuleManager.getInstance(myContext.getProject()).getModules();
- List<GenerationItem> items = new ArrayList<GenerationItem>();
- for (Module module : modules) {
- MavenProjectsManager mavenProjectsManager = MavenProjectsManager.getInstance(myContext.getProject());
- if (mavenProjectsManager != null && mavenProjectsManager.isMavenizedModule(module)) {
- AndroidFacet facet = AndroidFacet.getInstance(module);
- if (facet != null && facet.getProperties().RUN_PROCESS_RESOURCES_MAVEN_TASK) {
- MavenProject mavenProject = mavenProjectsManager.findProject(module);
- if (mavenProject != null) {
- Manifest manifest = facet.getManifest();
- String aPackage = manifest != null ? manifest.getPackage().getValue() : null;
- if (aPackage == null) {
- VirtualFile manifestFile = AndroidRootUtil.getManifestFile(facet);
- myContext.addMessage(CompilerMessageCategory.ERROR,
- "Cannot find package value in AndroidManifest.xml for module " + module.getName(),
- manifestFile != null ? manifestFile.getUrl() : null, -1, -1);
- continue;
- }
- items.add(new MyGenerationItem(module, aPackage, mavenProject.getGeneratedSourcesDirectory(false) + "/r"));
- }
- }
- }
- }
- return items.toArray(new GenerationItem[items.size()]);
- }
- }
-}
diff --git a/android/src/org/jetbrains/android/compiler/AndroidPackagingCompiler.java b/android/src/org/jetbrains/android/compiler/AndroidPackagingCompiler.java
deleted file mode 100644
index 1ef02af..0000000
--- a/android/src/org/jetbrains/android/compiler/AndroidPackagingCompiler.java
+++ /dev/null
@@ -1,532 +0,0 @@
-/*
- * Copyright 2000-2010 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jetbrains.android.compiler;
-
-import com.intellij.compiler.CompilerIOUtil;
-import com.intellij.compiler.impl.CompilerUtil;
-import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.compiler.*;
-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;
-import com.intellij.openapi.util.Comparing;
-import com.intellij.openapi.util.io.FileUtil;
-import com.intellij.openapi.vfs.JarFileSystem;
-import com.intellij.openapi.vfs.VfsUtil;
-import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.util.containers.HashSet;
-import org.jetbrains.android.compiler.tools.AndroidApkBuilder;
-import org.jetbrains.android.facet.AndroidFacet;
-import org.jetbrains.android.facet.AndroidFacetConfiguration;
-import org.jetbrains.android.facet.AndroidRootUtil;
-import org.jetbrains.android.sdk.AndroidPlatform;
-import org.jetbrains.android.util.AndroidBundle;
-import org.jetbrains.android.util.AndroidCommonUtils;
-import org.jetbrains.android.util.AndroidNativeLibData;
-import org.jetbrains.android.util.AndroidUtils;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.File;
-import java.io.IOException;
-import java.util.*;
-
-/**
- * @author yole
- */
-public class AndroidPackagingCompiler implements PackagingCompiler {
- private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.compiler.AndroidPackagingCompiler");
-
- @Override
- public void processOutdatedItem(CompileContext context, String url, @Nullable ValidityState state) {
- }
-
- @NotNull
- private static VirtualFile[] getExternalJars(@NotNull Module module,
- @NotNull AndroidFacetConfiguration configuration) {
- AndroidPlatform platform = configuration.getAndroidPlatform();
- if (platform != null) {
- List<VirtualFile> externalLibsAndModules = AndroidRootUtil.getExternalLibraries(module);
- return externalLibsAndModules.toArray(new VirtualFile[externalLibsAndModules.size()]);
- }
- return VirtualFile.EMPTY_ARRAY;
- }
-
- private static void fillSourceRoots(@NotNull Module module,
- @NotNull Set<Module> visited,
- @NotNull Set<VirtualFile> result,
- boolean includingTests) {
- visited.add(module);
- final AndroidFacet facet = AndroidFacet.getInstance(module);
- VirtualFile resDir = facet != null ? AndroidRootUtil.getResourceDir(facet) : null;
- ModuleRootManager manager = ModuleRootManager.getInstance(module);
- for (VirtualFile sourceRoot : manager.getSourceRoots(includingTests)) {
- if (!Comparing.equal(resDir, sourceRoot)) {
- result.add(sourceRoot);
- }
- }
- for (OrderEntry entry : manager.getOrderEntries()) {
- if (entry instanceof ModuleOrderEntry) {
- ModuleOrderEntry moduleOrderEntry = (ModuleOrderEntry)entry;
- DependencyScope scope = moduleOrderEntry.getScope();
- if (scope == DependencyScope.COMPILE) {
- Module depModule = moduleOrderEntry.getModule();
- if (depModule != null && !visited.contains(depModule)) {
- fillSourceRoots(depModule, visited, result, false);
- }
- }
- }
- }
- }
-
- @NotNull
- public static VirtualFile[] getSourceRootsForModuleAndDependencies(@NotNull Module module, boolean includingTests) {
- Set<VirtualFile> result = new HashSet<VirtualFile>();
- fillSourceRoots(module, new HashSet<Module>(), result, includingTests);
- return VfsUtil.toVirtualFileArray(result);
- }
-
- @Override
- @NotNull
- public ProcessingItem[] getProcessingItems(CompileContext context) {
- final List<ProcessingItem> items = new ArrayList<ProcessingItem>();
- for (Module module : ModuleManager.getInstance(context.getProject()).getModules()) {
- AndroidFacet facet = AndroidFacet.getInstance(module);
- if (facet != null && !facet.isLibraryProject()) {
- VirtualFile manifestFile = AndroidRootUtil.getManifestFileForCompiler(facet);
- VirtualFile[] sourceRoots = getSourceRootsForModuleAndDependencies(module, facet.getProperties().PACK_TEST_CODE);
- if (manifestFile != null) {
- AndroidFacetConfiguration configuration = facet.getConfiguration();
- VirtualFile outputDir = AndroidDexCompiler.getOutputDirectoryForDex(module);
- if (outputDir != null) {
- VirtualFile[] externalJars = getExternalJars(module, configuration);
-
- File resPackage = AndroidResourcesPackagingCompiler.getOutputFile(module, outputDir);
- String resPackagePath = FileUtil.toSystemDependentName(resPackage.getPath());
-
- File classesDexFile = new File(outputDir.getPath(), AndroidCommonUtils.CLASSES_FILE_NAME);
- String classesDexPath = FileUtil.toSystemDependentName(classesDexFile.getPath());
-
- AndroidPlatform platform = configuration.getAndroidPlatform();
- if (platform == null) {
- context.addMessage(CompilerMessageCategory.ERROR,
- AndroidBundle.message("android.compilation.error.specify.platform", module.getName()), null, -1, -1);
- continue;
- }
- String sdkPath = platform.getSdkData().getPath();
- String outputPath = AndroidRootUtil.getApkPath(facet);
- if (outputPath == null) {
- context.addMessage(CompilerMessageCategory.ERROR,
- AndroidBundle.message("android.compilation.error.apk.path.not.specified", module.getName()), null, -1, -1);
- continue;
- }
- final String keystorePath = FileUtil.toSystemDependentName(VfsUtil.urlToPath(configuration.getState().CUSTOM_DEBUG_KEYSTORE_PATH));
- items.add(
- createItem(module, facet, manifestFile, sourceRoots, externalJars, resPackagePath, classesDexPath, sdkPath, outputPath,
- false, AndroidCompileUtil.isReleaseBuild(context), keystorePath));
- }
- }
- }
- }
- return items.toArray(new ProcessingItem[items.size()]);
- }
-
- private static AptPackagingItem createItem(Module module,
- AndroidFacet facet,
- VirtualFile manifestFile,
- VirtualFile[] sourceRoots,
- VirtualFile[] externalJars,
- String resPackagePath,
- String classesDexPath,
- String sdkPath,
- String outputPath,
- boolean generateSignedApk,
- boolean releaseBuild,
- String customKeystorePath) {
- final AptPackagingItem item =
- new AptPackagingItem(sdkPath, manifestFile, resPackagePath, outputPath, generateSignedApk, releaseBuild, module, customKeystorePath,
- facet.getConfiguration().getAdditionalNativeLibraries());
- item.setNativeLibsFolders(collectNativeLibsFolders(facet));
- item.setClassesDexPath(classesDexPath);
- item.setSourceRoots(sourceRoots);
- item.setExternalLibraries(externalJars);
- return item;
- }
-
- @NotNull
- private static VirtualFile[] collectNativeLibsFolders(AndroidFacet facet) {
- List<VirtualFile> result = new ArrayList<VirtualFile>();
- VirtualFile libsDir = AndroidRootUtil.getLibsDir(facet);
- if (libsDir != null) {
- result.add(libsDir);
- }
- for (AndroidFacet depFacet : AndroidUtils.getAndroidLibraryDependencies(facet.getModule())) {
- VirtualFile depLibsDir = AndroidRootUtil.getLibsDir(depFacet);
- if (depLibsDir != null) {
- result.add(depLibsDir);
- }
- }
- return result.toArray(new VirtualFile[result.size()]);
- }
-
- private static String[] getPaths(@NotNull VirtualFile[] vFiles) {
- String[] result = new String[vFiles.length];
- for (int i = 0; i < vFiles.length; i++) {
- VirtualFile vFile = vFiles[i];
- result[i] = FileUtil.toSystemDependentName(vFile.getPath());
- }
- return result;
- }
-
- @Override
- public ProcessingItem[] process(final CompileContext context, ProcessingItem[] items) {
- if (!AndroidCompileUtil.isFullBuild(context)) {
- return ProcessingItem.EMPTY_ARRAY;
- }
-
- context.getProgressIndicator().setText("Building Android package...");
- final List<ProcessingItem> result = new ArrayList<ProcessingItem>();
- for (ProcessingItem processingItem : items) {
- AptPackagingItem item = (AptPackagingItem)processingItem;
-
- if (!AndroidCompileUtil.isModuleAffected(context, item.myModule)) {
- continue;
- }
-
- doProcess(context, item, false);
-
- if (context.getMessages(CompilerMessageCategory.ERROR).length == 0) {
- doProcess(context, item, true);
- }
-
- if (context.getMessages(CompilerMessageCategory.ERROR).length == 0) {
- result.add(item);
- }
- }
- return result.toArray(new ProcessingItem[result.size()]);
- }
-
- private static void doProcess(final CompileContext context, AptPackagingItem item, boolean unsigned) {
- if (!shouldGenerateApk(item.myModule, context, unsigned)) {
- return;
- }
-
- try {
- final String[] externalLibPaths = getPaths(item.getExternalLibraries());
-
- final String resPackagePath = unsigned
- ? item.getResPackagePath() + AndroidResourcesPackagingCompiler.RELEASE_SUFFIX
- : item.getResPackagePath();
-
- final String finalPath = unsigned
- ? AndroidCommonUtils.addSuffixToFileName(item.getFinalPath(), AndroidCompileUtil.UNSIGNED_SUFFIX)
- : item.getFinalPath();
-
- final String[] sourceRoots = AndroidCompileUtil.toOsPaths(item.getSourceRoots());
- final String[] nativeLibsFolders = AndroidCompileUtil.toOsPaths(item.getNativeLibsFolders());
- final Project project = context.getProject();
-
- final Map<CompilerMessageCategory, List<String>> messages = AndroidCompileUtil.toCompilerMessageCategoryKeys(
- AndroidApkBuilder.execute(resPackagePath, item.getClassesDexPath(), sourceRoots, externalLibPaths, nativeLibsFolders,
- item.getAdditionalNativeLibs(), finalPath, unsigned, item.mySdkPath, item.getCustomKeystorePath(),
- new ExcludedSourcesFilter(project)));
-
- if (messages.get(CompilerMessageCategory.ERROR).size() == 0) {
- if (item.myReleaseBuild == unsigned) {
- final File dst = new File(
- AndroidCommonUtils.addSuffixToFileName(item.getFinalPath(), AndroidCommonUtils.ANDROID_FINAL_PACKAGE_FOR_ARTIFACT_SUFFIX));
- FileUtil.copy(new File(finalPath), dst);
- CompilerUtil.refreshIOFile(dst);
- final VirtualFile jar = JarFileSystem.getInstance().refreshAndFindFileByPath(dst.getPath() + "!/");
- if (jar != null) {
- jar.refresh(false, true);
- }
- }
- }
- AndroidCompileUtil.addMessages(context, messages, item.myModule);
- }
- catch (final IOException e) {
- LOG.info(e);
- ApplicationManager.getApplication().runReadAction(new Runnable() {
- @Override
- public void run() {
- if (context.getProject().isDisposed()) return;
- context.addMessage(CompilerMessageCategory.ERROR, e.getMessage(), null, -1, -1);
- }
- });
- }
- }
-
- public static boolean shouldGenerateApk(Module module, CompileContext context, boolean unsigned) {
- final boolean releaseBuild = AndroidCompileUtil.isReleaseBuild(context);
-
- if (!unsigned) {
- return !releaseBuild;
- }
-
- final AndroidFacet facet = AndroidFacet.getInstance(module);
- if (facet == null) {
- return true;
- }
-
- if (releaseBuild) {
- return true;
- }
- return false;
- }
-
- @Override
- @NotNull
- public String getDescription() {
- return "Android Packaging Compiler";
- }
-
- @Override
- public boolean validateConfiguration(CompileScope scope) {
- return true;
- }
-
- @Override
- public ValidityState createValidityState(DataInput is) throws IOException {
- return new MyValidityState(is);
- }
-
- private static class AptPackagingItem implements ProcessingItem {
- private final String mySdkPath;
- private final VirtualFile myManifestFile;
- private final String myResPackagePath;
- private final String myFinalPath;
- private String myClassesDexPath;
- private VirtualFile[] myNativeLibsFolders;
- private final List<AndroidNativeLibData> myAdditionalNativeLibs;
- private VirtualFile[] mySourceRoots;
- private VirtualFile[] myExternalLibraries;
- private final boolean myGenerateUnsigendApk;
- private final Module myModule;
- private boolean myReleaseBuild;
-
- private final String myCustomKeystorePath;
-
- private AptPackagingItem(String sdkPath,
- @NotNull VirtualFile manifestFile,
- @NotNull String resPackagePath,
- @NotNull String finalPath,
- boolean generateUnsigendApk,
- boolean releaseBuild,
- @NotNull Module module,
- @Nullable String customKeystorePath,
- @NotNull List<AndroidNativeLibData> additionalNativeLibs) {
- mySdkPath = sdkPath;
- myManifestFile = manifestFile;
- myResPackagePath = resPackagePath;
- myFinalPath = finalPath;
- myGenerateUnsigendApk = generateUnsigendApk;
- myReleaseBuild = releaseBuild;
- myModule = module;
- myCustomKeystorePath = customKeystorePath;
- myAdditionalNativeLibs = additionalNativeLibs;
- }
-
- @NotNull
- public String getResPackagePath() {
- return myResPackagePath;
- }
-
- @NotNull
- public String getFinalPath() {
- return myFinalPath;
- }
-
- @NotNull
- public String getClassesDexPath() {
- return myClassesDexPath;
- }
-
- @Nullable
- public String getCustomKeystorePath() {
- return myCustomKeystorePath;
- }
-
- @NotNull
- public VirtualFile[] getNativeLibsFolders() {
- return myNativeLibsFolders;
- }
-
- @NotNull
- public List<AndroidNativeLibData> getAdditionalNativeLibs() {
- return myAdditionalNativeLibs;
- }
-
- @NotNull
- public VirtualFile[] getSourceRoots() {
- return mySourceRoots;
- }
-
- @NotNull
- public VirtualFile[] getExternalLibraries() {
- return myExternalLibraries;
- }
-
- public void setSourceRoots(@NotNull VirtualFile[] sourceRoots) {
- this.mySourceRoots = sourceRoots;
- }
-
- public void setExternalLibraries(@NotNull VirtualFile[] externalLibraries) {
- this.myExternalLibraries = externalLibraries;
- }
-
- public void setClassesDexPath(@NotNull String classesDexPath) {
- myClassesDexPath = classesDexPath;
- }
-
- public void setNativeLibsFolders(@NotNull VirtualFile[] nativeLibsFolders) {
- myNativeLibsFolders = nativeLibsFolders;
- }
-
- @Override
- @NotNull
- public VirtualFile getFile() {
- return myManifestFile;
- }
-
- @Override
- @Nullable
- public ValidityState getValidityState() {
- return new MyValidityState(myModule.getProject(), myResPackagePath, myClassesDexPath, myFinalPath, myGenerateUnsigendApk,
- myReleaseBuild, mySourceRoots, myExternalLibraries, myNativeLibsFolders, myCustomKeystorePath,
- myAdditionalNativeLibs);
- }
- }
-
- private static class MyValidityState implements ValidityState {
- private final Map<String, Long> myResourceTimestamps = new HashMap<String, Long>();
- private final Map<AndroidNativeLibData, Long> myAdditionalNativeLibs = new HashMap<AndroidNativeLibData, Long>();
- private final String myApkPath;
- private final boolean myGenerateUnsignedApk;
- private final boolean myReleaseBuild;
- private final String myCustomKeystorePath;
-
- MyValidityState(DataInput is) throws IOException {
- int size = is.readInt();
- for (int i = 0; i < size; i++) {
- String key = is.readUTF();
- long value = is.readLong();
- myResourceTimestamps.put(key, value);
- }
- myGenerateUnsignedApk = is.readBoolean();
- myReleaseBuild = is.readBoolean();
- myApkPath = is.readUTF();
- myCustomKeystorePath = CompilerIOUtil.readString(is);
-
- size = is.readInt();
- for (int i = 0; i < size; i++) {
- final String architecture = is.readUTF();
- final String path = is.readUTF();
- final String targetFileName = is.readUTF();
- final long timestamp = is.readLong();
- myAdditionalNativeLibs.put(new AndroidNativeLibData(architecture, path, targetFileName), timestamp);
- }
- }
-
- MyValidityState(Project project,
- String resPackagePath,
- String classesDexPath,
- String apkPath,
- boolean generateUnsignedApk,
- boolean releaseBuild,
- VirtualFile[] sourceRoots,
- VirtualFile[] externalLibs,
- VirtualFile[] nativeLibFolders,
- String customKeystorePath,
- List<AndroidNativeLibData> additionalNativeLibs) {
- myResourceTimestamps.put(FileUtil.toSystemIndependentName(resPackagePath), new File(resPackagePath).lastModified());
- myResourceTimestamps.put(FileUtil.toSystemIndependentName(classesDexPath), new File(classesDexPath).lastModified());
- myApkPath = apkPath;
- myGenerateUnsignedApk = generateUnsignedApk;
- myReleaseBuild = releaseBuild;
- myCustomKeystorePath = customKeystorePath != null ? customKeystorePath : "";
-
- final HashSet<File> resourcesFromSourceRoot = new HashSet<File>();
- for (VirtualFile sourceRoot : sourceRoots) {
- AndroidApkBuilder.collectStandardJavaResources(new File(sourceRoot.getPath()), resourcesFromSourceRoot,
- new ExcludedSourcesFilter(project));
- }
- for (File resource : resourcesFromSourceRoot) {
- myResourceTimestamps.put(FileUtil.toSystemIndependentName(resource.getPath()), resource.lastModified());
- }
-
- for (VirtualFile externalLib : externalLibs) {
- myResourceTimestamps.put(externalLib.getPath(), externalLib.getTimeStamp());
- }
- ArrayList<File> nativeLibs = new ArrayList<File>();
- for (VirtualFile nativeLibFolder : nativeLibFolders) {
- for (VirtualFile child : nativeLibFolder.getChildren()) {
- AndroidApkBuilder.collectNativeLibraries(new File(child.getPath()), nativeLibs, !releaseBuild);
- }
- }
- for (File nativeLib : nativeLibs) {
- myResourceTimestamps.put(FileUtil.toSystemIndependentName(nativeLib.getPath()), nativeLib.lastModified());
- }
- for (AndroidNativeLibData lib : additionalNativeLibs) {
- final String path = lib.getPath();
- myAdditionalNativeLibs.put(lib, new File(path).lastModified());
- }
- }
-
- @Override
- public boolean equalsTo(ValidityState otherState) {
- if (!(otherState instanceof MyValidityState)) {
- return false;
- }
- MyValidityState mvs = (MyValidityState)otherState;
- return mvs.myGenerateUnsignedApk == myGenerateUnsignedApk &&
- mvs.myReleaseBuild == myReleaseBuild &&
- mvs.myResourceTimestamps.equals(myResourceTimestamps) &&
- mvs.myApkPath.equals(myApkPath) &&
- mvs.myCustomKeystorePath.equals(myCustomKeystorePath) &&
- mvs.myAdditionalNativeLibs.equals(myAdditionalNativeLibs);
- }
-
- @Override
- public void save(DataOutput out) throws IOException {
- out.writeInt(myResourceTimestamps.size());
- for (Map.Entry<String, Long> entry : myResourceTimestamps.entrySet()) {
- out.writeUTF(entry.getKey());
- out.writeLong(entry.getValue());
- }
- out.writeBoolean(myGenerateUnsignedApk);
- out.writeBoolean(myReleaseBuild);
- out.writeUTF(myApkPath);
- CompilerIOUtil.writeString(myCustomKeystorePath, out);
-
- out.writeInt(myAdditionalNativeLibs.size());
- for (Map.Entry<AndroidNativeLibData, Long> entry : myAdditionalNativeLibs.entrySet()) {
- final AndroidNativeLibData lib = entry.getKey();
- out.writeUTF(lib.getArchitecture());
- out.writeUTF(lib.getPath());
- out.writeUTF(lib.getTargetFileName());
- out.writeLong(entry.getValue());
- }
- }
- }
-}
diff --git a/android/src/org/jetbrains/android/compiler/AndroidPngFilesCachingCompiler.java b/android/src/org/jetbrains/android/compiler/AndroidPngFilesCachingCompiler.java
deleted file mode 100644
index 16b40ce..0000000
--- a/android/src/org/jetbrains/android/compiler/AndroidPngFilesCachingCompiler.java
+++ /dev/null
@@ -1,255 +0,0 @@
-package org.jetbrains.android.compiler;
-
-import com.android.sdklib.IAndroidTarget;
-import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.compiler.*;
-import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.module.Module;
-import com.intellij.openapi.module.ModuleManager;
-import com.intellij.openapi.util.Comparing;
-import com.intellij.openapi.util.Computable;
-import com.intellij.openapi.util.io.FileUtil;
-import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.util.containers.HashMap;
-import com.intellij.util.containers.hash.HashSet;
-import org.jetbrains.android.compiler.tools.AndroidApt;
-import org.jetbrains.android.facet.AndroidFacet;
-import org.jetbrains.android.sdk.AndroidPlatform;
-import org.jetbrains.android.util.AndroidBundle;
-import org.jetbrains.android.util.AndroidCommonUtils;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-import java.util.*;
-
-/**
- * @author Eugene.Kudelevsky
- */
-public class AndroidPngFilesCachingCompiler implements SourceGeneratingCompiler {
- private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.compiler.AndroidPngFilesCachingCompiler");
-
- @NotNull
- @Override
- public GenerationItem[] getGenerationItems(final CompileContext context) {
- return ApplicationManager.getApplication().runReadAction(new Computable<GenerationItem[]>() {
- @Override
- public GenerationItem[] compute() {
- final List<GenerationItem> items = new ArrayList<GenerationItem>();
- final Module[] modules = ModuleManager.getInstance(context.getProject()).getModules();
-
- for (Module module : modules) {
- final AndroidFacet facet = AndroidFacet.getInstance(module);
- if (facet == null) {
- continue;
- }
-
- final VirtualFile resourcesDir = AndroidAptCompiler.getResourceDirForApkCompiler(facet);
- if (resourcesDir == null) {
- continue;
- }
-
- final AndroidPlatform platform = facet.getConfiguration().getAndroidPlatform();
- if (platform == null) {
- context.addMessage(CompilerMessageCategory.ERROR,
- AndroidBundle.message("android.compilation.error.specify.platform", module.getName()), null, -1, -1);
- continue;
- }
-
- final int platformToolsRevision = platform.getSdkData().getPlatformToolsRevision();
- if (platformToolsRevision > 0 && platformToolsRevision <= 7) {
- // png files cache is supported since platform-tools-r8
- continue;
- }
-
- items.add(new MyItem(module, platform.getTarget(), resourcesDir));
- }
- return items.toArray(new GenerationItem[items.size()]);
- }
- });
- }
-
- @Override
- public GenerationItem[] generate(CompileContext context,
- GenerationItem[] items,
- VirtualFile outputRootDirectory) {
- if (items == null || items.length == 0 || !AndroidCompileUtil.isFullBuild(context)) {
- return new GenerationItem[0];
- }
-
- context.getProgressIndicator().setText("Processing PNG files...");
-
- final List<GenerationItem> processedItems = new ArrayList<GenerationItem>();
-
- for (GenerationItem GenerationItem : items) {
- final MyItem item = (MyItem)GenerationItem;
- final Module module = item.getModule();
-
- if (!AndroidCompileUtil.isModuleAffected(context, module)) {
- continue;
- }
-
- final String resDirOsPath = FileUtil.toSystemDependentName(item.getResourceDir().getPath());
-
- try {
- final String resCacheDirOsPath = AndroidCompileUtil.findResourcesCacheDirectory(module, true, context);
- if (resCacheDirOsPath == null) {
- continue;
- }
-
- final Map<CompilerMessageCategory, List<String>> messages = AndroidCompileUtil.toCompilerMessageCategoryKeys(
- AndroidApt.crunch(item.getTarget(), Collections.singletonList(resDirOsPath), resCacheDirOsPath));
- AndroidCompileUtil.addMessages(context, messages, module);
- if (context.getMessages(CompilerMessageCategory.ERROR).length == 0) {
- processedItems.add(item);
- }
- }
- catch (IOException e) {
- final String message = e.getMessage();
- if (message != null) {
- LOG.info(e);
- context.addMessage(CompilerMessageCategory.ERROR, e.getMessage(), null, -1, -1);
- }
- else {
- LOG.error(e);
- }
- }
- }
-
- return processedItems.toArray(new GenerationItem[processedItems.size()]);
- }
-
- @Nullable
- @Override
- public VirtualFile getPresentableFile(CompileContext context, Module module, VirtualFile outputRoot, VirtualFile generatedFile) {
- return null;
- }
-
- @NotNull
- @Override
- public String getDescription() {
- return "Android PNG files caching compiler";
- }
-
- @Override
- public boolean validateConfiguration(CompileScope scope) {
- return true;
- }
-
- @Override
- public ValidityState createValidityState(DataInput in) throws IOException {
- return new MyValidityState(in);
- }
-
- private static class MyItem implements GenerationItem {
- private final Module myModule;
- private final IAndroidTarget myTarget;
- private final VirtualFile myResourceDir;
- private final MyValidityState myValidityState;
-
- private MyItem(@NotNull Module module,
- @NotNull IAndroidTarget target,
- @NotNull VirtualFile resourceDir) {
- myModule = module;
- myTarget = target;
- myResourceDir = resourceDir;
- myValidityState = new MyValidityState(myTarget, myResourceDir);
- }
-
- @NotNull
- public IAndroidTarget getTarget() {
- return myTarget;
- }
-
- @NotNull
- public VirtualFile getResourceDir() {
- return myResourceDir;
- }
-
- @Override
- @NotNull
- public Module getModule() {
- return myModule;
- }
-
- @Override
- public boolean isTestSource() {
- return false;
- }
-
- @Nullable
- @Override
- public String getPath() {
- return null;
- }
-
- @Override
- public ValidityState getValidityState() {
- return myValidityState;
- }
- }
-
- private static class MyValidityState implements ValidityState {
- private final String myTargetHashString;
- private final Map<String, Long> myTimestamps = new HashMap<String, Long>();
-
- private MyValidityState(@NotNull IAndroidTarget target, @NotNull VirtualFile resourceDir) {
- myTargetHashString = target.hashString();
- collectPngFiles(resourceDir, new HashSet<VirtualFile>());
- }
-
- public MyValidityState(@NotNull DataInput in) throws IOException {
- myTargetHashString = in.readUTF();
-
- final int pairsCount = in.readInt();
- for (int i = 0; i < pairsCount; i++) {
- final String path = in.readUTF();
- final long timestamp = in.readLong();
- myTimestamps.put(path, timestamp);
- }
- }
-
- private void collectPngFiles(@NotNull VirtualFile file, @NotNull Set<VirtualFile> visited) {
- if (!visited.add(file)) {
- return;
- }
-
- if (file.isDirectory()) {
- for (VirtualFile child : file.getChildren()) {
- collectPngFiles(child, visited);
- }
- }
- else if (AndroidCommonUtils.PNG_EXTENSION.equals(file.getExtension())) {
- myTimestamps.put(file.getPath(), file.getTimeStamp());
- }
- }
-
- @Override
- public boolean equalsTo(ValidityState otherState) {
- if (!(otherState instanceof MyValidityState)) {
- return false;
- }
-
- final MyValidityState other = (MyValidityState)otherState;
-
- if (!Comparing.equal(myTargetHashString, other.myTargetHashString)) {
- return false;
- }
-
- return myTimestamps.equals(other.myTimestamps);
- }
-
- @Override
- public void save(DataOutput out) throws IOException {
- out.writeUTF(myTargetHashString);
-
- out.writeInt(myTimestamps.size());
- for (Map.Entry<String, Long> e : myTimestamps.entrySet()) {
- out.writeUTF(e.getKey());
- out.writeLong(e.getValue());
- }
- }
- }
-}
diff --git a/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java b/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java
index 6ada779..256ebba 100644
--- a/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java
+++ b/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java
@@ -17,7 +17,6 @@
import com.intellij.compiler.CompilerConfiguration;
import com.intellij.compiler.CompilerConfigurationImpl;
-import com.intellij.compiler.CompilerWorkspaceConfiguration;
import com.intellij.compiler.options.CompileStepBeforeRun;
import com.intellij.compiler.server.BuildManager;
import com.intellij.facet.ProjectFacetManager;
@@ -82,9 +81,6 @@
// we do it here for internal mode and also to make there roots 'visibly excluded' in IDE settings
createGenModulesAndSourceRoots(project);
- if (!CompilerWorkspaceConfiguration.getInstance(project).useOutOfProcessBuild()) {
- return prepareForCompilation(context);
- }
return true;
}
diff --git a/android/src/org/jetbrains/android/compiler/AndroidProguardCompiler.java b/android/src/org/jetbrains/android/compiler/AndroidProguardCompiler.java
deleted file mode 100644
index ab13cab..0000000
--- a/android/src/org/jetbrains/android/compiler/AndroidProguardCompiler.java
+++ /dev/null
@@ -1,493 +0,0 @@
-package org.jetbrains.android.compiler;
-
-import com.android.sdklib.IAndroidTarget;
-import com.intellij.compiler.CompilerIOUtil;
-import com.intellij.compiler.impl.CompilerUtil;
-import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.compiler.*;
-import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.fileTypes.StdFileTypes;
-import com.intellij.openapi.module.Module;
-import com.intellij.openapi.module.ModuleManager;
-import com.intellij.openapi.projectRoots.JavaSdkType;
-import com.intellij.openapi.projectRoots.Sdk;
-import com.intellij.openapi.projectRoots.SdkTypeId;
-import com.intellij.openapi.roots.CompilerModuleExtension;
-import com.intellij.openapi.roots.ModuleRootManager;
-import com.intellij.openapi.util.Computable;
-import com.intellij.openapi.util.Key;
-import com.intellij.openapi.util.io.FileUtil;
-import com.intellij.openapi.vfs.LocalFileSystem;
-import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.util.containers.HashMap;
-import com.intellij.util.containers.HashSet;
-import org.jetbrains.android.facet.AndroidFacet;
-import org.jetbrains.android.facet.AndroidRootUtil;
-import org.jetbrains.android.sdk.AndroidPlatform;
-import org.jetbrains.android.util.AndroidBundle;
-import org.jetbrains.android.util.AndroidCommonUtils;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Eugene.Kudelevsky
- */
-public class AndroidProguardCompiler implements ClassPostProcessingCompiler {
- private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.compiler.AndroidProguardCompiler");
- public static Key<String> PROGUARD_CFG_PATHS_KEY = Key.create(AndroidCommonUtils.PROGUARD_CFG_PATHS_OPTION);
-
- @NotNull
- @Override
- public ProcessingItem[] getProcessingItems(final CompileContext context) {
- return ApplicationManager.getApplication().runReadAction(new Computable<ProcessingItem[]>() {
- @Override
- public ProcessingItem[] compute() {
- final Module[] modules = ModuleManager.getInstance(context.getProject()).getModules();
- final List<ProcessingItem> items = new ArrayList<ProcessingItem>();
-
- for (final Module module : modules) {
- final AndroidFacet facet = AndroidFacet.getInstance(module);
-
- if (facet == null || facet.isLibraryProject()) {
- continue;
- }
-
- final ProguardRunningOptions proguardRunningOptions = AndroidCompileUtil.getProguardConfigFilePathIfShouldRun(facet, context);
- if (proguardRunningOptions == null) {
- continue;
- }
- final List<String> proguardCfgPaths = proguardRunningOptions.getProguardCfgFiles();
-
- if (proguardCfgPaths.size() == 0) {
- context
- .addMessage(CompilerMessageCategory.ERROR, "Proguard config file path is not specified for module " + module.getName(), null,
- -1, -1);
- continue;
- }
- final List<VirtualFile> proguardConfigFiles = new ArrayList<VirtualFile>();
- boolean proguardCfgNotFound = false;
-
- for (String proguardCfgPath : proguardCfgPaths) {
- final VirtualFile proguardConfigFile =
- LocalFileSystem.getInstance().findFileByPath(FileUtil.toSystemIndependentName(proguardCfgPath));
-
- if (proguardConfigFile == null) {
- context.addMessage(CompilerMessageCategory.ERROR, "Cannot find file " + proguardCfgPath, null, -1, -1);
- proguardCfgNotFound = true;
- break;
- }
- proguardConfigFiles.add(proguardConfigFile);
- }
-
- if (proguardCfgNotFound) {
- continue;
- }
- final CompilerModuleExtension extension = CompilerModuleExtension.getInstance(module);
- if (extension == null) {
- LOG.error("Cannot find compiler module extension for module " + module.getName());
- continue;
- }
-
- final VirtualFile classFilesDir = extension.getCompilerOutputPath();
- if (classFilesDir == null) {
- context
- .addMessage(CompilerMessageCategory.INFORMATION, "Output directory is not specified for module " + module.getName(), null,
- -1, -1);
- continue;
- }
-
- final VirtualFile mainContentRoot = AndroidRootUtil.getMainContentRoot(facet);
- if (mainContentRoot == null) {
- context.addMessage(CompilerMessageCategory.ERROR, "Cannot find main content root for module " + module.getName(), null, -1, -1);
- continue;
- }
-
- final AndroidPlatform platform = facet.getConfiguration().getAndroidPlatform();
- if (platform == null) {
- context.addMessage(CompilerMessageCategory.ERROR,
- AndroidBundle.message("android.compilation.proguardCfgNotFound.specify.platform", module.getName()), null, -1, -1);
- continue;
- }
-
- final String logsDirOsPath = FileUtil.toSystemDependentName(mainContentRoot.getPath() + '/' + AndroidCommonUtils.DIRECTORY_FOR_LOGS_NAME);
-
- final File logsDir = new File(logsDirOsPath);
- if (!logsDir.exists()) {
- if (!logsDir.mkdirs()) {
- context.addMessage(CompilerMessageCategory.ERROR, "Cannot find directory " + logsDirOsPath, null, -1, -1);
- continue;
- }
- }
-
- final List<VirtualFile> externalJars = AndroidRootUtil.getExternalLibraries(module);
- final Set<VirtualFile> classFilesDirs = new HashSet<VirtualFile>();
- final Set<VirtualFile> libClassFilesDirs = new HashSet<VirtualFile>();
-
- AndroidDexCompiler.addModuleOutputDir(classFilesDirs, classFilesDir);
-
- for (VirtualFile file : AndroidRootUtil.getDependentModules(module, classFilesDir)) {
- if (file.isDirectory()) {
- AndroidDexCompiler.addModuleOutputDir(classFilesDirs, file);
- }
- else {
- AndroidDexCompiler.addModuleOutputDir(libClassFilesDirs, file.getParent());
- }
- }
-
- final String sdkPath = platform.getSdkData().getPath();
-
- final VirtualFile outputDir = AndroidDexCompiler.getOutputDirectoryForDex(module);
- final String outputJarOsPath = FileUtil.toSystemDependentName(outputDir.getPath() + '/' + AndroidCommonUtils.PROGUARD_OUTPUT_JAR_NAME);
-
- final VirtualFile proguardCfgGeneratedByAapt = outputDir.findChild(AndroidCommonUtils.PROGUARD_CFG_OUTPUT_FILE_NAME);
- if (proguardCfgGeneratedByAapt != null) {
- proguardConfigFiles.add(proguardCfgGeneratedByAapt);
- }
-
- items.add(new MyProcessingItem(module, sdkPath, platform.getTarget(), platform.getSdkData().getSdkToolsRevision(),
- proguardConfigFiles, false, outputJarOsPath,
- classFilesDir, classFilesDirs.toArray(new VirtualFile[classFilesDirs.size()]),
- libClassFilesDirs.toArray(new VirtualFile[libClassFilesDirs.size()]),
- externalJars.toArray(new VirtualFile[externalJars.size()]), logsDirOsPath));
- }
- return items.toArray(new ProcessingItem[items.size()]);
- }
- });
- }
-
- @Nullable
- private static String getJavaExecutablePath(@NotNull Module module) {
- final Sdk sdk = ModuleRootManager.getInstance(module).getSdk();
-
- if (sdk == null) {
- return null;
- }
- final SdkTypeId sdkType = sdk.getSdkType();
-
- if (!(sdkType instanceof JavaSdkType)) {
- return null;
- }
- return ((JavaSdkType)sdkType).getVMExecutablePath(sdk);
- }
-
- @Override
- public ProcessingItem[] process(CompileContext context, ProcessingItem[] items) {
- final List<ProcessingItem> processedItems = new ArrayList<ProcessingItem>();
-
- for (ProcessingItem item : items) {
- final MyProcessingItem processingItem = (MyProcessingItem)item;
-
- if (!AndroidCompileUtil.isModuleAffected(context, processingItem.myModule)) {
- continue;
- }
- final Module module = ((MyProcessingItem)item).getModule();
- final String javaExecutablePath = getJavaExecutablePath(module);
-
- if (javaExecutablePath == null) {
- context.addMessage(CompilerMessageCategory.ERROR, "Cannot find Java SDK for module " + module.getName(), null, -1, -1);
- continue;
- }
- final List<VirtualFile> cfgFiles = processingItem.getProguardConfigFiles();
- final String[] proguardCfgOsPaths = AndroidCompileUtil.toOsPaths(cfgFiles.toArray(new VirtualFile[cfgFiles.size()]));
-
- final String[] classFilesDirOsPaths = AndroidCompileUtil.toOsPaths(processingItem.getClassFilesDirs());
- final String[] libClassFilesDirOsPaths = AndroidCompileUtil.toOsPaths(processingItem.getLibClassFilesDirs());
- final String[] externalJarOsPaths = AndroidCompileUtil.toOsPaths(processingItem.getExternalJars());
-
- try {
- final String inputJarOsPath = AndroidCommonUtils.buildTempInputJar(classFilesDirOsPaths, libClassFilesDirOsPaths);
- final String logsDirOsPath = processingItem.getLogsDirectoryOsPath();
-
- final Map<CompilerMessageCategory, List<String>> messages = AndroidCompileUtil.toCompilerMessageCategoryKeys(
- AndroidCommonUtils.launchProguard(processingItem.getTarget(), processingItem.getSdkToolsRevision(),
- processingItem.getSdkOsPath(), javaExecutablePath, "", proguardCfgOsPaths,
- inputJarOsPath, externalJarOsPaths, processingItem.getOutputJarOsPath(), logsDirOsPath));
-
- CompilerUtil.refreshIOFile(new File(processingItem.getOutputJarOsPath()));
-
- AndroidCompileUtil.addMessages(context, messages, processingItem.myModule);
-
- if (messages.get(CompilerMessageCategory.ERROR).isEmpty()) {
- processedItems.add(item);
- }
- }
- catch (IOException e) {
- if (e.getMessage() == null) {
- LOG.error(e);
- }
- else {
- LOG.info(e);
- context.addMessage(CompilerMessageCategory.ERROR, "I/O error: " + e.getMessage(), null, -1, -1);
- }
- }
- }
-
- return processedItems.toArray(new ProcessingItem[processedItems.size()]);
- }
-
- @NotNull
- @Override
- public String getDescription() {
- return "Android Proguard Runner";
- }
-
- @Override
- public boolean validateConfiguration(CompileScope scope) {
- return true;
- }
-
- @Override
- public ValidityState createValidityState(DataInput in) throws IOException {
- return new MyValidityState(in);
- }
-
- private static class MyProcessingItem implements ProcessingItem {
- private final Module myModule;
- private final IAndroidTarget myTarget;
- private final int mySdkToolsRevision;
- private final String myOutputJarOsPath;
- private final VirtualFile myMainClassFilesDir;
- private final VirtualFile[] myClassFilesDirs;
- private final VirtualFile[] myLibClassFilesDirs;
- private final VirtualFile[] myExternalJars;
- private final String myLogsDirectoryOsPath;
- private final List<VirtualFile> myProguardConfigFiles;
- private final boolean myIncludeSystemProguardFile;
- private final String mySdkOsPath;
-
- private MyProcessingItem(@NotNull Module module,
- @NotNull String sdkOsPath,
- @NotNull IAndroidTarget target,
- int sdkToolsRevision,
- @NotNull List<VirtualFile> proguardConfigFiles,
- boolean includeSystemProguardFile,
- @NotNull String outputJarOsPath,
- @NotNull VirtualFile mainClassFilesDir,
- @NotNull VirtualFile[] classFilesDirs,
- @NotNull VirtualFile[] libCLassFilesDirs,
- @NotNull VirtualFile[] externalJars,
- @Nullable String logsDirectoryOsPath) {
- myModule = module;
- myTarget = target;
- mySdkToolsRevision = sdkToolsRevision;
- myProguardConfigFiles = proguardConfigFiles;
- myIncludeSystemProguardFile = includeSystemProguardFile;
- myOutputJarOsPath = outputJarOsPath;
- myMainClassFilesDir = mainClassFilesDir;
- mySdkOsPath = sdkOsPath;
- myClassFilesDirs = classFilesDirs;
- myLibClassFilesDirs = libCLassFilesDirs;
- myExternalJars = externalJars;
- myLogsDirectoryOsPath = logsDirectoryOsPath;
- }
-
- @NotNull
- public String getOutputJarOsPath() {
- return myOutputJarOsPath;
- }
-
- @NotNull
- public String getSdkOsPath() {
- return mySdkOsPath;
- }
-
- @NotNull
- public VirtualFile[] getClassFilesDirs() {
- return myClassFilesDirs;
- }
-
- @NotNull
- public VirtualFile[] getLibClassFilesDirs() {
- return myLibClassFilesDirs;
- }
-
- @NotNull
- @Override
- public VirtualFile getFile() {
- return myMainClassFilesDir;
- }
-
- public List<VirtualFile> getProguardConfigFiles() {
- return myProguardConfigFiles;
- }
-
- public boolean isIncludeSystemProguardFile() {
- return myIncludeSystemProguardFile;
- }
-
- @NotNull
- public VirtualFile[] getExternalJars() {
- return myExternalJars;
- }
-
- @NotNull
- public IAndroidTarget getTarget() {
- return myTarget;
- }
-
- public int getSdkToolsRevision() {
- return mySdkToolsRevision;
- }
-
- @Nullable
- public String getLogsDirectoryOsPath() {
- return myLogsDirectoryOsPath;
- }
-
- @Override
- public ValidityState getValidityState() {
- return new MyValidityState(myTarget, mySdkOsPath, myOutputJarOsPath, myClassFilesDirs, myExternalJars,
- myProguardConfigFiles, myIncludeSystemProguardFile, myLogsDirectoryOsPath);
- }
-
- @NotNull
- public Module getModule() {
- return myModule;
- }
- }
-
- private static class MyValidityState implements ValidityState {
- private final String myTargetHashString;
- private final String mySdkPath;
- private final String myOutputDirPath;
- private final String myLogsDirectoryPath;
- private final Map<String, Long> myClassFilesMap;
- private final Map<String, Long> myExternalJarsMap;
- private final Map<String, Long> myConfigFileTimestamps;
- private final boolean myIncludeSystemProguardCfg;
-
- public MyValidityState(@NotNull IAndroidTarget target,
- @NotNull String sdkOsPath,
- @NotNull String outputJarOsPath,
- @NotNull VirtualFile[] classFilesDirs,
- @NotNull VirtualFile[] externalJars,
- @NotNull List<VirtualFile> proguardConfigFiles,
- boolean includeSystemProguardCfg,
- @Nullable String logsDirectoryOsPath) {
- myTargetHashString = target.hashString();
- mySdkPath = sdkOsPath;
- myOutputDirPath = outputJarOsPath;
- myIncludeSystemProguardCfg = includeSystemProguardCfg;
-
- myClassFilesMap = new HashMap<String, Long>();
- final HashSet<VirtualFile> visited = new HashSet<VirtualFile>();
- for (VirtualFile dir : classFilesDirs) {
- fillClassFilesMap(dir, visited);
- }
-
- myExternalJarsMap = new HashMap<String, Long>();
- for (VirtualFile jar : externalJars) {
- myExternalJarsMap.put(jar.getPath(), jar.getTimeStamp());
- }
-
- myConfigFileTimestamps = new HashMap<String, Long>();
- for (VirtualFile file : proguardConfigFiles) {
- myConfigFileTimestamps.put(file.getPath(), file.getTimeStamp());
- }
- myLogsDirectoryPath = logsDirectoryOsPath != null ? logsDirectoryOsPath : "";
- }
-
- private void fillClassFilesMap(VirtualFile file, Set<VirtualFile> visited) {
- if (file.isDirectory() && visited.add(file)) {
- for (VirtualFile child : file.getChildren()) {
- fillClassFilesMap(child, visited);
- }
- }
- else if (StdFileTypes.CLASS.equals(file.getFileType())) {
- myClassFilesMap.put(file.getPath(), file.getTimeStamp());
- }
- }
-
- public MyValidityState(@NotNull DataInput in) throws IOException {
- myTargetHashString = in.readUTF();
-
- mySdkPath = CompilerIOUtil.readString(in);
- myOutputDirPath = CompilerIOUtil.readString(in);
-
- myClassFilesMap = new HashMap<String, Long>();
- final int classFilesCount = in.readInt();
-
- for (int i = 0; i < classFilesCount; i++) {
- final String path = CompilerIOUtil.readString(in);
- final long timestamp = in.readLong();
-
- myClassFilesMap.put(path, timestamp);
- }
-
- myExternalJarsMap = new HashMap<String, Long>();
- final int externalJarsCount = in.readInt();
-
- for (int i = 0; i < externalJarsCount; i++) {
- final String path = CompilerIOUtil.readString(in);
- final long timestamp = in.readLong();
-
- myExternalJarsMap.put(path, timestamp);
- }
-
- myConfigFileTimestamps = new HashMap<String, Long>();
- final int configFileCounts = in.readInt();
-
- for (int i = 0; i < configFileCounts; i++) {
- final String path = CompilerIOUtil.readString(in);
- final long timestamp = in.readLong();
- myConfigFileTimestamps.put(path, timestamp);
- }
- myIncludeSystemProguardCfg = in.readBoolean();
- myLogsDirectoryPath = CompilerIOUtil.readString(in);
- }
-
- @Override
- public boolean equalsTo(ValidityState otherState) {
- if (!(otherState instanceof MyValidityState)) {
- return false;
- }
-
- final MyValidityState other = (MyValidityState)otherState;
-
- return myTargetHashString.equals(other.myTargetHashString) &&
- mySdkPath.equals(other.mySdkPath) &&
- myOutputDirPath.equals(other.myOutputDirPath) &&
- myClassFilesMap.equals(other.myClassFilesMap) &&
- myExternalJarsMap.equals(other.myExternalJarsMap) &&
- myConfigFileTimestamps.equals(other.myConfigFileTimestamps) &&
- myIncludeSystemProguardCfg == other.myIncludeSystemProguardCfg &&
- myLogsDirectoryPath.equals(other.myLogsDirectoryPath);
- }
-
- @Override
- public void save(DataOutput out) throws IOException {
- out.writeUTF(myTargetHashString);
- CompilerIOUtil.writeString(mySdkPath, out);
- CompilerIOUtil.writeString(myOutputDirPath, out);
-
- out.writeInt(myClassFilesMap.size());
- for (String path : myClassFilesMap.keySet()) {
- CompilerIOUtil.writeString(path, out);
- out.writeLong(myClassFilesMap.get(path));
- }
-
- out.writeInt(myExternalJarsMap.size());
- for (String path : myExternalJarsMap.keySet()) {
- CompilerIOUtil.writeString(path, out);
- out.writeLong(myExternalJarsMap.get(path));
- }
-
- out.writeInt(myConfigFileTimestamps.size());
- for (String path : myConfigFileTimestamps.keySet()) {
- CompilerIOUtil.writeString(path, out);
- out.writeLong(myConfigFileTimestamps.get(path));
- }
- out.writeBoolean(myIncludeSystemProguardCfg);
- CompilerIOUtil.writeString(myLogsDirectoryPath, out);
- }
- }
-}
diff --git a/android/src/org/jetbrains/android/compiler/AndroidRenderscriptCompiler.java b/android/src/org/jetbrains/android/compiler/AndroidRenderscriptCompiler.java
deleted file mode 100644
index 8ace258..0000000
--- a/android/src/org/jetbrains/android/compiler/AndroidRenderscriptCompiler.java
+++ /dev/null
@@ -1,353 +0,0 @@
-package org.jetbrains.android.compiler;
-
-
-import com.android.SdkConstants;
-import com.android.sdklib.IAndroidTarget;
-import com.intellij.facet.FacetManager;
-import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.compiler.*;
-import com.intellij.openapi.compiler.ex.CompileContextEx;
-import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.module.Module;
-import com.intellij.openapi.project.Project;
-import com.intellij.openapi.roots.ProjectFileIndex;
-import com.intellij.openapi.roots.ProjectRootManager;
-import com.intellij.openapi.util.Comparing;
-import com.intellij.openapi.util.Computable;
-import com.intellij.openapi.util.io.FileUtil;
-import com.intellij.openapi.vfs.VfsUtilCore;
-import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.util.containers.HashMap;
-import com.intellij.util.containers.HashSet;
-import org.jetbrains.android.compiler.tools.AndroidRenderscript;
-import org.jetbrains.android.facet.AndroidFacet;
-import org.jetbrains.android.facet.AndroidRootUtil;
-import com.android.tools.idea.fileTypes.AndroidRenderscriptFileType;
-import org.jetbrains.android.sdk.AndroidPlatform;
-import org.jetbrains.android.util.AndroidBundle;
-import org.jetbrains.android.util.AndroidUtils;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.File;
-import java.io.IOException;
-import java.util.*;
-
-/**
- * @author Eugene.Kudelevsky
- */
-public class AndroidRenderscriptCompiler implements SourceGeneratingCompiler {
- private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.compiler.AndroidRenderscriptCompiler");
-
- private static final GenerationItem[] EMPTY_GENERATION_ITEM_ARRAY = {};
-
- @Nullable
- @Override
- public VirtualFile getPresentableFile(CompileContext context, Module module, VirtualFile outputRoot, VirtualFile generatedFile) {
- return null;
- }
-
- @Override
- public GenerationItem[] getGenerationItems(final CompileContext context) {
- return ApplicationManager.getApplication().runReadAction(new Computable<GenerationItem[]>() {
- @Override
- public GenerationItem[] compute() {
- if (context.getProject().isDisposed()) {
- return EMPTY_GENERATION_ITEM_ARRAY;
- }
-
- final VirtualFile[] files = context.getProjectCompileScope().getFiles(AndroidRenderscriptFileType.INSTANCE, true);
- final Map<Module, Collection<VirtualFile>> module2files = new HashMap<Module, Collection<VirtualFile>>();
-
- for (VirtualFile file : files) {
- final Module module = context.getModuleByFile(file);
-
- if (module != null) {
- Collection<VirtualFile> filesForModule = module2files.get(module);
-
- if (filesForModule == null) {
- filesForModule = new ArrayList<VirtualFile>();
- module2files.put(module, filesForModule);
- }
-
- filesForModule.add(file);
- }
- }
- final List<GenerationItem> items = new ArrayList<GenerationItem>(files.length);
-
- for (Map.Entry<Module, Collection<VirtualFile>> entry : module2files.entrySet()) {
- final Module module = entry.getKey();
- final AndroidFacet facet = FacetManager.getInstance(module).getFacetByType(AndroidFacet.ID);
- if (facet == null) {
- continue;
- }
-
- final AndroidPlatform platform = facet.getConfiguration().getAndroidPlatform();
- if (platform == null) {
- context.addMessage(CompilerMessageCategory.ERROR,
- AndroidBundle.message("android.compilation.error.specify.platform", module.getName()), null, -1, -1);
- continue;
- }
-
- final IAndroidTarget target = platform.getTarget();
- final String sdkLocation = platform.getSdkData().getPath();
-
- final String resourceDirPath = AndroidRootUtil.getResourceDirPath(facet);
- assert resourceDirPath != null;
-
- addItem(entry.getValue(), facet, resourceDirPath, sdkLocation, target, items);
- }
- return items.toArray(new GenerationItem[items.size()]);
- }
- });
- }
-
- private static void addItem(@NotNull final Collection<VirtualFile> sourceFiles,
- @NotNull final AndroidFacet facet,
- @NotNull final String resourceDirPath,
- @NotNull String sdkLocation,
- @NotNull final IAndroidTarget target,
- @NotNull final List<GenerationItem> items) {
- final String sourceRootPath = AndroidRootUtil.getRenderscriptGenSourceRootPath(facet);
- if (sourceRootPath == null) {
- return;
- }
- final String rawDirPath = resourceDirPath + '/' + SdkConstants.FD_RES_RAW;
- items.add(new MyGenerationItem(facet.getModule(), sourceFiles, rawDirPath, sdkLocation, target));
- }
-
- @Override
- public GenerationItem[] generate(final CompileContext context,
- final GenerationItem[] items,
- final VirtualFile outputRootDirectory) {
- if (items == null || items.length <= 0) {
- return EMPTY_GENERATION_ITEM_ARRAY;
- }
-
- context.getProgressIndicator().setText("Compiling RenderScript files...");
- final GenerationItem[] generationItems = doGenerate(context, items, outputRootDirectory);
- final Set<VirtualFile> generatedVFiles = new HashSet<VirtualFile>();
- final HashSet<VirtualFile> visited = new HashSet<VirtualFile>();
-
- outputRootDirectory.refresh(false, true);
- AndroidUtils.collectFiles(outputRootDirectory, visited, generatedVFiles);
-
- if (context instanceof CompileContextEx) {
- ((CompileContextEx)context).markGenerated(generatedVFiles);
- }
- return generationItems;
- }
-
- @NotNull
- @Override
- public String getDescription() {
- return AndroidBundle.message("android.renderscript.compiler.description");
- }
-
- @Override
- public boolean validateConfiguration(CompileScope scope) {
- return true;
- }
-
- @Nullable
- @Override
- public ValidityState createValidityState(DataInput in) throws IOException {
- return new MyValidityState(in);
- }
-
- private static GenerationItem[] doGenerate(@NotNull final CompileContext context,
- @NotNull final GenerationItem[] items,
- VirtualFile outputRootDirectory) {
- if (context.getProject().isDisposed()) {
- return EMPTY_GENERATION_ITEM_ARRAY;
- }
-
- // we have one item per module there, so clear output directory
- final String genRootPath = FileUtil.toSystemDependentName(outputRootDirectory.getPath());
- final File genRootDir = new File(genRootPath);
- if (genRootDir.exists()) {
- if (!FileUtil.delete(genRootDir)) {
- context.addMessage(CompilerMessageCategory.ERROR, "Cannot delete directory " + genRootPath, null, -1, -1);
- return EMPTY_GENERATION_ITEM_ARRAY;
- }
- if (!genRootDir.mkdir()) {
- context.addMessage(CompilerMessageCategory.ERROR, "Cannot create directory " + genRootPath, null, -1, -1);
- return EMPTY_GENERATION_ITEM_ARRAY;
- }
- }
-
- final List<GenerationItem> results = new ArrayList<GenerationItem>(items.length);
- for (final GenerationItem item : items) {
- if (item instanceof MyGenerationItem) {
- final MyGenerationItem genItem = (MyGenerationItem)item;
-
- if (!AndroidCompileUtil.isModuleAffected(context, genItem.myModule)) {
- continue;
- }
-
- boolean success = true;
-
- for (final VirtualFile sourceFile : genItem.myFiles) {
- final String depFolderOsPath = getDependencyFolder(context.getProject(), sourceFile, outputRootDirectory);
-
- try {
- final Map<CompilerMessageCategory, List<String>> messages = AndroidCompileUtil.toCompilerMessageCategoryKeys(
- AndroidRenderscript
- .execute(genItem.mySdkLocation, genItem.myAndroidTarget, sourceFile.getPath(), genRootPath,
- depFolderOsPath,
- genItem.myRawDirPath));
- AndroidCompileUtil.markDirty(outputRootDirectory, true);
-
- ApplicationManager.getApplication().runReadAction(new Runnable() {
- @Override
- public void run() {
- if (context.getProject().isDisposed()) {
- return;
- }
- addMessages(context, messages, sourceFile.getUrl());
- }
- });
-
- if (messages.get(CompilerMessageCategory.ERROR).size() > 0) {
- success = false;
- }
- }
- catch (final IOException e) {
- LOG.info(e);
- ApplicationManager.getApplication().runReadAction(new Runnable() {
- @Override
- public void run() {
- if (context.getProject().isDisposed()) return;
- context.addMessage(CompilerMessageCategory.ERROR, e.getMessage(), sourceFile.getUrl(), -1, -1);
- }
- });
- success = false;
- }
- }
-
- if (success) {
- results.add(genItem);
- }
- }
- }
- outputRootDirectory.refresh(false, true);
- return results.toArray(new GenerationItem[results.size()]);
- }
-
- private static void addMessages(@NotNull final CompileContext context,
- @NotNull final Map<CompilerMessageCategory, List<String>> messages,
- @NotNull final String url) {
- for (final CompilerMessageCategory category : messages.keySet()) {
- final List<String> messageList = messages.get(category);
- for (final String message : messageList) {
- context.addMessage(category, message, url, -1, -1);
- }
- }
- }
-
- @Nullable
- static String getDependencyFolder(@NotNull final Project project,
- @NotNull final VirtualFile sourceFile,
- @NotNull final VirtualFile genFolder) {
- final ProjectFileIndex index = ProjectRootManager.getInstance(project).getFileIndex();
-
- final VirtualFile sourceRoot = index.getSourceRootForFile(sourceFile);
- if (sourceRoot == null) {
- return null;
- }
-
- final VirtualFile parent = sourceFile.getParent();
- if (Comparing.equal(parent, sourceRoot)) {
- return genFolder.getPath();
- }
-
- final String relativePath = VfsUtilCore.getRelativePath(sourceFile.getParent(), sourceRoot, '/');
- assert relativePath != null;
- return genFolder.getPath() + '/' + relativePath;
- }
-
- private static class MyGenerationItem implements GenerationItem {
- final Module myModule;
- final String mySdkLocation;
- final Collection<VirtualFile> myFiles;
- final IAndroidTarget myAndroidTarget;
- final String myRawDirPath;
- private final MyValidityState myValidityState;
-
- public MyGenerationItem(@NotNull Module module,
- @NotNull Collection<VirtualFile> files,
- @NotNull String rawDirPath,
- @NotNull String sdkLocation,
- @NotNull IAndroidTarget target) {
- myModule = module;
- myFiles = files;
- myRawDirPath = rawDirPath;
- mySdkLocation = sdkLocation;
- myAndroidTarget = target;
- myValidityState = new MyValidityState(myFiles);
- }
-
- @Override
- @Nullable
- public String getPath() {
- return "";
- }
-
- @Override
- @Nullable
- public ValidityState getValidityState() {
- return myValidityState;
- }
-
- @Override
- public Module getModule() {
- return myModule;
- }
-
- @Override
- public boolean isTestSource() {
- return false;
- }
- }
-
- private static class MyValidityState implements ValidityState {
- private final Map<String, Long> myTimestamps = new HashMap<String, Long>();
-
- MyValidityState(DataInput in) throws IOException {
- final int size = in.readInt();
-
- for (int i = 0; i < size; i++) {
- final String path = in.readUTF();
- final long timestamp = in.readLong();
-
- myTimestamps.put(path, timestamp);
- }
- }
-
- MyValidityState(@NotNull Collection<VirtualFile> files) {
- for (VirtualFile file : files) {
- myTimestamps.put(file.getPath(), file.getTimeStamp());
- }
- }
-
- @Override
- public boolean equalsTo(ValidityState otherState) {
- if (!(otherState instanceof MyValidityState)) {
- return false;
- }
- return ((MyValidityState)otherState).myTimestamps.equals(myTimestamps);
- }
-
- @Override
- public void save(DataOutput out) throws IOException {
- out.writeInt(myTimestamps.size());
-
- for (Map.Entry<String, Long> entry : myTimestamps.entrySet()) {
- out.writeUTF(entry.getKey());
- out.writeLong(entry.getValue());
- }
- }
- }
-}
diff --git a/android/src/org/jetbrains/android/compiler/AndroidResourcesPackagingCompiler.java b/android/src/org/jetbrains/android/compiler/AndroidResourcesPackagingCompiler.java
deleted file mode 100644
index 6f63ee8..0000000
--- a/android/src/org/jetbrains/android/compiler/AndroidResourcesPackagingCompiler.java
+++ /dev/null
@@ -1,392 +0,0 @@
-/*
- * Copyright 2000-2010 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jetbrains.android.compiler;
-
-import com.android.sdklib.IAndroidTarget;
-import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.application.ModalityState;
-import com.intellij.openapi.compiler.*;
-import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.module.Module;
-import com.intellij.openapi.module.ModuleManager;
-import com.intellij.openapi.roots.ProjectRootManager;
-import com.intellij.openapi.util.Pair;
-import com.intellij.openapi.util.io.FileUtil;
-import com.intellij.openapi.vfs.LocalFileSystem;
-import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.openapi.vfs.encoding.EncodingManager;
-import com.intellij.util.ArrayUtil;
-import org.jetbrains.android.compiler.tools.AndroidApt;
-import org.jetbrains.android.dom.manifest.Application;
-import org.jetbrains.android.dom.manifest.Manifest;
-import org.jetbrains.android.facet.AndroidFacet;
-import org.jetbrains.android.facet.AndroidFacetConfiguration;
-import org.jetbrains.android.facet.AndroidRootUtil;
-import org.jetbrains.android.sdk.AndroidPlatform;
-import org.jetbrains.android.util.AndroidBundle;
-import org.jetbrains.android.util.AndroidUtils;
-import org.jetbrains.annotations.NotNull;
-
-import java.io.*;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Eugene.Kudelevsky
- */
-public class AndroidResourcesPackagingCompiler implements ClassPostProcessingCompiler {
- private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.compiler.AndroidResourcesPackagingCompiler");
-
- public static final String RELEASE_SUFFIX = ".release";
-
- @NotNull
- @Override
- public ProcessingItem[] getProcessingItems(CompileContext context) {
- final List<ProcessingItem> items = new ArrayList<ProcessingItem>();
- for (Module module : ModuleManager.getInstance(context.getProject()).getModules()) {
- AndroidFacet facet = AndroidFacet.getInstance(module);
- if (facet != null && !facet.isLibraryProject()) {
- VirtualFile manifestFile = AndroidRootUtil.getManifestFileForCompiler(facet);
-
- final ArrayList<String> assetDirPathsList = new ArrayList<String>();
- collectAssetDirs(facet, assetDirPathsList);
- final String[] assetDirPaths = ArrayUtil.toStringArray(assetDirPathsList);
-
- if (manifestFile == null) {
- context.addMessage(CompilerMessageCategory.ERROR,
- AndroidBundle.message("android.compilation.error.manifest.not.found", module.getName()), null, -1, -1);
- continue;
- }
- AndroidFacetConfiguration configuration = facet.getConfiguration();
- VirtualFile outputDir = AndroidDexCompiler.getOutputDirectoryForDex(module);
- if (outputDir != null) {
- String outputPath = getOutputFile(module, outputDir).getPath();
-
- final AndroidPlatform platform = configuration.getAndroidPlatform();
-
- if (platform != null) {
- String[] resourcesDirPaths = AndroidCompileUtil.collectResourceDirs(facet, true, context);
- final IAndroidTarget target = platform.getTarget();
- final int platformToolsRevision = platform.getSdkData().getPlatformToolsRevision();
-
- if (resourcesDirPaths.length == 0) {
- context.addMessage(CompilerMessageCategory.WARNING, "Resource directory not found for module " + module.getName(),
- null, -1, -1);
- }
-
- items.add(new MyItem(module, target, platformToolsRevision, manifestFile, resourcesDirPaths, assetDirPaths, outputPath,
- false, AndroidCompileUtil.isReleaseBuild(context)));
- //items.add(new MyItem(module, target, manifestFile, resourcesDirPaths, assetsDirPath, outputPath + RELEASE_SUFFIX, true));
- }
- }
- }
- }
- return items.toArray(new ProcessingItem[items.size()]);
- }
-
- private static void collectAssetDirs(@NotNull AndroidFacet facet, @NotNull List<String> result) {
- final VirtualFile assetsDir = AndroidRootUtil.getAssetsDir(facet);
- if (assetsDir != null) {
- result.add(FileUtil.toSystemDependentName(assetsDir.getPath()));
- }
- if (facet.getConfiguration().isIncludeAssetsFromLibraries()) {
- for (AndroidFacet depFacet : AndroidUtils.getAllAndroidDependencies(facet.getModule(), true)) {
- final VirtualFile depAssetsDir = AndroidRootUtil.getAssetsDir(depFacet);
-
- if (depAssetsDir != null) {
- result.add(FileUtil.toSystemDependentName(depAssetsDir.getPath()));
- }
- }
- }
- }
-
- static File getOutputFile(Module module, VirtualFile outputDir) {
- return new File(outputDir.getPath(), module.getName() + ".apk.res");
- }
-
- @Override
- public ProcessingItem[] process(final CompileContext context, ProcessingItem[] items) {
- if (!AndroidCompileUtil.isFullBuild(context)) {
- return ProcessingItem.EMPTY_ARRAY;
- }
-
- context.getProgressIndicator().setText("Packaging Android resources...");
- final List<ProcessingItem> result = new ArrayList<ProcessingItem>();
- for (ProcessingItem processingItem : items) {
- MyItem item = (MyItem)processingItem;
-
- if (!AndroidCompileUtil.isModuleAffected(context, item.myModule)) {
- continue;
- }
-
- doProcess(context, item, false);
-
- if (context.getMessages(CompilerMessageCategory.ERROR).length == 0) {
- doProcess(context, item, true);
- }
-
- if (context.getMessages(CompilerMessageCategory.ERROR).length == 0) {
- result.add(item);
- }
- }
- return result.toArray(new ProcessingItem[result.size()]);
- }
-
- private static void doProcess(final CompileContext context, MyItem item, boolean releasePackage) {
- if (!AndroidPackagingCompiler.shouldGenerateApk(item.myModule, context, releasePackage)) {
- return;
- }
-
- final VirtualFile preprocessedManifestFile;
- File manifestTmpDir = null;
-
- try {
- if (releasePackage) {
- preprocessedManifestFile = item.myManifestFile;
- }
- else {
- final Pair<VirtualFile, File> pair = copyManifestAndSetDebuggableToTrue(item.myModule, item.myManifestFile);
- preprocessedManifestFile = pair.getFirst();
- manifestTmpDir = pair.getSecond();
- }
- }
- catch (IOException e) {
- LOG.info(e);
- context.addMessage(CompilerMessageCategory.ERROR,
- '[' + item.myModule.getName() + "] Cannot preprocess AndroidManifest.xml for debug build",
- item.myManifestFile.getUrl(), -1, -1);
- return;
- }
-
- final Map<VirtualFile, VirtualFile> presentableFilesMap = Collections.singletonMap(item.myManifestFile, preprocessedManifestFile);
-
- try {
- final String outputPath = releasePackage
- ? item.myOutputPath + RELEASE_SUFFIX
- : item.myOutputPath;
-
- Map<CompilerMessageCategory, List<String>> messages = AndroidCompileUtil.toCompilerMessageCategoryKeys(
- AndroidApt.packageResources(item.myAndroidTarget,
- item.myPlatformToolsRevision,
- preprocessedManifestFile.getPath(),
- item.myResourceDirPaths,
- item.myAssetsDirPaths,
- outputPath, null, !releasePackage, 0, null, "", new FileFilter() {
- @Override
- public boolean accept(File file) {
- final VirtualFile vFile = LocalFileSystem.getInstance().findFileByIoFile(file);
- return vFile != null && !ProjectRootManager.getInstance(context.getProject()).getFileIndex().isIgnored(vFile);
- }
- }));
-
- AndroidCompileUtil.addMessages(context, messages, presentableFilesMap, item.myModule);
- }
- catch (final IOException e) {
- LOG.info(e);
- ApplicationManager.getApplication().runReadAction(new Runnable() {
- @Override
- public void run() {
- if (context.getProject().isDisposed()) return;
- context.addMessage(CompilerMessageCategory.ERROR, e.getMessage(), null, -1, -1);
- }
- });
- }
- finally {
- if (manifestTmpDir != null) {
- FileUtil.delete(manifestTmpDir);
- }
- }
- }
-
- @NotNull
- private static Pair<VirtualFile, File> copyManifestAndSetDebuggableToTrue(@NotNull final Module module, @NotNull final VirtualFile manifestFile)
- throws IOException {
-
- final File dir = FileUtil.createTempDirectory("android_manifest_copy", "tmp");
- final VirtualFile vDir = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(dir);
- if (vDir == null) {
- throw new IOException("Cannot create temp directory for manifest copy");
- }
-
- final VirtualFile[] manifestFileCopy = new VirtualFile[1];
-
- ApplicationManager.getApplication().invokeAndWait(new Runnable() {
- @Override
- public void run() {
- ApplicationManager.getApplication().runWriteAction(new Runnable() {
- @Override
- public void run() {
- try {
- manifestFileCopy[0] = manifestFile.copy(module.getProject(), vDir, manifestFile.getName());
- }
- catch (IOException e) {
- LOG.info(e);
- return;
- }
-
- if (manifestFileCopy[0] == null) {
- return;
- }
-
- final Manifest manifestInCopy = AndroidUtils.loadDomElement(module, manifestFileCopy[0], Manifest.class);
- if (manifestInCopy == null) {
- return;
- }
-
- final Application applicationInCopy = manifestInCopy.getApplication();
- if (applicationInCopy == null) {
- return;
- }
- applicationInCopy.getDebuggable().setValue(Boolean.TRUE.toString());
- }
- });
-
- if (manifestFileCopy[0] != null) {
- EncodingManager.getInstance().setEncoding(manifestFileCopy[0], null);
- }
-
- ApplicationManager.getApplication().saveAll();
- }
- }, ModalityState.defaultModalityState());
-
- if (manifestFileCopy[0] == null) {
- FileUtil.delete(dir);
- throw new IOException("Cannot copy manifest file to " + vDir.getPath());
- }
- return Pair.create(manifestFileCopy[0], dir);
- }
-
- @NotNull
- @Override
- public String getDescription() {
- return "Android Resources Packaging Compiler";
- }
-
- @Override
- public boolean validateConfiguration(CompileScope scope) {
- return true;
- }
-
- @Override
- public ValidityState createValidityState(DataInput in) throws IOException {
- return new MyValidityState(in);
- }
-
- private static class MyItem implements ProcessingItem {
- final Module myModule;
- final VirtualFile myManifestFile;
- final IAndroidTarget myAndroidTarget;
- final String[] myResourceDirPaths;
- final String[] myAssetsDirPaths;
- final String myOutputPath;
-
- private final boolean myFileExists;
- private final boolean myGenerateUnsignedApk;
- private boolean myReleaseBuild;
- final int myPlatformToolsRevision;
-
- private MyItem(Module module,
- IAndroidTarget androidTarget,
- int platformToolsRevision,
- VirtualFile manifestFile,
- String[] resourceDirPaths,
- String[] assetsDirPath,
- String outputPath,
- boolean generateUnsignedApk,
- boolean releaseBuild) {
- myModule = module;
- myAndroidTarget = androidTarget;
- myPlatformToolsRevision = platformToolsRevision;
- myManifestFile = manifestFile;
- myResourceDirPaths = resourceDirPaths;
- myAssetsDirPaths = assetsDirPath;
- myOutputPath = outputPath;
- myFileExists = new File(outputPath).exists();
- myGenerateUnsignedApk = generateUnsignedApk;
- myReleaseBuild = releaseBuild;
- }
-
- @NotNull
- @Override
- public VirtualFile getFile() {
- VirtualFile moduleFile = myModule.getModuleFile();
- return moduleFile != null ? moduleFile : myManifestFile;
- }
-
- @Override
- public ValidityState getValidityState() {
- return new MyValidityState(myModule, myFileExists, myGenerateUnsignedApk, myReleaseBuild, myPlatformToolsRevision);
- }
- }
-
- private static class MyValidityState extends ResourcesValidityState {
- private final boolean myOutputFileExists;
- private final boolean myGenerateUnsignedApk;
- private final boolean myReleaseBuild;
- private final int myPlatformToolsRevision;
-
- public MyValidityState(Module module,
- boolean outputFileExists,
- boolean generateUnsignedApk,
- boolean releaseBuild,
- int platformToolsRevision) {
- super(module);
- myOutputFileExists = outputFileExists;
- myGenerateUnsignedApk = generateUnsignedApk;
- myReleaseBuild = releaseBuild;
- myPlatformToolsRevision = platformToolsRevision;
- }
-
- public MyValidityState(DataInput is) throws IOException {
- super(is);
- myGenerateUnsignedApk = is.readBoolean();
- myReleaseBuild = is.readBoolean();
- myOutputFileExists = true;
- myPlatformToolsRevision = is.readInt();
- }
-
- @Override
- public boolean equalsTo(ValidityState otherState) {
- if (!(otherState instanceof MyValidityState)) {
- return false;
- }
- final MyValidityState otherState1 = (MyValidityState)otherState;
- if (myOutputFileExists != otherState1.myOutputFileExists) {
- return false;
- }
- if (myGenerateUnsignedApk != otherState1.myGenerateUnsignedApk) {
- return false;
- }
- if (myReleaseBuild != otherState1.myReleaseBuild) {
- return false;
- }
- if (myPlatformToolsRevision != otherState1.myPlatformToolsRevision) {
- return false;
- }
- return super.equalsTo(otherState);
- }
-
- @Override
- public void save(DataOutput os) throws IOException {
- super.save(os);
- os.writeBoolean(myGenerateUnsignedApk);
- os.writeBoolean(myReleaseBuild);
- os.writeInt(myPlatformToolsRevision);
- }
- }
-}
diff --git a/android/src/org/jetbrains/android/compiler/ResourcesValidityState.java b/android/src/org/jetbrains/android/compiler/ResourcesValidityState.java
deleted file mode 100644
index 30f7923..0000000
--- a/android/src/org/jetbrains/android/compiler/ResourcesValidityState.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright 2000-2010 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jetbrains.android.compiler;
-
-import com.android.sdklib.IAndroidTarget;
-import com.intellij.openapi.compiler.ValidityState;
-import com.intellij.openapi.module.Module;
-import com.intellij.openapi.vfs.VirtualFile;
-import org.jetbrains.android.facet.AndroidFacet;
-import org.jetbrains.android.facet.AndroidFacetConfiguration;
-import org.jetbrains.android.facet.AndroidRootUtil;
-import org.jetbrains.android.sdk.AndroidPlatform;
-import org.jetbrains.android.util.AndroidUtils;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author yole
- */
-public class ResourcesValidityState implements ValidityState {
- private final Map<String, Long> myResourceTimestamps = new HashMap<String, Long>();
- private final String myAndroidTargetName;
-
- public ResourcesValidityState(Module module) {
- AndroidFacet facet = AndroidFacet.getInstance(module);
- if (facet == null) {
- myAndroidTargetName = "";
- return;
- }
-
- final AndroidFacetConfiguration configuration = facet.getConfiguration();
- AndroidPlatform platform = configuration.getAndroidPlatform();
- IAndroidTarget target = platform != null ? platform.getTarget() : null;
- myAndroidTargetName = target != null ? target.getFullName() : "";
-
- // we need to use getManifestFile, not getManifestFileForCompiler, because MavenResourceCompiler spoils filtered manifest and it
- // becomes dirty in the next session. Actually we can pass filtered manifest to compiler ONLY after AndroidMavenResourcesCompiler
- // performed task, but MavenResourceCompiler not yet
-
- VirtualFile manifestFile = AndroidRootUtil.getManifestFile(facet);
- if (manifestFile != null) {
- myResourceTimestamps.put(manifestFile.getPath(), manifestFile.getTimeStamp());
- }
- VirtualFile resourcesDir = getResourcesDir(facet);
- if (resourcesDir != null) {
- collectFiles(resourcesDir);
- }
- VirtualFile assetsDir = AndroidRootUtil.getAssetsDir(facet);
- if (assetsDir != null) {
- collectFiles(assetsDir);
- }
- for (AndroidFacet depFacet : AndroidUtils.getAllAndroidDependencies(module, true)) {
- VirtualFile depManifest = AndroidRootUtil.getManifestFile(depFacet);
- if (depManifest != null) {
- myResourceTimestamps.put(depManifest.getPath(), depManifest.getTimeStamp());
- }
- VirtualFile depResDir = getResourcesDir(depFacet);
- if (depResDir != null) {
- collectFiles(depResDir);
- }
- if (configuration.isIncludeAssetsFromLibraries()) {
- final VirtualFile depAssetDir = AndroidRootUtil.getAssetsDir(depFacet);
- if (depAssetDir != null) {
- collectFiles(depAssetDir);
- }
- }
- }
- }
-
- @Nullable
- private static VirtualFile getResourcesDir(@NotNull AndroidFacet facet) {
- // same as with manifest file we check timestamps of NOT filtered resources, because MavenResourceCompiler spoils
- // filtered ones and it and they becomes dirty in the next session. Actually we can pass filtered resources to compiler ONLY after
- // AndroidMavenResourcesCompiler performed task, but MavenResourceCompiler not yet
-
- VirtualFile dir = AndroidAptCompiler.getResourceDirForApkCompiler(facet);
- if (dir != null) {
- VirtualFile parent = dir.getParent();
- if ("combined-resources".equals(parent.getName())) {
- return dir;
- }
- }
- return AndroidRootUtil.getResourceDir(facet);
- }
-
- private void collectFiles(VirtualFile resourcesDir) {
- for (VirtualFile child : resourcesDir.getChildren()) {
- if (child.isDirectory()) {
- collectFiles(child);
- }
- else {
- myResourceTimestamps.put(child.getPath(), child.getTimeStamp());
- }
- }
- }
-
- public ResourcesValidityState(DataInput is) throws IOException {
- int count = is.readInt();
- for (int i = 0; i < count; i++) {
- String path = is.readUTF();
- long timestamp = is.readLong();
- myResourceTimestamps.put(path, timestamp);
- }
- myAndroidTargetName = is.readUTF();
- }
-
- @Override
- public boolean equalsTo(ValidityState otherState) {
- if (!(otherState instanceof ResourcesValidityState)) {
- return false;
- }
- ResourcesValidityState rhs = (ResourcesValidityState)otherState;
- if (!myResourceTimestamps.equals(rhs.myResourceTimestamps)) {
- return false;
- }
- return true;
- }
-
- @Override
- public void save(DataOutput os) throws IOException {
- os.writeInt(myResourceTimestamps.size());
- for (Map.Entry<String, Long> e : myResourceTimestamps.entrySet()) {
- os.writeUTF(e.getKey());
- os.writeLong(e.getValue());
- }
- os.writeUTF(myAndroidTargetName);
- }
-}
diff --git a/android/src/org/jetbrains/android/compiler/artifact/AndroidFinalPackageElement.java b/android/src/org/jetbrains/android/compiler/artifact/AndroidFinalPackageElement.java
index d22ed96..31a85e5 100644
--- a/android/src/org/jetbrains/android/compiler/artifact/AndroidFinalPackageElement.java
+++ b/android/src/org/jetbrains/android/compiler/artifact/AndroidFinalPackageElement.java
@@ -6,10 +6,12 @@
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.FileUtil;
-import com.intellij.openapi.vfs.JarFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.packaging.artifacts.ArtifactType;
-import com.intellij.packaging.elements.*;
+import com.intellij.packaging.elements.AntCopyInstructionCreator;
+import com.intellij.packaging.elements.ArtifactAntGenerationContext;
+import com.intellij.packaging.elements.PackagingElement;
+import com.intellij.packaging.elements.PackagingElementResolvingContext;
import com.intellij.packaging.impl.elements.FacetBasedPackagingElement;
import com.intellij.packaging.impl.elements.ModuleOutputPackagingElement;
import com.intellij.packaging.impl.ui.DelegatedPackagingElementPresentation;
@@ -81,20 +83,6 @@
return Collections.emptyList();
}
- @Override
- public void computeIncrementalCompilerInstructions(@NotNull IncrementalCompilerInstructionCreator creator,
- @NotNull PackagingElementResolvingContext resolvingContext,
- @NotNull ArtifactIncrementalCompilerContext compilerContext,
- @NotNull ArtifactType artifactType) {
- final String apkPath = getApkPath();
- if (apkPath != null) {
- final VirtualFile apk = JarFileSystem.getInstance().findFileByPath(apkPath);
- if (apk != null && apk.isValid() && apk.isDirectory()) {
- creator.addDirectoryCopyInstructions(apk);
- }
- }
- }
-
@Nullable
public AndroidFacet getFacet() {
return myFacetPointer != null ? myFacetPointer.getFacet() : null;
diff --git a/android/src/org/jetbrains/android/dom/AndroidXmlExtension.java b/android/src/org/jetbrains/android/dom/AndroidXmlExtension.java
index b52184b..216259c 100644
--- a/android/src/org/jetbrains/android/dom/AndroidXmlExtension.java
+++ b/android/src/org/jetbrains/android/dom/AndroidXmlExtension.java
@@ -19,7 +19,6 @@
import com.intellij.lang.ASTNode;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
-import com.intellij.openapi.roots.impl.DirectoryIndex;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiFile;
@@ -49,10 +48,6 @@
public boolean isAvailable(final PsiFile file) {
if (file instanceof XmlFile) {
Project project = file.getProject();
- if (!project.isDefault() && !DirectoryIndex.getInstance(project).isInitialized()) {
- return false;
- }
-
if (AndroidFacet.getInstance(file) == null) {
return false;
}
diff --git a/android/src/org/jetbrains/android/dom/animation/AndroidAnimationUtils.java b/android/src/org/jetbrains/android/dom/animation/AndroidAnimationUtils.java
index c430e56..d5275d3 100644
--- a/android/src/org/jetbrains/android/dom/animation/AndroidAnimationUtils.java
+++ b/android/src/org/jetbrains/android/dom/animation/AndroidAnimationUtils.java
@@ -42,7 +42,8 @@
private AndroidAnimationUtils() {
}
- private static final String[] TAG_NAMES = {"set", "alpha", "scale", "translate", "rotate", "layoutAnimation", "gridLayoutAnimation"};
+ private static final String[] TAG_NAMES = {"set", "alpha", "scale", "translate",
+ "rotate", "layoutAnimation","gridLayoutAnimation", "animation-list"};
public static String getStyleableNameByTagName(@NotNull String tagName) {
if (tagName.equals("set")) {
diff --git a/android/src/org/jetbrains/android/dom/converters/FlagConverter.java b/android/src/org/jetbrains/android/dom/converters/FlagConverter.java
index c5338c7..389c38e 100644
--- a/android/src/org/jetbrains/android/dom/converters/FlagConverter.java
+++ b/android/src/org/jetbrains/android/dom/converters/FlagConverter.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2010 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,16 +15,12 @@
*/
package org.jetbrains.android.dom.converters;
-import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
-import com.intellij.psi.PsiReference;
import com.intellij.util.ArrayUtil;
import com.intellij.util.xml.ConvertContext;
-import com.intellij.util.xml.GenericAttributeValue;
import com.intellij.util.xml.GenericDomValue;
import com.intellij.util.xml.ResolvingConverter;
import com.intellij.util.xml.converters.DelimitedListConverter;
-import com.intellij.xml.util.XmlTagUtil;
import org.jetbrains.android.util.AndroidBundle;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -77,25 +73,6 @@
return ArrayUtil.toStringArray(variants);
}
- @NotNull
- @Override
- protected PsiReference createPsiReference(PsiElement element,
- int start,
- int end,
- ConvertContext context,
- GenericDomValue<List<String>> value,
- boolean delimitersOnly) {
- return new MyPsiReference(element, getTextRange(value, start, end), context, value, delimitersOnly);
- }
-
- protected static TextRange getTextRange(GenericDomValue value, int start, int end) {
- if (value instanceof GenericAttributeValue) {
- return new TextRange(start, end);
- }
- TextRange tagRange = XmlTagUtil.getTrimmedValueRange(value.getXmlTag());
- return new TextRange(tagRange.getStartOffset() + start - 1, tagRange.getStartOffset() + end - 1);
- }
-
@Override
protected PsiElement resolveReference(@Nullable final String s, final ConvertContext context) {
return s == null ? null : context.getReferenceXmlElement();
diff --git a/android/src/org/jetbrains/android/dom/drawable/AnimationListDomFileDescription.java b/android/src/org/jetbrains/android/dom/drawable/AnimationListDomFileDescription.java
index 17c0578..23e351f 100644
--- a/android/src/org/jetbrains/android/dom/drawable/AnimationListDomFileDescription.java
+++ b/android/src/org/jetbrains/android/dom/drawable/AnimationListDomFileDescription.java
@@ -16,7 +16,7 @@
@NonNls static final String ANIMATION_LIST_TAG = "animation-list";
public AnimationListDomFileDescription() {
- super(AnimationList.class, ANIMATION_LIST_TAG, ResourceType.DRAWABLE.getName());
+ super(AnimationList.class, ANIMATION_LIST_TAG, ResourceType.DRAWABLE.getName(), ResourceType.ANIM.getName());
}
@Override
diff --git a/android/src/org/jetbrains/android/exportSignedPackage/ApkStep.java b/android/src/org/jetbrains/android/exportSignedPackage/ApkStep.java
index 4254308..4477e1e 100644
--- a/android/src/org/jetbrains/android/exportSignedPackage/ApkStep.java
+++ b/android/src/org/jetbrains/android/exportSignedPackage/ApkStep.java
@@ -29,7 +29,6 @@
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.ArrayUtil;
import org.jetbrains.android.compiler.AndroidCompileUtil;
-import org.jetbrains.android.compiler.AndroidProguardCompiler;
import org.jetbrains.android.compiler.artifact.ProGuardConfigFilesPanel;
import org.jetbrains.android.facet.AndroidFacet;
import org.jetbrains.android.facet.AndroidFacetConfiguration;
@@ -253,7 +252,7 @@
throw new CommitStepException("Cannot find file " + path);
}
}
- compileScope.putUserData(AndroidProguardCompiler.PROGUARD_CFG_PATHS_KEY, proguardPathsStr);
+ compileScope.putUserData(AndroidCompileUtil.PROGUARD_CFG_PATHS_KEY, proguardPathsStr);
}
myWizard.setCompileScope(compileScope);
myWizard.setApkPath(apkPath);
diff --git a/android/src/org/jetbrains/android/facet/AndroidFacet.java b/android/src/org/jetbrains/android/facet/AndroidFacet.java
index d12e964..5b5bfc2 100644
--- a/android/src/org/jetbrains/android/facet/AndroidFacet.java
+++ b/android/src/org/jetbrains/android/facet/AndroidFacet.java
@@ -31,6 +31,7 @@
import com.android.tools.idea.model.AndroidModuleInfo;
import com.android.tools.idea.rendering.*;
import com.android.tools.idea.run.LaunchCompatibility;
+import com.android.tools.idea.templates.TemplateManager;
import com.android.tools.idea.sdk.DefaultSdks;
import com.android.tools.idea.startup.AndroidStudioSpecificInitializer;
import com.android.utils.ILogger;
@@ -46,6 +47,7 @@
import com.intellij.facet.FacetManager;
import com.intellij.facet.FacetTypeId;
import com.intellij.facet.FacetTypeRegistry;
+import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
@@ -79,7 +81,6 @@
import com.intellij.util.containers.HashSet;
import com.intellij.util.xml.ConvertContext;
import com.intellij.util.xml.DomElement;
-import org.jetbrains.android.compiler.AndroidAptCompiler;
import org.jetbrains.android.compiler.AndroidAutogeneratorMode;
import org.jetbrains.android.compiler.AndroidCompileUtil;
import org.jetbrains.android.dom.manifest.Manifest;
@@ -110,6 +111,7 @@
private static final Object APP_RESOURCES_LOCK = new Object();
private static final Object PROJECT_RESOURCES_LOCK = new Object();
private static final Object MODULE_RESOURCES_LOCK = new Object();
+ private static boolean ourDynamicTemplateMenuCreated;
private AvdManager myAvdManager = null;
private AndroidSdkData mySdkData;
@@ -605,6 +607,20 @@
}
}
+ public static void createDynamicTemplateMenu() {
+ if (ourDynamicTemplateMenuCreated) {
+ return;
+ }
+ ourDynamicTemplateMenuCreated = true;
+ DefaultActionGroup newGroup = (DefaultActionGroup)ActionManager.getInstance().getAction("NewGroup");
+ newGroup.addSeparator();
+ final ActionGroup menu = TemplateManager.getInstance().getTemplateCreationMenu(null);
+
+ if (menu != null) {
+ newGroup.add(menu, new Constraints(Anchor.AFTER, "NewFromTemplate"));
+ }
+ }
+
@Override
public void initFacet() {
StartupManager.getInstance(getModule().getProject()).runWhenProjectIsInitialized(new Runnable() {
@@ -626,7 +642,7 @@
return;
}
- if (AndroidAptCompiler.isToCompileModule(module, getConfiguration())) {
+ if (true) {
AndroidCompileUtil.generate(module, AndroidAutogeneratorMode.AAPT);
}
AndroidCompileUtil.generate(module, AndroidAutogeneratorMode.AIDL);
@@ -665,6 +681,7 @@
});
}
});
+ createDynamicTemplateMenu();
}
private void addResourceFolderToSdkRootsIfNecessary() {
diff --git a/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.java b/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.java
index a2fa362..a0fb212 100644
--- a/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.java
+++ b/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.java
@@ -44,7 +44,6 @@
import com.intellij.util.Function;
import com.intellij.util.PathUtil;
import com.intellij.util.ui.UIUtil;
-import org.jetbrains.android.compiler.AndroidAptCompiler;
import org.jetbrains.android.compiler.AndroidAutogeneratorMode;
import org.jetbrains.android.compiler.AndroidCompileUtil;
import org.jetbrains.android.compiler.artifact.ProGuardConfigFilesPanel;
@@ -153,9 +152,7 @@
myNativeLibsFolder.getButton().addActionListener(new MyFolderFieldListener(myNativeLibsFolder,
AndroidRootUtil.getLibsDir(facet), false, null));
- myCustomAptSourceDirField.getButton().addActionListener(new MyFolderFieldListener(myCustomAptSourceDirField,
- AndroidAptCompiler.getCustomResourceDirForApt(facet),
- false, null));
+ myCustomAptSourceDirField.getButton().addActionListener(new MyFolderFieldListener(myCustomAptSourceDirField, getCustomResourceDirForApt(facet), false, null));
myRunProguardCheckBox.addActionListener(new ActionListener() {
@Override
@@ -266,6 +263,11 @@
myProguardLogsDirectoryField.getButton().addActionListener(new MyFolderFieldListener(myProguardLogsDirectoryField, null, false, null));
}
+ @Nullable
+ public static VirtualFile getCustomResourceDirForApt(@NotNull AndroidFacet facet) {
+ return AndroidRootUtil.getFileByRelativeModulePath(facet.getModule(), facet.getProperties().CUSTOM_APK_RESOURCE_FOLDER, false);
+ }
+
private void updateLibAndAppSpecificFields() {
boolean lib = myIsLibraryProjectCheckbox.isSelected();
myAssetsFolderField.setEnabled(!lib);
@@ -583,8 +585,6 @@
myConfiguration.getState().PROGUARD_LOGS_FOLDER_RELATIVE_PATH =
absProguardLogsPath.length() > 0 ? '/' + getAndCheckRelativePath(absProguardLogsPath, false) : "";
- runApt = runApt && AndroidAptCompiler.isToCompileModule(myContext.getModule(), myConfiguration);
-
if (runApt || runIdl) {
final Module module = myContext.getModule();
diff --git a/android/src/org/jetbrains/android/facet/AndroidResourceFilesListener.java b/android/src/org/jetbrains/android/facet/AndroidResourceFilesListener.java
index 5ce021b..0cb4dfa 100644
--- a/android/src/org/jetbrains/android/facet/AndroidResourceFilesListener.java
+++ b/android/src/org/jetbrains/android/facet/AndroidResourceFilesListener.java
@@ -37,7 +37,6 @@
import com.intellij.util.containers.MultiMap;
import com.intellij.util.ui.update.MergingUpdateQueue;
import com.intellij.util.ui.update.Update;
-import org.jetbrains.android.compiler.AndroidAptCompiler;
import org.jetbrains.android.compiler.AndroidAutogeneratorMode;
import org.jetbrains.android.compiler.AndroidCompileUtil;
import org.jetbrains.android.dom.manifest.Manifest;
@@ -215,18 +214,16 @@
final List<AndroidAutogeneratorMode> modes = new ArrayList<AndroidAutogeneratorMode>();
if (Comparing.equal(manifestFile, file)) {
- if (AndroidAptCompiler.isToCompileModule(module, facet.getConfiguration())) {
- final Manifest manifest = facet.getManifest();
- final String aPackage = manifest != null ? manifest.getPackage().getValue() : null;
- final String cachedPackage = facet.getUserData(CACHED_PACKAGE_KEY);
+ final Manifest manifest = facet.getManifest();
+ final String aPackage = manifest != null ? manifest.getPackage().getValue() : null;
+ final String cachedPackage = facet.getUserData(CACHED_PACKAGE_KEY);
- if (cachedPackage != null && !cachedPackage.equals(aPackage)) {
- String aptGenDirPath = AndroidRootUtil.getAptGenSourceRootPath(facet);
- AndroidCompileUtil.removeDuplicatingClasses(module, cachedPackage, AndroidUtils.R_CLASS_NAME, null, aptGenDirPath);
- }
- facet.putUserData(CACHED_PACKAGE_KEY, aPackage);
- modes.add(AndroidAutogeneratorMode.AAPT);
+ if (cachedPackage != null && !cachedPackage.equals(aPackage)) {
+ String aptGenDirPath = AndroidRootUtil.getAptGenSourceRootPath(facet);
+ AndroidCompileUtil.removeDuplicatingClasses(module, cachedPackage, AndroidUtils.R_CLASS_NAME, null, aptGenDirPath);
}
+ facet.putUserData(CACHED_PACKAGE_KEY, aPackage);
+ modes.add(AndroidAutogeneratorMode.AAPT);
modes.add(AndroidAutogeneratorMode.BUILDCONFIG);
}
else if (file.getFileType() == AndroidIdlFileType.ourFileType) {
diff --git a/android/src/org/jetbrains/android/facet/AndroidRootUtil.java b/android/src/org/jetbrains/android/facet/AndroidRootUtil.java
index fa14cd2..3672001 100644
--- a/android/src/org/jetbrains/android/facet/AndroidRootUtil.java
+++ b/android/src/org/jetbrains/android/facet/AndroidRootUtil.java
@@ -472,7 +472,7 @@
final Properties properties = new Properties();
try {
properties.load(new FileInputStream(new File(vFile.getPath())));
- return new Pair<Properties, VirtualFile>(properties, vFile);
+ return Pair.create(properties, vFile);
}
catch (IOException e) {
LOG.info(e);
diff --git a/android/src/org/jetbrains/android/facet/IdeaSourceProvider.java b/android/src/org/jetbrains/android/facet/IdeaSourceProvider.java
index 665b11d..a245549 100644
--- a/android/src/org/jetbrains/android/facet/IdeaSourceProvider.java
+++ b/android/src/org/jetbrains/android/facet/IdeaSourceProvider.java
@@ -565,13 +565,13 @@
if (facet.isGradleProject()) {
for (IdeaSourceProvider provider : getCurrentSourceProviders(facet)) {
- if (provider.getManifestFile() == candidate) {
+ if (candidate.equals(provider.getManifestFile())) {
return true;
}
}
return false;
} else {
- return candidate == facet.getMainIdeaSourceSet().getManifestFile();
+ return candidate.equals(facet.getMainIdeaSourceSet().getManifestFile());
}
}
diff --git a/android/src/org/jetbrains/android/formatter/AndroidXmlPredefinedCodeStyle.java b/android/src/org/jetbrains/android/formatter/AndroidXmlPredefinedCodeStyle.java
index 2984bc0..c198af8 100644
--- a/android/src/org/jetbrains/android/formatter/AndroidXmlPredefinedCodeStyle.java
+++ b/android/src/org/jetbrains/android/formatter/AndroidXmlPredefinedCodeStyle.java
@@ -6,9 +6,11 @@
import com.intellij.psi.codeStyle.CodeStyleSettings;
import com.intellij.psi.codeStyle.CommonCodeStyleSettings;
import com.intellij.psi.codeStyle.PredefinedCodeStyle;
+import com.intellij.psi.codeStyle.arrangement.group.ArrangementGroupingRule;
import com.intellij.psi.codeStyle.arrangement.match.StdArrangementMatchRule;
-import com.intellij.psi.codeStyle.arrangement.std.StdRulePriorityAwareSettings;
+import com.intellij.psi.codeStyle.arrangement.std.StdArrangementSettings;
import com.intellij.psi.formatter.xml.XmlCodeStyleSettings;
+import com.intellij.util.containers.ContainerUtil;
import java.util.ArrayList;
import java.util.List;
@@ -61,7 +63,8 @@
rules.add(attrArrangementRule(".*", ".*", BY_NAME));
// TODO: Should sort name:"color",namespace:"" to the end (primarily for color state lists)
final CommonCodeStyleSettings xmlCommonSettings = settings.getCommonSettings(XMLLanguage.INSTANCE);
- xmlCommonSettings.setArrangementSettings(new StdRulePriorityAwareSettings(rules));
+ xmlCommonSettings.setArrangementSettings(
+ StdArrangementSettings.createByMatchRules(ContainerUtil.<ArrangementGroupingRule>emptyList(), rules));
xmlCommonSettings.FORCE_REARRANGE_MODE = CommonCodeStyleSettings.REARRANGE_ALWAYS;
}
}
diff --git a/android/src/org/jetbrains/android/inspections/lint/AndroidLintUtil.java b/android/src/org/jetbrains/android/inspections/lint/AndroidLintUtil.java
index 6c56a70..9e065bb 100644
--- a/android/src/org/jetbrains/android/inspections/lint/AndroidLintUtil.java
+++ b/android/src/org/jetbrains/android/inspections/lint/AndroidLintUtil.java
@@ -47,7 +47,7 @@
final AndroidLintInspectionBase inspection = (AndroidLintInspectionBase)profile.getUnwrappedTool(inspectionShortName, context);
if (inspection == null) return null;
final HighlightDisplayLevel errorLevel = profile.getErrorLevel(key, context);
- return new Pair<AndroidLintInspectionBase, HighlightDisplayLevel>(inspection,
- errorLevel != null ? errorLevel : HighlightDisplayLevel.WARNING);
+ return Pair.create(inspection,
+ errorLevel != null ? errorLevel : HighlightDisplayLevel.WARNING);
}
}
diff --git a/android/src/org/jetbrains/android/maven/AndroidFacetImporterBase.java b/android/src/org/jetbrains/android/maven/AndroidFacetImporterBase.java
index 3189150..b1ba3cd 100644
--- a/android/src/org/jetbrains/android/maven/AndroidFacetImporterBase.java
+++ b/android/src/org/jetbrains/android/maven/AndroidFacetImporterBase.java
@@ -280,7 +280,7 @@
Map<MavenProject, String> mavenProject2ModuleName,
List<MavenProjectsProcessorTask> tasks) {
final ModifiableRootModel rootModel = rootModelAdapter.getRootModel();
- removeExtApklibDependencies(rootModel, modelsProvider);
+ removeUselessDependencies(rootModel, modelsProvider, mavenProject);
for (MavenArtifact depArtifact : mavenProject.getDependencies()) {
if (mavenTree.findProject(depArtifact) != null) {
@@ -457,8 +457,8 @@
return null;
}
- private static void removeExtApklibDependencies(ModifiableRootModel modifiableRootModel,
- MavenModifiableModelsProvider modelsProvider) {
+ private static void removeUselessDependencies(ModifiableRootModel modifiableRootModel,
+ MavenModifiableModelsProvider modelsProvider, MavenProject mavenProject) {
for (OrderEntry entry : modifiableRootModel.getOrderEntries()) {
if (entry instanceof ModuleOrderEntry) {
final Module depModule = ((ModuleOrderEntry)entry).getModule();
@@ -466,13 +466,37 @@
modifiableRootModel.removeOrderEntry(entry);
}
}
- else if (entry instanceof LibraryOrderEntry &&
- containsDependencyOnApklibFile((LibraryOrderEntry)entry, modelsProvider)) {
- modifiableRootModel.removeOrderEntry(entry);
+ else if (entry instanceof LibraryOrderEntry) {
+ final LibraryOrderEntry libOrderEntry = (LibraryOrderEntry)entry;
+
+ if (containsDependencyOnApklibFile(libOrderEntry, modelsProvider) ||
+ pointsIntoUnpackedLibsDir(libOrderEntry, modelsProvider, mavenProject)) {
+ modifiableRootModel.removeOrderEntry(entry);
+ }
}
}
}
+ private static boolean pointsIntoUnpackedLibsDir(@NotNull LibraryOrderEntry entry,
+ @NotNull MavenModifiableModelsProvider provider,
+ @NotNull MavenProject mavenProject) {
+ final Library library = entry.getLibrary();
+
+ if (library == null) {
+ return false;
+ }
+ final Library.ModifiableModel libraryModel = provider.getLibraryModel(library);
+ final String[] urls = libraryModel.getUrls(OrderRootType.CLASSES);
+ final String unpackedLibsDir = FileUtil.toCanonicalPath(mavenProject.getBuildDirectory()) + "/unpacked-libs";
+
+ for (String url : urls) {
+ if (VfsUtilCore.urlToPath(url).startsWith(unpackedLibsDir)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
private static boolean containsDependencyOnApklibFile(@NotNull LibraryOrderEntry libraryOrderEntry,
@NotNull MavenModifiableModelsProvider modelsProvider) {
final Library library = libraryOrderEntry.getLibrary();
diff --git a/android/src/org/jetbrains/android/maven/AndroidMavenProviderImpl.java b/android/src/org/jetbrains/android/maven/AndroidMavenProviderImpl.java
index 8040eac..bf2ea60 100644
--- a/android/src/org/jetbrains/android/maven/AndroidMavenProviderImpl.java
+++ b/android/src/org/jetbrains/android/maven/AndroidMavenProviderImpl.java
@@ -28,7 +28,6 @@
import org.jetbrains.android.facet.AndroidRootUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import org.jetbrains.idea.maven.compiler.MavenResourceCompiler;
import org.jetbrains.idea.maven.model.MavenArtifact;
import org.jetbrains.idea.maven.model.MavenResource;
import org.jetbrains.idea.maven.project.MavenProject;
@@ -38,6 +37,7 @@
import java.io.File;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.regex.Pattern;
@@ -87,8 +87,8 @@
VirtualFile resDir = LocalFileSystem.getInstance().findFileByPath(resource.getDirectory());
if (resDir == null) continue;
- List<Pattern> includes = MavenResourceCompiler.collectPatterns(resource.getIncludes(), "**/*");
- List<Pattern> excludes = MavenResourceCompiler.collectPatterns(resource.getExcludes(), null);
+ List<Pattern> includes = collectPatterns(resource.getIncludes(), "**/*");
+ List<Pattern> excludes = collectPatterns(resource.getExcludes(), null);
final String resourceTargetPath = resource.getTargetPath();
if (resourceTargetPath != null) {
String targetPath = FileUtil.toSystemIndependentName(resourceTargetPath);
@@ -102,6 +102,18 @@
return false;
}
+ private static List<Pattern> collectPatterns(@Nullable List<String> values, @Nullable String defaultValue) {
+ List<Pattern> result = new ArrayList<Pattern>();
+ if (values == null || values.isEmpty()) {
+ if (defaultValue == null) return Collections.emptyList();
+ return MavenUtil.collectPattern(defaultValue, result);
+ }
+ for (String each : values) {
+ MavenUtil.collectPattern(each, result);
+ }
+ return result;
+ }
+
static boolean processResources(Project project,
VirtualFile sourceRoot,
VirtualFile file,
diff --git a/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java b/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java
index bf6d3b6..b514dc3 100644
--- a/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java
+++ b/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java
@@ -733,7 +733,7 @@
@Override
public ModuleWizardStep modifySettingsStep(@NotNull final SettingsStep settingsStep) {
if (myProjectType == null) {
- return super.modifySettingsStep(settingsStep);
+ return super.modifyProjectTypeStep(settingsStep);
}
switch (myProjectType) {
@@ -745,7 +745,7 @@
return new AndroidTestModifiedSettingsStep(this, settingsStep);
default:
LOG.error("Unknown project type " + myProjectType);
- return super.modifySettingsStep(settingsStep);
+ return super.modifyProjectTypeStep(settingsStep);
}
}
diff --git a/android/src/org/jetbrains/android/projectView/ResourceQualifierSwitcher.java b/android/src/org/jetbrains/android/projectView/ResourceQualifierSwitcher.java
index ae59e0d..6c34fa6 100644
--- a/android/src/org/jetbrains/android/projectView/ResourceQualifierSwitcher.java
+++ b/android/src/org/jetbrains/android/projectView/ResourceQualifierSwitcher.java
@@ -19,6 +19,7 @@
import com.intellij.ui.EditorNotifications;
import com.intellij.util.containers.BidirectionalMap;
import org.jetbrains.android.facet.AndroidFacet;
+import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
@@ -95,7 +96,7 @@
private final VirtualFile myFile;
private final BidirectionalMap<String, VirtualFile> myQualifiers;
- public ResourceQualifierSwitcherPanel(final Project project, final VirtualFile file, BidirectionalMap<String, VirtualFile> qualifiers) {
+ public ResourceQualifierSwitcherPanel(final Project project, @NotNull final VirtualFile file, BidirectionalMap<String, VirtualFile> qualifiers) {
super(new BorderLayout());
myProject = project;
myFile = file;
@@ -126,7 +127,7 @@
private void switchToFile(String qualifier) {
VirtualFile newFile = myQualifiers.get(qualifier);
- if (newFile != myFile) {
+ if (!myFile.equals(newFile)) {
FileEditorManager.getInstance(myProject).openFile(newFile, true);
}
}
diff --git a/android/src/org/jetbrains/android/resourceManagers/ResourceManager.java b/android/src/org/jetbrains/android/resourceManagers/ResourceManager.java
index 4893283..378846a 100644
--- a/android/src/org/jetbrains/android/resourceManagers/ResourceManager.java
+++ b/android/src/org/jetbrains/android/resourceManagers/ResourceManager.java
@@ -179,7 +179,7 @@
if ((files == null || files.contains(file)) && file.isValid()) {
final T element = AndroidUtils.loadDomElement(myProject, file, elementType);
if (element != null) {
- result.add(new Pair<T, VirtualFile>(element, file));
+ result.add(Pair.create(element, file));
}
}
}
diff --git a/android/src/org/jetbrains/android/run/AndroidRunConfiguration.java b/android/src/org/jetbrains/android/run/AndroidRunConfiguration.java
index c70fc61..d33d899 100755
--- a/android/src/org/jetbrains/android/run/AndroidRunConfiguration.java
+++ b/android/src/org/jetbrains/android/run/AndroidRunConfiguration.java
@@ -81,7 +81,7 @@
@Override
protected Pair<Boolean, String> supportsRunningLibraryProjects(@NotNull AndroidFacet facet) {
- return new Pair<Boolean, String>(Boolean.FALSE, AndroidBundle.message("android.cannot.run.library.project.error"));
+ return Pair.create(Boolean.FALSE, AndroidBundle.message("android.cannot.run.library.project.error"));
}
@Override
diff --git a/android/src/org/jetbrains/android/run/testing/AndroidTestRunConfiguration.java b/android/src/org/jetbrains/android/run/testing/AndroidTestRunConfiguration.java
index fb28d0a..a6f6d57 100644
--- a/android/src/org/jetbrains/android/run/testing/AndroidTestRunConfiguration.java
+++ b/android/src/org/jetbrains/android/run/testing/AndroidTestRunConfiguration.java
@@ -88,12 +88,12 @@
protected Pair<Boolean, String> supportsRunningLibraryProjects(@NotNull AndroidFacet facet) {
if (!facet.isGradleProject()) {
// Non Gradle projects always require an application
- return new Pair<Boolean, String>(Boolean.FALSE, AndroidBundle.message("android.cannot.run.library.project.error"));
+ return Pair.create(Boolean.FALSE, AndroidBundle.message("android.cannot.run.library.project.error"));
}
final IdeaAndroidProject project = facet.getIdeaAndroidProject();
if (project == null) {
- return new Pair<Boolean, String>(Boolean.FALSE, AndroidBundle.message("android.cannot.run.library.project.error"));
+ return Pair.create(Boolean.FALSE, AndroidBundle.message("android.cannot.run.library.project.error"));
}
// Gradle only supports testing against a single build type (which could be anything, but is "debug" build type by default)
diff --git a/android/testData/dom/anim/root1.xml b/android/testData/dom/anim/root1.xml
new file mode 100644
index 0000000..0a2bd26
--- /dev/null
+++ b/android/testData/dom/anim/root1.xml
@@ -0,0 +1 @@
+<animation-li<caret>
\ No newline at end of file
diff --git a/android/testData/dom/anim/root1_after.xml b/android/testData/dom/anim/root1_after.xml
new file mode 100644
index 0000000..a89c054
--- /dev/null
+++ b/android/testData/dom/anim/root1_after.xml
@@ -0,0 +1 @@
+<animation-list
\ No newline at end of file
diff --git a/android/testData/dom/anim/tn1.xml b/android/testData/dom/anim/tn1.xml
new file mode 100644
index 0000000..3deca21
--- /dev/null
+++ b/android/testData/dom/anim/tn1.xml
@@ -0,0 +1,3 @@
+<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <it<caret>
+</animation-list>
\ No newline at end of file
diff --git a/android/testData/dom/anim/tn1_after.xml b/android/testData/dom/anim/tn1_after.xml
new file mode 100644
index 0000000..8f4ce41
--- /dev/null
+++ b/android/testData/dom/anim/tn1_after.xml
@@ -0,0 +1,3 @@
+<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+</animation-list>
\ No newline at end of file
diff --git a/android/testSrc/com/android/tools/idea/actions/AndroidImportProjectActionTest.java b/android/testSrc/com/android/tools/idea/actions/AndroidImportProjectActionTest.java
index db5c803..b8c2ca2 100644
--- a/android/testSrc/com/android/tools/idea/actions/AndroidImportProjectActionTest.java
+++ b/android/testSrc/com/android/tools/idea/actions/AndroidImportProjectActionTest.java
@@ -42,28 +42,28 @@
}
public void testFindImportTargetWithDirectoryAndWithoutGradleOrEclipseFiles() {
- assertSame(myProjectRootDir, ProjectImportUtil.findImportTarget(myProjectRootDir));
+ assertEquals(myProjectRootDir, ProjectImportUtil.findImportTarget(myProjectRootDir));
}
public void testFindImportTargetWithDirectoryAndGradleBuildFile() throws IOException {
VirtualFile file = createChildFile(SdkConstants.FN_BUILD_GRADLE);
- assertSame(file, ProjectImportUtil.findImportTarget(myProjectRootDir));
+ assertEquals(file, ProjectImportUtil.findImportTarget(myProjectRootDir));
}
public void testFindImportTargetWithDirectoryAndGradleSettingsFile() throws IOException {
VirtualFile file = createChildFile(SdkConstants.FN_SETTINGS_GRADLE);
- assertSame(file, ProjectImportUtil.findImportTarget(myProjectRootDir));
+ assertEquals(file, ProjectImportUtil.findImportTarget(myProjectRootDir));
}
public void testFindImportTargetWithDirectoryAndEclipseFiles() throws IOException {
createChildFile(GradleImport.ECLIPSE_DOT_CLASSPATH);
VirtualFile file = createChildFile(GradleImport.ECLIPSE_DOT_PROJECT);
- assertSame(file, ProjectImportUtil.findImportTarget(myProjectRootDir));
+ assertEquals(file, ProjectImportUtil.findImportTarget(myProjectRootDir));
}
public void testFindImportTargetWithEclipseProjectFile() throws IOException {
VirtualFile file = createChildFile(GradleImport.ECLIPSE_DOT_PROJECT);
- assertSame(file, ProjectImportUtil.findImportTarget(file));
+ assertEquals(file, ProjectImportUtil.findImportTarget(file));
}
@NotNull
diff --git a/android/testSrc/com/android/tools/idea/gradle/customizer/android/ContentRootModuleCustomizerTest.java b/android/testSrc/com/android/tools/idea/gradle/customizer/android/ContentRootModuleCustomizerTest.java
index 0c1f817..5323fd4 100644
--- a/android/testSrc/com/android/tools/idea/gradle/customizer/android/ContentRootModuleCustomizerTest.java
+++ b/android/testSrc/com/android/tools/idea/gradle/customizer/android/ContentRootModuleCustomizerTest.java
@@ -28,6 +28,7 @@
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.SourceFolder;
import com.intellij.openapi.util.io.FileUtil;
+import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.testFramework.IdeaTestCase;
import com.intellij.util.containers.ContainerUtil;
@@ -94,9 +95,12 @@
SourceFolder[] sourceFolders = contentEntry.getSourceFolders();
List<String> sourcePaths = Lists.newArrayListWithExpectedSize(sourceFolders.length);
+
for (SourceFolder folder : sourceFolders) {
if (!folder.isTestSource()) {
VirtualFile file = folder.getFile();
+ final String path = VfsUtilCore.urlToPath(folder.getUrl());
+ System.out.println("path: " + path + "; " + new File(path).exists());
assertNotNull(file);
sourcePaths.add(file.getPath());
}
diff --git a/android/testSrc/com/android/tools/idea/rendering/IncludeReferenceTest.java b/android/testSrc/com/android/tools/idea/rendering/IncludeReferenceTest.java
index 66a8aec..dc03c9a 100644
--- a/android/testSrc/com/android/tools/idea/rendering/IncludeReferenceTest.java
+++ b/android/testSrc/com/android/tools/idea/rendering/IncludeReferenceTest.java
@@ -18,10 +18,8 @@
import com.android.ide.common.resources.ResourceResolver;
import com.android.tools.idea.configurations.Configuration;
import com.android.tools.idea.configurations.ConfigurationManager;
-import com.android.tools.idea.configurations.ResourceResolverCache;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.xml.XmlFile;
import org.jetbrains.android.AndroidTestCase;
@@ -40,11 +38,11 @@
assertEquals("designtime.xml", reference.getFromDisplayName());
assertEquals("designtime", reference.getFromResourceName());
assertEquals("@layout/designtime", reference.getFromResourceUrl());
- assertSame(file1, reference.getFromFile());
- assertSame(file2, reference.getToFile());
- assertSame(file1, LocalFileSystem.getInstance().findFileByIoFile(reference.getFromPath()));
+ assertEquals(file1, reference.getFromFile());
+ assertEquals(file2, reference.getToFile());
+ assertEquals(file1, LocalFileSystem.getInstance().findFileByIoFile(reference.getFromPath()));
//noinspection ConstantConditions
- assertSame(file2, LocalFileSystem.getInstance().findFileByIoFile(reference.getToPath()));
+ assertEquals(file2, LocalFileSystem.getInstance().findFileByIoFile(reference.getToPath()));
assertSame(myModule, reference.getModule());
reference = IncludeReference.create(myModule, file3, file2);
@@ -72,11 +70,11 @@
assertEquals("includer", reference.getFromResourceName());
assertEquals("@layout/includer", reference.getFromResourceUrl());
- assertSame(reference.getFromFile(), includer);
- assertSame(reference.getToFile(), included);
+ assertEquals(reference.getFromFile(), includer);
+ assertEquals(reference.getToFile(), included);
IncludeReference.setIncludingLayout(getProject(), psiFile, null);
- assertSame(IncludeReference.NONE, IncludeReference.get(myModule, psiFile, resourceResolver));
+ assertEquals(IncludeReference.NONE, IncludeReference.get(myModule, psiFile, resourceResolver));
VirtualFile other = myFixture.copyFileToProject("xmlpull/designtime.xml", "res/layout-land/designtime.xml");
assertNotNull(other);
diff --git a/android/testSrc/com/android/tools/idea/rendering/ModuleResourceRepositoryTest.java b/android/testSrc/com/android/tools/idea/rendering/ModuleResourceRepositoryTest.java
index 13dbab0..e8f9ebc 100644
--- a/android/testSrc/com/android/tools/idea/rendering/ModuleResourceRepositoryTest.java
+++ b/android/testSrc/com/android/tools/idea/rendering/ModuleResourceRepositoryTest.java
@@ -332,7 +332,7 @@
assertNotNull(psiFile);
VirtualFile parent = psiFile.getVirtualFile();
assertNotNull(parent);
- assertSame(dir, parent.getParent().getParent());
+ assertEquals(dir, parent.getParent().getParent());
}
static void assertStringIs(LocalResourceRepository repository, String key, String expected) {
diff --git a/android/testSrc/org/jetbrains/android/AndroidFacetImporterTest.java b/android/testSrc/org/jetbrains/android/AndroidFacetImporterTest.java
index 1c5c72c..50bdf8c 100644
--- a/android/testSrc/org/jetbrains/android/AndroidFacetImporterTest.java
+++ b/android/testSrc/org/jetbrains/android/AndroidFacetImporterTest.java
@@ -904,6 +904,8 @@
assertEquals(new HashSet<String>(Arrays.asList(
"target/generated-sources/combined-resources",
"target/generated-sources/combined-assets",
+ "target/test-classes",
+ "target/classes",
"target/generated-sources/extracted-dependencies")
), new HashSet<String>(Arrays.asList(excludedRootUrls)));
@@ -915,10 +917,11 @@
importProject();
sourceRoots = toRelativePaths(rootManager.getSourceRootUrls());
- assertEquals(0, sourceRoots.length);
+ assertEquals(2, sourceRoots.length);
excludedRootUrls = toRelativePaths(rootManager.getExcludeRootUrls());
assertEquals(new HashSet<String>(Arrays.asList(
+ "target/test-classes", "target/classes",
"target/generated-sources/combined-resources",
"target/generated-sources/combined-assets",
"target/generated-sources/extracted-dependencies",
diff --git a/android/testSrc/org/jetbrains/android/AndroidSdkTypeTest.java b/android/testSrc/org/jetbrains/android/AndroidSdkTypeTest.java
index a0910f1..b9c86db 100644
--- a/android/testSrc/org/jetbrains/android/AndroidSdkTypeTest.java
+++ b/android/testSrc/org/jetbrains/android/AndroidSdkTypeTest.java
@@ -44,6 +44,7 @@
fail("Exception should be thrown");
}
catch (Exception e) {
+ e.printStackTrace();
assertEquals(AndroidSdkType.getInstance().getUnsatisfiedDependencyMessage(), e.getMessage());
}
}
diff --git a/android/testSrc/org/jetbrains/android/dom/AndroidAnimationDomTest.java b/android/testSrc/org/jetbrains/android/dom/AndroidAnimationDomTest.java
index 8c65de8..00e63da 100644
--- a/android/testSrc/org/jetbrains/android/dom/AndroidAnimationDomTest.java
+++ b/android/testSrc/org/jetbrains/android/dom/AndroidAnimationDomTest.java
@@ -45,6 +45,10 @@
toTestCompletion("root.xml", "root_after.xml");
}
+ public void testRootCompletion1() throws Throwable {
+ toTestCompletion("root1.xml", "root1_after.xml");
+ }
+
public void testHighlighting() throws Throwable {
doTestHighlighting("hl.xml");
}
@@ -52,4 +56,8 @@
public void testChildren() throws Throwable {
toTestCompletion("tn.xml", "tn_after.xml");
}
+
+ public void testChildren1() throws Throwable {
+ toTestCompletion("tn1.xml", "tn1_after.xml");
+ }
}