Eclipse CDT扩展适配器工厂

Eclipse CDT扩展适配器工厂,eclipse,eclipse-plugin,eclipse-cdt,Eclipse,Eclipse Plugin,Eclipse Cdt,我试图覆盖CDT ResumeAtLine、MoveToLine、RunToLine的功能。因此,我创建了一个自定义SuspendResumeAdapterFactory,但它没有加载,但编译和运行时没有错误。我是否也需要一个自定义的AdaptiableType 下面是我的plugin.xml的内容 这里是我的CustomSuspendResumeAdapterFactory这个类是从内存中重建的,不能100%确定语法是否正确,但我认为应该清楚地看到我想要做什么 package my.pac

我试图覆盖CDT ResumeAtLine、MoveToLine、RunToLine的功能。因此,我创建了一个自定义SuspendResumeAdapterFactory,但它没有加载,但编译和运行时没有错误。我是否也需要一个自定义的AdaptiableType

下面是我的
plugin.xml
的内容


这里是我的
CustomSuspendResumeAdapterFactory
这个类是从内存中重建的,不能100%确定语法是否正确,但我认为应该清楚地看到我想要做什么

package my.package;
导入org.eclipse.cdt.dsf.datamodel.dmcontext;
导入org.eclipse.cdt.dsf.debug.internal.ui.actions.MoveToLine;
导入org.eclipse.cdt.dsf.debug.internal.ui.actions.ResumeAtLine;
导入org.eclipse.cdt.dsf.debug.internal.ui.actions.RunToLine;
导入org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerDMContext;
导入org.eclipse.cdt.dsf.debug.service.IRunControl.IExecutionDMContext;
导入org.eclipse.cdt.dsf.ui.viewmodel.datamodel.IDMVMContext;
导入org.eclipse.core.runtime.IAdaptable;
导入org.eclipse.core.runtime.IAdapterFactory;
导入org.eclipse.debug.core.DebugException;
导入org.eclipse.debug.core.model.ISuspendResume;
公共类CustomSuspendResumeAdapterFactory实现IAdapterFactory{
静态类SuspendResume实现ISuspendResume、IAdaptable{
私人最终客户Runtoline fRunToLine;
私人最终客户移动电话线;
私人最终客户关系;
SuspendResume(IExecutionDMContext execCtx){
fRunToLine=新的CustomRunToLine(execCtx);
fMoveToLine=新的CustomMoveToLine(execCtx);
fResumeAtLine=新的CustomResumeAtLine(execCtx);
}
@抑制警告(“未选中”)
@凌驾
公共T getAdapter(类适配器){
if(adapter.isInstance(RunToLine.class)){
System.out.println(“自定义运行线”);
返回(T)fRunToLine;
}
if(adapter.isInstance(MoveToLine.class)){
System.out.println(“自定义移动线”);
返回(T)fMoveToLine;
}
if(适配器.isInstance(ResumeToLine.class)){
System.out.println(“自定义简历列表”);
返回(T)Fresumatline;
}
返回null;
}
@凌驾
公共布尔值canResume(){return false;}
@凌驾
公共布尔canSuspend(){return false;}
//这必须返回true,因为平台
//RunToLineActionDelegate将仅启用
//如果我们被停职,我们将采取行动
@凌驾
公共布尔isSuspended(){return true;}
@凌驾
public void resume()引发调试异常{}
@凌驾
public void suspend()引发调试异常{}
}
@抑制警告(“未选中”)
@凌驾
公共T getAdapter(对象AdapterObject,类adapterType){
if(ISuspendResume.class.equals(adapterType)){
if(IDMVMContext的AdaptiableObject实例){
IExecutionDMContext execDmc=DMContexts.getAncestorOfType(
((IDMVMContext)AdapteableObject).getDMContext(),
iexecutionmcontext.class);
//只有使用RunToLine、MoveToLine或
//ResumeAtLine如果我们处理的是线程,而不是容器
if(execDmc!=null&&!(execDmc instanceof IContainerDMContext)){
返回(T)新的SuspendResume(execDmc);
}
}
}
返回null;
}
@凌驾
公共类[]getAdapterList(){
返回新类[]{ISuspendResume.Class};
}
}
为什么您的代码没有运行 您提供了一个新的适配器工厂,用于转换已处理的对象类型。i、 e.plugin.xml表示您可以将
IVMContext
转换为
ISuspendResume
。但是DSF插件已经提供了这样一个适配器工厂。如果您有一个新的目标类型(如IMySpecialRunToLine),您可以为此安装一个工厂,它需要
IVMContext
并将其转换为
IMySpecialRunToLine

虽然已过时,但如果这是一个新概念,则可能有用

如何执行自定义的运行到行实现 如果希望提供不同的运行到行的实现,则需要提供自己版本的
org.eclipse.cdt.dsf.debug.service.iruncontroll2.runToLine(IExecutionDMContext、String、int、boolean、RequestMonitor)
。org.eclipse.cdt.dsf.debug.internal.ui.actions.RunToLine类只是将ui功能(例如按钮等)直接连接到dsf后端,有些是由核心eclipse调试提供的。i、 e.如果你看一下
RunToLine
的功能,它实际上所做的就是获取
iruncontroll2
服务并调用
RunToLine

提供自己的
iruncontroll2
实现的方法是覆盖
org.eclipse.cdt.dsf.gdb.service.GdbDebugServicesFactory.createRunControlService(DsfSession)
并通过覆盖
org.eclipse.cdt.dsf.gdb.launching.GdbLaunchDelegate.newServiceFactory(ILaunchConfiguration,String)在自定义启动委托中提供您自己的
GdbDebugServicesFactory

当用户从编辑器的弹出菜单中选择Run To Line(运行到线路)时,将触发
RunToLine
,如以下屏幕截图所示:


什么时候触发“运行路线”?设法创建CustomGDBRunControl扩展了GDBRunControl,但既没有调用通常的MIRunControl.runToLine,也没有调用我的自定义行:-/我以为它会在“单步执行”命令后触发?单步执行和运行到行是两件截然不同的事情,单步执行由
org.eclipse.cdt.dsf.debug.service.IRunControl.step(IEExecution)处理