@Override public FoldingBuilder forLanguage(Language l) { FoldingBuilder cached = l.getUserData(getLanguageCache()); if (cached != null) return cached; List<FoldingBuilder> extensions = forKey(l); FoldingBuilder result; if (extensions.isEmpty()) { Language base = l.getBaseLanguage(); if (base != null) { result = forLanguage(base); } else { result = getDefaultImplementation(); } } else { return (extensions.size() == 1) ? extensions.get(0) : myBuilder == null ? myBuilder = new CompositeFoldingBuilder(extensions) : myBuilder; } l.putUserData(getLanguageCache(), result); return result; }