在迁移到Xtext 2.4.2和Eclipse Kepler之后,我们的DSL编辑器出现了一个问题。之前一切都很完美(Xtext 2.3.x,Juno)。
编辑初始化列表时,我们的DSL编辑器会抛出ClassCastException:
[1,2,3]
重现的步骤:
语法:
grammar org.eclipse.xtext.example.fowlerdsl.Statemachine
with org.eclipse.xtext.common.Terminals
generate statemachine "http://www.eclipse.org/xtext/example/fowlerdsl/Statemachine"
Statemachine : {Statemachine}
(vars += VarDeclWithOptionalInit)*
;
VarDeclWithOptionalInit returns Variable:
VarDecl ('=' value=AstExpression)?
;
VarDecl returns Variable:
'var' name = ID
;
AstExpression:
ExpressionList
| {AstExpression} INT
;
ExpressionList:
'[' expressions+=AstExpression (',' expressions+=AstExpression)* ']'
;
example.statemachine的内容
//Adding space between chars inside [] cause Exception
var example1 = [1, 2, 3]
//Doing the same in [10, 20] or [30, 40] is Ok, but modifying
//the top-level list cause the Exception
var example2 = [[10, 20], 0, [30, 40], 1, 2]
我认为示例文件的内容是正确的。但是当我使用新值编辑列表时,或者当我在逗号或值周围添加空格时,编辑器会弹出一个来自XtextReconcilierJob的ClassCastException的错误。
你认为我的语法有问题,还是来自Xtext方面的错误?
其他信息
我反对这种情况已经有好几天了,我收集了一些有趣的信息:
NullPointerException
。
PartialParsingHelper.reparse(IParser parser, IParseResult prev, ReplaceRegion cr)
有一种奇怪的行为Statemachine.eSet()
而不是Variable.eSet()
ClassCastException
来自相同的功能ID:
StateMachine.vars
的功能ID == 0 Variable.value
的功能ID == 0 Variable
中添加一些BEFORE值功能,则抛出的异常(较早)为NullPointerException
,因为Variable.value
在{{1}时具有功能ID == 2或3只有2个功能(0和1)错误的StackTrace:
StateMachine
答案 0 :(得分:1)
xText bugzilla中已经有一个bugifix。它是org.eclipse.parser.impl.PartialParsingHelper
的补丁。解决问题:
public Class bindIPartialParserHelper()
来注册此类(项目中的geenrated类,扩展org.eclipse.xtext.service.DefaultRuntimeModule)问题在于重新解析已经解析过的语言部分:旧元素的父容器未正确设置。新元素与旧元素链接,而不是旧元素的父元素。
我猜你自己已经知道这个了,但是这个说明可能会帮助下一个有同样问题的人。
答案 1 :(得分:0)
Xtext团队确认这是2.4.x版本的错误。有关错误修正的更多详细信息和通知,请参阅the related issue。