externalScanner025ParityProbe method

Map<String, Object?> externalScanner025ParityProbe()

Direct transition transcript for Tree-sitter 0.25.10's private external scanner deserialize/scan/serialize wrappers.

The probe drives the same typed adapter and external-lexer surface used by production parses with a deterministic scanner payload. Its state, input bytes, enabled-token row, lexer byte movement, result symbol, and serialized output are compared field-for-field with the pinned native parser.c helpers.

Implementation

Map<String, Object?> externalScanner025ParityProbe() {
  final probe = _ExternalScanner025Probe();
  final scanner = _TypedScannerAdapter<_ExternalScanner025ProbeState>(probe);
  final state = scanner.create();

  scanner.deserialize(state, Uint8List.fromList(const [3, 5, 8]));
  final deserializeToken = <String, Object?>{
    'event': 'deserialize',
    'call': probe.deserializeCallCount,
    'payload_before': probe.deserializePayloadBefore,
    'input': probe.deserializeInput,
    'length': probe.deserializeInput.length,
    'payload_after': probe.deserializePayloadAfter,
  };

  final lexer = TreeSitterExternalLexer('xyz');
  final byteBefore = lexer.position;
  final scanResult = scanner.scan(state, lexer, const [true, false, true]);
  final byteAfter = lexer.position;
  final token = lexer.token();
  final scan = <String, Object?>{
    'event': 'scan',
    'call': probe.scanCallCount,
    'external_lex_state': 1,
    'payload_before': probe.scanPayloadBefore,
    'valid': probe.scanValid,
    'lookahead_before': probe.scanLookaheadBefore,
    'byte_before': byteBefore,
    'byte_after': byteAfter,
    'result_symbol': token?.symbol,
    'result': scanResult,
    'payload_after': probe.scanPayloadAfter,
  };

  final serialized = scanner.serialize(state);
  final serialize = <String, Object?>{
    'event': 'serialize',
    'call': probe.serializeCallCount,
    'payload_before': probe.serializePayloadBefore,
    'output': serialized.toList(growable: false),
    'length': serialized.length,
    'returned_length': serialized.length,
  };

  (state as _ExternalScanner025ProbeState).payload = 99;
  scanner.deserialize(state, Uint8List(0));
  final deserializeNull = <String, Object?>{
    'event': 'deserialize',
    'call': probe.deserializeCallCount,
    'payload_before': probe.deserializePayloadBefore,
    'input': probe.deserializeInput,
    'length': probe.deserializeInput.length,
    'payload_after': probe.deserializePayloadAfter,
  };

  _destroyExternalScannerPayload(scanner, state);
  _destroyExternalScannerPayload(scanner, null);
  final destroy = <String, Object?>{
    'event': 'destroy',
    'call': probe.destroyCallCount,
    'payload_before': probe.destroyPayloadBefore,
  };

  return <String, Object?>{
    'deserialize_token': deserializeToken,
    'scan': scan,
    'serialize': serialize,
    'deserialize_null': deserializeNull,
    'destroy': destroy,
  };
}