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) {
    final cachedLine = _lineSpanCache[lineIndex];
    if (cachedLine != null && cachedLine.text == lineText) {
      return cachedLine.span;
    }
    if (cachedGrammarSpan != null) {
      _lineSpanCache[lineIndex] = HighlightedLine(
        lineText,
        cachedGrammarSpan,
        _version,
      );
      return cachedGrammarSpan;
    }
  }

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

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

  final cachedLine = _lineSpanCache[lineIndex];
  if (cachedLine != null &&
      cachedLine.text == lineText &&
      (semanticSpans == null || semanticSpans.isEmpty || _isEditing)) {
    return cachedLine.span;
  }

  final grammarSpan = _highlightLine(lineIndex, lineText);

  if (_isEditing) {
    _lineSpanCache[lineIndex] = HighlightedLine(
      lineText,
      grammarSpan,
      _version,
    );
    return grammarSpan;
  }

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

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

  return mergedSpan;
}