in javac-ast-extension/src/org/jetbrains/jps/javac/ast/JavacTreeRefScanner.java [183:224]
public Tree visitClass(ClassTree node, JavacReferenceCollectorListener.ReferenceCollector refCollector) {
TypeElement element = (TypeElement)refCollector.getReferencedElement(node);
if (element == null) return null;
myCurrentEnclosingElement.push(element);
ModifiersTree modifiers = node.getModifiers();
long modifiersEndOffset = refCollector.getEndOffset(modifiers);
long startOffset = modifiersEndOffset == -1 ? refCollector.getStartOffset(node) : (modifiersEndOffset + 1);
myCurrentEnclosingElementOffset.push(startOffset);
try {
final TypeMirror superclass = element.getSuperclass();
final List<? extends TypeMirror> interfaces = element.getInterfaces();
final JavacRef[] supers;
if (superclass != refCollector.getTypeUtility().getNoType(TypeKind.NONE)) {
supers = new JavacRef[interfaces.size() + 1];
final JavacRef.JavacElementRefBase ref = refCollector.asJavacRef(getCurrentEnclosingTypeElement(), superclass);
if (ref == null) return null;
supers[interfaces.size()] = ref;
}
else {
supers = interfaces.isEmpty() ? JavacRef.EMPTY_ARRAY : new JavacRef[interfaces.size()];
}
int i = 0;
for (TypeMirror anInterface : interfaces) {
final JavacRef.JavacElementRefBase ref = refCollector.asJavacRef(getCurrentEnclosingTypeElement(), anInterface);
if (ref == null) return null;
supers[i++] = ref;
}
final JavacRef.JavacElementRefBase aClass = refCollector.asJavacRef(null, element);
if (aClass == null) return null;
refCollector.sinkReference(aClass);
refCollector.sinkDeclaration(new JavacDef.JavacClassDef(aClass, supers));
if (((JavacRef.JavacClass)aClass).isAnonymous()) {
scan(myCurrentAnonymousTree.peek().getArguments(), refCollector);
}
super.visitClass(node, refCollector);
} finally {
myCurrentEnclosingElement.pop();
myCurrentEnclosingElementOffset.pop();
}
return null;
}