无法弄清楚 eclipse 插件如何确定重命名选择
Can't figure out how eclipse plugin is determining renaming choices
我在 Eclipse 论坛上发布了以下说明:https://www.eclipse.org/forums/index.php/t/1072029/。这包含所有详细信息,但我会在这里重复它们。
我正在使用一个有点复杂的 Eclipse 插件代码库。它用于以特定语言编辑文件。我对维护 Eclipse 插件还很陌生。原作者不容易找到。
代码库是开源的,它在 https://github.com/xored/yang-ide github 上。
插件所用的语言与 XML 有一些相似之处(不在语法上),因为一个模块可以 "import" 另一个模块的名称,并指定一个前缀与来自该导入文件的符号。该语言还有一个 "use" 命令,它采用表示某种结构化类型的符号名称。符号名称可以带或不带前缀。可以在该模块或导入的模块中定义结构化类型。
该插件有一个功能,我可以在 "Refactoring" 子菜单中 select 定义符号名称和 select "Rename"。它会 select 文件中所有出现的符号名称,并提示我重命名它,就像 Java 编辑器(和其他编辑器)的工作方式一样。
问题是,它选择替换的某些事件可能无效。如果我 select 在该模块中编辑了一个符号名称,而该名称恰好与导入模块中的符号名称相同,该模块由该模块中的前缀引用,当我 select "Rename" 操作,它也会标记那些前缀出现,即使它们指的是不同的符号。
让我感到困惑的是,即使我可以完全访问这个插件的源代码,我也无法弄清楚它在哪里确定要 select 的符号。我确实找到了 RenameAction
class,它扩展了 Action 并实现了 ISelectionChangedListener
,但其中似乎没有任何逻辑。我想一定有一些东西"inherent"在做这件事,这样逻辑已经在SDK中提供了,我只是看不出这是从哪里来的。
我能够设置远程调试系统,从主机上的 Eclipse 实例连接到 VM 中的 Eclipse 测试实例 运行,因此我在单步执行事件时不会遇到任何问题-驱动代码。
我可以使用任何想法来跟踪 Eclipse 插件中的此类问题。我想还有其他具有类似行为的插件。
似乎该操作只是收集一些信息(如文件),然后调用 RenameLinkedMode
来完成工作。
对 RenameSupport.findLocalReferences()
的调用似乎最有可能成为您的错误的来源。
关于调试的注意事项:您可以尝试在插件中添加日志记录,以查看当调试过于复杂时它做了什么。
或者您可以尝试 chronon,它允许您记录程序执行并及时向前和向后移动或回答诸如 "where did this value come from?"
之类的问题
我在 Eclipse 论坛上发布了以下说明:https://www.eclipse.org/forums/index.php/t/1072029/。这包含所有详细信息,但我会在这里重复它们。
我正在使用一个有点复杂的 Eclipse 插件代码库。它用于以特定语言编辑文件。我对维护 Eclipse 插件还很陌生。原作者不容易找到。
代码库是开源的,它在 https://github.com/xored/yang-ide github 上。
插件所用的语言与 XML 有一些相似之处(不在语法上),因为一个模块可以 "import" 另一个模块的名称,并指定一个前缀与来自该导入文件的符号。该语言还有一个 "use" 命令,它采用表示某种结构化类型的符号名称。符号名称可以带或不带前缀。可以在该模块或导入的模块中定义结构化类型。
该插件有一个功能,我可以在 "Refactoring" 子菜单中 select 定义符号名称和 select "Rename"。它会 select 文件中所有出现的符号名称,并提示我重命名它,就像 Java 编辑器(和其他编辑器)的工作方式一样。
问题是,它选择替换的某些事件可能无效。如果我 select 在该模块中编辑了一个符号名称,而该名称恰好与导入模块中的符号名称相同,该模块由该模块中的前缀引用,当我 select "Rename" 操作,它也会标记那些前缀出现,即使它们指的是不同的符号。
让我感到困惑的是,即使我可以完全访问这个插件的源代码,我也无法弄清楚它在哪里确定要 select 的符号。我确实找到了 RenameAction
class,它扩展了 Action 并实现了 ISelectionChangedListener
,但其中似乎没有任何逻辑。我想一定有一些东西"inherent"在做这件事,这样逻辑已经在SDK中提供了,我只是看不出这是从哪里来的。
我能够设置远程调试系统,从主机上的 Eclipse 实例连接到 VM 中的 Eclipse 测试实例 运行,因此我在单步执行事件时不会遇到任何问题-驱动代码。
我可以使用任何想法来跟踪 Eclipse 插件中的此类问题。我想还有其他具有类似行为的插件。
似乎该操作只是收集一些信息(如文件),然后调用 RenameLinkedMode
来完成工作。
对 RenameSupport.findLocalReferences()
的调用似乎最有可能成为您的错误的来源。
关于调试的注意事项:您可以尝试在插件中添加日志记录,以查看当调试过于复杂时它做了什么。
或者您可以尝试 chronon,它允许您记录程序执行并及时向前和向后移动或回答诸如 "where did this value come from?"
之类的问题