2

要素の名前を変更するなど、文書のテキストにいくつかの変更を加えたい DSL にクイックフィックス オプションを追加しました。その要素のテキストは問題なく変更できますが、そのすべての参照の名前も変更したいと考えています。つまり、リファクタリングの名前を変更します。それ、どうやったら出来るの?

どうにかしてクイックフィックス内から組み込みの名前変更リファクタリングをトリガーできますか? または、すべての要素の参照を調べて変更するにはどうすればよいですか?

4

2 に答える 2

1

そこで、プログラムで名前変更リファクタリングをトリガーする方法を見つけました。それが「適切な」方法であるかどうかはわかりませんが@SuppressWarnings("restriction")、コードに追加する必要があったため、そうではないと思いますが、機能します。

private void performDirectRenameRefactoring(EObject object, String newName) throws InterruptedException {
    XtextEditor editor = EditorUtils.getActiveXtextEditor();
    IRenameElementContext renameContext = new IRenameElementContext.Impl(
        EcoreUtil.getURI(object),
        object.eClass(),
        editor,
        editor.getSelectionProvider().getSelection(),
        null);
    IRenameSupport rename = renameSupportFactory.create(renameContext, newName);
    rename.startDirectRefactoring();
}

したがって、これをクイックフィックスから呼び出すには、を取得しEObjectて新しい名前を計算するだけです。問題がそれ自体の一部を占める場合、EObjectオブジェクトは次の方法で取得できます。

private EObject findObject(IXtextDocument doc, final Issue issue) {
    EObject object = doc.readOnly(new IUnitOfWork<EObject, XtextResource>() {
        public EObject exec(XtextResource state) throws Exception {
            return state.getEObject(issue.getUriToProblem().fragment());
        }
    });
}

から(問題を処理している場合は持っている必要があります)または(変更を提案している場合は持っている必要があります)IXtextDocumentから取得できます。IssueResolutionAcceptorIModificationContext

于 2013-01-26T10:10:50.430 に答える
0

オーク、解決策をどうもありがとう。これが私のバージョンの Xtend です。

@Inject(optional=true)
IRenameSupport.Factory renameSupportFactory;

@Inject(optional=true)
IRenameContextFactory renameContextFactory;

@Fix(VhdlValidator::INVALID_SIGNAL_NAME_ENDING)
def addSignalEnding(Issue issue, IssueResolutionAcceptor acceptor) {
    acceptor.accept(issue, 'Add the "_s" ending', 'Add the "_s" ending.', 'upcase.png') [
        EObject element, IModificationContext context |

        val editor = EditorUtils.getActiveXtextEditor();

        val renameElementContext = editor.getDocument().readOnly(
            new IUnitOfWork<IRenameElementContext, XtextResource>() 
            {
                override def IRenameElementContext exec(XtextResource state) 
                {
                    renameContextFactory.createRenameElementContext(element,
                            editor, null, state);
                }
            });

        val rename = renameSupportFactory.create(renameElementContext, (element as Signal).name + "_s" );
        rename.startDirectRefactoring();

    ]
}
于 2014-08-22T08:58:30.647 に答える