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
并使用 EObject
s 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
}
}
我想在 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
并使用 EObject
s 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
}
}