public AutocompleteProposals findAutocompletions(
SelectionModel selection, SignalEventEssence trigger) {
resetDirtyScope();
Position cursor = selection.getCursorPosition();
final Line line = cursor.getLine();
final int column = cursor.getColumn();
DocumentParser parser = getParser();
JsonArray<Token> tokens = parser.parseLineSync(line);
if (tokens == null) {
// This line has never been parsed yet. No variants.
return AutocompleteProposals.EMPTY;
}
// We do not ruin parse results for "clean" lines.
if (parser.isLineDirty(cursor.getLineNumber())) {
// But "processing" of "dirty" line is harmless.
XmlCodeAnalyzer.processLine(TaggableLineUtil.getPreviousLine(line), line, tokens);
}
String initialMode = parser.getInitialMode(line);
JsonArray<Pair<Integer, String>> modes = TokenUtil.buildModes(initialMode, tokens);
putModeAnchors(line, modes);
String mode = TokenUtil.findModeForColumn(initialMode, modes, column);
if (cssAutocompleter != null && CodeMirror2.CSS.equals(mode)) {
return cssAutocompleter.findAutocompletions(selection, trigger);
} else if (jsAutocompleter != null && CodeMirror2.JAVASCRIPT.equals(mode)) {
return jsAutocompleter.findAutocompletions(selection, trigger);
}
if (selection.hasSelection()) {
// Do not autocomplete in HTML when something is selected.
return AutocompleteProposals.EMPTY;
}
HtmlTagWithAttributes tag = line.getTag(XmlCodeAnalyzer.TAG_START_TAG);
boolean inTag = tag != null;
if (column == 0) {
// On first column we either add attribute or do nothing.
if (inTag) {
JsonArray<AutocompleteProposal> proposals = htmlAttributes.searchAttributes(
tag.getTagName(), tag.getAttributes(), "");
return new HtmlAutocompleteProposals("", proposals, ATTRIBUTE);
}
return AutocompleteProposals.EMPTY;
}
FindTagResult findTagResult = findTag(tokens, inTag, column);
if (!findTagResult.inTag || findTagResult.inToken == null) {
// Ooops =(
return AutocompleteProposals.EMPTY;
}
// If not unfinished tag at the beginning of line surrounds cursor...
if (findTagResult.startTagIndex >= 0) {
// Unfinished tag at he end of line may be used...
if (findTagResult.endTagIndex == -1) {
tag = line.getTag(XmlCodeAnalyzer.TAG_END_TAG);
if (tag == null) {
// Ooops =(
return AutocompleteProposals.EMPTY;
}
} else {