@@ -60,6 +60,54 @@ mod test;
60
60
61
61
lazy_static ! {
62
62
static ref RE_INCLUDE : Regex = Regex :: new( r#"^(?:\s)*?(?:#include) "(.+)"\r?"# ) . unwrap( ) ;
63
+ static ref TOPLEVEL_FILES : HashSet <PathBuf > = {
64
+ let mut set = HashSet :: with_capacity( 6864 ) ;
65
+ for folder in [ "shaders/" , "shaders/world0/" , "shaders/world1/" , "shaders/world-1/" ] {
66
+ for ext in [ "fsh" , "vsh" , "gsh" , "csh" ] {
67
+ set. insert( format!( "{}composite.{}" , folder, ext) . into( ) ) ;
68
+ for i in 1 ..=99 {
69
+ set. insert( format!( "{}composite{}.{}" , folder, i, ext) . into( ) ) ;
70
+ set. insert( format!( "{}deferred{}.{}" , folder, i, ext) . into( ) ) ;
71
+ set. insert( format!( "{}prepare{}.{}" , folder, i, ext) . into( ) ) ;
72
+ set. insert( format!( "{}shadowcomp{}.{}" , folder, i, ext) . into( ) ) ;
73
+ }
74
+ set. insert( format!( "{}composite_pre.{}" , folder, ext) . into( ) ) ;
75
+ set. insert( format!( "{}deferred.{}" , folder, ext) . into( ) ) ;
76
+ set. insert( format!( "{}deferred_pre.{}" , folder, ext) . into( ) ) ;
77
+ set. insert( format!( "{}final.{}" , folder, ext) . into( ) ) ;
78
+ set. insert( format!( "{}gbuffers_armor_glint.{}" , folder, ext) . into( ) ) ;
79
+ set. insert( format!( "{}gbuffers_basic.{}" , folder, ext) . into( ) ) ;
80
+ set. insert( format!( "{}gbuffers_beaconbeam.{}" , folder, ext) . into( ) ) ;
81
+ set. insert( format!( "{}gbuffers_block.{}" , folder, ext) . into( ) ) ;
82
+ set. insert( format!( "{}gbuffers_clouds.{}" , folder, ext) . into( ) ) ;
83
+ set. insert( format!( "{}gbuffers_damagedblock.{}" , folder, ext) . into( ) ) ;
84
+ set. insert( format!( "{}gbuffers_entities.{}" , folder, ext) . into( ) ) ;
85
+ set. insert( format!( "{}gbuffers_entities_glowing.{}" , folder, ext) . into( ) ) ;
86
+ set. insert( format!( "{}gbuffers_hand.{}" , folder, ext) . into( ) ) ;
87
+ set. insert( format!( "{}gbuffers_hand.{}" , folder, ext) . into( ) ) ;
88
+ set. insert( format!( "{}gbuffers_hand_water.{}" , folder, ext) . into( ) ) ;
89
+ set. insert( format!( "{}gbuffers_item.{}" , folder, ext) . into( ) ) ;
90
+ set. insert( format!( "{}gbuffers_line.{}" , folder, ext) . into( ) ) ;
91
+ set. insert( format!( "{}gbuffers_skybasic.{}" , folder, ext) . into( ) ) ;
92
+ set. insert( format!( "{}gbuffers_skytextured.{}" , folder, ext) . into( ) ) ;
93
+ set. insert( format!( "{}gbuffers_spidereyes.{}" , folder, ext) . into( ) ) ;
94
+ set. insert( format!( "{}gbuffers_terrain.{}" , folder, ext) . into( ) ) ;
95
+ set. insert( format!( "{}gbuffers_terrain_cutout.{}" , folder, ext) . into( ) ) ;
96
+ set. insert( format!( "{}gbuffers_terrain_cutout_mip.{}" , folder, ext) . into( ) ) ;
97
+ set. insert( format!( "{}gbuffers_terrain_solid.{}" , folder, ext) . into( ) ) ;
98
+ set. insert( format!( "{}gbuffers_textured.{}" , folder, ext) . into( ) ) ;
99
+ set. insert( format!( "{}gbuffers_textured_lit.{}" , folder, ext) . into( ) ) ;
100
+ set. insert( format!( "{}gbuffers_water.{}" , folder, ext) . into( ) ) ;
101
+ set. insert( format!( "{}gbuffers_weather.{}" , folder, ext) . into( ) ) ;
102
+ set. insert( format!( "{}prepare.{}" , folder, ext) . into( ) ) ;
103
+ set. insert( format!( "{}shadow.{}" , folder, ext) . into( ) ) ;
104
+ set. insert( format!( "{}shadow_cutout.{}" , folder, ext) . into( ) ) ;
105
+ set. insert( format!( "{}shadow_solid.{}" , folder, ext) . into( ) ) ;
106
+ set. insert( format!( "{}shadowcomp.{}" , folder, ext) . into( ) ) ;
107
+ }
108
+ }
109
+ set
110
+ } ;
63
111
}
64
112
65
113
fn main ( ) {
@@ -156,7 +204,7 @@ impl MinecraftShaderLanguageServer {
156
204
}
157
205
}
158
206
159
- pub fn gen_initial_graph ( & self ) {
207
+ fn build_initial_graph ( & self ) {
160
208
info ! ( "generating graph for current root" ; "root" => self . root. to_str( ) . unwrap( ) ) ;
161
209
162
210
// filter directories and files not ending in any of the 3 extensions
@@ -341,6 +389,13 @@ impl MinecraftShaderLanguageServer {
341
389
return Ok ( diagnostics) ;
342
390
}
343
391
} ;
392
+
393
+ if !TOPLEVEL_FILES . contains ( root_path. strip_prefix ( & self . root ) . unwrap ( ) ) {
394
+ warn ! ( "got a non-valid toplevel file" ; "root_ancestor" => root_path. to_str( ) . unwrap( ) , "stripped" => root_path. strip_prefix( & self . root) . unwrap( ) . to_str( ) . unwrap( ) ) ;
395
+ back_fill ( & all_sources, & mut diagnostics) ;
396
+ return Ok ( diagnostics) ;
397
+ }
398
+
344
399
let tree_type = if ext == "fsh" {
345
400
TreeType :: Fragment
346
401
} else if ext == "vsh" {
@@ -350,12 +405,7 @@ impl MinecraftShaderLanguageServer {
350
405
} else if ext == "csh" {
351
406
TreeType :: Compute
352
407
} else {
353
- warn ! (
354
- "got a non fsh|vsh|gsh|csh as a file root ancestor, skipping lint" ;
355
- "extension" => ext, "root_ancestor" => root_path. to_str( ) . unwrap( )
356
- ) ;
357
- back_fill ( & all_sources, & mut diagnostics) ;
358
- return Ok ( diagnostics) ;
408
+ unreachable ! ( ) ;
359
409
} ;
360
410
361
411
let stdout = match self . compile_shader_source ( & view, tree_type, & root_path) {
@@ -387,6 +437,12 @@ impl MinecraftShaderLanguageServer {
387
437
Some ( ext) => ext. to_str ( ) . unwrap ( ) ,
388
438
None => continue ,
389
439
} ;
440
+
441
+ if !TOPLEVEL_FILES . contains ( root_path. strip_prefix ( & self . root ) . unwrap ( ) ) {
442
+ warn ! ( "got a non-valid toplevel file" ; "root_ancestor" => root_path. to_str( ) . unwrap( ) , "stripped" => root_path. strip_prefix( & self . root) . unwrap( ) . to_str( ) . unwrap( ) ) ;
443
+ continue ;
444
+ }
445
+
390
446
let tree_type = if ext == "fsh" {
391
447
TreeType :: Fragment
392
448
} else if ext == "vsh" {
@@ -396,11 +452,7 @@ impl MinecraftShaderLanguageServer {
396
452
} else if ext == "csh" {
397
453
TreeType :: Compute
398
454
} else {
399
- warn ! (
400
- "got a non fsh|vsh|gsh|csh as a file root ancestor, skipping lint" ;
401
- "extension" => ext, "root_ancestor" => root_path. to_str( ) . unwrap( )
402
- ) ;
403
- continue ;
455
+ unreachable ! ( ) ;
404
456
} ;
405
457
406
458
let sources = self . load_sources ( & nodes) ?;
@@ -566,7 +618,8 @@ impl LanguageServerHandling for MinecraftShaderLanguageServer {
566
618
567
619
self . root = root;
568
620
569
- self . gen_initial_graph ( ) ;
621
+
622
+ self . build_initial_graph ( ) ;
570
623
571
624
self . set_status ( "ready" , "Project initialized" , "$(check)" ) ;
572
625
} ) ;
0 commit comments