Implicit imports based on type [message #734541] |
Sat, 08 October 2011 10:10  |
Eclipse User |
|
|
|
In the language I am modeling there exists a type called Enum. If an Enum is imported, it's constructors should also be imported.
I can not find a good way to solve this using xText. I tried using my custom scope provider with a loop through all available Enum objects. This slows down building to a crawl.
I am now trying to use an extended version of the ImportedNamespaceAwareLocalScopeProvider. I will have to override the 'getImplicitImports' and the 'internalGetImportedNamespaceResolvers' methods in order to add ImportNormalizers. The overridden code will look something like this:
IEObjectDescription singleElement = globalScope.getSingleElement(qualifiedName);
if (singleElement != null && singleElement.getEClass().equals(eClass))
{
Enum resolve = (Enum) EcoreUtil2.resolve(singleElement.getEObjectOrProxy(), res);
EList<EnumConstructor> constructors = resolve.getConstructors();
for (EnumConstructor constructor : constructors)
{
implicitImports.add(new ImportNormalizer(qualifiedName.append(constructor.getName()), false, ignoreCase));
}
}
Is there a better way to do this, or am I on the right track?
How would I deal with wild card imports? If "my.package.*" is imported, how do I loop though all Enums within that package?
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Re: Implicit imports based on type [message #735855 is a reply to message #735845] |
Wed, 12 October 2011 17:51   |
Eclipse User |
|
|
|
For now I solved it by overriding the createImportScope method of the ImportedNamespaceAwareLocalScopeProvider class.
protected ImportScope createImportScope(IScope parent, List<ImportNormalizer> namespaceResolvers, ISelectable importFrom, EClass type, boolean ignoreCase) {
List<ImportNormalizer> newNamespaceResolvers = namespaceResolvers;
if (isFeature(type)) {
newNamespaceResolvers = Lists.newArrayList(namespaceResolvers);
try {
importedNamespacePrefixField.setAccessible(true);
for (ImportNormalizer namespaceResolver : namespaceResolvers) {
QualifiedName qn = (QualifiedName) importedNamespacePrefixField.get(namespaceResolver);
IEObjectDescription singleElement = parent.getSingleElement(qn);
if (singleElement != null && isEnum(singleElement)) {
newNamespaceResolvers.add(new ImportNormalizer(qn, true, ignoreCase));
}
}
importedNamespacePrefixField.setAccessible(false);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
return super.createImportScope(parent, newNamespaceResolvers, importFrom, type, ignoreCase);
}
As you can see this requires some reflection. I will file a feature request that asks for a getImportedNamespace() or getImportedNamespacePrefix() method on ImportNormalizer
|
|
|
|
Powered by
FUDForum. Page generated in 0.04765 seconds