bbnf-analysis 0.1.1

Pure analysis logic for BBNF grammars (shared by LSP + WASM)
Documentation
use ls_types::*;

use crate::state::DocumentState;

pub fn semantic_tokens_full(state: &DocumentState) -> SemanticTokensResult {
    let mut data = Vec::new();
    let mut prev_line: u32 = 0;
    let mut prev_start: u32 = 0;

    for token in &state.info.semantic_tokens {
        if token.span.0 >= token.span.1 {
            continue;
        }

        let pos = state.line_index.offset_to_position(token.span.0);
        let length = (token.span.1 - token.span.0) as u32;

        let delta_line = pos.line - prev_line;
        let delta_start = if delta_line == 0 {
            pos.character - prev_start
        } else {
            pos.character
        };

        data.push(SemanticToken {
            delta_line,
            delta_start,
            length,
            token_type: token.token_type,
            token_modifiers_bitset: 0,
        });

        prev_line = pos.line;
        prev_start = pos.character;
    }

    SemanticTokensResult::Tokens(SemanticTokens {
        result_id: None,
        data,
    })
}