001 /*
002 * Copyright 2004-2008 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.JavacMessages;
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 =
045 new Context.Key<Bark>();
046
047 /**
048 * Preregisters factories to create and use a Bark object for use as
049 * both a Log and a Bark.
050 */
051 public static void preRegister(final Context context) {
052 context.put(barkKey, new Context.Factory<Bark>() {
053 public Bark make() {
054 return new Bark(context);
055 }
056 });
057 context.put(Log.logKey, new Context.Factory<Log>() {
058 public Log make() {
059 return Bark.instance(context);
060 }
061 });
062 }
063
064 /** Get the Bark instance for this context. */
065 public static Bark instance(Context context) {
066 Bark instance = context.get(barkKey);
067 if (instance == null)
068 instance = new Bark(context);
069 return instance;
070 }
071
072 /** Specifies whether or not to ignore any diagnostics that are reported.
073 */
074 private boolean ignoreDiagnostics;
075
076 /**
077 * Factory for APT-specific diagnostics.
078 */
079 private JCDiagnostic.Factory aptDiags;
080
081
082 /**
083 * Creates a Bark.
084 */
085 protected Bark(Context context) {
086 super(context); // will register this object in context with Log.logKey
087 context.put(barkKey, this);
088
089 // register additional resource bundle for APT messages.
090 JavacMessages aptMessages = JavacMessages.instance(context);
091 aptMessages.add("com.sun.tools.apt.resources.apt");
092 aptDiags = new JCDiagnostic.Factory(aptMessages, "apt");
093
094 multipleErrors = true;
095 }
096
097 /**
098 * Sets a flag indicating whether or not to ignore all diagnostics.
099 * When ignored, they are not reported to the output writers, not are they
100 * counted in the various counters.
101 * @param b If true, subsequent diagnostics will be ignored.
102 * @return the previous state of the flag
103 */
104 public boolean setDiagnosticsIgnored(boolean b) {
105 boolean prev = ignoreDiagnostics;
106 ignoreDiagnostics = b;
107 return prev;
108 }
109
110 /**
111 * Report a diagnostic if they are not currently being ignored.
112 */
113 @Override
114 public void report(JCDiagnostic diagnostic) {
115 if (ignoreDiagnostics)
116 return;
117
118 super.report(diagnostic);
119 }
120
121 /** Report an error.
122 * @param key The key for the localized error message.
123 * @param args Fields of the error message.
124 */
125 public void aptError(String key, Object... args) {
126 aptError(Position.NOPOS, key, args);
127 }
128
129 /** Report an error, unless another error was already reported at same
130 * source position.
131 * @param pos The source position at which to report the error.
132 * @param key The key for the localized error message.
133 * @param args Fields of the error message.
134 */
135 public void aptError(int pos, String key, Object ... args) {
136 report(aptDiags.error(source, new SimpleDiagnosticPosition(pos), key, args));
137 }
138
139 /** Report a warning, unless suppressed by the -nowarn option or the
140 * maximum number of warnings has been reached.
141 * @param key The key for the localized warning message.
142 * @param args Fields of the warning message.
143 */
144 public void aptWarning(String key, Object... args) {
145 aptWarning(Position.NOPOS, key, args);
146 }
147
148 /** Report a warning, unless suppressed by the -nowarn option or the
149 * maximum number of warnings has been reached.
150 * @param pos The source position at which to report the warning.
151 * @param key The key for the localized warning message.
152 * @param args Fields of the warning message.
153 */
154 public void aptWarning(int pos, String key, Object ... args) {
155 report(aptDiags.warning(source, new SimpleDiagnosticPosition(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), key, args));
173 }
174 }