Xtext - 如何通过文件名进行交叉引用?

Xtext - how to make cross-references by file name?

我想在 XText 中交叉引用,而不是通过使用其他文件中的某些属性,而是通过文件元数据(文件名)。

import: "string_msg/msg/StringMessage"

inputs:
    name: testString
    type: types.string_msg.StringMessage   # this is the cross-reference
    description: "Here goes some type of description or the other"      

"string_msg/msg/StringMessage"所属的语言只包含属性信息,不包含类型名称。我必须从文件名中导出类型名称,但理想情况下使引用文件的模型对象可用。

我该怎么做?到目前为止,我看到的所有示例都通过名称属性引用了其他 EObject。

您可以调整 IQualifiedNameProvider 并使用 EObjects eResource 和资源 URI 来计算名称。

package org.xtext.example.mydsl10;

import org.eclipse.emf.common.util.URI;
import org.eclipse.xtext.naming.DefaultDeclarativeQualifiedNameProvider;
import org.eclipse.xtext.naming.QualifiedName;
import org.xtext.example.mydsl10.myDsl.Greeting;

public class MyDslNameProvider extends DefaultDeclarativeQualifiedNameProvider {

    public QualifiedName qualifiedName(Greeting g) {
        URI uri = g.eResource().getURI();
        // this is your job 
        String simpleName = uri.trimFileExtension().lastSegment();
        return QualifiedName.create(simpleName, g.getName());
    }

}

别忘了绑定

class MyDslRuntimeModule extends AbstractMyDslRuntimeModule {

    override bindIQualifiedNameProvider() {
        MyDslNameProvider
    }

}