Mercurial Hosting > luan
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 } |