0

我用 xText 开发了一个 DSL,最近添加了一些增强的完成。在 xText 生成的编辑器中,当通过 Ctrl-Space 调用完成时,完成处理程序必须执行文件夹扫描以在同一 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 模型。

我希望你能理解我的近似英语(我是法国人)......

4

2 回答 2

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())
         {
            ...
         }
      }
   }
}
于 2012-10-11T17:52:54.107 回答
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. 

希望这可以帮助。

于 2012-10-11T12:56:53.383 回答