main.rs 1.6 KB
Newer Older
1 2
use std::env;
use std::ffi::OsStr;
P
Phodal Huang 已提交
3 4
use std::fs::File;
use std::io::Read;
5 6 7 8
use std::path::{Path, PathBuf};
use std::time::SystemTime;

use scie_grammar::grammar::{Grammar, StackElement};
9

P
Phodal Huang 已提交
10
fn main() {
11 12
    let target_dir = get_target_dir();
    let root_dir = get_top_dir(&*target_dir);
P
Phodal Huang 已提交
13 14 15 16 17 18 19 20 21

    let lang_spec_dir = root_dir.join("extensions").join("json").join("syntaxes").join("JSON.tmLanguage.json");
    let lang_test_dir = Path::new("fixtures").join("JavaScript.tmLanguage.json.txt");

    let code = read_code(&lang_test_dir);

    let mut grammar = Grammar::to_grammar(lang_spec_dir.to_str().unwrap());

    let mut rule_stack = Some(StackElement::null());
22 23

    let start = SystemTime::now();
P
Phodal Huang 已提交
24
    for line in code.lines() {
25
        // println!("{:?}", line);
P
Phodal Huang 已提交
26 27 28 29
        let result = grammar.tokenize_line(String::from(line), &mut rule_stack);
        rule_stack = *result.rule_stack;
    }

30 31 32
    if let Ok(n) = SystemTime::now().duration_since(start) {
        println!("TOKENIZING {:?} length using grammar source.js {:?} ms", code.len(), n.as_millis())
    }
P
Phodal Huang 已提交
33 34 35 36 37 38 39
}

fn read_code(lang_test_dir: &PathBuf) -> String {
    let mut file = File::open(lang_test_dir).unwrap();
    let mut code = String::new();
    file.read_to_string(&mut code).unwrap();
    code
40 41 42 43 44 45 46 47 48 49 50 51 52 53
}

// https://github.com/rust-lang/cargo/issues/2841
fn get_target_dir() -> PathBuf {
    let bin = env::current_exe().expect("exe path");
    let mut target_dir = PathBuf::from(bin.parent().expect("bin parent"));
    while target_dir.file_name() != Some(OsStr::new("target")) {
        target_dir.pop();
    }
    target_dir
}

fn get_top_dir<'a>(target_dir: &'a Path) -> &'a Path {
    target_dir.parent().expect("target parent")
P
Phodal Huang 已提交
54
}