fix for (very likely code with warnings) java.lang.StackOverflowError at org.eclipse.dltk.internal.javascript.ti.ElementValue.findMember(ElementValue.java:110) at org.eclipse.dltk.internal.javascript.ti.ElementValue.findMemberA(ElementValue.java:100) at org.eclipse.dltk.internal.javascript.ti.ImmutableValue$GetChildHandler.process(ImmutableValue.java:221) at org.eclipse.dltk.internal.javascript.ti.ImmutableValue$GetChildHandler.process(ImmutableValue.java:1) at org.eclipse.dltk.internal.javascript.ti.ImmutableValue.execute(ImmutableValue.java:89) at org.eclipse.dltk.internal.javascript.ti.ImmutableValue.getChild(ImmutableValue.java:328) at org.eclipse.dltk.internal.javascript.ti.ChildReference.getValue(ChildReference.java:41) at org.eclipse.dltk.internal.javascript.ti.ChildReference.getValue(ChildReference.java:39) at org.eclipse.dltk.internal.javascript.ti.AbstractReference.exists(AbstractReference.java:114) at org.eclipse.dltk.javascript.typeinfo.RLocalType.getChild(RLocalType.java:86) at org.eclipse.dltk.javascript.typeinfo.RLocalType.getDirectChild(RLocalType.java:52) at org.eclipse.dltk.internal.javascript.ti.ElementValue.findMember(ElementValue.java:198) at org.eclipse.dltk.internal.javascript.ti.ElementValue.findMemberA(ElementValue.java:100) at org.eclipse.dltk.internal.javascript.ti.ImmutableValue$GetChildHandler.process(ImmutableValue.java:221) at org.eclipse.dltk.internal.javascript.ti.ImmutableValue$GetChildHandler.process(ImmutableValue.java:1) at org.eclipse.dltk.internal.javascript.ti.ImmutableValue.execute(ImmutableValue.java:89) at org.eclipse.dltk.internal.javascript.ti.ImmutableValue.execute(ImmutableValue.java:92) at org.eclipse.dltk.internal.javascript.ti.ImmutableValue.getChild(ImmutableValue.java:328) at org.eclipse.dltk.internal.javascript.ti.ChildReference.getValue(ChildReference.java:41) at org.eclipse.dltk.internal.javascript.ti.ChildReference.getValue(ChildReference.java:39) at org.eclipse.dltk.internal.javascript.ti.AbstractReference.exists(AbstractReference.java:114) at org.eclipse.dltk.javascript.typeinfo.RLocalType.getChild(RLocalType.java:86) at org.eclipse.dltk.javascript.typeinfo.RLocalType.getDirectChild(RLocalType.java:52) at org.eclipse.dltk.internal.javascript.ti.ElementValue.findMember(ElementValue.java:198) at org.eclipse.dltk.internal.javascript.ti.ElementValue.findMemberA(ElementValue.java:100) at org.eclipse.dltk.internal.javascript.ti.ImmutableValue$GetChildHandler.process(ImmutableValue.java:221) at org.eclipse.dltk.internal.javascript.ti.ImmutableValue$GetChildHandler.process(ImmutableValue.java:1) at org.eclipse.dltk.internal.javascript.ti.ImmutableValue.execute(ImmutableValue.java:89) at org.eclipse.dltk.internal.javascript.ti.ImmutableValue.execute(ImmutableValue.java:92) at org.eclipse.dltk.internal.javascript.ti.ImmutableValue.getChild(ImmutableValue.java:328) at org.eclipse.dltk.internal.javascript.ti.ChildReference.getValue(ChildReference.java:41) at org.eclipse.dltk.internal.javascript.ti.ChildReference.getValue(ChildReference.java:39) at org.eclipse.dltk.internal.javascript.ti.AbstractReference.exists(AbstractReference.java:114) at org.eclipse.dltk.javascript.typeinfo.RLocalType.getChild(RLocalType.java:86) at org.eclipse.dltk.javascript.typeinfo.RLocalType.getDirectChild(RLocalType.java:52) at org.eclipse.dltk.internal.javascript.ti.ElementValue.findMember(ElementValue.java:198) at org.eclipse.dltk.internal.javascript.ti.ElementValue.findMemberA(ElementValue.java:100)
diff --git a/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/javascript/typeinfo/RLocalType.java b/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/javascript/typeinfo/RLocalType.java index c8dc5f1..1257501 100644 --- a/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/javascript/typeinfo/RLocalType.java +++ b/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/javascript/typeinfo/RLocalType.java
@@ -48,8 +48,17 @@ return PhantomValueReference.REFERENCE; } + private HashSet<String> recusionCheck = new HashSet<String>(); + public IValueReference getDirectChild(String name) { - return getChild(this, name, new HashSet<IRType>()); + if (recusionCheck.contains(name)) + return null; + recusionCheck.add(name); + try { + return getChild(this, name, new HashSet<IRType>()); + } finally { + recusionCheck.remove(name); + } } /** @@ -57,7 +66,7 @@ * @param declaredTypes * @param set */ - private IValueReference getChildFromDeclaredTypes(String name, + private static IValueReference getChildFromDeclaredTypes(String name, JSTypeSet declaredTypes, HashSet<IRType> set) { for (IRType irType : declaredTypes) { if (irType instanceof RLocalType) { @@ -69,7 +78,7 @@ return null; } - private IValueReference getChild(RLocalType irType, String name, + private static IValueReference getChild(RLocalType irType, String name, HashSet<IRType> set) { if (set.add(irType)) { IValueReference declaredValue = irType.getValue();