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();