aboutsummaryrefslogtreecommitdiffstats
path: root/lint
diff options
context:
space:
mode:
authorTor Norbye <tnorbye@google.com>2012-10-16 12:49:43 -0700
committerTor Norbye <tnorbye@google.com>2012-10-16 12:51:38 -0700
commitd8428eef9b0888561f45aee3c87abd139085174d (patch)
tree671d57d49cca8d510c097bed93e43ac398c1c5ef /lint
parent8868d79309786b1fe233151d9415453d0c10b2d5 (diff)
downloadsdk-d8428eef9b0888561f45aee3c87abd139085174d.zip
sdk-d8428eef9b0888561f45aee3c87abd139085174d.tar.gz
sdk-d8428eef9b0888561f45aee3c87abd139085174d.tar.bz2
Add lint support for checking frameworks/base/core
This changeset adds basic support for running lint against the AOSP frameworks/base/core codebase. It also makes the resource folder provided by the lint client. Change-Id: I7e38b0925cb032f776c54f975b924b91d6ab7a24
Diffstat (limited to 'lint')
-rw-r--r--lint/libs/lint_api/src/com/android/tools/lint/client/api/LintClient.java18
-rw-r--r--lint/libs/lint_api/src/com/android/tools/lint/client/api/LintDriver.java10
-rw-r--r--lint/libs/lint_api/src/com/android/tools/lint/detector/api/LintUtils.java3
-rw-r--r--lint/libs/lint_api/src/com/android/tools/lint/detector/api/Project.java67
-rw-r--r--lint/libs/lint_checks/src/com/android/tools/lint/checks/IconDetector.java12
-rw-r--r--lint/libs/lint_checks/src/com/android/tools/lint/checks/UnusedResourceDetector.java8
6 files changed, 107 insertions, 11 deletions
diff --git a/lint/libs/lint_api/src/com/android/tools/lint/client/api/LintClient.java b/lint/libs/lint_api/src/com/android/tools/lint/client/api/LintClient.java
index 2e21c06..2a68ddf 100644
--- a/lint/libs/lint_api/src/com/android/tools/lint/client/api/LintClient.java
+++ b/lint/libs/lint_api/src/com/android/tools/lint/client/api/LintClient.java
@@ -20,6 +20,7 @@ import static com.android.SdkConstants.CLASS_FOLDER;
import static com.android.SdkConstants.DOT_JAR;
import static com.android.SdkConstants.GEN_FOLDER;
import static com.android.SdkConstants.LIBS_FOLDER;
+import static com.android.SdkConstants.RES_FOLDER;
import static com.android.SdkConstants.SRC_FOLDER;
import com.android.SdkConstants;
@@ -233,6 +234,23 @@ public abstract class LintClient {
}
/**
+ * Returns the resource folder.
+ *
+ * @param project the project to look up the resource folder for
+ * @return a file pointing to the resource folder, or null if the project
+ * does not contain any resources
+ */
+ @Nullable
+ public File getResourceFolder(@NonNull Project project) {
+ File res = new File(project.getDir(), RES_FOLDER);
+ if (res.exists()) {
+ return res;
+ }
+
+ return null;
+ }
+
+ /**
* Returns the {@link SdkInfo} to use for the given project.
*
* @param project the project to look up an {@link SdkInfo} for
diff --git a/lint/libs/lint_api/src/com/android/tools/lint/client/api/LintDriver.java b/lint/libs/lint_api/src/com/android/tools/lint/client/api/LintDriver.java
index aad1ad7..415c305 100644
--- a/lint/libs/lint_api/src/com/android/tools/lint/client/api/LintDriver.java
+++ b/lint/libs/lint_api/src/com/android/tools/lint/client/api/LintDriver.java
@@ -819,8 +819,8 @@ public class LintDriver {
if (files != null) {
checkIndividualResources(project, main, xmlDetectors, files);
} else {
- File res = new File(project.getDir(), RES_FOLDER);
- if (res.exists() && xmlDetectors.size() > 0) {
+ File res = project.getResourceFolder();
+ if (res != null && xmlDetectors.size() > 0) {
checkResFolder(project, main, res, xmlDetectors);
}
}
@@ -1664,6 +1664,12 @@ public class LintDriver {
@Override
@Nullable
+ public File getResourceFolder(@NonNull Project project) {
+ return mDelegate.getResourceFolder(project);
+ }
+
+ @Override
+ @Nullable
public IDomParser getDomParser() {
return mDelegate.getDomParser();
}
diff --git a/lint/libs/lint_api/src/com/android/tools/lint/detector/api/LintUtils.java b/lint/libs/lint_api/src/com/android/tools/lint/detector/api/LintUtils.java
index 60c9e97..c0d5a85 100644
--- a/lint/libs/lint_api/src/com/android/tools/lint/detector/api/LintUtils.java
+++ b/lint/libs/lint_api/src/com/android/tools/lint/detector/api/LintUtils.java
@@ -668,6 +668,9 @@ public class LintUtils {
return false;
}
}
+ } else if (Project.isAospFrameworksProject(dir)) {
+ // Hardcoded AOSP support for the frameworks project
+ return true;
}
return hasManifest;
diff --git a/lint/libs/lint_api/src/com/android/tools/lint/detector/api/Project.java b/lint/libs/lint_api/src/com/android/tools/lint/detector/api/Project.java
index b584020..eb41807 100644
--- a/lint/libs/lint_api/src/com/android/tools/lint/detector/api/Project.java
+++ b/lint/libs/lint_api/src/com/android/tools/lint/detector/api/Project.java
@@ -25,9 +25,11 @@ import static com.android.SdkConstants.ATTR_PACKAGE;
import static com.android.SdkConstants.ATTR_TARGET_SDK_VERSION;
import static com.android.SdkConstants.PROGUARD_CONFIG;
import static com.android.SdkConstants.PROJECT_PROPERTIES;
+import static com.android.SdkConstants.RES_FOLDER;
import static com.android.SdkConstants.TAG_USES_SDK;
import static com.android.SdkConstants.VALUE_TRUE;
+import com.android.SdkConstants;
import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
import com.android.tools.lint.client.api.Configuration;
@@ -247,6 +249,9 @@ public class Project {
@NonNull
public List<File> getJavaSourceFolders() {
if (mJavaSourceFolders == null) {
+ if (isAospFrameworksProject(mDir)) {
+ return Collections.singletonList(new File(mDir, "java")); //$NON-NLS-1$
+ }
if (isAospBuildEnvironment()) {
String top = getAospTop();
if (mDir.getAbsolutePath().startsWith(top)) {
@@ -268,6 +273,21 @@ public class Project {
@NonNull
public List<File> getJavaClassFolders() {
if (mJavaClassFolders == null) {
+ if (isAospFrameworksProject(mDir)) {
+ File top = mDir.getParentFile().getParentFile().getParentFile();
+ if (top != null) {
+ File out = new File(top, "out");
+ if (out.exists()) {
+ String relative =
+ "target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar";
+ File jar = new File(out, relative.replace('/', File.separatorChar));
+ if (jar.exists()) {
+ mJavaClassFolders = Collections.singletonList(jar);
+ return mJavaClassFolders;
+ }
+ }
+ }
+ }
if (isAospBuildEnvironment()) {
String top = getAospTop();
if (mDir.getAbsolutePath().startsWith(top)) {
@@ -304,6 +324,28 @@ public class Project {
}
/**
+ * Returns the resource folder.
+ *
+ * @return a file pointing to the resource folder, or null if the project
+ * does not contain any resources
+ */
+ @Nullable
+ public File getResourceFolder() {
+ File folder = mClient.getResourceFolder(this);
+
+ if (folder != null && isAospFrameworksProject(mDir)) {
+ // No manifest file for this project: just init the manifest values here
+ mMinSdk = mTargetSdk = SdkConstants.HIGHEST_KNOWN_API;
+ folder = new File(folder, RES_FOLDER);
+ if (!folder.exists()) {
+ folder = null;
+ }
+ }
+
+ return folder;
+ }
+
+ /**
* Returns the relative path of a given file relative to the user specified
* directory (which is often the project directory but sometimes a higher up
* directory when a directory tree is being scanned
@@ -643,6 +685,31 @@ public class Project {
return sAospBuild.booleanValue();
}
+ /**
+ * Is this the frameworks AOSP project? Needs some hardcoded support since
+ * it doesn't have a manifest file, etc.
+ *
+ * @param dir the project directory to check
+ * @return true if this looks like the frameworks/base/core project
+ */
+ static boolean isAospFrameworksProject(@NonNull File dir) {
+ if (!dir.getPath().endsWith("core")) { //$NON-NLS-1$
+ return false;
+ }
+
+ File parent = dir.getParentFile();
+ if (parent == null || !parent.getName().equals("base")) { //$NON-NLS-1$
+ return false;
+ }
+
+ parent = parent.getParentFile();
+ if (parent == null || !parent.getName().equals("frameworks")) { //$NON-NLS-1$
+ return false;
+ }
+
+ return true;
+ }
+
/** Get the root AOSP dir, if any */
private static String getAospTop() {
return System.getenv("ANDROID_BUILD_TOP"); //$NON-NLS-1$
diff --git a/lint/libs/lint_checks/src/com/android/tools/lint/checks/IconDetector.java b/lint/libs/lint_checks/src/com/android/tools/lint/checks/IconDetector.java
index 2f416b5..9d9cf14 100644
--- a/lint/libs/lint_checks/src/com/android/tools/lint/checks/IconDetector.java
+++ b/lint/libs/lint_checks/src/com/android/tools/lint/checks/IconDetector.java
@@ -32,7 +32,6 @@ import static com.android.SdkConstants.DRAWABLE_MDPI;
import static com.android.SdkConstants.DRAWABLE_PREFIX;
import static com.android.SdkConstants.DRAWABLE_XHDPI;
import static com.android.SdkConstants.MENU_TYPE;
-import static com.android.SdkConstants.RES_FOLDER;
import static com.android.SdkConstants.R_CLASS;
import static com.android.SdkConstants.R_DRAWABLE_PREFIX;
import static com.android.SdkConstants.TAG_ACTIVITY;
@@ -53,6 +52,7 @@ import com.android.tools.lint.detector.api.Issue;
import com.android.tools.lint.detector.api.JavaContext;
import com.android.tools.lint.detector.api.LintUtils;
import com.android.tools.lint.detector.api.Location;
+import com.android.tools.lint.detector.api.Project;
import com.android.tools.lint.detector.api.ResourceXmlDetector;
import com.android.tools.lint.detector.api.Scope;
import com.android.tools.lint.detector.api.Severity;
@@ -335,17 +335,17 @@ public class IconDetector extends ResourceXmlDetector implements Detector.JavaSc
@Override
public void afterCheckLibraryProject(@NonNull Context context) {
- checkResourceFolder(context, context.getProject().getDir());
+ checkResourceFolder(context, context.getProject());
}
@Override
public void afterCheckProject(@NonNull Context context) {
- checkResourceFolder(context, context.getProject().getDir());
+ checkResourceFolder(context, context.getProject());
}
- private void checkResourceFolder(Context context, File dir) {
- File res = new File(dir, RES_FOLDER);
- if (res.isDirectory()) {
+ private void checkResourceFolder(Context context, @NonNull Project project) {
+ File res = project.getResourceFolder();
+ if (res != null) {
File[] folders = res.listFiles();
if (folders != null) {
boolean checkFolders = context.isEnabled(ICON_DENSITIES)
diff --git a/lint/libs/lint_checks/src/com/android/tools/lint/checks/UnusedResourceDetector.java b/lint/libs/lint_checks/src/com/android/tools/lint/checks/UnusedResourceDetector.java
index 1b4163e..5a3f174 100644
--- a/lint/libs/lint_checks/src/com/android/tools/lint/checks/UnusedResourceDetector.java
+++ b/lint/libs/lint_checks/src/com/android/tools/lint/checks/UnusedResourceDetector.java
@@ -26,7 +26,6 @@ import static com.android.SdkConstants.DOT_XML;
import static com.android.SdkConstants.RESOURCE_CLR_STYLEABLE;
import static com.android.SdkConstants.RESOURCE_CLZ_ARRAY;
import static com.android.SdkConstants.RESOURCE_CLZ_ID;
-import static com.android.SdkConstants.RES_FOLDER;
import static com.android.SdkConstants.R_ATTR_PREFIX;
import static com.android.SdkConstants.R_CLASS;
import static com.android.SdkConstants.R_ID_PREFIX;
@@ -261,8 +260,11 @@ public class UnusedResourceDetector extends ResourceXmlDetector implements Detec
if (type != null && LintUtils.isFileBasedResourceType(type)) {
String name = resource.substring(secondDot + 1);
- File res = new File(context.getProject().getDir(), RES_FOLDER);
- File[] folders = res.listFiles();
+ File[] folders = null;
+ File res = context.getProject().getResourceFolder();
+ if (res != null) {
+ folders = res.listFiles();
+ }
if (folders != null) {
// Process folders in alphabetical order such that we process
// based folders first: we want the locations in base folder