package org.erlide.naming; import org.eclipse.emf.ecore.EObject; import org.eclipse.xtext.naming.DefaultDeclarativeQualifiedNameProvider; import org.eclipse.xtext.naming.IQualifiedNameConverter; import org.eclipse.xtext.naming.QualifiedName; import org.erlide.erlang.DefineAttribute; import org.erlide.erlang.Expression; import org.erlide.erlang.Function; import org.erlide.erlang.ModelExtensions; import org.erlide.erlang.Module; import org.erlide.erlang.RecordAttribute; import org.erlide.erlang.RecordFieldDef; import org.erlide.erlang.TypeAttribute; import com.google.inject.Inject; public class ErlangQualifiedNameProvider extends DefaultDeclarativeQualifiedNameProvider { @Inject private IQualifiedNameConverter converter; @Inject private ModelExtensions modelExtensions; QualifiedName qualifiedName(final Module module) { String name = modelExtensions.getName(module); if (name == null) { // TODO this isn't very unique! we should use the physical path, or // something name = module.eResource().getURI().lastSegment() .replaceAll("\\.", "_"); } return QualifiedName.create(name); } QualifiedName qualifiedName(final DefineAttribute macro) { return splice(getParentsFullyQualifiedName(macro), converter.toQualifiedName(macro.getMacroName())); } QualifiedName qualifiedName(final RecordAttribute record) { return splice(getParentsFullyQualifiedName(record), converter.toQualifiedName(record.getName())); } QualifiedName qualifiedName(final RecordFieldDef field) { return splice(getParentsFullyQualifiedName(field), converter.toQualifiedName(field.getName())); } QualifiedName qualifiedName(final Function function) { // even private functions get a FQN, we filter them out in the global // scope manager return splice( getParentsFullyQualifiedName(function), converter.toQualifiedName(function.getName() + "/" + modelExtensions.getArity(function))); } QualifiedName qualifiedName(final Expression expression) { // TODO return null; } QualifiedName qualifiedName(final TypeAttribute type) { return splice(getParentsFullyQualifiedName(type), converter.toQualifiedName(type.getName())); } public static QualifiedName splice(final QualifiedName a, final QualifiedName b) { return a == null ? b : a.append(b); } /** * The fully qualified name of the closest named parent. */ QualifiedName getParentsFullyQualifiedName(final EObject o) { for (EObject tmp = o.eContainer(); tmp != null; tmp = tmp.eContainer()) { final QualifiedName n = getFullyQualifiedName(tmp); if (n != null) { return n; } } return null; } }