/*******************************************************************************
* Copyright (c) 2013 itemis AG (http://www.itemis.eu) and others.
* 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
*******************************************************************************/
package org.eclipse.emf.ecore.xcore.scoping.types;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.common.types.JvmType;
import org.eclipse.xtext.naming.QualifiedName;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.eclipse.xtext.scoping.IScope;
import com.google.common.collect.Lists;
public abstract class AbstractXcoreScope implements IScope
{
public IEObjectDescription getSingleElement(QualifiedName name)
{
throw new UnsupportedOperationException();
}
public Iterable<IEObjectDescription> getElements(QualifiedName name)
{
throw new UnsupportedOperationException();
}
public IEObjectDescription getSingleElement(EObject object)
{
Iterator<IEObjectDescription> elements = getElements(object).iterator();
if (elements.hasNext())
{
IEObjectDescription result = elements.next();
String resultName = result.getName().toString();
while (elements.hasNext())
{
IEObjectDescription candidate = elements.next();
String candidateName = candidate.getName().toString();
int candidateNameLength = candidateName.length();
int resultNameLength = resultName.length();
if (candidateNameLength < resultNameLength)
{
result = candidate;
resultName = candidateName;
}
else if (candidateNameLength == resultNameLength)
{
// prefer '.' over '$'
if (candidate.getQualifiedName().getSegmentCount() > result.getQualifiedName().getSegmentCount())
{
result = candidate;
resultName = candidateName;
}
}
}
return result;
}
return null;
}
public final Iterable<IEObjectDescription> getElements(EObject object)
{
if (!(object instanceof JvmType) || object.eIsProxy())
{
throw new IllegalArgumentException(String.valueOf(object));
}
List<IEObjectDescription> result = Lists.newLinkedList();
doGetElements((JvmType) object, result);
for (Iterator<IEObjectDescription> iterator = result.iterator(); iterator.hasNext(); )
{
IEObjectDescription description = iterator.next();
IEObjectDescription lookUp = getSingleElement(description.getName());
if (lookUp == null || lookUp.getEObjectOrProxy() != object)
{
iterator.remove();
}
}
return result;
}
protected abstract void doGetElements(JvmType type, List<IEObjectDescription> result);
public Iterable<IEObjectDescription> getAllElements()
{
throw new UnsupportedOperationException();
}
}