package org.eclipselabs.spray.xtext.customizing; import java.util.List; import org.eclipse.emf.ecore.EObject; import org.eclipse.xtext.common.types.JvmGenericType; import org.eclipse.xtext.naming.DefaultDeclarativeQualifiedNameProvider; import org.eclipse.xtext.naming.IQualifiedNameConverter; import org.eclipse.xtext.naming.QualifiedName; import org.eclipse.xtext.nodemodel.INode; import org.eclipse.xtext.nodemodel.util.NodeModelUtils; import org.eclipselabs.spray.mm.spray.MetaAttribute; import org.eclipselabs.spray.mm.spray.MetaClass; import org.eclipselabs.spray.mm.spray.Shape; import org.eclipselabs.spray.mm.spray.SprayPackage; import com.google.inject.Inject; public class SprayQualifiedNameProvider extends DefaultDeclarativeQualifiedNameProvider { @Inject private IQualifiedNameConverter converter; QualifiedName qualifiedName(JvmGenericType type) { return converter.toQualifiedName(type.getQualifiedName()); } public QualifiedName qualifiedName(MetaClass element) { List<INode> nodes = NodeModelUtils.findNodesForFeature(element, SprayPackage.Literals.META_CLASS__TYPE); String eClassName = NodeModelUtils.getTokenText(nodes.get(0)); return QualifiedName.create(element.getDiagram().getName(), eClassName); } /** * MetaAttribute has a name property, but we do not want to get it scoped */ public QualifiedName qualifiedName(MetaAttribute element) { return null; } public QualifiedName qualifiedName(Shape element) { EObject parentObject = element.eContainer(); QualifiedName parent = getFullyQualifiedName(parentObject); while (parent == null && parentObject != null) { parentObject = parentObject.eContainer(); parent = parentObject != null ? getFullyQualifiedName(parentObject) : null; } String name = element.eClass().getName() + element.eContainer().eContents().indexOf(element); return parent.append(name); } }