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)
}