Thu, 12 Oct 2017 19:44:07 +0800
merge
1 /*
2 * Copyright (c) 1997, 2010, 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 */
26 package com.sun.codemodel.internal;
28 import java.util.HashMap;
29 import java.util.Map;
31 /**
32 * JavaDoc comment.
33 *
34 * <p>
35 * A javadoc comment consists of multiple parts. There's the main part (that comes the first in
36 * in the comment section), then the parameter parts (@param), the return part (@return),
37 * and the throws parts (@throws).
38 *
39 * TODO: it would be nice if we have JComment class and we can derive this class from there.
40 */
41 public class JDocComment extends JCommentPart implements JGenerable {
43 private static final long serialVersionUID = 1L;
45 /** list of @param tags */
46 private final Map<String,JCommentPart> atParams = new HashMap<String,JCommentPart>();
48 /** list of xdoclets */
49 private final Map<String,Map<String,String>> atXdoclets = new HashMap<String,Map<String,String>>();
51 /** list of @throws tags */
52 private final Map<JClass,JCommentPart> atThrows = new HashMap<JClass,JCommentPart>();
54 /**
55 * The @return tag part.
56 */
57 private JCommentPart atReturn = null;
59 /** The @deprecated tag */
60 private JCommentPart atDeprecated = null;
62 private final JCodeModel owner;
65 public JDocComment(JCodeModel owner) {
66 this.owner = owner;
67 }
69 public JDocComment append(Object o) {
70 add(o);
71 return this;
72 }
74 /**
75 * Append a text to a @param tag to the javadoc
76 */
77 public JCommentPart addParam( String param ) {
78 JCommentPart p = atParams.get(param);
79 if(p==null)
80 atParams.put(param,p=new JCommentPart());
81 return p;
82 }
84 /**
85 * Append a text to an @param tag.
86 */
87 public JCommentPart addParam( JVar param ) {
88 return addParam( param.name() );
89 }
92 /**
93 * add an @throws tag to the javadoc
94 */
95 public JCommentPart addThrows( Class<? extends Throwable> exception ) {
96 return addThrows( owner.ref(exception) );
97 }
99 /**
100 * add an @throws tag to the javadoc
101 */
102 public JCommentPart addThrows( JClass exception ) {
103 JCommentPart p = atThrows.get(exception);
104 if(p==null)
105 atThrows.put(exception,p=new JCommentPart());
106 return p;
107 }
109 /**
110 * Appends a text to @return tag.
111 */
112 public JCommentPart addReturn() {
113 if(atReturn==null)
114 atReturn = new JCommentPart();
115 return atReturn;
116 }
118 /**
119 * add an @deprecated tag to the javadoc, with the associated message.
120 */
121 public JCommentPart addDeprecated() {
122 if(atDeprecated==null)
123 atDeprecated = new JCommentPart();
124 return atDeprecated;
125 }
127 /**
128 * add an xdoclet.
129 */
130 public Map<String,String> addXdoclet(String name) {
131 Map<String,String> p = atXdoclets.get(name);
132 if(p==null)
133 atXdoclets.put(name,p=new HashMap<String,String>());
134 return p;
135 }
137 /**
138 * add an xdoclet.
139 */
140 public Map<String,String> addXdoclet(String name, Map<String,String> attributes) {
141 Map<String,String> p = atXdoclets.get(name);
142 if(p==null)
143 atXdoclets.put(name,p=new HashMap<String,String>());
144 p.putAll(attributes);
145 return p;
146 }
148 /**
149 * add an xdoclet.
150 */
151 public Map<String,String> addXdoclet(String name, String attribute, String value) {
152 Map<String,String> p = atXdoclets.get(name);
153 if(p==null)
154 atXdoclets.put(name,p=new HashMap<String,String>());
155 p.put(attribute, value);
156 return p;
157 }
159 public void generate(JFormatter f) {
160 // I realized that we can't use StringTokenizer because
161 // this will recognize multiple \n as one token.
163 f.p("/**").nl();
165 format(f," * ");
167 f.p(" * ").nl();
168 for (Map.Entry<String,JCommentPart> e : atParams.entrySet()) {
169 f.p(" * @param ").p(e.getKey()).nl();
170 e.getValue().format(f,INDENT);
171 }
172 if( atReturn != null ) {
173 f.p(" * @return").nl();
174 atReturn.format(f,INDENT);
175 }
176 for (Map.Entry<JClass,JCommentPart> e : atThrows.entrySet()) {
177 f.p(" * @throws ").t(e.getKey()).nl();
178 e.getValue().format(f,INDENT);
179 }
180 if( atDeprecated != null ) {
181 f.p(" * @deprecated").nl();
182 atDeprecated.format(f,INDENT);
183 }
184 for (Map.Entry<String,Map<String,String>> e : atXdoclets.entrySet()) {
185 f.p(" * @").p(e.getKey());
186 if (e.getValue() != null) {
187 for (Map.Entry<String,String> a : e.getValue().entrySet()) {
188 f.p(" ").p(a.getKey()).p("= \"").p(a.getValue()).p("\"");
189 }
190 }
191 f.nl();
192 }
193 f.p(" */").nl();
194 }
196 private static final String INDENT = " * ";
197 }