wat_service 0.1.0

WebAssembly Text Format language service.
Documentation
use line_index::{LineCol, LineIndex};
use lsp_types::{Position, Range};
use rowan::{TextRange, TextSize};

pub fn rowan_pos_to_lsp_pos(line_index: &LineIndex, pos: TextSize) -> Position {
    let line_col = line_index.line_col(pos);
    Position::new(line_col.line, line_col.col)
}

pub fn rowan_range_to_lsp_range(line_index: &LineIndex, range: TextRange) -> Range {
    Range::new(
        rowan_pos_to_lsp_pos(line_index, range.start()),
        rowan_pos_to_lsp_pos(line_index, range.end()),
    )
}

pub fn lsp_pos_to_rowan_pos(line_index: &LineIndex, pos: Position) -> Option<TextSize> {
    line_index.offset(LineCol {
        line: pos.line,
        col: pos.character,
    })
}

pub fn lsp_range_to_rowan_range(line_index: &LineIndex, range: Range) -> Option<TextRange> {
    line_index
        .offset(LineCol {
            line: range.start.line,
            col: range.start.character,
        })
        .zip(line_index.offset(LineCol {
            line: range.end.line,
            col: range.end.character,
        }))
        .map(|(start, end)| TextRange::new(TextSize::new(start.into()), TextSize::new(end.into())))
}

pub(crate) mod ast {
    use rowan::{GreenNode, NodeOrToken};
    use wat_syntax::SyntaxKind;

    pub fn find_func_type_of_type_def(green: &GreenNode) -> Option<GreenNode> {
        green.children().find_map(|child| match child {
            NodeOrToken::Node(node) if node.kind() == SyntaxKind::FUNC_TYPE.into() => {
                Some(node.to_owned())
            }
            _ => None,
        })
    }
}