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;
	}
}