Semantic completion within the formal context (reported names). Syntactic completion of keywords and symbols, with abbreviations (based on language context).
*/
def add_keywords(names: List[String]): Completion = { val keywords1 = names.foldLeft(keywords) { case (ks, k) => if (ks(k)) ks else ks + k } if (keywords eq keywords1) this elsenew Completion(keywords1, words_lex, words_map, abbrevs_lex, abbrevs_map)
}
/* symbols and abbrevs */
def add_symbols: Completion = { val words =
Symbol.symbols.entries.flatMap { entry => val sym = entry.symbol val word = "\\" + entry.name val seps =
entry.argument match { case Symbol.Argument.none => Nil case Symbol.Argument.cartouche => List("") case Symbol.Argument.space_cartouche => List(" ")
}
List(sym -> sym, word -> sym) :::
seps.map(sep => word -> (sym + sep + "\\\u0007\\"))
}
privatedef add_abbrev(abbrev: (String, String)): Completion =
abbrev match { case ("", _) => this case (abbr, text) => val rev_abbr = abbr.reverse val is_word = Completion.Word_Parsers.is_word(abbr)
val abbrevs_result = { val reverse_in = new Library.Reverse(text.subSequence(0, caret))
Scan.Parsers.parse(Scan.Parsers.literal(abbrevs_lex), reverse_in) match { case Scan.Parsers.Success(reverse_abbr, _) => val abbrevs = abbrevs_map.get_list(reverse_abbr)
abbrevs match { case Nil => None case (abbr, _) :: _ => val ok = if (abbr == Completion.antiquote) language_context.antiquotes else language_context.symbols || Completion.default_abbrevs.exists(_._1 == abbr) if (ok) Some((abbr, abbrevs)) else None
} case _ => None
}
}
val words_result = if (abbrevs_result.isDefined) None else { val word_context =
caret < length && Completion.Word_Parsers.is_word_char(text.charAt(caret)) val result =
Completion.Word_Parsers.read_symbol(text.subSequence(0, caret)) match { case Some(symbol) => Some((symbol, "")) case None => Completion.Word_Parsers.read_word(text.subSequence(0, caret))
}
result.map(
{ case (word, underscores) => val complete_words = words_lex.completions(word) val full_word = word + underscores val completions = if (complete_words.contains(full_word) && is_keyword_template(full_word, false)) Nil else for {
complete_word <- complete_words
ok = if (is_keyword(complete_word)) !word_context && language_context.is_outer else language_context.symbols || Completion.Word_Parsers.is_symboloid(word) if ok
completion <- words_map.get_list(complete_word)
} yield (complete_word, completion)
(full_word, completions)
})
}
(abbrevs_result orElse words_result) match { case Some((original, completions)) if completions.nonEmpty => val range = Text.Range(- original.length, 0) + caret + start val immediate =
explicit ||
(!Completion.Word_Parsers.is_word(original) &&
!Completion.Word_Parsers.is_symboloid(original) &&
Character.codePointCount(original, 0, original.length) > 1) val unique = completions.length == 1
def decode1(s: String): String = if (unicode) Symbol.decode(s) else s def decode2(s: String): String = if (unicode) s else Symbol.decode(s)
if (items.isEmpty) None else
Some(Completion.Result(range, original, unique,
items.sortBy(_.name).sorted(history.ordering)))
case _ => None
}
}
}
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.2Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.