Mercurial Hosting > nabble
comparison 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 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:7ecd1a4ef557 |
---|---|
1 package nabble.naml.compiler; | |
2 | |
3 import java.lang.reflect.Method; | |
4 import fschmidt.util.java.Interner; | |
5 import nabble.naml.dom.Element; | |
6 | |
7 | |
8 public final class StackTraceElement { | |
9 | |
10 private static final Interner<StackTraceElement> interner = new Interner<StackTraceElement>(); | |
11 | |
12 public final Source source; | |
13 private final int lineNumber; | |
14 private final Element element; | |
15 private final String commandName; | |
16 private Method method; | |
17 | |
18 StackTraceElement(Source source,int lineNumber) { | |
19 this.source = source; | |
20 this.lineNumber = lineNumber; | |
21 this.element = null; | |
22 this.commandName = null; | |
23 } | |
24 | |
25 public StackTraceElement(Source source,Element element) { | |
26 this(source,element,(String)null); | |
27 } | |
28 | |
29 StackTraceElement(Macro macro) { | |
30 this(macro.source,macro.element); | |
31 } | |
32 | |
33 StackTraceElement(Source source,Element element,String commandName) { | |
34 this.source = source; | |
35 this.lineNumber = element.lineNumber(); | |
36 this.element = element; | |
37 this.commandName = commandName==null ? null : commandName.intern(); | |
38 } | |
39 | |
40 StackTraceElement(Source source,Element element,JavaCommand javaCommand) { | |
41 this(source,element,javaCommand.name); | |
42 setMethod(javaCommand.method); | |
43 } | |
44 | |
45 void setMethod(Method method) { | |
46 this.method = method; | |
47 } | |
48 | |
49 @Override public boolean equals(Object obj) { | |
50 if( !(obj instanceof StackTraceElement) ) | |
51 return false; | |
52 StackTraceElement ste = (StackTraceElement)obj; | |
53 return ste.source == source | |
54 && ste.lineNumber == lineNumber | |
55 && ste.element == element | |
56 && ste.commandName == commandName | |
57 ; | |
58 } | |
59 | |
60 @Override public int hashCode() { | |
61 int hash = source.id.hashCode(); | |
62 hash = 31*hash + lineNumber; | |
63 if( element != null ) | |
64 hash = 31*hash + element.hashCode(); | |
65 if( commandName != null ) | |
66 hash = 31*hash + commandName.hashCode(); | |
67 return hash; | |
68 } | |
69 | |
70 StackTraceElement intern() { | |
71 return interner.intern(this); | |
72 } | |
73 | |
74 public String toString() { | |
75 if( element == null ) | |
76 return source + ":" + (lineNumber+1); | |
77 StringBuilder sb = new StringBuilder(); | |
78 if( commandName != null ) | |
79 sb.append( commandName ); | |
80 sb | |
81 .append( "(" ) | |
82 .append( source ) | |
83 .append( ":" ) | |
84 .append( lineNumber+1 ) | |
85 .append( ") - " ) | |
86 .append( element.openingTag() ) | |
87 ; | |
88 if( method != null ) | |
89 sb.append( " - " ).append( method ); | |
90 return sb.toString(); | |
91 } | |
92 | |
93 String commandName() { | |
94 return commandName; | |
95 } | |
96 } |