eclispe java预览_Java-自定义Eclipse重构的预览错误

我正在实现新的Eclipse重构。 这将使开发人员能够将前提条件语句从子方法上拉到父方法。

当我在重构向导中选择“完成”时,所有这些都可以完美地工作,但是当我选择“预览”时,会出现错误“未提供目标编辑”。 这似乎是由于从createMoveTarget返回的TextEdit中的问题引起的。但是我不知道为什么。

运行我的createMoveTarget代码后,会发生异常的堆栈跟踪,并将更改用于生成预览。

org.eclipse.text.edits.MalformedTreeException: No target edit provided.

at org.eclipse.text.edits.MoveSourceEdit.performConsistencyCheck(MoveSourceEdit.java:208)

at org.eclipse.text.edits.TextEdit.traverseConsistencyCheck(TextEdit.java:873)

at org.eclipse.text.edits.MoveSourceEdit.traverseConsistencyCheck(MoveSourceEdit.java:183)

at org.eclipse.text.edits.TextEdit.traverseConsistencyCheck(TextEdit.java:869)

at org.eclipse.text.edits.TextEdit.traverseConsistencyCheck(TextEdit.java:869)

at org.eclipse.text.edits.TextEditProcessor.checkIntegrityDo(TextEditProcessor.java:176)

at org.eclipse.text.edits.TextEdit.dispatchCheckIntegrity(TextEdit.java:743)

at org.eclipse.text.edits.TextEditProcessor.performEdits(TextEditProcessor.java:151)

at org.eclipse.ltk.core.refactoring.TextChange.getPreviewDocument(TextChange.java:534)

at org.eclipse.ltk.core.refactoring.TextChange.getPreviewDocument(TextChange.java:403)

at org.eclipse.ltk.core.refactoring.TextChange.getPreviewContent(TextChange.java:411)

at org.eclipse.ltk.internal.ui.refactoring.TextEditChangePreviewViewer.setInput(TextEditChangePreviewViewer.java:209)

at org.eclipse.ltk.internal.ui.refactoring.AbstractChangeNode.feedInput(AbstractChangeNode.java:99)

at org.eclipse.ltk.internal.ui.refactoring.PreviewWizardPage.showPreview(PreviewWizardPage.java:598)

at org.eclipse.ltk.internal.ui.refactoring.PreviewWizardPage.access$6(PreviewWizardPage.java:583)

at org.eclipse.ltk.internal.ui.refactoring.PreviewWizardPage$7.selectionChanged(PreviewWizardPage.java:574)

at org.eclipse.jface.viewers.Viewer$2.run(Viewer.java:162)

at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)

at org.eclipse.core.runtime.Platform.run(Platform.java:888)

at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48)

at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175)

at org.eclipse.jface.viewers.Viewer.fireSelectionChanged(Viewer.java:160)

at org.eclipse.jface.viewers.StructuredViewer.updateSelection(StructuredViewer.java:2132)

at org.eclipse.jface.viewers.StructuredViewer.setSelection(StructuredViewer.java:1669)

at org.eclipse.jface.viewers.TreeViewer.setSelection(TreeViewer.java:1124)

at org.eclipse.jface.viewers.Viewer.setSelection(Viewer.java:392)

at org.eclipse.ltk.internal.ui.refactoring.PreviewWizardPage.setVisible(PreviewWizardPage.java:505)

at org.eclipse.ltk.internal.ui.refactoring.RefactoringWizardDialog2.makeVisible(RefactoringWizardDialog2.java:762)

at org.eclipse.ltk.internal.ui.refactoring.RefactoringWizardDialog2.showCurrentPage(RefactoringWizardDialog2.java:477)

at org.eclipse.ltk.internal.ui.refactoring.RefactoringWizardDialog2.nextOrPreviewPressed(RefactoringWizardDialog2.java:507)

at org.eclipse.ltk.internal.ui.refactoring.RefactoringWizardDialog2.access$2(RefactoringWizardDialog2.java:492)

at org.eclipse.ltk.internal.ui.refactoring.RefactoringWizardDialog2$1.widgetSelected(RefactoringWizardDialog2.java:691)

at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:228)

at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)

at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003)

at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3880)

at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3473)

at org.eclipse.jface.window.Window.runEventLoop(Window.java:825)

at org.eclipse.jface.window.Window.open(Window.java:801)

at org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation$1.run(RefactoringWizardOpenOperation.java:143)

at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)

at org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation.run(RefactoringWizardOpenOperation.java:155)

at org.jmlspecs.eclipse.refactor.action.AbstractMethodActionDelegate.run(AbstractMethodActionDelegate.java:78)

at org.jmlspecs.eclipse.refactor.action.AbstractMethodActionDelegate.run(AbstractMethodActionDelegate.java:67)

at org.eclipse.ui.internal.PluginAction.runWithEvent(PluginAction.java:251)

at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:584)

at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:501)

at org.eclipse.jface.action.ActionContributionItem$6.handleEvent(ActionContributionItem.java:452)

at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)

at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003)

at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3880)

at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3473)

at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2405)

at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2369)

at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2221)

at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:500)

at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)

at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:493)

at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)

at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:113)

at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:194)

at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)

at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)

at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:368)

at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

at java.lang.reflect.Method.invoke(Unknown Source)

at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:559)

at org.eclipse.equinox.launcher.Main.basicRun(Main.java:514)

at org.eclipse.equinox.launcher.Main.run(Main.java:1311)

at org.eclipse.equinox.launcher.Main.main(Main.java:1287)

当前,执行更改的代码如下所示:

CompilationUnit sourceNode = ...

ASTRewrite sourceRewrite = ASTRewrite.create(sourceNode.getAST());

Statement statement = ...

sourceRewrite.createMoveTarget(statement);

CompilationUnit destinationNode = ...

MethodDeclaration destinationMethod = ...

ASTRewrite destinationRewrite = ASTRewrite.create(destinationNode.getAST());

ListRewrite lrw = destinationRewrite.getListRewrite(destinationMethod.getBody(),

Block.STATEMENTS_PROPERTY);

lrw.insertFirst(statement, null);

我知道使用createMoveTarget的方式不是如何记录它,但是当我遵循如下文档时,该语句已从源中删除,但没有移到目标位置,并且在预览中仍然出现相同的错误。

CompilationUnit sourceNode = ...

ASTRewrite sourceRewrite = ASTRewrite.create(sourceNode.getAST());

Statement statement = ...

Statement replacement = sourceRewrite.createMoveTarget(statement);

sourceRewrite.remove(statement, null);

CompilationUnit destinationNode = ...

MethodDeclaration destinationMethod = ...

ASTRewrite destinationRewrite = ASTRewrite.create(destinationNode.getAST());

ListRewrite lrw = destinationRewrite.getListRewrite(destinationMethod.getBody(),

Block.STATEMENTS_PROPERTY);

lrw.insertFirst(replacement, null);

这是执行重构的示例。

之前:

class A {

foo(int a) {

return a * 2;

}

}

class B {

foo(int a) {

JC.requires(a > 1);

return a * 3;

}

}

后:

class A {

foo(int a) {

JC.requires(a > 1);

return a * 2;

}

}

class B extends A {

foo(int a) {

return a * 3;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值