1 /*
   2  * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package com.sun.tools.javadoc;
  27 
  28 import javax.tools.JavaFileObject;
  29 
  30 import com.sun.source.util.TreePath;
  31 import com.sun.tools.javac.code.Symbol.*;
  32 import com.sun.tools.javac.comp.Enter;
  33 import com.sun.tools.javac.tree.JCTree.*;
  34 import com.sun.tools.javac.util.Context;
  35 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
  36 import com.sun.tools.javac.util.List;
  37 
  38 import static com.sun.tools.javac.code.Kinds.Kind.*;
  39 
  40 /**
  41  *  Javadoc's own enter phase does a few things above and beyond that
  42  *  done by javac.
  43  *
  44  *  <p><b>This is NOT part of any supported API.
  45  *  If you write code that depends on this, you do so at your own risk.
  46  *  This code and its internal interfaces are subject to change or
  47  *  deletion without notice.</b>
  48  *
  49  *  @author Neal Gafter
  50  */
  51 public class JavadocEnter extends Enter {
  52     public static JavadocEnter instance(Context context) {
  53         Enter instance = context.get(enterKey);
  54         if (instance == null)
  55             instance = new JavadocEnter(context);
  56         return (JavadocEnter)instance;
  57     }
  58 
  59     public static void preRegister(Context context) {
  60         context.put(enterKey, new Context.Factory<Enter>() {
  61                public Enter make(Context c) {
  62                    return new JavadocEnter(c);
  63                }
  64         });
  65     }
  66 
  67     protected JavadocEnter(Context context) {
  68         super(context);
  69         messager = Messager.instance0(context);
  70         docenv = DocEnv.instance(context);
  71     }
  72 
  73     final Messager messager;
  74     final DocEnv docenv;
  75 
  76     @Override
  77     public void main(List<JCCompilationUnit> trees) {
  78         // count all Enter errors as warnings.
  79         int nerrors = messager.nerrors;
  80         super.main(trees);
  81         messager.nwarnings += (messager.nerrors - nerrors);
  82         messager.nerrors = nerrors;
  83     }
  84 
  85     @Override
  86     public void visitTopLevel(JCCompilationUnit tree) {
  87         super.visitTopLevel(tree);
  88         if (tree.sourcefile.isNameCompatible("package-info", JavaFileObject.Kind.SOURCE)) {
  89             JCPackageDecl pd = tree.getPackage();
  90             TreePath tp = pd == null ? docenv.getTreePath(tree) : docenv.getTreePath(tree, pd);
  91             docenv.makePackageDoc(tree.packge, tp);
  92         }
  93     }
  94 
  95     @Override
  96     public void visitClassDef(JCClassDecl tree) {
  97         super.visitClassDef(tree);
  98         if (tree.sym == null) return;
  99         if (tree.sym.kind == TYP || tree.sym.kind == ERR) {
 100             ClassSymbol c = tree.sym;
 101             docenv.makeClassDoc(c, docenv.getTreePath(env.toplevel, tree));
 102         }
 103     }
 104 
 105     /** Don't complain about a duplicate class. */
 106     @Override
 107     protected void duplicateClass(DiagnosticPosition pos, ClassSymbol c) {}
 108 
 109 }