1

Xtext 2.4.2 と Eclipse Kepler に移行した後、DSL のエディターに問題が発生しました。以前はすべてが完全に機能していました (Xtext 2.3.x、Juno)。

初期化リストを編集すると、DSL エディターは ClassCastException をスローします。 [1,2,3] Xtext エラー ポップアップ

再現する手順:

  1. 新しい「Xtext State-Machine Example」プロジェクトを作成します
  2. 以下の文法を編集してください
  3. パッケージ org.eclipse.xtext.example.fowlerdsl.generator を削除します (4 で再生成されます)。
  4. org.eclipse.xtext.example.fowlerdsl.GenerateStatemachine.mwe2 ワークフローを実行します
  5. 日食アプリケーションを実行する
  6. 空のプロジェクトに新しいファイル (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スローされる例外 (以前)はNullPointerExceptionVariable.valueStateMachine

エラーのスタック トレース:

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
4

2 に答える 2