From 97987f3ac584c6d67a6c1df340c06bb723eef0a8 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 15 Feb 2013 12:57:34 +0400 Subject: [PATCH] performance --- .../tree/java/PsiReferenceExpressionImpl.java | 15 +++++++++--- .../psi/impl/source/tree/FileElement.java | 3 ++- .../psi/impl/source/tree/SharedImplUtil.java | 24 +++++++++++++------ 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java index fdb1609faef4..0466bab6163c 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java @@ -18,6 +18,7 @@ package com.intellij.psi.impl.source.tree.java; import com.intellij.lang.ASTNode; import com.intellij.openapi.diagnostic.LogUtil; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.TextRange; import com.intellij.pom.java.LanguageLevel; @@ -313,16 +314,24 @@ public class PsiReferenceExpressionImpl extends PsiReferenceExpressionBase imple @Override @NotNull public JavaResolveResult[] multiResolve(boolean incompleteCode) { - final PsiManagerEx manager = getManager(); + FileElement fileElement = SharedImplUtil.findFileElement(this); + if (fileElement == null) { + LOG.error("fileElement == null!"); + return JavaResolveResult.EMPTY_ARRAY; + } + final PsiManagerEx manager = fileElement.getManager(); if (manager == null) { LOG.error("getManager() == null!"); return JavaResolveResult.EMPTY_ARRAY; } - if (!isValid()) { + PsiFile file = SharedImplUtil.getContainingFile(fileElement); + boolean valid = file != null && file.isValid(); + if (!valid) { LOG.error("invalid!"); return JavaResolveResult.EMPTY_ARRAY; } - ResolveResult[] results = ResolveCache.getInstance(getProject()).resolveWithCaching(this, OurGenericsResolver.INSTANCE, true, incompleteCode); + Project project = manager.getProject(); + ResolveResult[] results = ResolveCache.getInstance(project).resolveWithCaching(this, OurGenericsResolver.INSTANCE, true, incompleteCode); return results.length == 0 ? JavaResolveResult.EMPTY_ARRAY : (JavaResolveResult[])results; } diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/tree/FileElement.java b/platform/core-impl/src/com/intellij/psi/impl/source/tree/FileElement.java index 26cb9d5161a8..ed2ba0d60336 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/tree/FileElement.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/tree/FileElement.java @@ -45,7 +45,8 @@ public class FileElement extends LazyParseableElement implements FileASTNode { @Override public PsiManagerEx getManager() { - if (getTreeParent() != null) return getTreeParent().getManager(); + CompositeElement treeParent = getTreeParent(); + if (treeParent != null) return treeParent.getManager(); return (PsiManagerEx)getPsi().getManager(); //TODO: cache? } diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/tree/SharedImplUtil.java b/platform/core-impl/src/com/intellij/psi/impl/source/tree/SharedImplUtil.java index 23c18d31d7c7..a814fe725b6a 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/tree/SharedImplUtil.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/tree/SharedImplUtil.java @@ -58,12 +58,9 @@ public class SharedImplUtil { } public static PsiFile getContainingFile(ASTNode thisElement) { - TreeElement element; - for (element = (TreeElement)thisElement; element.getTreeParent() != null; element = element.getTreeParent()) { - } - - PsiElement psiElement = element.getPsi(); - if (!(psiElement instanceof PsiFile)) return null; + TreeElement element = findFileElement(thisElement); + PsiElement psiElement = element == null ? null : element.getPsi(); + if (psiElement == null) return null; return psiElement.getContainingFile(); } @@ -74,10 +71,23 @@ public class SharedImplUtil { } public static boolean isWritable(ASTNode thisElement) { - PsiFile file = SourceTreeToPsiMap.treeElementToPsi(thisElement).getContainingFile(); + PsiFile file = getContainingFile(thisElement); return file == null || file.isWritable(); } + public static FileElement findFileElement(@NotNull ASTNode element) { + ASTNode parent = element.getTreeParent(); + while (parent != null) { + element = parent; + parent = parent.getTreeParent(); + } + + if (element instanceof FileElement) { + return (FileElement)element; + } + return null; + } + public static CharTable findCharTableByTree(ASTNode tree) { while (tree != null) { final CharTable userData = tree.getUserData(CharTable.CHAR_TABLE_KEY);