001: /*
002: * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved.
003: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004: *
005: * This code is free software; you can redistribute it and/or modify it
006: * under the terms of the GNU General Public License version 2 only, as
007: * published by the Free Software Foundation. Sun designates this
008: * particular file as subject to the "Classpath" exception as provided
009: * by Sun in the LICENSE file that accompanied this code.
010: *
011: * This code is distributed in the hope that it will be useful, but WITHOUT
012: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
014: * version 2 for more details (a copy is included in the LICENSE file that
015: * accompanied this code).
016: *
017: * You should have received a copy of the GNU General Public License version
018: * 2 along with this work; if not, write to the Free Software Foundation,
019: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020: *
021: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022: * CA 95054 USA or visit www.sun.com if you need additional information or
023: * have any questions.
024: */
025:
026: package com.sun.tools.javac.processing;
027:
028: import com.sun.tools.javac.model.JavacElements;
029: import com.sun.tools.javac.util.*;
030: import com.sun.tools.javac.comp.*;
031: import com.sun.tools.javac.tree.JCTree;
032: import com.sun.tools.javac.tree.JCTree.*;
033: import com.sun.tools.javac.util.Position;
034: import javax.lang.model.element.*;
035: import javax.tools.JavaFileObject;
036: import javax.tools.Diagnostic;
037: import javax.annotation.processing.*;
038: import java.util.*;
039:
040: /**
041: * An implementation of the Messager built on top of log.
042: *
043: * <p><b>This is NOT part of any API supported by Sun Microsystems.
044: * If you write code that depends on this, you do so at your own risk.
045: * This code and its internal interfaces are subject to change or
046: * deletion without notice.</b>
047: */
048: @Version("@(#)JavacMessager.java 1.15 07/05/05")
049: public class JavacMessager implements Messager {
050: Log log;
051: JavacProcessingEnvironment processingEnv;
052: int errorCount = 0;
053:
054: JavacMessager(Context context,
055: JavacProcessingEnvironment processingEnv) {
056: log = Log.instance(context);
057: this .processingEnv = processingEnv;
058: }
059:
060: // processingEnv.getElementUtils()
061:
062: public void printMessage(Diagnostic.Kind kind, CharSequence msg) {
063: printMessage(kind, msg, null, null, null);
064: }
065:
066: public void printMessage(Diagnostic.Kind kind, CharSequence msg,
067: Element e) {
068: printMessage(kind, msg, e, null, null);
069: }
070:
071: /**
072: * Prints a message of the specified kind at the location of the
073: * annotation mirror of the annotated element.
074: *
075: * @param kind the kind of message
076: * @param msg the message, or an empty string if none
077: * @param e the annotated element
078: * @param a the annotation to use as a position hint
079: */
080: public void printMessage(Diagnostic.Kind kind, CharSequence msg,
081: Element e, AnnotationMirror a) {
082: printMessage(kind, msg, e, a, null);
083: }
084:
085: /**
086: * Prints a message of the specified kind at the location of the
087: * annotation value inside the annotation mirror of the annotated
088: * element.
089: *
090: * @param kind the kind of message
091: * @param msg the message, or an empty string if none
092: * @param e the annotated element
093: * @param a the annotation containing the annotaiton value
094: * @param v the annotation value to use as a position hint
095: */
096: public void printMessage(Diagnostic.Kind kind, CharSequence msg,
097: Element e, AnnotationMirror a, AnnotationValue v) {
098: JavaFileObject oldSource = null;
099: JavaFileObject newSource = null;
100: JCDiagnostic.DiagnosticPosition pos = null;
101: JavacElements elemUtils = processingEnv.getElementUtils();
102: Pair<JCTree, JCCompilationUnit> treeTop = elemUtils
103: .getTreeAndTopLevel(e, a, v);
104: if (treeTop != null) {
105: newSource = treeTop.snd.sourcefile;
106: if (newSource != null) {
107: oldSource = log.useSource(newSource);
108: pos = treeTop.fst.pos();
109: }
110: }
111: try {
112: switch (kind) {
113: case ERROR:
114: errorCount++;
115: boolean prev = log.multipleErrors;
116: log.multipleErrors = true;
117: try {
118: log.error(pos, "proc.messager", msg.toString());
119: } finally {
120: log.multipleErrors = prev;
121: }
122: break;
123:
124: case WARNING:
125: log.warning(pos, "proc.messager", msg.toString());
126: break;
127:
128: case MANDATORY_WARNING:
129: log.mandatoryWarning(pos, "proc.messager", msg
130: .toString());
131: break;
132:
133: default:
134: log.note(pos, "proc.messager", msg.toString());
135: break;
136: }
137: } finally {
138: if (oldSource != null)
139: log.useSource(oldSource);
140: }
141: }
142:
143: /**
144: * Prints an error message.
145: * Equivalent to {@code printError(null, msg)}.
146: * @param msg the message, or an empty string if none
147: */
148: public void printError(String msg) {
149: printMessage(Diagnostic.Kind.ERROR, msg);
150: }
151:
152: /**
153: * Prints a warning message.
154: * Equivalent to {@code printWarning(null, msg)}.
155: * @param msg the message, or an empty string if none
156: */
157: public void printWarning(String msg) {
158: printMessage(Diagnostic.Kind.WARNING, msg);
159: }
160:
161: /**
162: * Prints a notice.
163: * @param msg the message, or an empty string if none
164: */
165: public void printNotice(String msg) {
166: printMessage(Diagnostic.Kind.NOTE, msg);
167: }
168:
169: public boolean errorRaised() {
170: return errorCount > 0;
171: }
172:
173: public int errorCount() {
174: return errorCount;
175: }
176:
177: public void newRound(Context context) {
178: log = Log.instance(context);
179: errorCount = 0;
180: }
181:
182: public String toString() {
183: return "javac Messager version @(#)JavacMessager.java 1.15 07/05/05";
184: }
185: }
|