luau-analyzer-sys 0.1.1

A high-performance, embedded Luau type-checking and analysis engine written in Rust. This crate provides bindings to the Luau analyzer, allowing you to integrate static analysis and code intelligence directly into your applications.
Documentation
use std::env;
use std::path::PathBuf;

fn main() {
    let luau_dir = PathBuf::from("luau");

    println!("cargo:rerun-if-changed=build.rs");
    println!("cargo:rerun-if-changed=src/shim.cpp");

    let luau_modules = [
        (
            "Common",
            &["BytecodeWire.cpp", "StringUtils.cpp", "TimeTrace.cpp"][..],
        ),
        (
            "Ast",
            &[
                "Allocator.cpp",
                "Ast.cpp",
                "Confusables.cpp",
                "Cst.cpp",
                "Lexer.cpp",
                "Location.cpp",
                "Parser.cpp",
                "PrettyPrinter.cpp",
            ],
        ),
        ("Bytecode", &["BytecodeBuilder.cpp", "BytecodeGraph.cpp"]),
        (
            "Compiler",
            &[
                "Compiler.cpp",
                "Builtins.cpp",
                "BuiltinFolding.cpp",
                "ConstantFolding.cpp",
                "CostModel.cpp",
                "TableShape.cpp",
                "Types.cpp",
                "ValueTracking.cpp",
                "lcode.cpp",
            ],
        ),
        (
            "Config",
            &["Config.cpp", "LinterConfig.cpp", "LuauConfig.cpp"],
        ),
        (
            "Analysis",
            &[
                "Anyification.cpp",
                "ApplyTypeFunction.cpp",
                "AstJsonEncoder.cpp",
                "AstQuery.cpp",
                "AstUtils.cpp",
                "Autocomplete.cpp",
                "AutocompleteCore.cpp",
                "BuiltinDefinitions.cpp",
                "BuiltinTypeFunctions.cpp",
                "Clone.cpp",
                "Constraint.cpp",
                "ConstraintGenerator.cpp",
                "ConstraintSolver.cpp",
                "DataFlowGraph.cpp",
                "DcrLogger.cpp",
                "Def.cpp",
                "EmbeddedBuiltinDefinitions.cpp",
                "Error.cpp",
                "ExpectedTypeVisitor.cpp",
                "FileResolver.cpp",
                "FragmentAutocomplete.cpp",
                "Frontend.cpp",
                "Generalization.cpp",
                "NativeStackGuard.cpp",
                "GlobalTypes.cpp",
                "Instantiation.cpp",
                "Instantiation2.cpp",
                "IostreamHelpers.cpp",
                "IterativeTypeVisitor.cpp",
                "IterativeTypeFunctionTypeVisitor.cpp",
                "JsonEmitter.cpp",
                "Linter.cpp",
                "LValue.cpp",
                "Module.cpp",
                "NonStrictTypeChecker.cpp",
                "Normalize.cpp",
                "OverloadResolver.cpp",
                "Quantify.cpp",
                "RecursionCounter.cpp",
                "Refinement.cpp",
                "RequireTracer.cpp",
                "Scope.cpp",
                "Simplify.cpp",
                "StructuralTypeEquality.cpp",
                "Substitution.cpp",
                "Subtyping.cpp",
                "SubtypingUnifier.cpp",
                "Symbol.cpp",
                "TableLiteralInference.cpp",
                "ToDot.cpp",
                "TopoSortStatements.cpp",
                "ToString.cpp",
                "TxnLog.cpp",
                "Type.cpp",
                "TypeArena.cpp",
                "TypeAttach.cpp",
                "TypeChecker2.cpp",
                "TypedAllocator.cpp",
                "TypeFunction.cpp",
                "TypeFunctionError.cpp",
                "TypeFunctionReductionGuesser.cpp",
                "TypeFunctionRuntime.cpp",
                "TypeFunctionRuntimeBuilder.cpp",
                "TypeIds.cpp",
                "TypeInfer.cpp",
                "TypeOrPack.cpp",
                "TypePack.cpp",
                "TypePath.cpp",
                "TypeUtils.cpp",
                "Unifiable.cpp",
                "Unifier.cpp",
                "Unifier2.cpp",
                "UserDefinedTypeFunction.cpp",
            ],
        ),
        (
            "VM",
            &[
                "lapi.cpp",
                "laux.cpp",
                "lbaselib.cpp",
                "lbitlib.cpp",
                "lbuffer.cpp",
                "lbuflib.cpp",
                "lbuiltins.cpp",
                "lcorolib.cpp",
                "ldblib.cpp",
                "ldebug.cpp",
                "ldo.cpp",
                "lfunc.cpp",
                "lgc.cpp",
                "lgcdebug.cpp",
                "linit.cpp",
                "lmathlib.cpp",
                "lmem.cpp",
                "lnumprint.cpp",
                "lobject.cpp",
                "loslib.cpp",
                "lperf.cpp",
                "lstate.cpp",
                "lstring.cpp",
                "lstrlib.cpp",
                "ltable.cpp",
                "ltablib.cpp",
                "ltm.cpp",
                "ludata.cpp",
                "lutf8lib.cpp",
                "lveclib.cpp",
                "lintlib.cpp",
                "lvmexecute.cpp",
                "lvmload.cpp",
                "lvmutils.cpp",
            ],
        ),
    ];

    let mut build = cc::Build::new();
    build.cpp(true);

    build
        .flag_if_supported("-std=c++17")
        .flag_if_supported("/std:c++17")
        .flag_if_supported("/MP");

    let target = env::var("TARGET").unwrap_or_default();
    if target.contains("windows") {
        build.define("_CRT_SECURE_NO_WARNINGS", None);
        build.define("_HAS_EXCEPTIONS", "1");
        build.flag_if_supported("/EHsc");
    } else {
        build.flag_if_supported("-fexceptions");
    }

    for (module_name, files) in &luau_modules {
        build.include(luau_dir.join(module_name).join("include"));

        for file in *files {
            let path_arquivo = luau_dir.join(module_name).join("src").join(file);

            println!("cargo:rerun-if-changed={}", path_arquivo.display());
            build.file(path_arquivo);
        }
    }

    build.file("src/shim.cpp");

    build.compile("luau_analysis");
}