我正在使用Xtext的DSL生成器接口,以便基于我的Xtext DSL生成一些模型。一切正常,但是现在编写生成器时我遇到了一些问题。我正在使用生成器过滤掉Xtext DSL中声明的规则。我通过选择某些规则,然后将它们转换为Iterable
对象来实现,然后可以使用该对象过滤某些类型(请参见下面的代码中的toIterable.filter()
部分)。下面的代码包含一个for循环,它本身又包含3个嵌套的for循环。这些嵌套循环都对一种特定类型的方法语句(我在DSL中声明的类型)进行过滤。我想通过在filter()
方法中传递3种类型作为参数,将这3个for循环组合在一个for循环中。在这种情况下,将存在一个嵌套的for循环,条件理想的情况是:
for (eachMethodStatement : ifStatement.expression.eAllContents.toIterable.filter(StatementSort1, StatementSort2, StatementSort3)
问题是
filter()
方法仅接受一个参数(一种类型),所以现在我必须编写三个称为getDemand
的分派方法,它们基本上都相同。它现在可以工作,但是这迫使我为要过滤的每种类型编写很多样板代码。
是否有一种方法可以过滤多种类型(在一个for循环中)而无需创建大量样板代码?
for (ifStatement : ifElseStatement.eAllContents.toIterable.filter(IfStatements)){
for (persistenceFunction : ifStatement.expression.eAllContents.toIterable.filter(SingleLibraryPersistenceMethodStatement)) {
expressionDemand += getDemand(persistenceFunction,resourceTable)
}
for (interfaceFunction : ifStatement.expression.eAllContents.toIterable.filter(SingleLibraryInterFaceMethodStatement)) {
expressionDemand += getDemand(interfaceFunction,resourceTable)
}
for (businessFunction : ifStatement.expression.eAllContents.toIterable.filter(SingleLibraryBusinessMethodStatement)) {
expressionDemand += getDemand(businessFunction,resourceTable)
}
for (persistenceFunction : ifStatement.expression.eAllContents.toIterable.filter(RelationalOperator)) {
expressionDemand += getDemand(persistenceFunction,resourceTable)
}
}
我正在使用Xtext的DSL生成器接口,以便基于我的Xtext DSL生成一些模型。一切正常,但是现在编写生成器时我遇到了一些问题。我...
<T> T filter(Class<T>)
不能执行多种类型,因为返回类型不能为T
,而是-在极端情况下必须稍后转换的Object
。