001: /*
002: * Copyright 2004-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.apt.util;
027:
028: import com.sun.tools.javac.util.Context;
029: import com.sun.tools.javac.util.JCDiagnostic;
030: import com.sun.tools.javac.util.JCDiagnostic.SimpleDiagnosticPosition;
031: import com.sun.tools.javac.util.Log;
032: import com.sun.tools.javac.util.Messages;
033: import com.sun.tools.javac.util.Position;
034:
035: /** A subtype of Log for use in APT.
036: *
037: * <p><b>This is NOT part of any API supported by Sun Microsystems. If
038: * you write code that depends on this, you do so at your own risk.
039: * This code and its internal interfaces are subject to change or
040: * deletion without notice.</b>
041: */
042: public class Bark extends Log {
043: /** The context key for the bark. */
044: protected static final Context.Key<Bark> barkKey = new Context.Key<Bark>();
045:
046: /**
047: * Preregisters factories to create and use a Bark object for use as
048: * both a Log and a Bark.
049: */
050: public static void preRegister(final Context context) {
051: context.put(barkKey, new Context.Factory<Bark>() {
052: public Bark make() {
053: return new Bark(context);
054: }
055: });
056: context.put(Log.logKey, new Context.Factory<Log>() {
057: public Log make() {
058: return Bark.instance(context);
059: }
060: });
061: }
062:
063: /** Get the Bark instance for this context. */
064: public static Bark instance(Context context) {
065: Bark instance = context.get(barkKey);
066: if (instance == null)
067: instance = new Bark(context);
068: return instance;
069: }
070:
071: /** Specifies whether or not to ignore any diagnostics that are reported.
072: */
073: private boolean ignoreDiagnostics;
074:
075: /**
076: * Factory for APT-specific diagnostics.
077: */
078: private JCDiagnostic.Factory aptDiags;
079:
080: /**
081: * Creates a Bark.
082: */
083: protected Bark(Context context) {
084: super (context); // will register this object in context with Log.logKey
085: context.put(barkKey, this );
086:
087: // register additional resource bundle for APT messages.
088: Messages aptMessages = new Messages(Messages.getDefaultBundle());
089: aptMessages.add("com.sun.tools.apt.resources.apt");
090: aptDiags = new JCDiagnostic.Factory(aptMessages, "apt");
091:
092: multipleErrors = true;
093: }
094:
095: /**
096: * Sets a flag indicating whether or not to ignore all diagnostics.
097: * When ignored, they are not reported to the output writers, not are they
098: * counted in the various counters.
099: * @param b If true, subsequent diagnostics will be ignored.
100: * @return the previous state of the flag
101: */
102: public boolean setDiagnosticsIgnored(boolean b) {
103: boolean prev = ignoreDiagnostics;
104: ignoreDiagnostics = b;
105: return prev;
106: }
107:
108: /**
109: * Report a diagnostic if they are not currently being ignored.
110: */
111: @Override
112: public void report(JCDiagnostic diagnostic) {
113: if (ignoreDiagnostics)
114: return;
115:
116: super .report(diagnostic);
117: }
118:
119: /** Report an error.
120: * @param key The key for the localized error message.
121: * @param args Fields of the error message.
122: */
123: public void aptError(String key, Object... args) {
124: aptError(Position.NOPOS, key, args);
125: }
126:
127: /** Report an error, unless another error was already reported at same
128: * source position.
129: * @param pos The source position at which to report the error.
130: * @param key The key for the localized error message.
131: * @param args Fields of the error message.
132: */
133: public void aptError(int pos, String key, Object... args) {
134: report(aptDiags.error(source,
135: new SimpleDiagnosticPosition(pos), key, args));
136: }
137:
138: /** Report a warning, unless suppressed by the -nowarn option or the
139: * maximum number of warnings has been reached.
140: * @param key The key for the localized warning message.
141: * @param args Fields of the warning message.
142: */
143: public void aptWarning(String key, Object... args) {
144: aptWarning(Position.NOPOS, key, args);
145: }
146:
147: /** Report a warning, unless suppressed by the -nowarn option or the
148: * maximum number of warnings has been reached.
149: * @param pos The source position at which to report the warning.
150: * @param key The key for the localized warning message.
151: * @param args Fields of the warning message.
152: */
153: public void aptWarning(int pos, String key, Object... args) {
154: report(aptDiags.warning(source, new SimpleDiagnosticPosition(
155: pos), key, args));
156: }
157:
158: /** Report a note, unless suppressed by the -nowarn option.
159: * @param key The key for the localized note message.
160: * @param args Fields of the note message.
161: */
162: public void aptNote(String key, Object... args) {
163: aptNote(Position.NOPOS, key, args);
164: }
165:
166: /** Report a note, unless suppressed by the -nowarn option.
167: * @param pos The source position at which to report the note.
168: * @param key The key for the localized note message.
169: * @param args Fields of the note message.
170: */
171: public void aptNote(int pos, String key, Object... args) {
172: report(aptDiags.note(source, new SimpleDiagnosticPosition(pos),
173: key, args));
174: }
175: }
|