对 Java 代码执行代码辅助

JDT API 允许其它插件对一些 Java 元素执行代码辅助或代码选择。允许此处理的元素应实现 ICodeAssist

有两种处理方法:

在 Java 模型中,有两个元素实现此接口:IClassFileICompilationUnit。仅当类文件具有相连接的源时,代码补全和代码选择才回答该类文件的结果。 

代码补全

执行代码补全

使用程序执行代码补全的唯一方法是调用 ICodeAssist.codeComplete。您指定编译单元中的偏移量,从而在此偏移量之后请求代码补全。还必须提供 ICompletionRequestor 的实例才能接受可能的补全。

ICompletionRequestor 中的每个方法都接受不同类型的代码补全建议。每个方法的参数都包括用于描述所建议的元素(它的名称和声明类型等)、它在编译单元中的建议插入位置以及它的相关性的文本。  

补全请求者可以接受许多不同类型的补全,包括插入下列元素:

补全请求者还必须能够接受编译错误。  

如果插件并非对每种类型的代码补全都感兴趣,则可以使用 CompletionRequestorAdapter,以便只需实现感兴趣的补全类型。以下示例显示只用来接受类补全的适配器。

// Get the compilation unit
   ICompilationUnit unit = ...;
   
   // Get the offset
   int offset = ...;
   
   // Create the requester
   ICompletionRequestor requestor = new CompletionRequestorAdapter() {
      public void acceptClass(
         char[] packageName,
         char[] className,
         char[] completionName,
         int modifiers,
         int completionStart,
         int completionEnd,
         int relevance) {
         System.out.println("propose a class named " + new String(className));
      }
   };
   
   // Compute proposals
   unit.codeComplete(offset, requestor);

补全相关性

因为可能有许多不同的可能补全,所以,相关性的概念用来比较建议的补全与其它建议的相关性。相关性由正整数表示。除非相对于其它建议的值使用,否则值没有隐式含义。代码补全候选的相关性可能受表达式的预期类型影响,这是因为它与周围代码中的类型(如变量类型、强制类型转型类型以及返回类型等)相关。存在于补全中的预期前缀或后缀也会影响补全的相关性。

代码补全选项

JDT 核心插件定义了用于控制代码补全行为的选项。其它插件可以更改这些选项。   

附加选项允许您为字段、静态字段、局部变量和方法自变量的建议补全名称指定前缀和后缀。  

 有关代码辅助选项及其缺省值的更多信息,请参阅 JDT 核心代码辅助选项

代码选择

执行代码选择

代码选择用来查找由编译单元中的一定范围的文本(通常是选择的文本)表示的 Java 元素。要使用程序来执行代码选择,必须调用 ICodeAssist.codeSelect。必须提供所选内容的开始索引位置及其长度。结果是 Java 元素的数组。大多数情况下,数组中只有一个元素,但是如果选择是有歧义的,则会返回所有可能的元素。

在以下示例中,为编译单元调用了代码选择。

   // Get the compilation unit
   ICompilationUnit unit = ...;
   
   // Get the offset and length
   int offset = ...;
   int length = ...;
   
   // perform selection
   IJavaElement[] elements = unit.codeSelect(offset, length);
   System.out.println("the selected element is " + element[0].getElementName());

位于光标位置的选择

当选择长度指定为 0 时,将通过查找包含指定偏移量的整个标记来计算所选内容。考虑以下方法示例:

   public void fooMethod(Object) {
   }

如果在 fooMethod 的第一个字符后指定偏移量,并且指定长度 0,则将把所选内容计算为包括整个 fooMethod 标记。相反,如果指定长度 5,则认为所选内容是 ooMet