summaryrefslogtreecommitdiff
path: root/lint/src
diff options
context:
space:
mode:
authorTor Norbye <tnorbye@google.com>2021-01-07 18:22:33 -0800
committerTor Norbye <tnorbye@google.com>2021-02-14 15:44:59 +0000
commit4fcc339679ccb7dc1e3a38d5954506630fcbb8db (patch)
treea2e920dfc7585d47adca7f2583b4e14bf1f15849 /lint/src
parent7b9a8df634ef2b8ca93e5d49f13be968dae579ec (diff)
downloadidea-4fcc339679ccb7dc1e3a38d5954506630fcbb8db.tar.gz
Track Lint Partial Analysis API changes
Bug: None Test: Existing Change-Id: I57e3b6296e2e396af1a44940b939a19c0a112c18
Diffstat (limited to 'lint/src')
-rw-r--r--lint/src/com/android/tools/idea/lint/common/DomPsiConverter.java27
-rw-r--r--lint/src/com/android/tools/idea/lint/common/DomPsiParser.java37
-rw-r--r--lint/src/com/android/tools/idea/lint/common/LintIdeClient.java60
3 files changed, 90 insertions, 34 deletions
diff --git a/lint/src/com/android/tools/idea/lint/common/DomPsiConverter.java b/lint/src/com/android/tools/idea/lint/common/DomPsiConverter.java
index efb9e67b06f..0bf6025eeec 100644
--- a/lint/src/com/android/tools/idea/lint/common/DomPsiConverter.java
+++ b/lint/src/com/android/tools/idea/lint/common/DomPsiConverter.java
@@ -25,6 +25,7 @@ import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
import com.intellij.psi.xml.XmlAttribute;
import com.intellij.psi.xml.XmlAttributeValue;
import com.intellij.psi.xml.XmlComment;
@@ -33,6 +34,7 @@ import com.intellij.psi.xml.XmlElement;
import com.intellij.psi.xml.XmlFile;
import com.intellij.psi.xml.XmlTag;
import com.intellij.psi.xml.XmlText;
+import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -88,7 +90,7 @@ public class DomPsiConverter {
return null;
}
- return convert(xmlDocument);
+ return convert(xmlDocument, xmlFile);
}
catch (ProcessCanceledException e) {
// Ignore: common occurrence, e.g. we're running lint as part of an editor background
@@ -110,12 +112,14 @@ public class DomPsiConverter {
/**
* Convert the given {@link XmlDocument} to a DOM tree
*
+ *
* @param document the document to be converted
+ * @param xmlFile the underlying PSI file
* @return a corresponding W3C DOM tree
*/
@NotNull
- private static Document convert(@NotNull XmlDocument document) {
- return new DomDocument(document);
+ private static Document convert(@NotNull XmlDocument document, @NotNull XmlFile xmlFile) {
+ return new DomDocument(document, xmlFile);
}
@Nullable
@@ -244,10 +248,14 @@ public class DomPsiConverter {
return textRange;
}
- @NotNull
+ @Nullable
public static XmlElement getPsiElement(@NotNull Node node) {
- DomNode domNode = (DomNode)node;
- return domNode.myElement;
+ if (node instanceof DomNode) {
+ DomNode domNode = (DomNode)node;
+ return domNode.myElement;
+ } else {
+ return null;
+ }
}
private static final DomNodeList EMPTY = new DomNodeList() {
@@ -713,11 +721,13 @@ public class DomPsiConverter {
private static class DomDocument extends DomNode implements Document {
@NotNull private final XmlDocument myPsiDocument;
+ private final XmlFile myFile;
@Nullable private DomElement myRoot;
- private DomDocument(@NotNull XmlDocument document) {
+ private DomDocument(@NotNull XmlDocument document, @NotNull XmlFile file) {
super(null, null, document);
myPsiDocument = document;
+ myFile = file;
}
// From org.w3c.dom.Node:
@@ -757,6 +767,9 @@ public class DomPsiConverter {
@Nullable
@Override
public Object getUserData(String s) {
+ if (s.equals(PsiFile.class.getName())) {
+ return myFile;
+ }
return null;
}
diff --git a/lint/src/com/android/tools/idea/lint/common/DomPsiParser.java b/lint/src/com/android/tools/idea/lint/common/DomPsiParser.java
index 0e22746a553..ad0ca3e49c6 100644
--- a/lint/src/com/android/tools/idea/lint/common/DomPsiParser.java
+++ b/lint/src/com/android/tools/idea/lint/common/DomPsiParser.java
@@ -15,6 +15,8 @@
*/
package com.android.tools.idea.lint.common;
+import static com.android.utils.PositionXmlParser.CONTENT_KEY;
+
import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
import com.android.tools.lint.client.api.LintClient;
@@ -28,11 +30,14 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.vfs.VfsUtil;
+import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.psi.xml.XmlElement;
import com.intellij.psi.xml.XmlFile;
import java.io.File;
+import kotlin.io.FilesKt;
+import kotlin.text.Charsets;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
@@ -228,11 +233,33 @@ class DomPsiParser extends XmlParser {
@Override
protected void initializeLineColumn() {
XmlElement element = DomPsiConverter.getPsiElement(myNode);
- ApplicationManager.getApplication().assertReadAccessAllowed();
- PsiFile file = element.getContainingFile();
- if (file != null && file.isValid()) {
- String contents = file.getText();
- initializeFromText(contents);
+ if (element != null) {
+ ApplicationManager.getApplication().assertReadAccessAllowed();
+ PsiFile file = element.getContainingFile();
+ if (file != null && file.isValid()) {
+ String contents = file.getText();
+ initializeFromText(contents);
+ }
+ } else {
+ // Not an IDE XML document; probably read from merged manifest
+ Document document = myNode.getOwnerDocument();
+ String text = (String)document.getUserData(CONTENT_KEY);
+ if (text != null) {
+ initializeFromText(text);
+ } else {
+ File file = (File)document.getUserData(File.class.getName());
+ if (file != null) {
+ String contents = FilesKt.readText(file, Charsets.UTF_8);
+ initializeFromText(contents);
+ }
+ else {
+ PsiFile psiFile = (PsiFile)document.getUserData(PsiFile.class.getName());
+ if (psiFile != null) {
+ String contents = psiFile.getText();
+ initializeFromText(contents);
+ }
+ }
+ }
}
}
}
diff --git a/lint/src/com/android/tools/idea/lint/common/LintIdeClient.java b/lint/src/com/android/tools/idea/lint/common/LintIdeClient.java
index 0f71238de3f..c9f7065f996 100644
--- a/lint/src/com/android/tools/idea/lint/common/LintIdeClient.java
+++ b/lint/src/com/android/tools/idea/lint/common/LintIdeClient.java
@@ -37,9 +37,12 @@ import com.android.tools.lint.client.api.LintRequest;
import com.android.tools.lint.client.api.ResourceRepositoryScope;
import com.android.tools.lint.client.api.UastParser;
import com.android.tools.lint.client.api.XmlParser;
+import com.android.tools.lint.detector.api.Constraint;
import com.android.tools.lint.detector.api.Context;
+import com.android.tools.lint.detector.api.Incident;
import com.android.tools.lint.detector.api.Issue;
import com.android.tools.lint.detector.api.LintFix;
+import com.android.tools.lint.detector.api.LintMap;
import com.android.tools.lint.detector.api.Location;
import com.android.tools.lint.detector.api.Position;
import com.android.tools.lint.detector.api.Severity;
@@ -297,36 +300,47 @@ public class LintIdeClient extends LintClient implements Disposable {
}
@Override
- public void report(@NonNull Context context,
- @NonNull Issue issue,
- @NonNull Severity severity,
- @NonNull Location location,
- @NonNull String message,
- @NonNull TextFormat format,
- @Nullable LintFix extraData) {
+ public void report(@NotNull Context context, @NotNull Incident incident, @NotNull Constraint constraint) {
+ // We don't support (or need!) partial analysis from the IDE
+ assert false;
+ }
+
+ @Override
+ public void report(@NotNull Context context, @NotNull Incident incident, @NotNull LintMap map) {
+ // We don't support (or need!) partial analysis from the IDE
+ assert false;
+ }
+
+ @Override
+ public void report(@NotNull Context context,
+ @NotNull Incident incident,
+ @NotNull TextFormat format) {
if (myLintResult instanceof LintEditorResult) {
- report((LintEditorResult)myLintResult, context, issue, severity, location, message, format, extraData);
+ report((LintEditorResult)myLintResult, context, incident, format);
}
else if (myLintResult instanceof LintBatchResult) {
- report((LintBatchResult)myLintResult, context, issue, severity, location, message, format, extraData);
+ report((LintBatchResult)myLintResult, context, incident, format);
}
else if (myLintResult instanceof LintIgnoredResult) {
// Ignore
}
else {
- assert false : message;
+ assert false : incident.getMessage();
}
}
public void report(
@NonNull LintEditorResult lintResult,
@NonNull Context context,
- @NonNull Issue issue,
- @NonNull Severity severity,
- @NonNull Location location,
- @NonNull String message,
- @NonNull TextFormat format,
- @Nullable LintFix quickfixData) {
+ @NonNull Incident incident,
+ @NonNull TextFormat format
+ ) {
+ Issue issue = incident.getIssue();
+ Severity severity = incident.getSeverity();
+ Location location = incident.getLocation();
+ String message = incident.getMessage();
+ LintFix quickfixData = incident.getFix();
+
File file = location.getFile();
VirtualFile vFile = LocalFileSystem.getInstance().findFileByIoFile(file);
@@ -352,12 +366,14 @@ public class LintIdeClient extends LintClient implements Disposable {
public void report(
@NonNull LintBatchResult state,
@NonNull Context context,
- @NonNull Issue issue,
- @NonNull Severity severity,
- @NonNull Location location,
- @NonNull String message,
- @NonNull TextFormat format,
- @Nullable LintFix quickfixData) {
+ @NonNull Incident incident,
+ @NonNull TextFormat format
+ ) {
+ Issue issue = incident.getIssue();
+ Severity severity = incident.getSeverity();
+ Location location = incident.getLocation();
+ String message = incident.getMessage();
+ LintFix quickfixData = incident.getFix();
AnalysisScope scope = state.getScope();
Map<Issue, Map<File, List<LintProblemData>>> myProblemMap = state.getProblemMap();