//
// Copyright (c) 2006, Brian Frank and Andy Frank
// Licensed under the Academic Free License version 3.0
//
// History:
// 15 Sep 05 Brian Frank Creation
// 2 Jun 06 Brian Frank Ported from Java to Fan
//
**
** CompilerLog manages logging compiler messages. The default
** writes everything to standard output.
**
class CompilerLog
{
//////////////////////////////////////////////////////////////////////////
// Construction
//////////////////////////////////////////////////////////////////////////
**
** Construct for specified output stream.
**
new make(OutStream out := Env.cur.out)
{
this.out = out
}
//////////////////////////////////////////////////////////////////////////
// Methods
//////////////////////////////////////////////////////////////////////////
**
** Is debug level enabled
**
Bool isDebug()
{
return level <= LogLevel.debug
}
**
** Indent the output.
**
Void indent()
{
indentation++
}
**
** Unindent the output.
**
Void unindent()
{
indentation--
if (indentation < 0) indentation = 0
}
**
** Log an error level message.
**
Void err(Str msg, Err? err := null)
{
log(LogRec(DateTime.now, LogLevel.err, "compiler", msg, err))
}
**
** Log a warn level message.
**
Void warn(Str msg, Err? err := null)
{
log(LogRec(DateTime.now, LogLevel.warn, "compiler", msg, err))
}
**
** Log an info level message.
**
Void info(Str msg, Err? err := null)
{
log(LogRec(DateTime.now, LogLevel.info, "compiler", msg, err))
}
**
** Log an debug level message.
**
Void debug(Str msg, Err? err := null)
{
log(LogRec(DateTime.now, LogLevel.debug, "compiler", msg, err))
}
**
** Generate a log entry. The log entry is only generated
** if the specified level is greater than or equal to
** the configured level field.
**
virtual Void log(LogRec rec)
{
if (rec.level < this.level) return
if (rec.level >= LogLevel.warn) print(rec.level.toStr.upper).print(": ")
else print(Str.spaces(indentation*2))
printLine(rec.msg)
if (rec.err != null)
{
if (isDebug)
rec.err.trace(out)
else
print(Str.spaces(indentation*2+4)).printLine(rec.err)
}
}
//////////////////////////////////////////////////////////////////////////
// CompilerErr
//////////////////////////////////////////////////////////////////////////
**
** Log a CompilerErr
**
virtual Void compilerErr(CompilerErr err)
{
if (err.level < this.level) return
loc := err.loc.toLocStr
if (err.isWarn)
printLine("$loc: WARN $err.msg")
else
printLine("$loc: $err.msg")
if (isDebug) err.trace(out)
}
//////////////////////////////////////////////////////////////////////////
// IO
//////////////////////////////////////////////////////////////////////////
**
** Print a string without trailing newline.
**
CompilerLog print(Obj? s)
{
out.print(s)
return this
}
**
** Print a line.
**
CompilerLog printLine(Obj? s := "")
{
out.printLine(s).flush
return this
}
//////////////////////////////////////////////////////////////////////////
// Fields
//////////////////////////////////////////////////////////////////////////
** Max severity of log entries to report
LogLevel level := LogLevel.info
** Current level of indentation
Int indentation := 0
** Sink for all output
OutStream? out := null
}