oak-elixir 0.0.11

Elixir functional programming language parser with support for metaprogramming and concurrent programming features.
Documentation
use oak_core::{errors::OakError, source::Source};
use oak_elixir::{ElixirLanguage, ElixirLexer};
use oak_testing::lexing::LexerTester;
use std::{path::Path, time::Duration};

#[test]
fn test_elixir_lexer() -> Result<(), OakError> {
    let here = Path::new(env!("CARGO_MANIFEST_DIR"));
    let language = Box::leak(Box::new(ElixirLanguage::default()));
    let lexer = ElixirLexer::new(language);
    let test_runner = LexerTester::new(here.join("tests/lexer")).with_extension("ex").with_timeout(Duration::from_secs(5));
    test_runner.run_tests::<ElixirLanguage, _>(&lexer)?;
    Ok(())
}

#[test]
fn test_peek_behavior() {
    use oak_core::{LexerState, SourceText};
    use oak_elixir::ElixirLanguage;

    let source = SourceText::new("NESTED_CONSTANT");
    let mut cache = oak_core::parser::session::ParseSession::<ElixirLanguage>::default();
    let mut state = LexerState::<SourceText, ElixirLanguage>::new_with_cache(&source, 0, &mut cache);

    println!("Initial state:");
    println!("Position: {}", state.get_position());
    println!("current(): {:?}", state.current());
    println!("peek(): {:?}", state.peek());

    println!("\nAfter advancing 1 char:");
    state.advance(1);
    println!("Position: {}", state.get_position());
    println!("current(): {:?}", state.current());
    println!("peek(): {:?}", state.peek());

    println!("\nAfter advancing 1 char:");
    state.advance(1);
    println!("Position: {}", state.get_position());
    println!("current(): {:?}", state.current());
    println!("peek(): {:?}", state.peek())
}

#[test]
fn test_elixir_module_parsing() -> Result<(), OakError> {
    use oak_core::{Lexer, SourceText};

    let source = SourceText::new("defmodule MyModule do\n  def hello do\n    :world\n  end\nend");
    let language = Box::leak(Box::new(ElixirLanguage::default()));
    let lexer = ElixirLexer::new(language);

    let mut cache = oak_core::parser::session::ParseSession::<ElixirLanguage>::default();
    let result = lexer.lex(&source, &[], &mut cache);

    println!("Testing Elixir module parsing:");
    println!("Source code: '{}'", (&source).get_text_from(0));

    let tokens = result.result?;
    assert!(!tokens.is_empty(), "Should parse at least one token");

    let first_token = &tokens[0];
    let source_ref = &source;
    let token_text = source_ref.get_text_in(first_token.span.clone());

    println!("First token: Kind={:?}, Text='{}'", first_token.kind, token_text);

    println!("✅ Elixir module parsing test passed!");
    Ok(())
}