package ch.vorburger.xtext.problems.crossnames.naming;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.naming.IQualifiedNameProvider;
import org.eclipse.xtext.naming.QualifiedName;
import org.eclipse.xtext.nodemodel.INode;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
import ch.vorburger.xtext.problems.crossnames.aLang.ModelA;
import ch.vorburger.xtext.problems.crossnames.bLang.BLangPackage;
import ch.vorburger.xtext.problems.crossnames.bLang.ModelB;
/**
* IQualifiedNameProvider for B.
*
* @author Michael Vorburger
*/
public class BLangNameProvider extends IQualifiedNameProvider.AbstractImpl {
@Override
public QualifiedName getFullyQualifiedName(EObject obj) {
if (obj == null)
return null;
ModelB b = (ModelB) obj;
// Do *NOT* resolve cross-references in order to create EObjectDescriptions! Else you'll hit a "Cyclic resolution of lazy links" AssertionError...
// @see http://www.eclipse.org/forums/index.php/m/707310/
// @see http://www.eclipse.org/forums/index.php/m/734839/
// @see http://www.eclipse.org/forums/index.php/m/802015/
// @see http://www.eclipse.org/forums/index.php/m/730141/
//
// ModelA forA = b.getModelA();
// if (forA == null)
// return null;
// final String aName = forA.getName();
//
// Instead like this:
List<INode> nodes = NodeModelUtils.findNodesForFeature(b, BLangPackage.Literals.MODEL_B__MODEL_A);
INode node = nodes.get(0);
final String aName = NodeModelUtils.getTokenText(node);
return QualifiedName.create(aName, b.getLocalNonUniqueName());
}
}