getLineSpan method

TextSpan? getLineSpan(
  1. int lineIndex,
  2. String lineText
)

Implementation

TextSpan? getLineSpan(int lineIndex, String lineText) {
  final mergedCache = _mergedCache[lineIndex];
  if (mergedCache != null &&
      mergedCache.version == _version &&
      mergedCache.text == lineText) {
    return mergedCache.span;
  }

  final grammarCache = _grammarCache[lineIndex];
  final cachedGrammarSpan =
      grammarCache != null &&
          grammarCache.version == _version &&
          grammarCache.text == lineText
      ? grammarCache.span
      : null;

  final semanticSpans = _lineSemanticSpans[lineIndex];
  if (_isEditing || semanticSpans == null || semanticSpans.isEmpty) {
    if (_lineSpanCache.containsKey(lineText)) {
      return _lineSpanCache[lineText];
    }
    if (cachedGrammarSpan != null) {
      _lineSpanCache[lineText] = cachedGrammarSpan;
      return cachedGrammarSpan;
    }
  }

  if (cachedGrammarSpan != null) {
    final mergedSpan = _mergeGrammarAndSemantic(
      lineText,
      cachedGrammarSpan,
      semanticSpans,
    );

    _lineSpanCache[lineText] = mergedSpan;
    _mergedCache[lineIndex] = HighlightedLine(lineText, mergedSpan, _version);
    return mergedSpan;
  }

  if (_lineSpanCache.containsKey(lineText) &&
      (semanticSpans == null || semanticSpans.isEmpty || _isEditing)) {
    return _lineSpanCache[lineText];
  }

  final grammarSpan = _highlightLine(lineText);

  if (_isEditing) {
    _lineSpanCache[lineText] = grammarSpan;
    return grammarSpan;
  }

  final mergedSpan = _mergeGrammarAndSemantic(
    lineText,
    grammarSpan,
    semanticSpans,
  );

  _lineSpanCache[lineText] = mergedSpan;
  _mergedCache[lineIndex] = HighlightedLine(lineText, mergedSpan, _version);

  return mergedSpan;
}