codeHandleAutoPair function

TextCommandResult codeHandleAutoPair({
  1. required TextDocument document,
  2. required TextOffsetStateSnapshot state,
  3. required CodeLanguageProfile profile,
  4. required String typed,
})

Implementation

TextCommandResult codeHandleAutoPair({
  required TextDocument document,
  required TextOffsetStateSnapshot state,
  required CodeLanguageProfile profile,
  required String typed,
}) {
  final matching = profile.autoPairs[typed];
  if (matching != null) {
    if (typed == matching &&
        !codeShouldAutoPairSymmetricDelimiterInDocument(
          document,
          state.cursorOffset,
          hasSelection: state.hasSelection,
        )) {
      return _unchangedCodeResultFromDocument(document, state);
    }

    if (state.hasSelection) {
      return textWrapSelection(
        document: document,
        state: state,
        before: typed,
        after: matching,
      );
    }

    final working = document.copy();
    final result = edit_ops.insertTextIntoDocument(
      working,
      state.cursorOffset,
      '$typed$matching',
    );
    return _codeResultFromDocument(
      working,
      cursorOffset:
          state.cursorOffset.clamp(0, document.length) +
          typed.characters.length,
      documentChange: result.change,
      changed: result.changed,
    );
  }

  if (!profile.autoPairs.containsValue(typed) || state.hasSelection) {
    return _unchangedCodeResultFromDocument(document, state);
  }

  final offset = state.cursorOffset;
  if (document.matchesOffsetRange(
    startOffset: offset,
    graphemes: <String>[typed],
  )) {
    return _codeResultFromDocument(
      document,
      cursorOffset: offset + 1,
      selectionBaseOffset: state.selectionBaseOffset,
      selectionExtentOffset: state.selectionExtentOffset,
      changed: true,
    );
  }

  return _unchangedCodeResultFromDocument(document, state);
}