aboutsummaryrefslogtreecommitdiffstats
path: root/eclipse/plugins
diff options
context:
space:
mode:
authorTor Norbye <tnorbye@google.com>2012-11-30 13:48:47 -0800
committerTor Norbye <tnorbye@google.com>2012-11-30 17:47:09 -0800
commitdefb28521b99e2b42d6e60e2eda1259803514196 (patch)
tree1dea7b7c6f8f7539c60c99a556c124435a3f36dd /eclipse/plugins
parent6c7924f6fea737bf5c87c1a6b845d690b8c46099 (diff)
downloadsdk-defb28521b99e2b42d6e60e2eda1259803514196.zip
sdk-defb28521b99e2b42d6e60e2eda1259803514196.tar.gz
sdk-defb28521b99e2b42d6e60e2eda1259803514196.tar.bz2
Add tools:targetApi to control local minSdk (like @TargetApi)
Also add XML editor quickfix to set the attribute on an API violation. Change-Id: Ife95d73659656e98a6fb1a322354f5fcfcef1888
Diffstat (limited to 'eclipse/plugins')
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtUtils.java38
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/AddSuppressAnnotation.java3
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/AddSuppressAttribute.java82
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintFixGenerator.java14
4 files changed, 78 insertions, 59 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtUtils.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtUtils.java
index 6e051df..c98e94f 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtUtils.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtUtils.java
@@ -815,42 +815,6 @@ public class AdtUtils {
}
/**
- * Returns the applicable build code (for
- * {@code android.os.Build.VERSION_CODES}) for the corresponding API level,
- * or null if it's unknown.
- *
- * @param api the API level to look up a version code for
- * @return the corresponding build code field name, or null
- */
- @Nullable
- public static String getBuildCodes(int api) {
- // See http://developer.android.com/reference/android/os/Build.VERSION_CODES.html
- switch (api) {
- case 1: return "BASE"; //$NON-NLS-1$
- case 2: return "BASE_1_1"; //$NON-NLS-1$
- case 3: return "CUPCAKE"; //$NON-NLS-1$
- case 4: return "DONUT"; //$NON-NLS-1$
- case 5: return "ECLAIR"; //$NON-NLS-1$
- case 6: return "ECLAIR_0_1"; //$NON-NLS-1$
- case 7: return "ECLAIR_MR1"; //$NON-NLS-1$
- case 8: return "FROYO"; //$NON-NLS-1$
- case 9: return "GINGERBREAD"; //$NON-NLS-1$
- case 10: return "GINGERBREAD_MR1"; //$NON-NLS-1$
- case 11: return "HONEYCOMB"; //$NON-NLS-1$
- case 12: return "HONEYCOMB_MR1"; //$NON-NLS-1$
- case 13: return "HONEYCOMB_MR2"; //$NON-NLS-1$
- case 14: return "ICE_CREAM_SANDWICH"; //$NON-NLS-1$
- case 15: return "ICE_CREAM_SANDWICH_MR1"; //$NON-NLS-1$
- case 16: return "JELLY_BEAN"; //$NON-NLS-1$
- case 17: return "JELLY_BEAN_MR1"; //$NON-NLS-1$
- // If you add more versions here, also update #getAndroidName and
- // SdkConstants#HIGHEST_KNOWN_API
- }
-
- return null;
- }
-
- /**
* Returns a string label for the given target, of the form
* "API 16: Android 4.1 (Jelly Bean)".
*
@@ -994,7 +958,7 @@ public class AdtUtils {
case 15: return "API 15: Android 4.0.3 (IceCreamSandwich)";
case 16: return "API 16: Android 4.1 (Jelly Bean)";
case 17: return "API 17: Android 4.2 (Jelly Bean)";
- // If you add more versions here, also update #getBuildCodes and
+ // If you add more versions here, also update LintUtils#getBuildCodes and
// SdkConstants#HIGHEST_KNOWN_API
default: {
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/AddSuppressAnnotation.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/AddSuppressAnnotation.java
index 80dac65..59dbe82 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/AddSuppressAnnotation.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/AddSuppressAnnotation.java
@@ -31,6 +31,7 @@ import com.android.ide.eclipse.adt.internal.editors.IconFactory;
import com.android.tools.lint.checks.AnnotationDetector;
import com.android.tools.lint.checks.ApiDetector;
import com.android.tools.lint.detector.api.Issue;
+import com.android.tools.lint.detector.api.LintUtils;
import com.android.tools.lint.detector.api.Scope;
import org.eclipse.core.resources.IMarker;
@@ -407,7 +408,7 @@ class AddSuppressAnnotation implements IMarkerResolution2 {
// @TargetApi is only valid on methods and classes, not fields etc
&& (body instanceof MethodDeclaration
|| body instanceof TypeDeclaration)) {
- String apiString = AdtUtils.getBuildCodes(api);
+ String apiString = LintUtils.getBuildCode(api);
if (apiString == null) {
apiString = Integer.toString(api);
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/AddSuppressAttribute.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/AddSuppressAttribute.java
index 23943d5..fdb0383 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/AddSuppressAttribute.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/AddSuppressAttribute.java
@@ -17,6 +17,7 @@
package com.android.ide.eclipse.adt.internal.lint;
import static com.android.SdkConstants.ATTR_IGNORE;
+import static com.android.SdkConstants.ATTR_TARGET_API;
import static com.android.SdkConstants.DOT_XML;
import com.android.annotations.NonNull;
@@ -26,6 +27,9 @@ import com.android.ide.eclipse.adt.AdtUtils;
import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
import com.android.ide.eclipse.adt.internal.editors.IconFactory;
import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
+import com.android.tools.lint.checks.ApiDetector;
+import com.android.tools.lint.detector.api.LintUtils;
+import com.google.common.collect.Lists;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
@@ -38,6 +42,12 @@ import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
/**
* Fix for adding {@code tools:ignore="id"} attributes in XML files.
*/
@@ -47,14 +57,26 @@ class AddSuppressAttribute implements ICompletionProposal {
private final IMarker mMarker;
private final Element mElement;
private final String mDescription;
+ /**
+ * Should it create a {@code tools:targetApi} attribute instead of a
+ * {@code tools:ignore} attribute? If so pass a non null API level
+ */
+ private final String mTargetApi;
+
- private AddSuppressAttribute(AndroidXmlEditor editor, String id, IMarker marker,
- Element element, String description) {
+ private AddSuppressAttribute(
+ @NonNull AndroidXmlEditor editor,
+ @NonNull String id,
+ @NonNull IMarker marker,
+ @NonNull Element element,
+ @NonNull String description,
+ @Nullable String targetApi) {
mEditor = editor;
mId = id;
mMarker = marker;
mElement = element;
mDescription = description;
+ mTargetApi = targetApi;
}
@Override
@@ -84,7 +106,16 @@ class AddSuppressAttribute implements ICompletionProposal {
@Override
public void apply(IDocument document) {
- AdtUtils.setToolsAttribute(mEditor, mElement, "Suppress Lint Warning", ATTR_IGNORE, mId,
+ String attribute;
+ String value;
+ if (mTargetApi != null) {
+ attribute = ATTR_TARGET_API;
+ value = mTargetApi;
+ } else {
+ attribute = ATTR_IGNORE;
+ value = mId;
+ }
+ AdtUtils.setToolsAttribute(mEditor, mElement, mDescription, attribute, value,
true /*reveal*/, true /*append*/);
try {
@@ -92,7 +123,7 @@ class AddSuppressAttribute implements ICompletionProposal {
// (so the user doesn't have to re-run lint just to see it disappear)
mMarker.delete();
} catch (CoreException e) {
- AdtPlugin.log(e, "Could not add suppress annotation");
+ AdtPlugin.log(e, "Could not remove marker");
}
}
@@ -103,17 +134,17 @@ class AddSuppressAttribute implements ICompletionProposal {
* @param editor the associated editor containing the marker
* @param marker the marker to create fixes for
* @param id the issue id
- * @return a fix for this marker, or null if unable
+ * @return a list of fixes for this marker, possibly empty
*/
- @Nullable
- public static AddSuppressAttribute createFix(
+ @NonNull
+ public static List<AddSuppressAttribute> createFixes(
@NonNull AndroidXmlEditor editor,
@NonNull IMarker marker,
@NonNull String id) {
// This only applies to XML files:
String fileName = marker.getResource().getName();
if (!fileName.endsWith(DOT_XML)) {
- return null;
+ return Collections.emptyList();
}
int offset = marker.getAttribute(IMarker.CHAR_START, -1);
@@ -127,7 +158,7 @@ class AddSuppressAttribute implements ICompletionProposal {
node = DomUtilities.getNode(editor.getStructuredDocument(), offset);
}
if (node == null) {
- return null;
+ return Collections.emptyList();
}
Document document = node.getOwnerDocument();
while (node != null && node.getNodeType() != Node.ELEMENT_NODE) {
@@ -136,13 +167,40 @@ class AddSuppressAttribute implements ICompletionProposal {
if (node == null) {
node = document.getDocumentElement();
if (node == null) {
- return null;
+ return Collections.emptyList();
}
}
String desc = String.format("Add ignore '%1$s\' to element", id);
Element element = (Element) node;
- return new AddSuppressAttribute(editor, id, marker, element, desc);
+ List<AddSuppressAttribute> fixes = Lists.newArrayListWithExpectedSize(2);
+ fixes.add(new AddSuppressAttribute(editor, id, marker, element, desc, null));
+
+ int api = -1;
+ if (id.equals(ApiDetector.UNSUPPORTED.getId())) {
+ String message = marker.getAttribute(IMarker.MESSAGE, null);
+ if (message != null) {
+ Pattern pattern = Pattern.compile("\\s(\\d+)\\s"); //$NON-NLS-1$
+ Matcher matcher = pattern.matcher(message);
+ if (matcher.find()) {
+ api = Integer.parseInt(matcher.group(1));
+ String targetApi;
+ String buildCode = LintUtils.getBuildCode(api);
+ if (buildCode != null) {
+ targetApi = buildCode.toLowerCase(Locale.US);
+ fixes.add(new AddSuppressAttribute(editor, id, marker, element,
+ String.format("Add targetApi '%1$s\' to element", targetApi),
+ targetApi));
+ }
+ targetApi = Integer.toString(api);
+ fixes.add(new AddSuppressAttribute(editor, id, marker, element,
+ String.format("Add targetApi '%1$s\' to element", targetApi),
+ targetApi));
+ }
+ }
+ }
+
+ return fixes;
}
/**
@@ -170,7 +228,7 @@ class AddSuppressAttribute implements ICompletionProposal {
node = node.getOwnerDocument().getDocumentElement();
String desc = String.format("Add ignore '%1$s\' to element", id);
Element element = (Element) node;
- return new AddSuppressAttribute(editor, id, marker, element, desc);
+ return new AddSuppressAttribute(editor, id, marker, element, desc, null);
}
return null;
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintFixGenerator.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintFixGenerator.java
index 4c356b7..22fe23b 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintFixGenerator.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintFixGenerator.java
@@ -189,11 +189,7 @@ public class LintFixGenerator implements IMarkerResolutionGenerator2, IQuickAssi
String message = marker.getAttribute(IMarker.MESSAGE, null);
proposals.add(new MoreInfoProposal(id, message));
- ICompletionProposal fix = AddSuppressAttribute.createFix(editor, marker, id);
- if (fix != null) {
- proposals.add(fix);
- }
-
+ proposals.addAll(AddSuppressAttribute.createFixes(editor, marker, id));
proposals.add(new SuppressProposal(file, id, false));
proposals.add(new SuppressProposal(file.getProject(), id, true /* all */));
proposals.add(new SuppressProposal(file, id, true /* all */));
@@ -296,11 +292,11 @@ public class LintFixGenerator implements IMarkerResolutionGenerator2, IQuickAssi
assert isXml;
if (part instanceof AndroidXmlEditor) {
AndroidXmlEditor editor = (AndroidXmlEditor) part;
- AddSuppressAttribute fix = AddSuppressAttribute.createFix(editor,
+ List<AddSuppressAttribute> fixes = AddSuppressAttribute.createFixes(editor,
marker, id);
- if (fix != null) {
+ if (fixes.size() > 0) {
IStructuredDocument document = editor.getStructuredDocument();
- fix.apply(document);
+ fixes.get(0).apply(document);
}
}
}
@@ -511,7 +507,7 @@ public class LintFixGenerator implements IMarkerResolutionGenerator2, IQuickAssi
@Override
public String getDisplayString() {
- return "Explain Issue";
+ return String.format("Explain Issue (%1$s)", mId);
}
// ---- Implements MarkerResolution2 ----