gpt4 book ai didi

java - Xtext:如何从 JvmTypeReference 获取集合类型参数(泛型)?

转载 作者:行者123 更新时间:2023-11-29 09:07:50 25 4
gpt4 key购买 nike

在 Xtext 中,我试图编写一个实用方法来返回集合类型(通用类型),其中集合类型由解析器创建的 JvmTypeReference 表示,我需要知道类型参数:

@Inject TypeReferences typeReferences;
public JvmType getCollectionType(JvmTypeReference clazz) {
if (typeReferences.isInstanceOf(clazz, Collection.class)) {
collectionType = typeReferences.getArgument(clazz, 0);
return collectionType;
}
}

示例 1:输入 java.util.List<String>我希望该方法返回 java.lang.String ,示例 2:输入 java.util.Set<a.b.m.Book>返回 a.b.m.Book .

我需要我的生成器的集合类型参数类型。

听起来很有希望的typeReferences.getArgument(..)然而返回JvmParameterizedTypeReference: E其中 getType()给出 JvmTypeParameter <E> java.util.List .唔。我进了死胡同。

是否有可能或类型删除是否也适用于 JvmTypeReference ?我希望不会。

感谢您的任何提示。

最佳答案

已解决。 getCollectionType() 是正确的。不正确的是输入,即我创建 JvmTypeReference 的方式。它们并非直接源自已解析的模型。只有顶级元素在我的 DSL 中明确指定了类型。所有子元素类型都是使用 Xtext“内省(introspection)”以级联方式从上到下推断的。推断类型存储在模型本身中;各种其他东西都依赖于它们,比如验证。要在模型 AST 中存储一个推断的 JvmTypeReference,必须复制它。

我没有正确创建副本。错误的库调用。

错误:

public JvmTypeReference createDefensiveCopyOfJvmTypeReference(JvmTypeReference typeReference) {
return typeReferences.createTypeRef(typeReference.getType());
}

正确:

public JvmTypeReference createDefensiveCopyOfJvmTypeReference(JvmTypeReference   typeReference) {
return EcoreUtil.copy(typeReference);
}

嗯,TypeReferences#createTypeRef() 并非完全错误。它创建所需类型的副本,但表现出与 Java 类似的“类型删除”。

我也把这个问题放在了 Xtext forum 上.

查看我的 DeepCloneDSL完整源代码的项目。

附言
为什么我们必须复制一份 JvmTypeReference? Xtext 通用类型的其他实例? JvmTypeReference 是一个复杂类型,EObject,它本身是 AST 的一个片段,一个模型的片段。通过设置 JvmType 或类似类型的属性,可以将模型片段插入到另一个模型中;它不能插入两次或同时在两个不同的模型中。 Xtext 本身阻止了一些此类操作,有些更棘手,必须找到 the hard way .

关于java - Xtext:如何从 JvmTypeReference 获取集合类型参数(泛型)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13912053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com