| /******************************************************************************* |
| * 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 java.util.ArrayList; |
| import java.util.HashSet; |
| import java.util.List; |
| import java.util.Set; |
| |
| import org.eclipse.dltk.javascript.typeinference.IValueCollection; |
| import org.eclipse.dltk.javascript.typeinference.IValueReference; |
| |
| public class NestedValueCollection extends ValueCollection { |
| |
| protected NestedValueCollection(IValueCollection parent) { |
| super(parent); |
| } |
| |
| public boolean isScope() { |
| return false; |
| } |
| |
| @Override |
| public IValueReference getReturnValue() { |
| return getParent().getReturnValue(); |
| } |
| |
| @Override |
| public IValueReference getThis() { |
| return getParent().getThis(); |
| } |
| |
| @Override |
| public boolean equals(Object obj) { |
| if (obj instanceof NestedValueCollection) { |
| return getParent() |
| .equals(((NestedValueCollection) obj).getParent()); |
| } |
| return super.equals(obj); |
| } |
| |
| @Override |
| public int hashCode() { |
| return getParent().hashCode(); |
| } |
| |
| protected static void mergeTo(IValueCollection parent, |
| final List<NestedValueCollection> collections) { |
| final Set<String> names = new HashSet<String>(); |
| for (NestedValueCollection collection : collections) { |
| names.addAll(collection.getValue() |
| .getDirectChildren(IValue.DEFAULT)); |
| } |
| List<IValueReference> childValues = new ArrayList<IValueReference>(); |
| for (String childName : names) { |
| childValues.clear(); |
| for (NestedValueCollection collection : collections) { |
| final IValueReference childValue = collection |
| .getChild(childName); |
| if (childValue.exists()) { |
| childValues.add(childValue); |
| } |
| } |
| IValueReference value = parent.getChild(childName); |
| boolean set = collections.size() == 2 |
| && childValues.size() == collections.size(); |
| for (IValueReference childValue : childValues) { |
| if (set) |
| value.setValue(childValue); |
| else |
| value.addValue(childValue, false); |
| set = false; |
| } |
| } |
| } |
| |
| } |