【发布时间】:2015-03-19 00:30:59
【问题描述】:
出于某些原因,我的JvmModelInferrer 需要 搜索满足条件的特殊类型的所有元素。这些元素是完全推断模型所必需的。但是所有这些元素都可以分布在项目的所有源代码文件中。更准确地说:有一个元素引入了一个类和几个元素修改了这个类。这个语法看起来像这样(简化到最小深度):
DeltaAction:
AddsUnit | ModifiesUnit | RemovesUnit;
AddsUnit:
{AddsUnit} 'adds' '{' unit=JavaCompilationUnit? '}';
JavaCompilationUnit:
('package' name=QualifiedName EOL)?
importSection=XImportSection?
// ...
typeDeclarations=ClassOrInterface;
ClassOrInterface:
ClassDeclaration /* | ... */;
ClassDeclaration:
'class' name=QualifiedName
// ...
;
ModifiesUnit:
'modifies' unit=[ClassOrInterface|QualifiedName] '{'
// ...
'}';
如果我现在推断类pkg.A 的jvm 模型,我需要找到所有引用pkg.A 的ModifiesUnit 单元来生成这个类。
这或多或少是一个问题:如何找到所有引用pkg.A 的元素?我找到了一个灵魂,但我认为它的性能非常低下,也许有任何 API 对我来说效率更高。
类 DeltaJJvmModelInferrer 扩展 AbstractModelInferrer {
@Inject ResourceDescriptionsProvider descsProvider
@Inject ResourceSet set
@Inject IQualifiedNameProvider qnameProvider
def dispatch void infer(DeltaJUnit unit, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) {
descsProvider.createResourceDescriptions.allResourceDescriptions.forEach [ rd |
val res = set.getResource(rd.URI, true)
res.unload
res.load(null)
EcoreUtil2.resolveAll(res)
]
try {
set.allContents.filter(typeof(ModifiesUnit)).filter [ mu |
qnameProvider.getFullyQualifiedName(mu.unit).equals(qnameProvider.getFullyQualifiedName(cd))
].forEach [ mu |
// Do the stuff I need to do!
]
} catch (Exception e) {
return
}
]
}
【问题讨论】:
-
用想要的名称询问所有 ModifiesUnit 的索引然后看看?
-
看看索引中的参考说明
-
我还没有使用索引。我明天看看。有没有关于它的使用的文档?
-
descsProvider.createResourceDescriptions 是索引 - 不,没有文档 - 但您可以向 iresourcedescription 询问信息
-
另一种可能性是将信息直接存储在索引中(修改 DefaultResourceDEscriptionStrategy 并将信息存储在用户数据映射中) - 使用 nodemodelutils 检索信息,因为模型未链接)