diff options
author | Tor Norbye <tnorbye@google.com> | 2021-01-07 18:22:33 -0800 |
---|---|---|
committer | Tor Norbye <tnorbye@google.com> | 2021-02-14 15:44:59 +0000 |
commit | 4fcc339679ccb7dc1e3a38d5954506630fcbb8db (patch) | |
tree | a2e920dfc7585d47adca7f2583b4e14bf1f15849 /lint/src | |
parent | 7b9a8df634ef2b8ca93e5d49f13be968dae579ec (diff) | |
download | idea-4fcc339679ccb7dc1e3a38d5954506630fcbb8db.tar.gz |
Track Lint Partial Analysis API changes
Bug: None
Test: Existing
Change-Id: I57e3b6296e2e396af1a44940b939a19c0a112c18
Diffstat (limited to 'lint/src')
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(); |