Skip to content

Commit 42a5679

Browse files
committed
node-macro: add CrateIdent struct containing resolved crate paths
1 parent d87d6ab commit 42a5679

File tree

10 files changed

+86
-49
lines changed

10 files changed

+86
-49
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

node-graph/gcore-shaders/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ glam = { workspace = true }
3535
half = { workspace = true, default-features = false }
3636
num-derive = { workspace = true }
3737
num-traits = { workspace = true }
38+
spirv-std = { workspace = true }
3839

3940
# Workspace std dependencies
4041
serde = { workspace = true, optional = true }

node-graph/gcore-shaders/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ pub mod choice_type;
55
pub mod color;
66
pub mod context;
77
pub mod registry;
8+
pub mod shaders;
89

910
pub use context::Ctx;
1011
pub use glam;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pub mod __private {
2+
pub use bytemuck;
3+
pub use glam;
4+
pub use spirv_std;
5+
}

node-graph/node-macro/src/codegen.rs

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use crate::parsing::*;
22
use convert_case::{Case, Casing};
3-
use proc_macro_crate::FoundCrate;
43
use proc_macro2::TokenStream as TokenStream2;
54
use quote::{ToTokens, format_ident, quote, quote_spanned};
65
use std::sync::atomic::AtomicU64;
@@ -10,7 +9,7 @@ use syn::token::Comma;
109
use syn::{Error, Ident, PatIdent, Token, WhereClause, WherePredicate, parse_quote};
1110
static NODE_ID: AtomicU64 = AtomicU64::new(0);
1211

13-
pub(crate) fn generate_node_code(parsed: &ParsedNodeFn) -> syn::Result<TokenStream2> {
12+
pub(crate) fn generate_node_code(crate_ident: &CrateIdent, parsed: &ParsedNodeFn) -> syn::Result<TokenStream2> {
1413
let ParsedNodeFn {
1514
vis,
1615
attributes,
@@ -24,10 +23,10 @@ pub(crate) fn generate_node_code(parsed: &ParsedNodeFn) -> syn::Result<TokenStre
2423
is_async,
2524
fields,
2625
body,
27-
crate_name: graphene_core_crate,
2826
description,
2927
..
3028
} = parsed;
29+
let graphene_core = crate_ident.gcore()?;
3130

3231
let category = &attributes.category.as_ref().map(|value| quote!(Some(#value))).unwrap_or(quote!(None));
3332
let mod_name = format_ident!("_{}_mod", mod_name);
@@ -60,14 +59,6 @@ pub(crate) fn generate_node_code(parsed: &ParsedNodeFn) -> syn::Result<TokenStre
6059
quote! { pub(super) #name: #r#gen }
6160
});
6261

63-
let graphene_core = match graphene_core_crate {
64-
FoundCrate::Itself => quote!(crate),
65-
FoundCrate::Name(name) => {
66-
let ident = Ident::new(name, proc_macro2::Span::call_site());
67-
quote!( #ident )
68-
}
69-
};
70-
7162
let mut future_idents = Vec::new();
7263

7364
let field_types: Vec<_> = fields
@@ -295,7 +286,7 @@ pub(crate) fn generate_node_code(parsed: &ParsedNodeFn) -> syn::Result<TokenStre
295286

296287
let cfg = crate::shader_nodes::modify_cfg(attributes);
297288
let node_input_accessor = generate_node_input_references(parsed, fn_generics, &field_idents, &graphene_core, &identifier, &cfg);
298-
let ShaderTokens { shader_entry_point, gpu_node } = attributes.shader_node.as_ref().map(|n| n.codegen(parsed)).unwrap_or(Ok(ShaderTokens::default()))?;
289+
let ShaderTokens { shader_entry_point, gpu_node } = attributes.shader_node.as_ref().map(|n| n.codegen(crate_ident, parsed)).unwrap_or(Ok(ShaderTokens::default()))?;
299290

300291
Ok(quote! {
301292
/// Underlying implementation for [#struct_name]
@@ -592,6 +583,7 @@ fn generate_register_node_impl(parsed: &ParsedNodeFn, field_names: &[&Ident], st
592583
})
593584
}
594585

586+
use crate::crate_ident::CrateIdent;
595587
use crate::shader_nodes::{ShaderCodegen, ShaderTokens};
596588
use syn::visit_mut::VisitMut;
597589
use syn::{GenericArgument, Lifetime, Type};
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
use proc_macro_crate::{FoundCrate, crate_name};
2+
use proc_macro2::{Span, TokenStream};
3+
use quote::{format_ident, quote};
4+
5+
pub struct CrateIdent {
6+
gcore: syn::Result<TokenStream>,
7+
gcore_shaders: syn::Result<TokenStream>,
8+
wgpu_executor: syn::Result<TokenStream>,
9+
}
10+
11+
impl CrateIdent {
12+
pub fn gcore(&self) -> syn::Result<&TokenStream> {
13+
self.gcore.as_ref().map_err(Clone::clone)
14+
}
15+
16+
pub fn gcore_shaders(&self) -> syn::Result<&TokenStream> {
17+
self.gcore_shaders.as_ref().map_err(Clone::clone)
18+
}
19+
20+
pub fn wgpu_executor(&self) -> syn::Result<&TokenStream> {
21+
self.wgpu_executor.as_ref().map_err(Clone::clone)
22+
}
23+
}
24+
25+
impl Default for CrateIdent {
26+
fn default() -> Self {
27+
let find_crate = |orig_name| match crate_name(orig_name) {
28+
Ok(FoundCrate::Itself) => Ok(quote!(crate)),
29+
Ok(FoundCrate::Name(name)) => {
30+
let name = format_ident!("{}", name);
31+
Ok(quote!(::#name))
32+
}
33+
Err(e) => Err(syn::Error::new(Span::call_site(), &format!("Could not find dependency on `{orig_name}`:\n{e}"))),
34+
};
35+
36+
let gcore = find_crate("graphene-core");
37+
let gcore_shaders = find_crate("graphene-core-shaders").or_else(|eshaders| {
38+
gcore
39+
.as_ref()
40+
.map(Clone::clone)
41+
.map_err(|ecore| syn::Error::new(Span::call_site(), &format!("{ecore}\n\nFallback: {eshaders}")))
42+
});
43+
let wgpu_executor = find_crate("wgpu-executor");
44+
Self { gcore, gcore_shaders, wgpu_executor }
45+
}
46+
}

node-graph/node-macro/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use proc_macro_error2::proc_macro_error;
33
use syn::GenericParam;
44

55
mod codegen;
6+
mod crate_ident;
67
mod derive_choice_type;
78
mod parsing;
89
mod shader_nodes;

node-graph/node-macro/src/parsing.rs

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use syn::{
1212
};
1313

1414
use crate::codegen::generate_node_code;
15+
use crate::crate_ident::CrateIdent;
1516
use crate::shader_nodes::ShaderNodeType;
1617

1718
#[derive(Clone, Debug)]
@@ -35,7 +36,6 @@ pub(crate) struct ParsedNodeFn {
3536
pub(crate) is_async: bool,
3637
pub(crate) fields: Vec<ParsedField>,
3738
pub(crate) body: TokenStream2,
38-
pub(crate) crate_name: proc_macro_crate::FoundCrate,
3939
pub(crate) description: String,
4040
}
4141

@@ -313,12 +313,6 @@ fn parse_node_fn(attr: TokenStream2, item: TokenStream2) -> syn::Result<ParsedNo
313313
let output_type = parse_output(&input_fn.sig.output)?;
314314
let where_clause = input_fn.sig.generics.where_clause;
315315
let body = input_fn.block.to_token_stream();
316-
let crate_name = proc_macro_crate::crate_name("graphene-core").map_err(|e| {
317-
Error::new(
318-
proc_macro2::Span::call_site(),
319-
format!("Failed to find location of graphene_core. Make sure it is imported as a dependency: {e}"),
320-
)
321-
})?;
322316
let description = input_fn
323317
.attrs
324318
.iter()
@@ -349,7 +343,6 @@ fn parse_node_fn(attr: TokenStream2, item: TokenStream2) -> syn::Result<ParsedNo
349343
fields,
350344
where_clause,
351345
body,
352-
crate_name,
353346
description,
354347
})
355348
}
@@ -643,10 +636,11 @@ fn extract_attribute<'a>(attrs: &'a [Attribute], name: &str) -> Option<&'a Attri
643636

644637
// Modify the new_node_fn function to use the code generation
645638
pub fn new_node_fn(attr: TokenStream2, item: TokenStream2) -> syn::Result<TokenStream2> {
639+
let crate_ident = CrateIdent::default();
646640
let mut parsed_node = parse_node_fn(attr, item.clone()).map_err(|e| Error::new(e.span(), format!("Failed to parse node function: {e}")))?;
647641
parsed_node.replace_impl_trait_in_input();
648642
crate::validation::validate_node_fn(&parsed_node).map_err(|e| Error::new(e.span(), format!("Validation Error: {e}")))?;
649-
generate_node_code(&parsed_node).map_err(|e| Error::new(e.span(), format!("Failed to generate node code: {e}")))
643+
generate_node_code(&crate_ident, &parsed_node).map_err(|e| Error::new(e.span(), format!("Failed to generate node code: {e}")))
650644
}
651645

652646
impl ParsedNodeFn {
@@ -829,7 +823,6 @@ mod tests {
829823
unit: None,
830824
}],
831825
body: TokenStream2::new(),
832-
crate_name: FoundCrate::Itself,
833826
description: String::from("Multi\nLine\n"),
834827
};
835828

@@ -911,7 +904,6 @@ mod tests {
911904
},
912905
],
913906
body: TokenStream2::new(),
914-
crate_name: FoundCrate::Itself,
915907
description: String::from("Hello\n\t\t\t\tWorld\n"),
916908
};
917909

@@ -974,7 +966,6 @@ mod tests {
974966
unit: None,
975967
}],
976968
body: TokenStream2::new(),
977-
crate_name: FoundCrate::Itself,
978969
description: "Test\n".into(),
979970
};
980971

@@ -1041,7 +1032,6 @@ mod tests {
10411032
unit: None,
10421033
}],
10431034
body: TokenStream2::new(),
1044-
crate_name: FoundCrate::Itself,
10451035
description: String::new(),
10461036
};
10471037

@@ -1110,7 +1100,6 @@ mod tests {
11101100
unit: None,
11111101
}],
11121102
body: TokenStream2::new(),
1113-
crate_name: FoundCrate::Itself,
11141103
description: String::new(),
11151104
};
11161105

@@ -1172,7 +1161,6 @@ mod tests {
11721161
unit: None,
11731162
}],
11741163
body: TokenStream2::new(),
1175-
crate_name: FoundCrate::Itself,
11761164
description: String::new(),
11771165
};
11781166

@@ -1214,7 +1202,6 @@ mod tests {
12141202
is_async: false,
12151203
fields: vec![],
12161204
body: TokenStream2::new(),
1217-
crate_name: FoundCrate::Itself,
12181205
description: String::new(),
12191206
};
12201207

node-graph/node-macro/src/shader_nodes/mod.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use crate::crate_ident::CrateIdent;
12
use crate::parsing::{NodeFnAttributes, ParsedNodeFn};
23
use crate::shader_nodes::per_pixel_adjust::PerPixelAdjust;
34
use proc_macro2::{Ident, TokenStream};
@@ -50,11 +51,11 @@ impl Parse for ShaderNodeType {
5051
}
5152

5253
pub trait ShaderCodegen {
53-
fn codegen(&self, parsed: &ParsedNodeFn) -> syn::Result<ShaderTokens>;
54+
fn codegen(&self, crate_ident: &CrateIdent, parsed: &ParsedNodeFn) -> syn::Result<ShaderTokens>;
5455
}
5556

5657
impl ShaderCodegen for ShaderNodeType {
57-
fn codegen(&self, parsed: &ParsedNodeFn) -> syn::Result<ShaderTokens> {
58+
fn codegen(&self, crate_ident: &CrateIdent, parsed: &ParsedNodeFn) -> syn::Result<ShaderTokens> {
5859
match self {
5960
ShaderNodeType::None | ShaderNodeType::ShaderNode => (),
6061
_ => {
@@ -66,7 +67,7 @@ impl ShaderCodegen for ShaderNodeType {
6667

6768
match self {
6869
ShaderNodeType::None | ShaderNodeType::ShaderNode => Ok(ShaderTokens::default()),
69-
ShaderNodeType::PerPixelAdjust(x) => x.codegen(parsed),
70+
ShaderNodeType::PerPixelAdjust(x) => x.codegen(crate_ident, parsed),
7071
}
7172
}
7273
}

0 commit comments

Comments
 (0)