| package org.eclipse.dltk.internal.javascript.ti; |
| |
| import java.util.Map; |
| import java.util.Set; |
| |
| import org.eclipse.dltk.javascript.typeinference.IValueCollection; |
| import org.eclipse.dltk.javascript.typeinference.IValueReference; |
| |
| public class ImmutableValueCollection implements IValueCollection, |
| IValueProvider { |
| |
| public static ImmutableValueCollection getImmutableValueCollection( |
| IValueCollection collection, Map<Object, Object> visited) { |
| if (collection == null) |
| return null; |
| ImmutableValueCollection readOnlyCol = (ImmutableValueCollection) visited |
| .get(collection); |
| if (readOnlyCol != null) |
| return readOnlyCol; |
| |
| readOnlyCol = new ImmutableValueCollection(); |
| visited.put(collection, readOnlyCol); |
| |
| boolean reference = false; |
| IValue value = null; |
| if (collection instanceof IValueProvider) { |
| reference = ((IValueProvider) collection).isReference(); |
| value = ((IValueProvider) collection).getValue(); |
| if (value instanceof Value) |
| value = ((Value) value).getImmutableValue(visited); |
| } |
| IValue thisValue = null; |
| if (collection.getThis() instanceof IValueProvider) { |
| thisValue = ((IValueProvider) collection.getThis()).getValue(); |
| if (thisValue instanceof Value) |
| thisValue = ((Value) thisValue).getImmutableValue(visited); |
| } |
| IValue returnValue = null; |
| if (collection.getReturnValue() instanceof IValueProvider) { |
| returnValue = ((IValueProvider) collection.getReturnValue()) |
| .getValue(); |
| if (returnValue instanceof Value) |
| returnValue = ((Value) returnValue).getImmutableValue(visited); |
| } |
| readOnlyCol.init(collection.isScope(), reference, |
| getImmutableValueCollection(collection.getParent(), visited), |
| value, thisValue, returnValue); |
| return readOnlyCol; |
| } |
| |
| private boolean scope; |
| private boolean reference; |
| private IValueCollection parent; |
| private IValue value; |
| private IValueReference thisValue; |
| private IValueReference returnValue; |
| |
| public ImmutableValueCollection() { |
| } |
| |
| public void init(boolean scope, boolean reference, IValueCollection parent, |
| IValue value, IValue thisValue, IValue returnValue) { |
| this.scope = scope; |
| this.reference = reference; |
| this.parent = parent; |
| this.value = value; |
| this.thisValue = new AnonymousValue(thisValue); |
| this.returnValue = new AnonymousValue(returnValue); |
| } |
| |
| public boolean isReference() { |
| return reference; |
| } |
| |
| public IValue getValue() { |
| return value; |
| } |
| |
| public IValue createValue() { |
| return getValue(); |
| } |
| |
| public final Set<String> getDirectChildren() { |
| return getDirectChildren(IValue.DEFAULT); |
| } |
| |
| public Set<String> getDirectChildren(int flags) { |
| return value.getDirectChildren(flags); |
| } |
| |
| public Set<String> getDeletedChildren() { |
| return value.getDeletedChildren(); |
| } |
| |
| public boolean hasChild(String name) { |
| IValue value = getValue(); |
| return value != null && value.getChild(name, true) != null; |
| } |
| |
| public IValueReference getChild(String name) { |
| return new ChildReference(this, name); |
| } |
| |
| public boolean isScope() { |
| return scope; |
| } |
| |
| public IValueCollection getParent() { |
| return parent; |
| } |
| |
| public IValueReference createChild(String name) { |
| return null; |
| } |
| |
| public IValueReference getReturnValue() { |
| return returnValue; |
| } |
| |
| public IValueReference getThis() { |
| return thisValue; |
| } |
| } |