diff --git a/jps/jps-builders-6/src/org/jetbrains/jps/javac/ast/JavacReferenceCollectorListener.java b/jps/jps-builders-6/src/org/jetbrains/jps/javac/ast/JavacReferenceCollectorListener.java index 0e30f9c371b7..e32ad69b7f44 100644 --- a/jps/jps-builders-6/src/org/jetbrains/jps/javac/ast/JavacReferenceCollectorListener.java +++ b/jps/jps-builders-6/src/org/jetbrains/jps/javac/ast/JavacReferenceCollectorListener.java @@ -196,7 +196,7 @@ final class JavacReferenceCollectorListener implements TaskListener { // member import for (Element memberElement : myElementUtility.getAllMembers((TypeElement)ownerElement)) { if (memberElement.getSimpleName() == name) { - incrementOrAdd(elements, JavacRef.JavacElementRefBase.fromElement(memberElement, myNameTableCache)); + incrementOrAdd(elements, JavacRef.JavacElementRefBase.fromElement(memberElement, null, myNameTableCache)); } } } @@ -213,7 +213,7 @@ final class JavacReferenceCollectorListener implements TaskListener { for (Element element = baseImport; element != null && element.getKind() != ElementKind.PACKAGE; element = element.getEnclosingElement()) { - incrementOrAdd(collector, JavacRef.JavacElementRefBase.fromElement(element, myNameTableCache)); + incrementOrAdd(collector, JavacRef.JavacElementRefBase.fromElement(element, null, myNameTableCache)); } } @@ -221,6 +221,7 @@ final class JavacReferenceCollectorListener implements TaskListener { private final JavacFileData myFileData; private final JavacTreeHelper myTreeHelper; private int myRemainDeclarations; + public CompilationUnitTree myUnitTree; private ReferenceCollector(int remainDeclarations, String filePath, @@ -231,6 +232,7 @@ final class JavacReferenceCollectorListener implements TaskListener { myDivideImportRefs ? createReferenceHolder() : EMPTY_T_OBJ_INT_MAP, createDefinitionHolder()); myTreeHelper = new JavacTreeHelper(unitTree, myTreeUtility); + myUnitTree = unitTree; } void sinkReference(@Nullable JavacRef.JavacElementRefBase ref) { @@ -243,13 +245,18 @@ final class JavacReferenceCollectorListener implements TaskListener { @Nullable JavacRef.JavacElementRefBase asJavacRef(Element element) { - return JavacRef.JavacElementRefBase.fromElement(element, myNameTableCache); + return asJavacRef(element, null); + } + + @Nullable + JavacRef.JavacElementRefBase asJavacRef(Element element, Element qualifier) { + return JavacRef.JavacElementRefBase.fromElement(element, qualifier, myNameTableCache); } @Nullable JavacRef.JavacElementRefBase asJavacRef(TypeMirror typeMirror) { final Element element = getTypeUtility().asElement(typeMirror); - return element == null ? null : JavacRef.JavacElementRefBase.fromElement(element, myNameTableCache); + return element == null ? null : JavacRef.JavacElementRefBase.fromElement(element, null, myNameTableCache); } Element getReferencedElement(Tree tree) { @@ -267,6 +274,14 @@ final class JavacReferenceCollectorListener implements TaskListener { private int decrementRemainDeclarationsAndGet(Tree declarationToProcess) { return declarationToProcess == null ? myRemainDeclarations : --myRemainDeclarations; } + + public Elements getElementUtility() { + return myElementUtility; + } + + public Trees getTrees() { + return myTreeUtility; + } } private static TObjectIntHashMap createReferenceHolder() { diff --git a/jps/jps-builders-6/src/org/jetbrains/jps/javac/ast/JavacTreeRefScanner.java b/jps/jps-builders-6/src/org/jetbrains/jps/javac/ast/JavacTreeRefScanner.java index db00962cd1f9..c2f0c7ca830c 100644 --- a/jps/jps-builders-6/src/org/jetbrains/jps/javac/ast/JavacTreeRefScanner.java +++ b/jps/jps-builders-6/src/org/jetbrains/jps/javac/ast/JavacTreeRefScanner.java @@ -15,14 +15,18 @@ */ package org.jetbrains.jps.javac.ast; +import com.intellij.util.containers.Stack; import com.sun.source.tree.*; import com.sun.source.util.TreeScanner; import org.jetbrains.jps.javac.ast.api.JavacDef; import org.jetbrains.jps.javac.ast.api.JavacRef; import javax.lang.model.element.*; +import javax.lang.model.type.DeclaredType; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; +import javax.lang.model.util.Elements; +import javax.lang.model.util.Types; import java.util.EnumSet; import java.util.List; import java.util.Set; @@ -87,7 +91,13 @@ class JavacTreeRefScanner extends TreeScanner members = elements.getAllMembers(currentClass); + for (Element member : members) { + if (member == element /*cheaper then the next condition*/ || types.isSameType(member.asType(), element.asType())) { + actualQualifier = currentClass; + break; + } + } + if (actualQualifier != null) { + break; + } + currentClass = getEnclosingClass(currentClass); + } + + if (actualQualifier == null) { + throw new NullPointerException(); + } + collector.sinkReference(collector.asJavacRef(element, actualQualifier)); + scan(node.getTypeArguments(), collector); + scan(node.getArguments(), collector); + return null; + } + } + return super.visitMethodInvocation(node, collector); + } + + final Stack myCurrentEnclosingElement = new Stack(); @Override public Tree visitClass(ClassTree node, JavacReferenceCollectorListener.ReferenceCollector refCollector) { TypeElement element = (TypeElement)refCollector.getReferencedElement(node); if (element == null) return null; + myCurrentEnclosingElement.add(element); final TypeMirror superclass = element.getSuperclass(); final List interfaces = element.getInterfaces(); @@ -136,7 +183,9 @@ class JavacTreeRefScanner extends TreeScanner