La API de las herramientas de desarrollo Java (JDT) permite que otros conectores efectúen la asistencia de código o la selección de código en algunos elementos Java. Los elementos que permiten esta manipulación deben implementar la interfaz ICodeAssist.
Existen dos tipos de manipulación:
En el modelo Java existen dos elementos que implementan esta interfaz: IClassFile e ICompilationUnit. La conclusión de código y la selección de código tan solo responden con los resultados de un archivo de clase si este tiene fuente conectado.
La única forma de realizar programáticamente la conclusión de código consiste en invocar ICodeAssist.codeComplete. Especificará el desplazamiento en la unidad de compilación después de la cual desea la conclusión del código. También debe suministrar una instancia de ICompletionRequestor para aceptar las posibles conclusiones.
Cada método de ICompletionRequestor acepta un tipo distinto de propuesta de conclusión de código. Cada método tiene como parámetros el texto descriptivo del elemento propuesto (su nombre, el tipo declarante, etcétera), su posición propuesta para la inserción en la unidad de compilación, y su relevancia.
Un peticionario de conclusiones puede aceptar muchos tipos de conclusiones distintos, incluida la inserción de los siguientes elementos:
El peticionario de conclusiones también debe ser capaz de aceptar errores de compilación.
Si su conector no está destinado a toda clase de conclusión de código, puede utilizar un CompletionRequestorAdapter para que solo tenga que implementar los tipos de conclusiones que le interesen. El siguiente ejemplo muestra un adaptador que solo se utiliza para aceptar conclusiones de clases.
// Obtener la unidad de compilación ICompilationUnit unit = ...; // Obtener el desplazamiento int offset = ...; // Crear el peticionario ICompletionRequestor requestor = new CompletionRequestorAdapter() { public void acceptClass( char[] packageName, char[] className, char[] completionName, int modifiers, int completionStart, int completionEnd, int relevance) { System.out.println("proponer una clase llamada " + new String(className)); } }; // Calcular propuestas unit.codeComplete(offset, requestor);
Dado que existen muchas conclusiones distintas, se emplea el concepto de relevancia a la hora de comparar una conclusión sugerida con las demás propuestas. La relevancia viene representada por un entero positivo. El significado del valor no es implícito, sino tan solo relativo al valor de las otras propuestas. La relevancia de una conclusión de código candidata puede verse afectada por el tipo que cabe esperar de la expresión, dado que está relacionado con los tipos existentes en el código que hay alrededor, tal como tipos de variables, tipos de conversión de tipo, tipos de retorno, etcétera. La presencia de un prefijo o un sufijo esperado en una conclusión también afecta a su relevancia.
El conector del núcleo de JDT define opciones que controlan el comportamiento de la conclusión del código. Estas opciones se pueden cambiar mediante otros conectores.
Existen opciones adicionales que le permiten especificar prefijos y sufijos para los nombres de campos, campos estáticos, variables locales y argumentos de métodos de la conclusión propuesta.
En el tema Opciones de asistencia de código de núcleo de JDT hallará más información sobre las opciones de la asistencia de código y sus valores predeterminados.
La selección de código permite localizar el elemento Java representado por un rango de texto (habitualmente, el texto seleccionado) en una unidad de compilación. Para realizar programáticamente una selección de código, debe invocar ICodeAssist.codeSelect. Debe suministrar la ubicación de índice inicial de la selección y su longitud. El resultado es una matriz de elementos Java. La mayoría de las veces, solo hay un elemento en la matriz, pero si la selección es ambigua, se devuelven todos los elementos posibles.
En el siguiente ejemplo,
se invoca la selección de código para una unidad de compilación.
// Obtener la unidad de compilación
ICompilationUnit unit = ...;
// Obtener el desplazamiento y la longitud
int offset = ...;
int length = ...;
// Realizar selección
IJavaElement[] elements = unit.codeSelect(offset, length);
System.out.println("el elemento seleccionado es " + element[0].getElementName());
Cuando se especifica una longitud de selección igual a cero (0), se calculará una selección localizando el símbolo de conclusión que encierra el desplazamiento especificado. Tome en consideración el siguiente método de ejemplo:
public void fooMethod(Object) {
}