public Tree visitClass()

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;
  }