Mercurial Hosting > luan
comparison core/src/luan/AbstractLuanTable.java @ 355:1bce334a816b
AbstractLuanTable now implements LuanRepr
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 14 Apr 2015 09:33:34 -0600 |
parents | 9fb523472035 |
children | 1a464e090538 |
comparison
equal
deleted
inserted
replaced
354:705e4d6c3dbb | 355:1bce334a816b |
---|---|
12 import java.util.HashSet; | 12 import java.util.HashSet; |
13 import java.util.IdentityHashMap; | 13 import java.util.IdentityHashMap; |
14 import java.util.regex.Pattern; | 14 import java.util.regex.Pattern; |
15 | 15 |
16 | 16 |
17 public abstract class AbstractLuanTable implements LuanTable { | 17 public abstract class AbstractLuanTable implements LuanTable, LuanRepr { |
18 | 18 |
19 protected final Map<Object,Object> newMap() { | 19 protected final Map<Object,Object> newMap() { |
20 return new LinkedHashMap<Object,Object>(); | 20 return new LinkedHashMap<Object,Object>(); |
21 } | 21 } |
22 | 22 |
40 Map<Object,Object> map = newMap(); | 40 Map<Object,Object> map = newMap(); |
41 for( Map.Entry<Object,Object> entry : this ) { | 41 for( Map.Entry<Object,Object> entry : this ) { |
42 map.put(entry.getKey(),entry.getValue()); | 42 map.put(entry.getKey(),entry.getValue()); |
43 } | 43 } |
44 return map; | 44 return map; |
45 } | |
46 | |
47 // shouldn't include list | |
48 protected Map<Object,Object> map() { | |
49 return asMap(); | |
45 } | 50 } |
46 | 51 |
47 protected abstract String type(); | 52 protected abstract String type(); |
48 | 53 |
49 @Override public final String toString() { | 54 @Override public final String toString() { |
94 } | 99 } |
95 | 100 |
96 @Override public void setJava() { | 101 @Override public void setJava() { |
97 throw new UnsupportedOperationException(); | 102 throw new UnsupportedOperationException(); |
98 } | 103 } |
104 | |
105 @Override public String repr() { | |
106 return repr( Collections.newSetFromMap(new IdentityHashMap<AbstractLuanTable,Boolean>()) ); | |
107 } | |
108 | |
109 private String repr(Set<AbstractLuanTable> set) { | |
110 if( !set.add(this) ) { | |
111 return "\"<circular reference>\""; | |
112 } | |
113 StringBuilder sb = new StringBuilder(); | |
114 sb.append('{'); | |
115 boolean isFirst = true; | |
116 for( Object obj : asList() ) { | |
117 if( isFirst ) { | |
118 isFirst = false; | |
119 } else { | |
120 sb.append(", "); | |
121 } | |
122 sb.append(repr(set,obj)); | |
123 } | |
124 for( Map.Entry<Object,Object> entry : map().entrySet() ) { | |
125 if( isFirst ) { | |
126 isFirst = false; | |
127 } else { | |
128 sb.append(", "); | |
129 } | |
130 sb.append(reprKey(set,entry.getKey())).append('=').append(repr(set,entry.getValue())); | |
131 } | |
132 sb.append('}'); | |
133 return sb.toString(); | |
134 } | |
135 | |
136 private static final Pattern namePtn = Pattern.compile("[a-zA-Z_][a-zA-Z_0-9]*"); | |
137 | |
138 private String reprKey(Set<AbstractLuanTable> set,Object obj) { | |
139 if( obj instanceof String ) { | |
140 String s = (String)obj; | |
141 if( namePtn.matcher(s).matches() ) | |
142 return s; | |
143 } | |
144 return "[" + repr(set,obj) + "]"; | |
145 } | |
146 | |
147 String repr(Set<AbstractLuanTable> set,Object obj) { | |
148 if( obj instanceof AbstractLuanTable ) { | |
149 AbstractLuanTable t = (AbstractLuanTable)obj; | |
150 return t.repr(set); | |
151 } else { | |
152 String s = Luan.repr(obj); | |
153 if( s == null ) | |
154 s = "<couldn't repr: " + Luan.stringEncode(Luan.toString(obj)) + ">"; | |
155 return s; | |
156 } | |
157 } | |
158 | |
99 } | 159 } |