Hierarchical_Feature:
optional?=('opt')? name=ID (group=Feature_Group)?
| shared?='shared' ref=[Hierarchical_Feature|ID];
Feature_Group:
'group' cardinality=Cardinality '{' sub_features+=Hierarchical_Feature (',' sub_features+=Hierarchical_Feature)* '}';
Long_IDHeadAbstract: Feature | Hierarchical_Feature | Constant;
Long_ID: (head=[Long_IDHeadAbstract]| keyword=Shortcut) tail=(Long_IDTail)?;
Long_IDTail: '.' (head=[Hierarchical_Feature] (tail=Long_IDTail)?) | head=[Attribute];
QualifiedName qualifiedName(Hierarchical_Feature feature) {
if (!feature.isShared()) {
return QualifiedName.create(feature.getName());
}
else {
List<INode> nodes = NodeModelUtils.findNodesForFeature(feature,TVLPackage.Literals.FEATURE__REF);
if (!nodes.isEmpty()) {
INode first = nodes.get(0);
return QualifiedName.create(NodeModelUtils.getTokenText(first));
}
return QualifiedName.create("Shared error");//TODO: improve
}
}