2017年3月12日日曜日

EClassの識別を属性名name以外に設定する場合の注意点

 xtextのデフォルトのインスタンスの識別は属性名nameで判断している。
そのため、属性名name以外で判断したい場合は、変更する必要がある。

  • 対象 
    •  bindIQualifiedNameProvider 
      • QualifiedNameを解釈するための定義
      • デフォルトでは、DefaultDeclarativeQualifiedNameProviderを使っている。


  • 拡張方法
    • DefaultDeclarativeQualifiedNameProviderを継承したクラスを作成する。
    • QualifiedNameを取得する方法をname->別名に変更する 
    • MyDslRuntimeModule.xtendでbindするクラスをoverrideで変更する。


/*
 * generated by Xtext 2.9.1
 */
package org.xtext.example.mydsl

import org.eclipse.xtext.naming.IQualifiedNameProvider

/**
 * Use this class to register components to be used at runtime / without the Equinox extension registry.
 */
class MyDslRuntimeModule extends AbstractMyDslRuntimeModule {
  

 override Class bindIQualifiedNameProvider() {
  return MyDslQNP;
 }
 
}

MyDslQNP.java
package org.xtext.example.mydsl;

import org.eclipse.sirius.sample.basicfamily.Identifier;
import org.eclipse.xtext.naming.DefaultDeclarativeQualifiedNameProvider;
import org.eclipse.xtext.naming.QualifiedName;
 
public class MyDslQNP extends DefaultDeclarativeQualifiedNameProvider{
 
    QualifiedName qualifiedName(Identifier e) {
        return QualifiedName.create(e.getShortName());
    }
 
}


Outlineの表示もカスタマイズが必要になる。

MyDslOutlineTreeProvider


class MyDslOutlineTreeProvider extends DefaultOutlineTreeProvider {
 
 override protected _text(Object modelElement) {
  if( modelElement instanceof Identifiable){
   return (modelElement as Identifiable).shortName
  }
 }
 
}

0 件のコメント:

コメントを投稿