@@ -7,6 +7,7 @@ use rust_lsp::lsp::*;
77use rust_lsp:: lsp_types:: { notification:: * , * } ;
88
99use petgraph:: stable_graph:: NodeIndex ;
10+ use path_slash:: PathExt ;
1011
1112use serde:: Deserialize ;
1213use serde_json:: { from_value, Value } ;
@@ -58,53 +59,61 @@ mod url_norm;
5859#[ cfg( test) ]
5960mod test;
6061
62+ pub fn is_top_level ( path : & Path ) -> bool {
63+ let path = path. to_slash ( ) . unwrap ( ) ;
64+ if !RE_WORLD_FOLDER . is_match ( & path) {
65+ return false ;
66+ }
67+ let parts: Vec < & str > = path. split ( "/" ) . collect ( ) ;
68+ let len = parts. len ( ) ;
69+ ( len == 3 || len == 2 ) && TOPLEVEL_FILES . contains ( parts[ len - 1 ] )
70+ }
71+
6172lazy_static ! {
6273 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( ) ) ;
74+ static ref RE_WORLD_FOLDER : Regex = Regex :: new( r#"^shaders(/world-?\d+)?"# ) . unwrap( ) ;
75+ static ref TOPLEVEL_FILES : HashSet <String > = {
76+ let mut set = HashSet :: with_capacity( 1716 ) ;
77+ for ext in [ "fsh" , "vsh" , "gsh" , "csh" ] {
78+ set. insert( format!( "composite.{}" , ext) ) ;
79+ set. insert( format!( "deferred.{}" , ext) ) ;
80+ set. insert( format!( "prepare.{}" , ext) ) ;
81+ set. insert( format!( "shadowcomp.{}" , ext) ) ;
82+ for i in 1 ..=99 {
83+ set. insert( format!( "composite{}.{}" , i, ext) ) ;
84+ set. insert( format!( "deferred{}.{}" , i, ext) ) ;
85+ set. insert( format!( "prepare{}.{}" , i, ext) ) ;
86+ set. insert( format!( "shadowcomp{}.{}" , i, ext) ) ;
10787 }
88+ set. insert( format!( "composite_pre.{}" , ext) ) ;
89+ set. insert( format!( "deferred_pre.{}" , ext) ) ;
90+ set. insert( format!( "final.{}" , ext) ) ;
91+ set. insert( format!( "gbuffers_armor_glint.{}" , ext) ) ;
92+ set. insert( format!( "gbuffers_basic.{}" , ext) ) ;
93+ set. insert( format!( "gbuffers_beaconbeam.{}" , ext) ) ;
94+ set. insert( format!( "gbuffers_block.{}" , ext) ) ;
95+ set. insert( format!( "gbuffers_clouds.{}" , ext) ) ;
96+ set. insert( format!( "gbuffers_damagedblock.{}" , ext) ) ;
97+ set. insert( format!( "gbuffers_entities.{}" , ext) ) ;
98+ set. insert( format!( "gbuffers_entities_glowing.{}" , ext) ) ;
99+ set. insert( format!( "gbuffers_hand.{}" , ext) ) ;
100+ set. insert( format!( "gbuffers_hand_water.{}" , ext) ) ;
101+ set. insert( format!( "gbuffers_item.{}" , ext) ) ;
102+ set. insert( format!( "gbuffers_line.{}" , ext) ) ;
103+ set. insert( format!( "gbuffers_skybasic.{}" , ext) ) ;
104+ set. insert( format!( "gbuffers_skytextured.{}" , ext) ) ;
105+ set. insert( format!( "gbuffers_spidereyes.{}" , ext) ) ;
106+ set. insert( format!( "gbuffers_terrain.{}" , ext) ) ;
107+ set. insert( format!( "gbuffers_terrain_cutout.{}" , ext) ) ;
108+ set. insert( format!( "gbuffers_terrain_cutout_mip.{}" , ext) ) ;
109+ set. insert( format!( "gbuffers_terrain_solid.{}" , ext) ) ;
110+ set. insert( format!( "gbuffers_textured.{}" , ext) ) ;
111+ set. insert( format!( "gbuffers_textured_lit.{}" , ext) ) ;
112+ set. insert( format!( "gbuffers_water.{}" , ext) ) ;
113+ set. insert( format!( "gbuffers_weather.{}" , ext) ) ;
114+ set. insert( format!( "shadow.{}" , ext) ) ;
115+ set. insert( format!( "shadow_cutout.{}" , ext) ) ;
116+ set. insert( format!( "shadow_solid.{}" , ext) ) ;
108117 }
109118 set
110119 } ;
@@ -390,7 +399,7 @@ impl MinecraftShaderLanguageServer {
390399 }
391400 } ;
392401
393- if !TOPLEVEL_FILES . contains ( root_path. strip_prefix ( & self . root ) . unwrap ( ) ) {
402+ if !is_top_level ( root_path. strip_prefix ( & self . root ) . unwrap ( ) ) {
394403 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( ) ) ;
395404 back_fill ( & all_sources, & mut diagnostics) ;
396405 return Ok ( diagnostics) ;
@@ -438,7 +447,7 @@ impl MinecraftShaderLanguageServer {
438447 None => continue ,
439448 } ;
440449
441- if !TOPLEVEL_FILES . contains ( root_path. strip_prefix ( & self . root ) . unwrap ( ) ) {
450+ if !is_top_level ( root_path. strip_prefix ( & self . root ) . unwrap ( ) ) {
442451 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( ) ) ;
443452 continue ;
444453 }
0 commit comments