comparison core/src/luan/LuanTable.java @ 423:1eafb11a150d

remove Luan.repr()
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 01 May 2015 16:30:28 -0600
parents af82b266fe89
children 0a2fb80907f9
comparison
equal deleted inserted replaced
422:af82b266fe89 423:1eafb11a150d
13 import java.util.HashSet; 13 import java.util.HashSet;
14 import java.util.IdentityHashMap; 14 import java.util.IdentityHashMap;
15 import java.util.regex.Pattern; 15 import java.util.regex.Pattern;
16 16
17 17
18 public final class LuanTable implements Iterable<Map.Entry<Object,Object>>, LuanRepr, DeepCloneable<LuanTable> { 18 public final class LuanTable implements Iterable<Map.Entry<Object,Object>>, DeepCloneable<LuanTable> {
19 private Map<Object,Object> map = null; 19 private Map<Object,Object> map = null;
20 private List<Object> list = null; 20 private List<Object> list = null;
21 private LuanTable metatable = null; 21 private LuanTable metatable = null;
22 private boolean hasJava = false; 22 private boolean hasJava = false;
23 23
331 331
332 public LuanTable cloneTable() { 332 public LuanTable cloneTable() {
333 return isList() ? new LuanTable(new ArrayList<Object>(asList())) : new LuanTable(asMap()); 333 return isList() ? new LuanTable(new ArrayList<Object>(asList())) : new LuanTable(asMap());
334 } 334 }
335 335
336 @Override public String repr(LuanState luan) throws LuanException {
337 LuanFunction fn = luan.JAVA.getHandlerFunction("__repr",this);
338 if( fn != null )
339 return luan.JAVA.checkString( Luan.first( luan.call(fn,"__repr",new Object[]{this}) ) );
340 return repr( luan, Collections.newSetFromMap(new IdentityHashMap<LuanTable,Boolean>()) );
341 }
342
343 private String repr(LuanState luan,Set<LuanTable> set) throws LuanException {
344 if( !set.add(this) ) {
345 return "\"<circular reference>\"";
346 }
347 StringBuilder sb = new StringBuilder();
348 sb.append('{');
349 boolean isFirst = true;
350 for( Object obj : asList() ) {
351 if( isFirst ) {
352 isFirst = false;
353 } else {
354 sb.append(", ");
355 }
356 sb.append(repr(luan,set,obj));
357 }
358 for( Map.Entry<Object,Object> entry : map().entrySet() ) {
359 if( isFirst ) {
360 isFirst = false;
361 } else {
362 sb.append(", ");
363 }
364 sb.append(reprKey(luan,set,entry.getKey())).append('=').append(repr(luan,set,entry.getValue()));
365 }
366 sb.append('}');
367 return sb.toString();
368 }
369
370 private static final Pattern namePtn = Pattern.compile("[a-zA-Z_][a-zA-Z_0-9]*");
371
372 private String reprKey(LuanState luan,Set<LuanTable> set,Object obj) throws LuanException {
373 if( obj instanceof String ) {
374 String s = (String)obj;
375 if( namePtn.matcher(s).matches() )
376 return s;
377 }
378 return "[" + repr(luan,set,obj) + "]";
379 }
380
381 private String repr(LuanState luan,Set<LuanTable> set,Object obj) throws LuanException {
382 if( obj instanceof LuanTable ) {
383 LuanTable t = (LuanTable)obj;
384 return t.repr(luan,set);
385 } else {
386 String s = luan.repr(obj);
387 if( s == null )
388 s = "<couldn't repr: " + Luan.stringEncode(Luan.toString(obj)) + ">";
389 return s;
390 }
391 }
392
393 @Override public final String toString() { 336 @Override public final String toString() {
394 return "table: " + Integer.toHexString(hashCode()); 337 return "table: " + Integer.toHexString(hashCode());
395 } 338 }
396 339
397 } 340 }