@@ -60,6 +60,54 @@ mod test;
6060
6161lazy_static ! {
6262 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+ } ;
63111}
64112
65113fn main ( ) {
@@ -156,7 +204,7 @@ impl MinecraftShaderLanguageServer {
156204 }
157205 }
158206
159- pub fn gen_initial_graph ( & self ) {
207+ fn build_initial_graph ( & self ) {
160208 info ! ( "generating graph for current root" ; "root" => self . root. to_str( ) . unwrap( ) ) ;
161209
162210 // filter directories and files not ending in any of the 3 extensions
@@ -341,6 +389,13 @@ impl MinecraftShaderLanguageServer {
341389 return Ok ( diagnostics) ;
342390 }
343391 } ;
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+
344399 let tree_type = if ext == "fsh" {
345400 TreeType :: Fragment
346401 } else if ext == "vsh" {
@@ -350,12 +405,7 @@ impl MinecraftShaderLanguageServer {
350405 } else if ext == "csh" {
351406 TreeType :: Compute
352407 } 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 ! ( ) ;
359409 } ;
360410
361411 let stdout = match self . compile_shader_source ( & view, tree_type, & root_path) {
@@ -387,6 +437,12 @@ impl MinecraftShaderLanguageServer {
387437 Some ( ext) => ext. to_str ( ) . unwrap ( ) ,
388438 None => continue ,
389439 } ;
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+
390446 let tree_type = if ext == "fsh" {
391447 TreeType :: Fragment
392448 } else if ext == "vsh" {
@@ -396,11 +452,7 @@ impl MinecraftShaderLanguageServer {
396452 } else if ext == "csh" {
397453 TreeType :: Compute
398454 } 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 ! ( ) ;
404456 } ;
405457
406458 let sources = self . load_sources ( & nodes) ?;
@@ -566,7 +618,8 @@ impl LanguageServerHandling for MinecraftShaderLanguageServer {
566618
567619 self . root = root;
568620
569- self . gen_initial_graph ( ) ;
621+
622+ self . build_initial_graph ( ) ;
570623
571624 self . set_status ( "ready" , "Project initialized" , "$(check)" ) ;
572625 } ) ;
0 commit comments