我在我的 DSL 中添加了一个 quickfix 选项,我想在其中对文档文本进行一些修改 - 包括重命名某些元素。我可以很好地更改该元素中的文本,但我还想重命名它的所有引用 - 即重命名重构。我怎么做?
我可以以某种方式从 quickfix 内部触发内置的重命名重构吗?或者,我如何查看所有元素的引用并更改它们?
我在我的 DSL 中添加了一个 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());
}
});
}
您可以IXtextDocument
从任一IssueResolutionAcceptor
(如果您正在处理问题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();
]
}