decode_token_records

func decode_token_records(encoded: String) -> [Token]?

Decode canonical token records without imposing tree structure: the wrapper macro ABI hands over a declaration's token run, which is not a single delimited group. Empty input decodes to an empty token list.

View Source
pub func decode_token_records(encoded: String) -> [Token]? {
	let view = encoded.utf8()
	if (view.count() / 40) * 40 != view.count() { return .none }
	let tokens: [Token] = []
	let index = 0
	loop index < view.count() {
		let tag: Int
		let span_start: Int
		let span_end: Int
		let lexeme_start: Int
		let lexeme_end: Int
		if let .some(value) = decode_hex_word(view: view, start: index) { tag = value } else { return .none }
		if let .some(value) = decode_hex_word(view: view, start: index + 8) { span_start = value } else { return .none }
		if let .some(value) = decode_hex_word(view: view, start: index + 16) { span_end = value } else { return .none }
		if let .some(value) = decode_hex_word(view: view, start: index + 24) { lexeme_start = value } else { return .none }
		if let .some(value) = decode_hex_word(view: view, start: index + 32) { lexeme_end = value } else { return .none }
		let kind: TokenKind
		if let .some(value) = token_kind_from_tag(tag: tag) { kind = value } else { return .none }
		if span_start > span_end || lexeme_start < span_start || lexeme_end > span_end { return .none }
		tokens.push(Token(kind: kind, span: span_start..<span_end, lexeme: lexeme_start..<lexeme_end))
		index = index + 40
	}
	.some(tokens)
}