Grammatik-Autocompletion einfach erweiterbar

28. April 2010 – 11:32

Einer der vielen Vorteile bei der Definition einer DSL mit Xtext ist der, dass man einen auf die Grammatik abgestimmten Editor gratis dazu bekommt. Wie in Eclipse gewöhnt, schlägt dieser bei Autocompletion, abhängig von der aktuellen Position, die nächsten möglichen Elemente vor. Bei Benutzern, die zwar mit dem Editor arbeiten, aber nicht sehr mit der DSL vertraut sind, sind zusätzliche Informationen an den Elemente sehr hilfreich um deren Semantik besser verstehen zu können. Die folgende Möglichkeit stellt ein Verfahren dar, um solche zusätzlichen Informationen für jedes Element der Grammatik einfach und schnell editierbar zu halten.

Im vom Xtext erzeugten ui-projekt muss im src-Ordner die entsprechende ProposalProvider Klasse (hier MyDSLProposalProvider) die Methode completeKeyWord(…) wie folgt überschreiben:


public class MyDSLProposalProvider extends AbstractMobileDSLProposalProvider {

Properties configFile;

@Override
public void completeKeyword(Keyword keyword, ContentAssistContext contentAssistContext, ICompletionProposalAcceptor acceptor) {
if (configFile == null) {
try {
configFile = new Properties();
configFile.load(this.getClass().getClassLoader().
getResourceAsStream("src/org/mydsl/contentassist/description.properties"));
} catch (IOException e) {
e.printStackTrace();
}
}
ICompletionProposal proposal = createCompletionProposal(keyword, keyword.getValue(), contentAssistContext);
ConfigurableCompletionProposal p = (ConfigurableCompletionProposal) proposal;
String prop = configFile.getProperty(keyword.getValue());
if (prop!=null && p!=null) {
p.setAdditionalProposalInfo(configFile.getProperty(keyword.getValue()));
// register the proposal, the acceptor handles null-values gracefully
acceptor.accept(proposal);
} else {
super.completeKeyword(keyword, contentAssistContext, acceptor);
}
}

}

Die Methode sorgt dafür, dass eine Konfigurations-Datei(Key-Value-Paare) einmalig eingelesen wird (Hier “description.properties”). Beim auslösen der Autocompletion für ein bestimmtes Element, wird dieses Element in der Konfigurationsdatei gesucht und falls vorhanden, der Value als zusätzlichen Information dazu angezeigt.
Hier ein Ausschnitt aus der “description.properties”:

application=Some meta-information about the application that is modelled
entity=description for entities

und eine Vorschau wie es im Editor aussieht:
Vorschau Editor