From c7d6fd7fa5c0e7e34a7fa3ba771882de966cd004 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Sat, 26 Oct 2024 18:46:57 -0400 Subject: [PATCH] build: move `generate-wasm-exports-lists to xtask --- script/generate-wasm-exports-list | 8 ----- xtask/src/generate.rs | 55 ++++++++++++++++++++++++++++++- xtask/src/main.rs | 3 ++ 3 files changed, 57 insertions(+), 9 deletions(-) delete mode 100755 script/generate-wasm-exports-list diff --git a/script/generate-wasm-exports-list b/script/generate-wasm-exports-list deleted file mode 100755 index 58f4d863..00000000 --- a/script/generate-wasm-exports-list +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -set -e - -while read -r wasm_file; do - wasm-objdump --details "$wasm_file" --section Import | \ - sed -n 's/.*.*/\1/p' -done < <(find target -maxdepth 2 -name 'tree-sitter-*.wasm') | sort -u diff --git a/xtask/src/generate.rs b/xtask/src/generate.rs index 268351b2..1af04275 100644 --- a/xtask/src/generate.rs +++ b/xtask/src/generate.rs @@ -1,4 +1,4 @@ -use std::{ffi::OsStr, fs, process::Command}; +use std::{collections::BTreeSet, ffi::OsStr, fs, path::Path, process::Command}; use anyhow::{Context, Result}; @@ -99,6 +99,59 @@ pub fn run_bindings() -> Result<()> { .with_context(|| "Failed to write bindings") } +pub fn run_wasm_exports() -> Result<()> { + let mut imports = BTreeSet::new(); + + let mut callback = |path: &str| -> Result<()> { + let output = Command::new("wasm-objdump") + .args(["--details", path, "--section", "Import"]) + .output()?; + bail_on_err(&output, "Failed to run wasm-objdump")?; + + let output = String::from_utf8_lossy(&output.stdout); + + for line in output.lines() { + if let Some(imp) = line.split("').next()) { + imports.insert(imp.to_string()); + } + } + + Ok(()) + }; + + for entry in fs::read_dir(Path::new("target"))? { + let Ok(entry) = entry else { + continue; + }; + let path = entry.path(); + if path.is_dir() { + for entry in fs::read_dir(&path)? { + let Ok(entry) = entry else { + continue; + }; + let path = entry.path(); + if path.is_file() + && path.extension() == Some(OsStr::new("wasm")) + && path + .file_name() + .unwrap() + .to_str() + .unwrap() + .starts_with("tree-sitter-") + { + callback(path.to_str().unwrap())?; + } + } + } + } + + for imp in imports { + println!("{imp}"); + } + + Ok(()) +} + fn find_grammar_files( dir: &str, ) -> impl Iterator> { diff --git a/xtask/src/main.rs b/xtask/src/main.rs index 6074ff19..4709920e 100644 --- a/xtask/src/main.rs +++ b/xtask/src/main.rs @@ -34,6 +34,8 @@ enum Commands { GenerateBindings, /// Generates the fixtures for testing tree-sitter. GenerateFixtures(GenerateFixtures), + /// Generate the list of exports from Tree-sitter WASM files. + GenerateWasmExports, /// Run the test suite Test(Test), /// Run the WASM test suite @@ -197,6 +199,7 @@ fn run() -> Result<()> { Commands::GenerateFixtures(generate_fixtures_options) => { generate::run_fixtures(&generate_fixtures_options)?; } + Commands::GenerateWasmExports => generate::run_wasm_exports()?, Commands::Test(test_options) => test::run(&test_options)?, Commands::TestWasm => test::run_wasm()?, Commands::UpgradeWasmtime(upgrade_wasmtime_options) => {