我在Eclipse论坛中发布了以下注释:https://www.eclipse.org/forums/index.php/t/1072029/。这有所有细节,但我会在这里重复一遍。
我正在使用一个有点复杂的Eclipse插件代码库。它用于编辑特定语言的文件。我很擅长维护Eclipse插件。原作者并不容易获得。
代码库是开源的,它位于https://github.com/xored/yang-ide的github上。
插件的语言与XML有一些相似之处(不在语法中),因为一个模块可以按名称“导入”另一个模块,并指定与该导入文件中的符号相关联的前缀。该语言还具有“use”命令,该命令采用表示结构化类型的符号名称。符号名称可以带或不带前缀。结构化类型可以在该模块中定义,也可以在导入的模块中定义。
插件有一个功能,我可以选择符号名称的定义,然后在“重构”子菜单中选择“重命名”。它将在文件中选择该符号名称的所有出现,并提示我重命名它,就像Java编辑器(和其他人)的工作方式一样。
问题是,它选择替换的某些事件可能无效。如果我在该模块中选择了一个符号名称,该符号名称恰好与导入模块中的符号同名,该模块由此模块中的前缀引用,当我选择“重命名”操作时,它也会标记那些带前缀的事件。 ,即使他们提到了不同的符号。
令我困惑的是,尽管我可以完全访问此插件的源代码,但我无法弄清楚它在哪里确定要选择的符号。我找到了一个RenameAction
类,它扩展了Action并实现了ISelectionChangedListener
,但是其中没有任何东西似乎有这个逻辑。我想在这里做的事情肯定有一些“固有的”,这样逻辑已经在SDK中提供了,我只是看不到它的来源。
我能够从主机上的Eclipse实例建立一个远程调试系统,连接到运行在VM中的Eclipse测试实例,因此我不会遇到任何问题,因为单步执行事件驱动的代码。
我可以使用任何想法来跟踪Eclipse插件中的这类问题。我想其他插件也有类似的行为。
答案 0 :(得分:2)
似乎该操作只收集了一些信息(如文件),然后调用RenameLinkedMode
来完成工作。
对RenameSupport.findLocalReferences()
的调用似乎最有希望成为您的错误来源。
关于调试的注意事项:您可以尝试向插件添加日志记录,以查看调试过于复杂时的操作。
或者您可以尝试chronon,它可以让您记录程序执行并及时前进或后退,或者回答诸如“此值来自何处?”等问题。