我开发了一个带有xText的DSL,最近添加了somme增强完成功能。 在通过Ctrl-Space调用完成时在xText生成的编辑器中,完成处理程序必须执行文件夹扫描以在同一DSL的另一个文本文件中查找符号。 切入点是:
public class TypesProposalProvider extends AbstractTypesProposalProvider
{
public void completeQualifiedName_Path(
EObject model,
Assignment assignment,
ContentAssistContext context,
ICompletionProposalAcceptor acceptor )
{
super.completeQualifiedName_Path( model, assignment, context, acceptor );
我用:
Model root = (Model) context.getRootModel();
Resource rootRc = root.eResource();
获取模型的emf.ecore容器。
现在,我如何根据ecore资源查找兄弟资源,同一文件夹中的其他文件?
使用另一个资源,我将调用Resource.load()来填充兄弟姐妹的底层emf.ecore模型。
我希望你能理解我的近似英语(我是法语)...
答案 0 :(得分:0)
我假设兄弟姐妹的模特互不推荐。在这种情况下,您可以使用WorkspaceSynchronizer从资源中获取文件。
实施例
Resource rootRc = root.eResource();
IFile file = WorkspaceSynchronizer.getFile(rootRc);
IResource parent = file.getParent();
Iresource[] childern = parent.members();
for(<iterate over children>)
load the children resources.
希望这有帮助。
答案 1 :(得分:0)
这是最终版本,像往常一样紧凑;-):
Resource rootRc = root.eResource();
String rcPath = rootRc.getURI().toPlatformString( true );
IFile file = (IFile)ResourcesPlugin.getWorkspace().getRoot().findMember( rcPath );
IContainer parent = file.getParent();
for( IResource member : parent.members())
{
String ext = member.getFileExtension();
if( ext != null && ext.equals( "types" ))
{
String prefix = member.getName();
String path = member.getLocation().toString();
URI uriSibling = URI.createFileURI( path );
prefix = prefix.substring( 0, prefix.length() - ".types".length());
if( ! rcPath.endsWith( '/' + prefix + ".types" )
&& ( context.getPrefix().isEmpty() || prefix.startsWith( cntxtPrefix )))
{
Resource types = rs.createResource( uriSibling );
types.load( null );
for( EObject rc : types.getContents())
{
...
}
}
}
}