Someone reading yesterday's blog entry might have thought: "OK. So you're not only able to create syntax coloring for some kind of trivial DSL. Yes, you're also able to do it for a real language, in this case, Ceylon. However, you caught a lucky break in that case, it's unlikely you'll be able to do it again for another real language."

Well, OK, take a look at this, my hypothetically sceptical imaginary friend:

What you see here is syntax coloring for Clojure (via the Clojure.g ANTLR file), created in about 45 minutes (Clojure turns out to have a lot less tokens than Ceylon), together with HTML embedding within Clojure comments. However, note that the embedding only supports syntax coloring, not code completion, not sure if that is possible nor how to do that.

Here's my embedding definition, i.e., this is all, no more or less than this:

@ServiceProvider(service = LanguageProvider.class)

public class HTMLEmbeddingLanguageProvider extends LanguageProvider {

private Language embeddedLanguage;

@Override

public Language<?> findLanguage(String mimeType) {

return ClojureTokenId.getLanguage();

}

@Override

public LanguageEmbedding<?> findLanguageEmbedding(Token<?> token, LanguagePath languagePath, InputAttributes inputAttributes) {

initLanguage();

if (11 == token.id().ordinal()) { //11 is the token ordinal in Clojure for comments

return LanguageEmbedding.create(embeddedLanguage, 0, 0);

}

return null;

}

private void initLanguage() {

embeddedLanguage = MimeLookup.getLookup("text/html").lookup(Language.class);

if (embeddedLanguage == null) {

throw new NullPointerException("Can't find language for embedding");

}

}

}

Soon I'll be working on a tutorial showing how to create syntax coloring for the Movie Query DSL I showed over the last two days.

