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 }