BeanDev: Code Completion und Java Typen erkennen
Wie ich schon in meinem letzten Blog-Post geschrieben hatte, ist das Ermitteln eines Java Datentypes abhängig zu einer Cursorposition im Quelltext alles andere als trivial.
Aber nur mit diesem Wissen ist es möglich dem Anwender einem dem Kontext sinnvolle Ergebnisliste an Code Completion Einträgen zurückzugeben.
Nehmen wir wieder meinen (virtuellen) ColorCode Completion Provider, der Farbwerte in der Completion Liste vorschlagen soll. Dem Programmierer ist es wohl kaum zuzumuten, immer die Liste an Farbcodes anzuzeigen, auch wenn an aktueller Cursorposition gar kein Color-Objekt erwartet wird.
Also bei solchen Beispielen soll auf keinen Fall eine Liste an Farbcodes vorgeschlagen werden:
int i = |
JFrame f = new JFrame (|
double d = Math.sin (2.4) + |
Aber hier wäre die Vorschlagsliste durchaus sinnvoll:
Color c = |
((Component) comp).setBackground (|
Color outColor = error ? Color.RED : |
Wie findet man aber heraus, welcher Datentyp an der mit | gekennzeichneten Position im Quelltext erwartet wird? Nicht einfach...
Glücklicherweise ist NetBeans Open Source und zu meiner Erleichterung hat sich natürlich jemand anderes schon Gedanken darum gemacht. Das merkt man ja schnell, wenn man selber in der IDE das Code Completion nutzt. Die eigentliche Methode, die dabei hilft ist getSmartTypes aus der Klasse JavaCompletionProvider. Nur ist diese Methode private. Mit ein wenig Arbeit habe ich aber die relevanten Teile von JavaCompletionProvider hinauskopiert und drei Klassen erzeugt, damit man in eigenen Projekten getSmartTypes verwenden kann.
Innerhalb eines eigenen Completion Providers kann man nun sehr einfach die Datentypen abfragen:
public void run(CompilationController ci) throws Exception {
valid = false;
CompletionEnvironment env = ParserUtilities.getCompletionEnvironment (ci, component.getCaretPosition(), true);
if ( hasTypes(ParserUtilities.getSmartTypes(env), "Color", "java.awt.Color") ) {
valid = true;
}
}
private boolean hasTypes (Set<? extends TypeMirror> types, String... typeList) {
if ( types == null || types.size() == 0 ) return false;
for (TypeMirror typeMirror : types) {
for (String type : typeList) {
if ( typeMirror.toString().equals(type)) return true;
}
}
return false;
}
Die drei notwendigen Klassen finden sich hier im ZIP-Archiv. Ich würde mich freuen, wenn noch jemand die Hilfsklasse verwenden kann.
Beste Grüße,
Josch.
Da werden Sie geholfen:
Das deutsche NetBeans Forum
![Validate my RSS feed [Valid RSS]](http://www.sepix.de/fileadmin/valid-rss.png)