mirror of
https://github.com/Eaglercraft-TeaVM-Fork/eagler-teavm.git
synced 2024-12-22 16:14:10 -08:00
Fix circular reference support in toString of collection classes (#552)
This commit is contained in:
parent
66ce993019
commit
8122095193
|
@ -56,6 +56,10 @@ class TAbstractStringBuilder extends TObject implements TSerializable, TCharSequ
|
||||||
length = value.length();
|
length = value.length();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TAbstractStringBuilder append(Object obj) {
|
||||||
|
return append(String.valueOf(obj));
|
||||||
|
}
|
||||||
|
|
||||||
protected TAbstractStringBuilder append(String string) {
|
protected TAbstractStringBuilder append(String string) {
|
||||||
return insert(length, string);
|
return insert(length, string);
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,11 @@ public class TStringBuffer extends TAbstractStringBuilder implements TAppendable
|
||||||
super(value);
|
super(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TStringBuffer append(Object obj) {
|
||||||
|
return append(String.valueOf(obj));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TStringBuffer append(String string) {
|
public TStringBuffer append(String string) {
|
||||||
super.append(string);
|
super.append(string);
|
||||||
|
|
|
@ -32,6 +32,11 @@ public class TStringBuilder extends TAbstractStringBuilder implements TAppendabl
|
||||||
super(value);
|
super(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TStringBuilder append(Object obj) {
|
||||||
|
return append(String.valueOf(obj));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TStringBuilder append(String string) {
|
public TStringBuilder append(String string) {
|
||||||
super.append(string);
|
super.append(string);
|
||||||
|
|
|
@ -142,15 +142,17 @@ public abstract class TAbstractCollection<E> extends TObject implements TCollect
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
sb.append("[");
|
sb.append('[');
|
||||||
TIterator<E> iter = iterator();
|
TIterator<E> iter = iterator();
|
||||||
if (iter.hasNext()) {
|
if (iter.hasNext()) {
|
||||||
sb.append(String.valueOf(iter.next()));
|
E e = iter.next();
|
||||||
|
sb.append(e == this ? "(this Collection)" : iter.next());
|
||||||
}
|
}
|
||||||
while (iter.hasNext()) {
|
while (iter.hasNext()) {
|
||||||
sb.append(", ").append(String.valueOf(iter.next()));
|
E e = iter.next();
|
||||||
|
sb.append(", ").append(e == this ? "(this Collection)" : iter.next());
|
||||||
}
|
}
|
||||||
sb.append("]");
|
sb.append(']');
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -265,6 +265,28 @@ public abstract class TAbstractMap<K, V> extends TObject implements TMap<K, V> {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append('{');
|
||||||
|
TIterator<TMap.Entry<K, V>> iter = entrySet().iterator();
|
||||||
|
if (iter.hasNext()) {
|
||||||
|
TMap.Entry<K, V> e = iter.next();
|
||||||
|
sb.append(e.getKey() == this ? "(this Map)" : e.getKey());
|
||||||
|
sb.append('=');
|
||||||
|
sb.append(e.getValue() == this ? "(this Map)" : e.getValue());
|
||||||
|
}
|
||||||
|
while (iter.hasNext()) {
|
||||||
|
sb.append(", ");
|
||||||
|
TMap.Entry<K, V> e = iter.next();
|
||||||
|
sb.append(e.getKey() == this ? "(this Map)" : e.getKey());
|
||||||
|
sb.append('=');
|
||||||
|
sb.append(e.getValue() == this ? "(this Map)" : e.getValue());
|
||||||
|
}
|
||||||
|
sb.append('}');
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Object clone() throws TCloneNotSupportedException {
|
protected Object clone() throws TCloneNotSupportedException {
|
||||||
TAbstractMap<?, ?> copy = (TAbstractMap<?, ?>) super.clone();
|
TAbstractMap<?, ?> copy = (TAbstractMap<?, ?>) super.clone();
|
||||||
|
|
|
@ -195,4 +195,19 @@ public class TArrayList<E> extends TAbstractList<E> implements TCloneable, TSeri
|
||||||
action.accept(array[i]);
|
action.accept(array[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
if (size == 0) {
|
||||||
|
return "[]";
|
||||||
|
}
|
||||||
|
int length = size - 1;
|
||||||
|
StringBuilder buffer = new StringBuilder(size * 16);
|
||||||
|
buffer.append('[');
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
buffer.append(array[i] == this ? "(this Collection)" : array[i]).append(", ");
|
||||||
|
}
|
||||||
|
buffer.append(array[length] == this ? "(this Collection)" : array[length]);
|
||||||
|
return buffer.append(']').toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -174,4 +174,14 @@ public class ArrayListTest {
|
||||||
assertEquals("A1", list.get(0));
|
assertEquals("A1", list.get(0));
|
||||||
assertEquals("B1", list.get(1));
|
assertEquals("B1", list.get(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testToString() {
|
||||||
|
List list = new ArrayList<>();
|
||||||
|
list.add(list);
|
||||||
|
list.add("A");
|
||||||
|
|
||||||
|
assertEquals("[(this Collection), A]", list.toString());
|
||||||
|
assertEquals("[]", new ArrayList().toString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -550,4 +550,14 @@ public class LinkedHashMapTest {
|
||||||
}
|
}
|
||||||
assertTrue("Entries left to iterate on", !it2.hasNext());
|
assertTrue("Entries left to iterate on", !it2.hasNext());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test_to_String() {
|
||||||
|
LinkedHashMap lhm = new LinkedHashMap();
|
||||||
|
lhm.put("A", lhm);
|
||||||
|
lhm.put("B", "C");
|
||||||
|
|
||||||
|
assertEquals("{A=(this Map), B=C}", lhm.toString());
|
||||||
|
assertEquals("{}", new LinkedHashMap().toString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user