Xtext 2.4.2 と Eclipse Kepler に移行した後、DSL のエディターに問題が発生しました。以前はすべてが完全に機能していました (Xtext 2.3.x、Juno)。
初期化リストを編集すると、DSL エディターは ClassCastException をスローします。
[1,2,3]
再現する手順:
- 新しい「Xtext State-Machine Example」プロジェクトを作成します
- 以下の文法を編集してください
- パッケージ org.eclipse.xtext.example.fowlerdsl.generator を削除します (4 で再生成されます)。
- org.eclipse.xtext.example.fowlerdsl.GenerateStatemachine.mwe2 ワークフローを実行します
- 日食アプリケーションを実行する
- 空のプロジェクトに新しいファイル (example.statemachine) を作成し、次の内容をコピーします。
文法:
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 側のバグですか?
追加情報
私は数日間これと戦っており、いくつかの興味深い情報を収集しました。
- この例では、エディターは、内部リストからではなく、最上位リストから要素を編集する場合にのみスローします (example2 変数を参照)。
- 私のテストで
NullPointerException
は、コール スタックの早い段階で a がスローされることがありました。- メソッド
PartialParsingHelper.reparse(IParser parser, IParseResult prev, ReplaceRegion cr)
が奇妙な動作をしていると思われます - このメソッドは、モデル内の現在変更されている要素の親を見つけて、新しい値でこれに対して eSet() を呼び出します。
Statemachine.eSet()
しかし、私たちの場合、代わりに呼び出そうとしますVariable.eSet()
- は
ClassCastException
、等しい機能 ID から取得されます。StateMachine.vars
機能 ID == 0 を持っていますVariable.value
機能 ID == 0 を持っています- しかし、2つの機能は同じタイプではありません
- にいくつかの機能BEFORE値を追加すると、
Variable
スローされる例外 (以前)はNullPointerException
Variable.value
StateMachine
- メソッド
エラーのスタック トレース:
Thread [Worker-2] (Suspended (exception ClassCastException))
StatemachineImpl.eSet(int, Object) line: 128
StatemachineImpl(BasicEObjectImpl).eSet(EStructuralFeature, Object) line: 1071
PartialParsingHelper.reparse(IParser, IParseResult, ReplaceRegion) line: 161
StatemachineParser(AbstractAntlrParser).doReparse(IParseResult, ReplaceRegion) line: 136
StatemachineParser(AbstractParser).reparse(IParseResult, ReplaceRegion) line: 48
LazyLinkingResource(XtextResource).update(int, int, String) line: 220
XtextDocumentReconcileStrategy.doReconcile(IRegion) line: 125
XtextDocumentReconcileStrategy.reconcile(IRegion) line: 55
XtextReconciler.doRun(XtextResource, IProgressMonitor) line: 329
XtextReconciler.access$3(XtextReconciler, XtextResource, IProgressMonitor) line: 316
XtextReconciler$1.process(XtextResource) line: 273
XtextReconciler$1.process(Object) line: 1
XtextReconciler$1(IUnitOfWork$Void<T>).exec(T) line: 36
XtextDocument$XtextDocumentLocker(AbstractReadWriteAcces<P>).modify(IUnitOfWork<T,P>) line: 81
XtextDocument$XtextDocumentLocker.modify(IUnitOfWork<T,XtextResource>) line: 201
XtextDocument.internalModify(IUnitOfWork<T,XtextResource>) line: 98
XtextReconciler.run(IProgressMonitor) line: 270
Worker.run() line: 53