IDEA-83572 add annotations.jar to classpath automatically [rev=elena.shaverdova]

This commit is contained in:
Eugene Kudelevsky
2012-04-03 20:54:09 +04:00
parent 618850449e
commit b053dbdfdf
5 changed files with 79 additions and 9 deletions
@@ -158,6 +158,8 @@ class AndroidJpsUtil {
public static Set<String> getExternalLibraries(@NotNull ProjectPaths paths, @NotNull Module module) {
final Set<String> result = new HashSet<String>();
fillClasspath(paths, module, null, result, new HashSet<String>(), false);
// todo: add annotations.jar to result
return result;
}
@@ -46,13 +46,17 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.SdkAdditionalData;
import com.intellij.openapi.projectRoots.SdkModificator;
import com.intellij.openapi.roots.*;
import com.intellij.openapi.roots.ModuleRootEvent;
import com.intellij.openapi.roots.ModuleRootListener;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.startup.StartupManager;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.JarFileSystem;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
@@ -520,20 +524,35 @@ public class AndroidFacet extends Facet<AndroidFacetConfiguration> {
if (resFolderPath == null) {
return;
}
final List<VirtualFile> filesToAdd = new ArrayList<VirtualFile>();
final VirtualFile resFolder = LocalFileSystem.getInstance().findFileByPath(resFolderPath);
if (resFolder == null) {
return;
if (resFolder != null) {
filesToAdd.add(resFolder);
}
for (VirtualFile root : sdk.getRootProvider().getFiles(OrderRootType.CLASSES)) {
if (root == resFolder) {
return;
if (platform.needToAddAnnotationsJarToClasspath()) {
final String sdkHomePath = FileUtil.toSystemIndependentName(platform.getSdkData().getLocation());
final VirtualFile annotationsJar = JarFileSystem.getInstance().findFileByPath(
sdkHomePath + AndroidSdkUtils.ANNOTATIONS_JAR_RELATIVE_PATH + JarFileSystem.JAR_SEPARATOR);
filesToAdd.add(annotationsJar);
}
addFilesToSdkIfNecessary(sdk, filesToAdd);
}
private static void addFilesToSdkIfNecessary(@NotNull Sdk sdk, @NotNull Collection<VirtualFile> files) {
final List<VirtualFile> newFiles = new ArrayList<VirtualFile>(files);
newFiles.removeAll(Arrays.asList(sdk.getRootProvider().getFiles(OrderRootType.CLASSES)));
if (newFiles.size() > 0) {
final SdkModificator modificator = sdk.getSdkModificator();
for (VirtualFile file : newFiles) {
modificator.addRoot(file, OrderRootType.CLASSES);
}
modificator.commitChanges();
}
final SdkModificator modificator = sdk.getSdkModificator();
modificator.addRoot(resFolder, OrderRootType.CLASSES);
modificator.commitChanges();
}
private static void updateDependenciesInPropertyFile(@NotNull final PropertiesFile projectProperties,
@@ -22,6 +22,7 @@ import com.intellij.lang.properties.psi.PropertiesFile;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.*;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.util.Computable;
@@ -32,6 +33,10 @@ import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.util.containers.OrderedSet;
import org.jetbrains.android.compiler.AndroidCompileUtil;
import org.jetbrains.android.sdk.AndroidPlatform;
import org.jetbrains.android.sdk.AndroidSdkAdditionalData;
import org.jetbrains.android.sdk.AndroidSdkType;
import org.jetbrains.android.sdk.AndroidSdkUtils;
import org.jetbrains.android.util.AndroidCommonUtils;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -284,9 +289,38 @@ public class AndroidRootUtil {
Set<VirtualFile> files = new HashSet<VirtualFile>();
OrderedSet<VirtualFile> libs = new OrderedSet<VirtualFile>();
fillExternalLibrariesAndModules(module, files, libs, new HashSet<Module>(), false);
addAnnotationsJar(module, libs);
return libs;
}
private static void addAnnotationsJar(Module module, OrderedSet<VirtualFile> libs) {
final Sdk sdk = ModuleRootManager.getInstance(module).getSdk();
if (sdk == null || !sdk.getSdkType().equals(AndroidSdkType.getInstance())) {
return;
}
final String sdkHomePath = sdk.getHomePath();
if (sdkHomePath == null) {
return;
}
final AndroidSdkAdditionalData data = (AndroidSdkAdditionalData)sdk.getSdkAdditionalData();
if (data == null) {
return;
}
final AndroidPlatform platform = data.getAndroidPlatform();
if (platform != null && platform.needToAddAnnotationsJarToClasspath()) {
final String annotationsJarPath = FileUtil.toSystemIndependentName(sdkHomePath) + AndroidSdkUtils.ANNOTATIONS_JAR_RELATIVE_PATH;
final VirtualFile annotationsJar = LocalFileSystem.getInstance().findFileByPath(annotationsJarPath);
if (annotationsJar != null) {
libs.add(annotationsJar);
}
}
}
@NotNull
public static Set<VirtualFile> getDependentModules(Module module,
VirtualFile moduleOutputDir) {
@@ -179,4 +179,8 @@ public class AndroidPlatform {
result = 31 * result + myTarget.hashCode();
return result;
}
public boolean needToAddAnnotationsJarToClasspath() {
return myTarget.getVersion().getApiLevel() <= 15;
}
}
@@ -73,6 +73,7 @@ public class AndroidSdkUtils {
public static final String DEFAULT_PLATFORM_NAME_PROPERTY = "AndroidPlatformName";
@NonNls public static final String ANDROID_HOME_ENV = "ANDROID_HOME";
@NonNls public static final String ANNOTATIONS_JAR_RELATIVE_PATH = "/tools/support/annotations.jar";
private AndroidSdkUtils() {
}
@@ -128,6 +129,16 @@ public class AndroidSdkUtils {
result.add(new OrderRoot(resFolder, OrderRootType.CLASSES));
}
}
if (sdkPath != null) {
// todo: check if we should do it for new android platforms (api_level >= 15)
final VirtualFile annotationsJar = JarFileSystem.getInstance()
.findFileByPath(FileUtil.toSystemIndependentName(sdkPath) + ANNOTATIONS_JAR_RELATIVE_PATH + JarFileSystem.JAR_SEPARATOR);
if (annotationsJar != null) {
result.add(new OrderRoot(annotationsJar, OrderRootType.CLASSES));
}
}
return result;
}