Mercurial Hosting > nabble
view src/nabble/naml/compiler/StackTraceElement.java @ 0:7ecd1a4ef557
add content
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 21 Mar 2019 19:15:52 -0600 |
parents | |
children |
line wrap: on
line source
package nabble.naml.compiler; import java.lang.reflect.Method; import fschmidt.util.java.Interner; import nabble.naml.dom.Element; public final class StackTraceElement { private static final Interner<StackTraceElement> interner = new Interner<StackTraceElement>(); public final Source source; private final int lineNumber; private final Element element; private final String commandName; private Method method; StackTraceElement(Source source,int lineNumber) { this.source = source; this.lineNumber = lineNumber; this.element = null; this.commandName = null; } public StackTraceElement(Source source,Element element) { this(source,element,(String)null); } StackTraceElement(Macro macro) { this(macro.source,macro.element); } StackTraceElement(Source source,Element element,String commandName) { this.source = source; this.lineNumber = element.lineNumber(); this.element = element; this.commandName = commandName==null ? null : commandName.intern(); } StackTraceElement(Source source,Element element,JavaCommand javaCommand) { this(source,element,javaCommand.name); setMethod(javaCommand.method); } void setMethod(Method method) { this.method = method; } @Override public boolean equals(Object obj) { if( !(obj instanceof StackTraceElement) ) return false; StackTraceElement ste = (StackTraceElement)obj; return ste.source == source && ste.lineNumber == lineNumber && ste.element == element && ste.commandName == commandName ; } @Override public int hashCode() { int hash = source.id.hashCode(); hash = 31*hash + lineNumber; if( element != null ) hash = 31*hash + element.hashCode(); if( commandName != null ) hash = 31*hash + commandName.hashCode(); return hash; } StackTraceElement intern() { return interner.intern(this); } public String toString() { if( element == null ) return source + ":" + (lineNumber+1); StringBuilder sb = new StringBuilder(); if( commandName != null ) sb.append( commandName ); sb .append( "(" ) .append( source ) .append( ":" ) .append( lineNumber+1 ) .append( ") - " ) .append( element.openingTag() ) ; if( method != null ) sb.append( " - " ).append( method ); return sb.toString(); } String commandName() { return commandName; } }