blob: 3ab284253b00b145abc26f2bccd53a808f8b99b1 [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package flex2.compiler.util;
import flash.localization.LocalizationManager;
import flex2.compiler.ILocalizableMessage;
import flex2.compiler.Logger;
import flex2.compiler.Source;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.LinkedList;
import java.util.List;
import macromedia.asc.util.IntegerPool;
/**
* LocalLogger keeps a local count of warnings of errors.
*/
public class LocalLogger implements Logger
{
public LocalLogger(Logger original, Source source)
{
this(original);
this.source = source;
}
public LocalLogger(Logger original)
{
assert !(original instanceof LocalLogger);
this.original = original;
errorCount = 0;
warningCount = 0;
warnings = null;
}
private Logger original;
private Source source;
private int errorCount, warningCount;
private List<Warning> warnings;
private LocalizationManager l10n;
// C: used by PersistenceStore...
public void setSource(Source s)
{
source = s;
}
// Disconnect this logger from the original logger...
public void disconnect()
{
original = null;
source = null;
l10n = null;
}
public boolean isConnected()
{
return original != null;
}
public int errorCount()
{
return errorCount;
}
public int warningCount()
{
return warningCount;
}
public void logInfo(String info)
{
if (original != null)
{
original.logInfo(info);
}
}
public void logDebug(String debug)
{
if (original != null)
{
original.logDebug(debug);
}
}
public void logWarning(String warning)
{
if (original != null)
{
original.logWarning(warning);
}
recordWarning(warning);
}
public void logError(String error)
{
if (original != null)
{
original.logError(error);
}
errorCount++;
}
public void logInfo(String path, String info)
{
if (original != null)
{
String misrouteInfo = checkPath(path, null, null, info, null, null);
if (misrouteInfo == null)
{
original.logInfo(path, info);
}
else
{
original.logInfo(source.getNameForReporting(), info + misrouteInfo);
logUnmappedError(misrouteInfo);
}
}
}
public void logDebug(String path, String debug)
{
if (original != null)
{
String misrouteInfo = checkPath(path, null, null, debug, null, null);
if (misrouteInfo == null)
{
original.logDebug(path, debug);
}
else
{
original.logDebug(source.getNameForReporting(), debug + misrouteInfo);
logUnmappedError(misrouteInfo);
}
}
}
public void logWarning(String path, String warning)
{
if (original != null)
{
String misrouteInfo = checkPath(path, null, null, warning, null, null);
if (misrouteInfo == null)
{
original.logWarning(path, warning);
}
else
{
original.logWarning(source.getNameForReporting(), warning + misrouteInfo);
logUnmappedError(misrouteInfo);
}
}
recordWarning(path, warning);
}
public void logWarning(String path, String warning, int errorCode)
{
if (original != null)
{
String misrouteInfo = checkPath(path, null, null, warning, null, IntegerPool.getNumber(errorCode));
if (misrouteInfo == null)
{
original.logWarning(path, warning, errorCode);
}
else
{
original.logWarning(source.getNameForReporting(), warning + misrouteInfo);
logUnmappedError(misrouteInfo);
}
}
recordWarning(path, warning, errorCode);
}
public void logError(String path, String error)
{
if (original != null)
{
String misrouteInfo = checkPath(path, null, null, error, null, null);
if (misrouteInfo == null)
{
original.logError(path, error);
}
else
{
original.logError(source.getNameForReporting(), error + misrouteInfo);
logUnmappedError(misrouteInfo);
}
}
errorCount++;
}
public void logError(String path, String error, int errorCode)
{
if (original != null)
{
String misrouteInfo = checkPath(path, null, null, error, null, IntegerPool.getNumber(errorCode));
if (misrouteInfo == null)
{
original.logError(path, error, errorCode);
}
else
{
original.logError(source.getNameForReporting(), error + misrouteInfo);
logUnmappedError(misrouteInfo);
}
}
errorCount++;
}
public void logInfo(String path, int line, String info)
{
if (original != null)
{
String misrouteInfo = checkPath(path, IntegerPool.getNumber(line), null, info, null, null);
if (misrouteInfo == null)
{
original.logInfo(path, line, info);
}
else
{
original.logInfo(source.getNameForReporting(), info + misrouteInfo);
logUnmappedError(misrouteInfo);
}
}
}
public void logDebug(String path, int line, String debug)
{
if (original != null)
{
String misrouteInfo = checkPath(path, IntegerPool.getNumber(line), null, debug, null, null);
if (misrouteInfo == null)
{
original.logDebug(path, line, debug);
}
else
{
original.logDebug(source.getNameForReporting(), debug + misrouteInfo);
logUnmappedError(misrouteInfo);
}
}
}
public void logWarning(String path, int line, String warning)
{
if (original != null)
{
String misrouteInfo = checkPath(path, IntegerPool.getNumber(line), null, warning, null, null);
if (misrouteInfo == null)
{
original.logWarning(path, line, warning);
}
else
{
original.logWarning(source.getNameForReporting(), warning + misrouteInfo);
logUnmappedError(misrouteInfo);
}
}
recordWarning(path, line, warning);
}
public void logWarning(String path, int line, String warning, int errorCode)
{
if (original != null)
{
String misrouteInfo = checkPath(path, IntegerPool.getNumber(line), null, warning, null, IntegerPool.getNumber(errorCode));
if (misrouteInfo == null)
{
original.logWarning(path, line, warning, errorCode);
}
else
{
original.logWarning(source.getNameForReporting(), warning + misrouteInfo);
logUnmappedError(misrouteInfo);
}
}
recordWarning(path, line, warning, errorCode);
}
public void logError(String path, int line, String error)
{
if (original != null)
{
String misrouteInfo = checkPath(path, IntegerPool.getNumber(line), null, error, null, null);
if (misrouteInfo == null)
{
original.logError(path, line, error);
}
else
{
original.logError(source.getNameForReporting(), error + misrouteInfo);
logUnmappedError(misrouteInfo);
}
}
errorCount++;
}
public void logError(String path, int line, String error, int errorCode)
{
if (original != null)
{
String misrouteInfo = checkPath(path, IntegerPool.getNumber(line), null, error, null, IntegerPool.getNumber(errorCode));
if (misrouteInfo == null)
{
original.logError(path, line, error, errorCode);
}
else
{
original.logError(source.getNameForReporting(), error + misrouteInfo);
}
}
errorCount++;
}
public void logInfo(String path, int line, int col, String info)
{
if (original != null)
{
String misrouteInfo = checkPath(path, IntegerPool.getNumber(line), IntegerPool.getNumber(col), info, null, null);
if (misrouteInfo == null)
{
original.logInfo(path, line, col, info);
}
else
{
original.logInfo(source.getNameForReporting(), info + misrouteInfo);
logUnmappedError(misrouteInfo);
}
}
}
public void logDebug(String path, int line, int col, String debug)
{
if (original != null)
{
String misrouteInfo = checkPath(path, IntegerPool.getNumber(line), IntegerPool.getNumber(col), debug, null, null);
if (misrouteInfo == null)
{
original.logDebug(path, line, col, debug);
}
else
{
original.logDebug(source.getNameForReporting(), debug + misrouteInfo);
logUnmappedError(misrouteInfo);
}
}
}
public void logWarning(String path, int line, int col, String warning)
{
if (original != null)
{
String misrouteInfo = checkPath(path, IntegerPool.getNumber(line), IntegerPool.getNumber(col), warning, null, null);
if (misrouteInfo == null)
{
original.logWarning(path, line, col, warning);
}
else
{
original.logWarning(source.getNameForReporting(), warning + misrouteInfo);
logUnmappedError(misrouteInfo);
}
}
recordWarning(path, line, col, warning);
}
public void logError(String path, int line, int col, String error)
{
if (original != null)
{
String misrouteInfo = checkPath(path, IntegerPool.getNumber(line), IntegerPool.getNumber(col), error, null, null);
if (misrouteInfo == null)
{
original.logError(path, line, col, error);
}
else
{
original.logError(source.getNameForReporting(), error + misrouteInfo);
logUnmappedError(misrouteInfo);
}
}
errorCount++;
}
public void logWarning(String path, int line, int col, String warning, String source)
{
if (original != null)
{
String misrouteInfo = checkPath(path, IntegerPool.getNumber(line), IntegerPool.getNumber(col), warning, source, null);
if (misrouteInfo == null)
{
original.logWarning(path, line, col, warning, source);
}
else
{
original.logWarning(this.source.getNameForReporting(), warning + misrouteInfo);
logUnmappedError(misrouteInfo);
}
}
recordWarning(path, line, col, warning, source);
}
public void logWarning(String path, int line, int col, String warning, String source, int errorCode)
{
if (original != null)
{
String misrouteInfo = checkPath(path, IntegerPool.getNumber(line), IntegerPool.getNumber(col), source, null, IntegerPool.getNumber(errorCode));
if (misrouteInfo == null)
{
original.logWarning(path, line, col, warning, source, errorCode);
}
else
{
original.logWarning(this.source.getNameForReporting(), warning + misrouteInfo);
logUnmappedError(misrouteInfo);
}
}
recordWarning(path, line, col, warning, source, errorCode);
}
public void logError(String path, int line, int col, String error, String source)
{
if (original != null)
{
String misrouteInfo = checkPath(path, IntegerPool.getNumber(line), IntegerPool.getNumber(col), error, source, null);
if (misrouteInfo == null)
{
original.logError(path, line, col, error, source);
}
else
{
original.logError(this.source.getNameForReporting(), error + misrouteInfo);
logUnmappedError(misrouteInfo);
}
}
errorCount++;
}
public void logError(String path, int line, int col, String error, String source, int errorCode)
{
if (original != null)
{
String misrouteInfo = checkPath(path, IntegerPool.getNumber(line), IntegerPool.getNumber(col), error, source, IntegerPool.getNumber(errorCode));
if (misrouteInfo == null)
{
original.logError(path, line, col, error, source, errorCode);
}
else
{
original.logError(this.source.getNameForReporting(), error + misrouteInfo);
logUnmappedError(misrouteInfo);
}
}
errorCount++;
}
public void log(ILocalizableMessage m)
{
log(m, null);
}
public void log(ILocalizableMessage m, String source)
{
if (m.getLevel() == ILocalizableMessage.ERROR)
{
errorCount++;
}
else if (m.getLevel() == ILocalizableMessage.WARNING)
{
warningCount++;
recordWarning(m.getPath(), m.getLine(), m.getColumn(), l10n.getLocalizedTextString(m));
}
if (original != null)
{
String misrouteInfo = null;
if (m.isPathAvailable())
{
misrouteInfo = checkPath(m.getPath(), IntegerPool.getNumber(m.getLine()), IntegerPool.getNumber(m.getColumn()), null, null, null);
}
if (misrouteInfo == null)
{
if (source == null)
{
original.log(m);
}
else
{
original.log(m, source);
}
}
else
{
// NOTE: no way to tack CODEGEN locator onto error message in this case
m.setPath(this.source.getNameForReporting());
m.setLine(-1);
m.setColumn(-1);
original.log(m);
logUnmappedError(misrouteInfo);
}
}
}
public void needsCompilation(String path, String reason)
{
if (original != null)
{
original.needsCompilation(path, reason);
}
}
public void includedFileUpdated(String path)
{
if (original != null)
{
original.includedFileUpdated(path);
}
}
public void includedFileAffected(String path)
{
if (original != null)
{
original.includedFileAffected(path);
}
}
public void setLocalizationManager(LocalizationManager mgr)
{
l10n = mgr;
}
/**
* Compact diagnostic text containing generated-code locator info. Can be appended to error message.
*/
private String checkPath(String p, Integer line, Integer col, String msg, String source, Integer errorCode)
{
boolean result = !this.source.getNameForReporting().equals(p) &&
!this.source.isIncludedFile(p);
// !this.source.getCompilationUnit().getAssets().exists(p);
if (result)
{
return (new StringBuilder(" [")
.append(new GeneratedCodeMarker().getMessage())).append(": ")
.append(new PathInfo(p).getMessage()).append(", ")
.append(new LineInfo(line == null ? 0 : line.intValue()).getMessage()).append(", ")
.append(new ColumnInfo(col == null ? 0 : col.intValue()).getMessage()).append("]")
.toString();
}
else
{
return null;
}
}
/**
* Log a debug message with details on an error that came in with an invalid path (assumed to be generated
* code derived from the current Source).
* TODO this should be controllable via the commandline for diagnostics etc.
* Unfortunately, debug logging seems to always be enabled at the console currently, so for 2.0 GMC we
* just stuff it.
*/
private void logUnmappedError(String misrouteInfo)
{
// original.logDebug(misrouteInfo);
}
/**
* Full diagnostic text, including stack dump.
*/
@SuppressWarnings("unused")
private String checkPathFull(String p, Integer line, Integer col, String msg, String source, Integer errorCode)
{
boolean result = !this.source.getNameForReporting().equals(p) &&
!this.source.isIncludedFile(p);
// !this.source.getCompilationUnit().getAssets().exists(p);
if (result)
{
StringWriter misrouteInfo = new StringWriter();
PrintWriter pw = new PrintWriter(misrouteInfo, true);
pw.println(new ErrMsgBug().getMessage());
pw.println(new PathInfo(p).getMessage());
if (line != null)
{
pw.println(new LineInfo(line.intValue()).getMessage());
}
if (col != null)
{
pw.println(new ColumnInfo(col.intValue()).getMessage());
}
if (msg != null)
{
pw.println(new MessageInfo(msg).getMessage());
}
if (source != null)
{
pw.println(new SourceInfo(source).getMessage());
}
if (errorCode != null)
{
pw.println(new ErrorCodeInfo(errorCode.intValue()).getMessage());
}
new Exception(new StackTraceInfo().getMessage()).printStackTrace(pw);
return misrouteInfo.toString();
}
else
{
return null;
}
}
public static class GeneratedCodeMarker extends CompilerMessage.CompilerInfo {
private static final long serialVersionUID = -7628545867822633628L;}
public static class ErrMsgBug extends CompilerMessage.CompilerInfo
{
private static final long serialVersionUID = 8033874361803199059L;
public ErrMsgBug()
{
super();
}
}
public static class PathInfo extends CompilerMessage.CompilerInfo
{
private static final long serialVersionUID = -6570823652701358227L;
public PathInfo(String p)
{
filepath = p;
}
public final String filepath;
}
public static class LineInfo extends CompilerMessage.CompilerInfo
{
private static final long serialVersionUID = -87438910186526222L;
public LineInfo(int l)
{
fileline = l;
}
public final int fileline;
}
public static class ColumnInfo extends CompilerMessage.CompilerInfo
{
private static final long serialVersionUID = 1134311690698586756L;
public ColumnInfo(int c)
{
filecol = c;
}
public final int filecol;
}
public static class MessageInfo extends CompilerMessage.CompilerInfo
{
private static final long serialVersionUID = 3056765623916777257L;
public MessageInfo(String m)
{
filemsg = m;
}
public final String filemsg;
}
public static class SourceInfo extends CompilerMessage.CompilerInfo
{
private static final long serialVersionUID = -4219876071297989808L;
public SourceInfo(String s)
{
filesource = s;
}
public final String filesource;
}
public static class ErrorCodeInfo extends CompilerMessage.CompilerInfo
{
private static final long serialVersionUID = 2382276768592926066L;
public ErrorCodeInfo(int e)
{
fileerrorCode = e;
}
public final int fileerrorCode;
}
public static class StackTraceInfo extends CompilerMessage.CompilerInfo
{
private static final long serialVersionUID = 2730713000203583580L;
public StackTraceInfo()
{
super();
}
}
public void displayWarnings(Logger logger)
{
for (int i = 0, size = warnings == null ? 0 : warnings.size(); i < size; i++)
{
Warning w = warnings.get(i);
if (w.path != null)
{
if (w.line == null && w.col == null && w.source == null && w.errorCode == null)
{
logger.logWarning(w.path, w.warning);
}
else if (w.line == null && w.col == null && w.source == null && w.errorCode != null)
{
logger.logWarning(w.path, w.warning, w.errorCode.intValue());
}
else if (w.line == null && w.col == null && w.source != null && w.errorCode == null)
{
logger.logWarning(w.path, w.warning);
}
else if (w.line == null && w.col == null && w.source != null && w.errorCode != null)
{
logger.logWarning(w.path, w.warning, w.errorCode.intValue());
}
else if (w.line == null && w.col != null && w.source == null && w.errorCode == null)
{
logger.logWarning(w.path, w.warning);
}
else if (w.line == null && w.col != null && w.source == null && w.errorCode != null)
{
logger.logWarning(w.path, w.warning, w.errorCode.intValue());
}
else if (w.line == null && w.col != null && w.source != null && w.errorCode == null)
{
logger.logWarning(w.path, w.warning);
}
else if (w.line == null && w.col != null && w.source != null && w.errorCode != null)
{
logger.logWarning(w.path, w.warning, w.errorCode.intValue());
}
else if (w.line != null && w.col == null && w.source == null && w.errorCode == null)
{
logger.logWarning(w.path, w.line.intValue(), w.warning);
}
else if (w.line != null && w.col == null && w.source == null && w.errorCode != null)
{
logger.logWarning(w.path, w.line.intValue(), w.warning, w.errorCode.intValue());
}
else if (w.line != null && w.col == null && w.source != null && w.errorCode == null)
{
logger.logWarning(w.path, w.line.intValue(), w.warning);
}
else if (w.line != null && w.col == null && w.source != null && w.errorCode != null)
{
logger.logWarning(w.path, w.line.intValue(), w.warning, w.errorCode.intValue());
}
else if (w.line != null && w.col != null && w.source == null && w.errorCode == null)
{
logger.logWarning(w.path, w.line.intValue(), w.col.intValue(), w.warning);
}
else if (w.line != null && w.col != null && w.source == null && w.errorCode != null)
{
logger.logWarning(w.path, w.line.intValue(), w.warning, w.errorCode.intValue());
}
else if (w.line != null && w.col != null && w.source != null && w.errorCode == null)
{
logger.logWarning(w.path, w.line.intValue(), w.col.intValue(), w.warning, w.source);
}
else if (w.line != null && w.col != null && w.source != null && w.errorCode != null)
{
logger.logWarning(w.path, w.line.intValue(), w.col.intValue(), w.warning, w.source, w.errorCode.intValue());
}
}
else
{
logger.logWarning(w.warning);
}
}
}
public List<Warning> getWarnings()
{
return warnings;
}
private void recordWarning(String warning)
{
recordWarning(null, null, null, warning, null, null);
}
private void recordWarning(String path, String warning)
{
recordWarning(path, null, null, warning, null, null);
}
private void recordWarning(String path, String warning, int errorCode)
{
recordWarning(path, null, null, warning, null, IntegerPool.getNumber(errorCode));
}
private void recordWarning(String path, int line, String warning)
{
recordWarning(path, IntegerPool.getNumber(line), null, warning, null, null);
}
private void recordWarning(String path, int line, String warning, int errorCode)
{
recordWarning(path, IntegerPool.getNumber(line), null, warning, null, IntegerPool.getNumber(errorCode));
}
private void recordWarning(String path, int line, int col, String warning)
{
recordWarning(path, IntegerPool.getNumber(line), IntegerPool.getNumber(col), warning, null, null);
}
private void recordWarning(String path, int line, int col, String warning, String source)
{
recordWarning(path, IntegerPool.getNumber(line), IntegerPool.getNumber(col), warning, source, null);
}
private void recordWarning(String path, int line, int col, String warning, String source, int errorCode)
{
recordWarning(path, IntegerPool.getNumber(line), IntegerPool.getNumber(col), warning, source, IntegerPool.getNumber(errorCode));
}
public void recordWarning(String path, Integer line, Integer col, String warning, String source, Integer errorCode)
{
Warning w = new Warning();
w.path = path;
w.warning = warning;
w.source = source;
w.line = line;
w.col = col;
w.errorCode = errorCode;
if (warnings == null)
{
warnings = new LinkedList<Warning>();
}
warnings.add(w);
warningCount++;
}
public static class Warning
{
public String path, warning, source;
public Integer line, col, errorCode;
}
}