对于某些种类的启动方式,获取与代码中的当前执行点相对应的源代码可能很重要。当对程序进行调试或概要分析时,这一点通常很重要。调试插件提供了几个不同的扩展点,这些扩展点允许插件注册有助于找到源代码的类。
ISourceLocator 和 IPersistableSourceLocator 定义用于从正在执行的程序映射回源代码的接口。
通常会实现源定位器以使用对应的启动配置和启动配置代表。可以在定义启动配置类型时指定源定位器标识,也可以通过使用 ILaunchConfiguration.ATTR_SOURCE_LOCATOR_ID 属性使该标识与启动配置相关联。在任何一种情况下,一个配置的源定位器的标识在某一时刻必须解析为实际实现 IPersistableSourceLocator 的类。源定位器标识与其类之间的关联是通过使用 org.eclipse.debug.core.sourceLocators 扩展点来建立的。
以下标记来自 Java 工具:
<extension point = "org.eclipse.debug.core.sourceLocators"> <sourceLocator id = "org.eclipse.jdt.debug.ui.javaSourceLocator" class="org.eclipse.jdt.debug.ui.JavaUISourceLocator" name="%javaSourceLocator"/> </extension>
因为启动配置可持久存在,所以源定位器标识可能将与启动配置存储在一起。当要实例化源定位器时,调试插件查找源定位器标识属性并实例化与该标识相关联的类。
源查找的实现必须依赖于正在启动的程序类型。然而,平台为源定位器定义了一个抽象实现,该源定位器在给定的路径上查找源文件,包括目录、Zip 文件、JAR 文件等等。要利用此实现,您的插件可以扩展 AbstractSourceLookupDirector。该特定实现的所有需求是提供适当的 ISourceLookupParticipant 的能力,以便可以将堆栈帧映射到文件名。请参阅 AbstractSourceLookupDirector 的扩充符。以获取示例。
AbstractSourceLookupDirector 根据特定的源代码查找路径来搜索源文件。此路径表示为一组 ISourceContainer。应该搜索以找到源代码的源容器通常是根据要启动的源配置的特定条件来计算的。ISourcePathComputer 为对象定义用于计算启动配置的适当源路径的接口。源路径计算机与源定位器非常相似,它是通过标识来指定的,可以在启动配置类型的扩展定义中指定它,也可以通过为启动配置设置 ISourceLocator.ATTR_SOURCE_PATH_COMPUTER_ID 属性来以编程方式指定它的关联。源路径计算机的标识与它在 org.eclipse.debug.core.sourcePathComputers 扩展点中的实现类相关联。以下标记显示由 JDT 用于其 Java 源路径计算机的定义:
<extension point="org.eclipse.debug.core.sourcePathComputers"> <sourcePathComputer id="org.eclipse.jdt.launching.sourceLookup.javaSourcePathComputer" class="org.eclipse.jdt.launching.sourcelookup.containers.JavaSourcePathComputer"> </sourcePathComputer> ...
源路径计算机负责计算表示源查找路径的一组 ISourceContainer。例如,Java 源路径计算机在构建路径时会考虑类路径。
指定为源查找路径的一部分的容器必须实现 ISourceContainer,它可以搜索为指定的源元素提供的容器。可能需要不同种类的源容器来表示存储源代码的不同种类的位置。例如,JDT 定义源容器来表示 Java 项目中的源、类路径上的源和包段中的源。可以通过启动配置中的标识来存储用于启动配置的源容器。由于启动配置可以是持久的,所以必须有一种方法来使源容器的标识与其实现类相关联。这是通过使用 org.eclipse.debug.core.sourceContainerTypes 扩展点来完成的。以下示例来自 JDT:
<extension point="org.eclipse.debug.core.sourceContainerTypes"> <sourceContainerType id="org.eclipse.jdt.launching.sourceContainer.javaProject" name="%javaProjectSourceContainerType.name" description="%javaProjectSourceContainerType.description" class="org.eclipse.jdt.internal.launching.JavaProjectSourceContainerTypeDelegate"> </sourceContainerType> ...