0
|
1 package nabble.naml.compiler;
|
|
2
|
|
3 import java.util.Collections;
|
|
4 import java.util.List;
|
|
5 import java.util.ArrayList;
|
|
6 import java.util.Iterator;
|
|
7 import java.util.Map;
|
|
8
|
|
9
|
|
10 final class MacroNamespace implements GenericNamespace {
|
|
11 private final Macro macro;
|
|
12 private final List<String> names = new ArrayList<String>();
|
|
13
|
|
14 MacroNamespace(Macro macro,StackTrace stackTrace,Map<String,List<Macro>> macros)
|
|
15 throws CompileException
|
|
16 {
|
|
17 this.macro = macro;
|
|
18 while(true) {
|
|
19 names.add(macro.name);
|
|
20 if( macro.extendsNs == null )
|
|
21 break;
|
|
22 stackTrace.push( new StackTraceElement(macro) );
|
|
23 try {
|
|
24 List<Macro> candidates = macros.get(macro.extendsNs);
|
|
25 if( candidates==null )
|
|
26 throw new CompileException(stackTrace,"'extend' namespace not found: "+macro.extendsNs);
|
|
27 for( Iterator<Macro> iter = candidates.iterator(); iter.hasNext(); ) {
|
|
28 Macro m = iter.next();
|
|
29 if( m.type != Macro.Type.NAMESPACE )
|
|
30 iter.remove();
|
|
31 }
|
|
32 if( candidates.size() == 0 )
|
|
33 throw new CompileException(stackTrace,"'extend' namespace not found: "+macro.extendsNs);
|
|
34 if( candidates.size() > 1 )
|
|
35 throw new CompileException(stackTrace,"duplicate 'extend' namespaces: "+candidates);
|
|
36 macro = candidates.get(0);
|
|
37 } finally {
|
|
38 stackTrace.pop();
|
|
39 }
|
|
40 }
|
|
41 }
|
|
42
|
|
43 @Override public boolean isGlobal() {
|
|
44 return true;
|
|
45 }
|
|
46
|
|
47 @Override public boolean isTransparent() {
|
|
48 return false;
|
|
49 }
|
|
50
|
|
51 @Override public List<String> names() {
|
|
52 return names;
|
|
53 }
|
|
54
|
|
55 @Override public String getId() {
|
|
56 return macro.getId();
|
|
57 }
|
|
58
|
|
59 @Override public boolean equals(Object obj) {
|
|
60 if( !(obj instanceof MacroNamespace) )
|
|
61 return false;
|
|
62 MacroNamespace ns = (MacroNamespace)obj;
|
|
63 return names.equals(ns.names);
|
|
64 }
|
|
65
|
|
66 @Override public int hashCode() {
|
|
67 return names.hashCode();
|
|
68 }
|
|
69
|
|
70 @Override public String toString() {
|
|
71 return names.get(0);
|
|
72 }
|
|
73 }
|