externalScanner025ParityProbe method
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,
};
}