我已經在我的DSL中添加了一個quickfix選項,其中我想對文檔文本進行一些修改 - 包括重命名一些元素。我可以更改該元素中的文本,但我也想重命名其所有引用 - 即重命名重構。我怎麼做?如何使用重命名重構作爲quickfix的一部分?
我能以某種方式觸發quickfix內置的重命名重構嗎?或者,我該如何檢查所有元素的引用並更改它們?
我已經在我的DSL中添加了一個quickfix選項,其中我想對文檔文本進行一些修改 - 包括重命名一些元素。我可以更改該元素中的文本,但我也想重命名其所有引用 - 即重命名重構。我怎麼做?如何使用重命名重構作爲quickfix的一部分?
我能以某種方式觸發quickfix內置的重命名重構嗎?或者,我該如何檢查所有元素的引用並更改它們?
所以,我找到了一種以編程方式觸發重命名重構的方法。我不知道這是否是「正確」的方式 - 我猜是不是,因爲我不得不添加@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());
}
});
}
你可以從任何一個IssueResolutionAcceptor
IXtextDocument
(其中,如果你正在處理一個問題,你應該有),或者從IModificationContext
(如果你提出改變,你應該擁有這些)。
橡樹,非常感謝您的解決方案。這是我在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();
]
}