src/share/classes/com/sun/tools/javac/api/JavacTrees.java

changeset 1704
ed918a442b83
parent 1455
75ab654b5cd5
child 1726
a7ff36d06fa2
equal deleted inserted replaced
1699:94870c08391c 1704:ed918a442b83
1 /* 1 /*
2 * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 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 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this 7 * published by the Free Software Foundation. Oracle designates this
41 import javax.tools.Diagnostic; 41 import javax.tools.Diagnostic;
42 import javax.tools.JavaCompiler; 42 import javax.tools.JavaCompiler;
43 import javax.tools.JavaFileObject; 43 import javax.tools.JavaFileObject;
44 44
45 import com.sun.source.doctree.DocCommentTree; 45 import com.sun.source.doctree.DocCommentTree;
46 import com.sun.source.doctree.DocTree;
46 import com.sun.source.doctree.ReferenceTree; 47 import com.sun.source.doctree.ReferenceTree;
47 import com.sun.source.tree.CatchTree; 48 import com.sun.source.tree.CatchTree;
48 import com.sun.source.tree.CompilationUnitTree; 49 import com.sun.source.tree.CompilationUnitTree;
49 import com.sun.source.tree.Scope; 50 import com.sun.source.tree.Scope;
50 import com.sun.source.tree.Tree; 51 import com.sun.source.tree.Tree;
52 import com.sun.source.util.DocSourcePositions;
53 import com.sun.source.util.DocTreeScanner;
51 import com.sun.source.util.DocTrees; 54 import com.sun.source.util.DocTrees;
52 import com.sun.source.util.JavacTask; 55 import com.sun.source.util.JavacTask;
53 import com.sun.source.util.SourcePositions;
54 import com.sun.source.util.TreePath; 56 import com.sun.source.util.TreePath;
55 import com.sun.tools.javac.code.Flags; 57 import com.sun.tools.javac.code.Flags;
56 import com.sun.tools.javac.code.Kinds; 58 import com.sun.tools.javac.code.Kinds;
57 import com.sun.tools.javac.code.Symbol; 59 import com.sun.tools.javac.code.Symbol;
58 import com.sun.tools.javac.code.Symbol.ClassSymbol; 60 import com.sun.tools.javac.code.Symbol.ClassSymbol;
74 import com.sun.tools.javac.comp.MemberEnter; 76 import com.sun.tools.javac.comp.MemberEnter;
75 import com.sun.tools.javac.comp.Resolve; 77 import com.sun.tools.javac.comp.Resolve;
76 import com.sun.tools.javac.model.JavacElements; 78 import com.sun.tools.javac.model.JavacElements;
77 import com.sun.tools.javac.processing.JavacProcessingEnvironment; 79 import com.sun.tools.javac.processing.JavacProcessingEnvironment;
78 import com.sun.tools.javac.tree.DCTree; 80 import com.sun.tools.javac.tree.DCTree;
81 import com.sun.tools.javac.tree.DCTree.DCBlockTag;
79 import com.sun.tools.javac.tree.DCTree.DCDocComment; 82 import com.sun.tools.javac.tree.DCTree.DCDocComment;
83 import com.sun.tools.javac.tree.DCTree.DCEndPosTree;
84 import com.sun.tools.javac.tree.DCTree.DCErroneous;
85 import com.sun.tools.javac.tree.DCTree.DCIdentifier;
86 import com.sun.tools.javac.tree.DCTree.DCParam;
80 import com.sun.tools.javac.tree.DCTree.DCReference; 87 import com.sun.tools.javac.tree.DCTree.DCReference;
88 import com.sun.tools.javac.tree.DCTree.DCText;
81 import com.sun.tools.javac.tree.EndPosTable; 89 import com.sun.tools.javac.tree.EndPosTable;
82 import com.sun.tools.javac.tree.JCTree; 90 import com.sun.tools.javac.tree.JCTree;
83 import com.sun.tools.javac.tree.JCTree.*; 91 import com.sun.tools.javac.tree.JCTree.*;
84 import com.sun.tools.javac.tree.TreeCopier; 92 import com.sun.tools.javac.tree.TreeCopier;
85 import com.sun.tools.javac.tree.TreeInfo; 93 import com.sun.tools.javac.tree.TreeInfo;
92 import com.sun.tools.javac.util.ListBuffer; 100 import com.sun.tools.javac.util.ListBuffer;
93 import com.sun.tools.javac.util.Log; 101 import com.sun.tools.javac.util.Log;
94 import com.sun.tools.javac.util.Name; 102 import com.sun.tools.javac.util.Name;
95 import com.sun.tools.javac.util.Names; 103 import com.sun.tools.javac.util.Names;
96 import com.sun.tools.javac.util.Pair; 104 import com.sun.tools.javac.util.Pair;
105 import com.sun.tools.javac.util.Position;
97 import static com.sun.tools.javac.code.TypeTag.*; 106 import static com.sun.tools.javac.code.TypeTag.*;
98 107
99 /** 108 /**
100 * Provides an implementation of Trees. 109 * Provides an implementation of Trees.
101 * 110 *
164 JavacTask t = context.get(JavacTask.class); 173 JavacTask t = context.get(JavacTask.class);
165 if (t instanceof JavacTaskImpl) 174 if (t instanceof JavacTaskImpl)
166 javacTaskImpl = (JavacTaskImpl) t; 175 javacTaskImpl = (JavacTaskImpl) t;
167 } 176 }
168 177
169 public SourcePositions getSourcePositions() { 178 public DocSourcePositions getSourcePositions() {
170 return new SourcePositions() { 179 return new DocSourcePositions() {
171 public long getStartPosition(CompilationUnitTree file, Tree tree) { 180 public long getStartPosition(CompilationUnitTree file, Tree tree) {
172 return TreeInfo.getStartPos((JCTree) tree); 181 return TreeInfo.getStartPos((JCTree) tree);
173 } 182 }
174 183
175 public long getEndPosition(CompilationUnitTree file, Tree tree) { 184 public long getEndPosition(CompilationUnitTree file, Tree tree) {
176 EndPosTable endPosTable = ((JCCompilationUnit) file).endPositions; 185 EndPosTable endPosTable = ((JCCompilationUnit) file).endPositions;
177 return TreeInfo.getEndPos((JCTree) tree, endPosTable); 186 return TreeInfo.getEndPos((JCTree) tree, endPosTable);
178 } 187 }
188
189 public long getStartPosition(CompilationUnitTree file, DocCommentTree comment, DocTree tree) {
190 return ((DCTree) tree).getSourcePosition((DCDocComment) comment);
191 }
192 @SuppressWarnings("fallthrough")
193 public long getEndPosition(CompilationUnitTree file, DocCommentTree comment, DocTree tree) {
194 DCDocComment dcComment = (DCDocComment) comment;
195 if (tree instanceof DCEndPosTree) {
196 int endPos = ((DCEndPosTree) tree).getEndPos(dcComment);
197
198 if (endPos != Position.NOPOS) {
199 return endPos;
200 }
201 }
202 int correction = 0;
203 switch (tree.getKind()) {
204 case TEXT:
205 DCText text = (DCText) tree;
206
207 return dcComment.comment.getSourcePos(text.pos + text.text.length());
208 case ERRONEOUS:
209 DCErroneous err = (DCErroneous) tree;
210
211 return dcComment.comment.getSourcePos(err.pos + err.body.length());
212 case IDENTIFIER:
213 DCIdentifier ident = (DCIdentifier) tree;
214
215 return dcComment.comment.getSourcePos(ident.pos + (ident.name != names.error ? ident.name.length() : 0));
216 case PARAM:
217 DCParam param = (DCParam) tree;
218
219 if (param.isTypeParameter && param.getDescription().isEmpty()) {
220 correction = 1;
221 }
222 case AUTHOR: case DEPRECATED: case RETURN: case SEE:
223 case SERIAL: case SERIAL_DATA: case SERIAL_FIELD: case SINCE:
224 case THROWS: case UNKNOWN_BLOCK_TAG: case VERSION: {
225 DocTree last = getLastChild(tree);
226
227 if (last != null) {
228 return getEndPosition(file, comment, last) + correction;
229 }
230
231 DCBlockTag block = (DCBlockTag) tree;
232
233 return dcComment.comment.getSourcePos(block.pos + block.getTagName().length() + 1);
234 }
235 default:
236 DocTree last = getLastChild(tree);
237
238 if (last != null) {
239 return getEndPosition(file, comment, last);
240 }
241 break;
242 }
243
244 return Position.NOPOS;
245 }
179 }; 246 };
247 }
248
249 private DocTree getLastChild(DocTree tree) {
250 final DocTree[] last = new DocTree[] {null};
251
252 tree.accept(new DocTreeScanner<Void, Void>() {
253 @Override public Void scan(DocTree node, Void p) {
254 if (node != null) last[0] = node;
255 return null;
256 }
257 }, null);
258
259 return last[0];
180 } 260 }
181 261
182 public JCClassDecl getTree(TypeElement element) { 262 public JCClassDecl getTree(TypeElement element) {
183 return (JCClassDecl) getTree((Element) element); 263 return (JCClassDecl) getTree((Element) element);
184 } 264 }

mercurial