From 7c5c02b2aefa1bec5fde0f083cdb7c67af6b2caa Mon Sep 17 00:00:00 2001 From: Monnoroch Date: Wed, 11 Jul 2018 21:36:23 +0100 Subject: [PATCH] Initial framework code for the wrapper generator. Related to #76. --- ci/test.sh | 5 +++ generator/Cargo.lock | 33 +++++++++++++++++ generator/Cargo.toml | 11 ++++++ generator/src/lib.rs | 78 +++++++++++++++++++++++++++++++++++++++++ generator/tests/test.rs | 12 +++++++ 5 files changed, 139 insertions(+) create mode 100755 ci/test.sh create mode 100644 generator/Cargo.lock create mode 100644 generator/Cargo.toml create mode 100644 generator/src/lib.rs create mode 100644 generator/tests/test.rs diff --git a/ci/test.sh b/ci/test.sh new file mode 100755 index 0000000..30668ef --- /dev/null +++ b/ci/test.sh @@ -0,0 +1,5 @@ +set -e + +cargo test --verbose --features libjvm +(cd examples/java-lib && ./test.sh) +(cd generator && cargo test --verbose) diff --git a/generator/Cargo.lock b/generator/Cargo.lock new file mode 100644 index 0000000..9675eec --- /dev/null +++ b/generator/Cargo.lock @@ -0,0 +1,33 @@ +[[package]] +name = "proc-macro2" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "quote" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rust-jni-generator" +version = "0.1.0" +dependencies = [ + "proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "unicode-xid" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[metadata] +"checksum proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "effdb53b25cdad54f8f48843d67398f7ef2e14f12c1b4cb4effc549a6462a4d6" +"checksum quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e44651a0dc4cdd99f71c83b561e221f714912d11af1a4dff0631f923d53af035" +"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" diff --git a/generator/Cargo.toml b/generator/Cargo.toml new file mode 100644 index 0000000..9d909ce --- /dev/null +++ b/generator/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "rust-jni-generator" +version = "0.1.0" +authors = ["Monnoroch "] + +[dependencies] +quote = "0.6.3" +proc-macro2 = "0.4.6" + +[lib] +proc-macro = true diff --git a/generator/src/lib.rs b/generator/src/lib.rs new file mode 100644 index 0000000..387d1d6 --- /dev/null +++ b/generator/src/lib.rs @@ -0,0 +1,78 @@ +#![feature(proc_macro)] + +extern crate proc_macro; +#[macro_use] +extern crate quote; +extern crate proc_macro2; + +use proc_macro2::*; +use quote::ToTokens; +use std::ops::Deref; + +/// Generate `rust-jni` wrappers for Java classes and interfaces. +/// +/// TODO(#76): examples. +#[proc_macro] +pub fn java_generate(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + let input: TokenStream = input.into(); + java_generate_impl(input).into() +} + +fn java_generate_impl(input: TokenStream) -> TokenStream { + generate(to_generator_data(parse_java_definition(input))) +} + +#[derive(Debug, PartialEq, Eq, Clone)] +struct JavaDefinitions {} + +fn parse_java_definition(_input: TokenStream) -> JavaDefinitions { + JavaDefinitions {} +} + +#[cfg(test)] +mod parse_tests { + use super::*; + + #[test] + fn empty() { + let input = quote!{}; + assert_eq!(parse_java_definition(input), JavaDefinitions {}); + } +} + +#[derive(Debug, PartialEq, Eq, Clone)] +struct GeneratorData {} + +fn to_generator_data(_definitions: JavaDefinitions) -> GeneratorData { + GeneratorData {} +} + +#[cfg(test)] +mod to_generator_data_tests { + use super::*; + + #[test] + fn empty() { + assert_eq!(to_generator_data(JavaDefinitions {}), GeneratorData {}); + } +} + +fn generate(_data: GeneratorData) -> TokenStream { + TokenStream::new() +} + +#[cfg(test)] +mod generate_tests { + use super::*; + + #[test] + fn empty() { + let expected = quote!{}; + assert_tokens_equals(generate(GeneratorData {}), expected); + } +} + +#[cfg(test)] +fn assert_tokens_equals(left: TokenStream, right: TokenStream) { + assert_eq!(format!("{:?}", left), format!("{:?}", right),); +} diff --git a/generator/tests/test.rs b/generator/tests/test.rs new file mode 100644 index 0000000..fc5ddbe --- /dev/null +++ b/generator/tests/test.rs @@ -0,0 +1,12 @@ +extern crate rust_jni_generator; + +#[cfg(test)] +mod tests { + #[allow(unused_imports)] + use rust_jni_generator::*; + + java_generate!{} + + #[test] + fn test() {} +}