| /******************************************************************************* |
| * Copyright (c) 2010 xored software, Inc. |
| * |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * xored software, Inc. - initial API and Implementation (Alex Panchenko) |
| *******************************************************************************/ |
| package org.eclipse.dltk.internal.javascript.ti; |
| |
| import org.eclipse.dltk.javascript.typeinference.IValueCollection; |
| import org.eclipse.dltk.javascript.typeinference.IValueReference; |
| |
| public class ChildReference extends AbstractReference { |
| |
| private final IValueProvider parent; |
| private final String name; |
| |
| public ChildReference(IValueProvider parent, String name) { |
| this.parent = parent; |
| this.name = name; |
| } |
| |
| public boolean isReference() { |
| if (FUNCTION_OP.equals(name) || ARRAY_OP.equals(name)) { |
| return false; |
| } |
| return parent.isReference(); |
| } |
| |
| @Override |
| public IValue getValue() { |
| if (parent instanceof IValueCollection) { |
| return findChild((IValueCollection) parent, name); |
| } |
| IValue parentValue = parent.getValue(); |
| if (parentValue != null) { |
| return parentValue.getChild(name, true); |
| } |
| return null; |
| } |
| |
| private static IValue findChild(IValueCollection collection, String name) { |
| while (collection != null) { |
| if (collection instanceof IValueProvider) { |
| // XXX WithValueCollection doesn't implement IValueProvider |
| IValue childValue = ((IValueProvider) collection).getValue() |
| .getChild(name, true); |
| if (childValue != null) { |
| return childValue; |
| } |
| } |
| collection = collection.getParent(); |
| } |
| return null; |
| } |
| |
| @Override |
| public IValue createValue() { |
| if (parent instanceof IValueCollection) { |
| IValue childValue = findChild((IValueCollection) parent, name); |
| if (childValue != null) { |
| return childValue; |
| } |
| } |
| IValue parentValue = parent.createValue(); |
| if (parentValue != null) { |
| return parentValue.createChild(name, 0); |
| } else { |
| return null; |
| } |
| } |
| |
| public IValueReference getParent() { |
| if (parent instanceof IValueReference) { |
| return (IValueReference) parent; |
| } else { |
| return null; |
| } |
| } |
| |
| public void delete(boolean force) { |
| final IValue value = parent.getValue(); |
| if (value != null) { |
| value.deleteChild(name, force); |
| } |
| } |
| |
| public String getName() { |
| return name; |
| } |
| |
| @Override |
| public String toString() { |
| return parent.toString() + "." + name; |
| } |
| |
| @Override |
| public boolean equals(Object obj) { |
| if (obj instanceof ChildReference) { |
| final ChildReference other = (ChildReference) obj; |
| return name.equals(other.name) && parent.equals(other.parent); |
| } |
| return false; |
| } |
| |
| @Override |
| public int hashCode() { |
| return name.hashCode(); |
| } |
| |
| } |