From 3c58af95fa80f3253854d91e6cc95eb35f7ef199 Mon Sep 17 00:00:00 2001 From: Noah Santschi-Cooney Date: Sun, 24 Apr 2022 00:55:43 +0100 Subject: [PATCH 01/13] fix logo images because gitattributes treated them as text --- .gitattributes | 3 ++- README.md | 2 +- logo-min.png | Bin 0 -> 25081 bytes logo.png | Bin 1172868 -> 1172883 bytes 4 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 logo-min.png diff --git a/.gitattributes b/.gitattributes index 07764a7..a2eabde 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,2 @@ -* text eol=lf \ No newline at end of file +* text eol=lf +*.png binary \ No newline at end of file diff --git a/README.md b/README.md index 2465d12..dcad726 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Currently supported editors: - [Visual Studio Code](https://code.visualstudio.com/) with `vscode-mc-shader` - + ## Features diff --git a/logo-min.png b/logo-min.png new file mode 100644 index 0000000000000000000000000000000000000000..4faf57b43c56bcc9405a43d8b37f44ea7f472801 GIT binary patch literal 25081 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 literal 0 HcmV?d00001 diff --git a/logo.png b/logo.png index bec83b0c6e92ace5cab5058f34840caef1bcdd95..17aba30a5d3ff35bc61381210cc63825914d510a 100644 GIT binary patch delta 178 zcmZoU?LPUmJ8NfvpF3|O%T^Xf8+}IJb_adN?GE}(Wuid#HWwx!W(H!G?b}>f1z8z+ zw;%Up3=}J} delta 150 zcmbPy+P&qpJ4Gy!w(oRd6=dCh+LM*H zyZz=B*6la1uq_qeUjK&8Bd`5L6#MoQQ5+i|Z?CfB+~m`)+s(OMx0~yZ{&ue2T(g_E yFSFx*ExCPC1h-n~_ML0FBiXhKZ{gl-*?#;jHxTmxF)tAF0Wtsf<8KAdd Date: Sun, 24 Apr 2022 21:53:21 +0100 Subject: [PATCH 02/13] fix nvidia diagnostics line offset, once and for all (hopefully) --- server/main/src/diagnostics_parser.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/main/src/diagnostics_parser.rs b/server/main/src/diagnostics_parser.rs index 978dcd9..2c4279b 100644 --- a/server/main/src/diagnostics_parser.rs +++ b/server/main/src/diagnostics_parser.rs @@ -40,7 +40,7 @@ impl<'a, T: opengl::ShaderValidator + ?Sized> DiagnosticsParser<'a, T> { fn get_line_offset(&self) -> u32 { *self.line_offset.get_or_init(|| match self.vendor_querier.vendor().as_str() { "ATI Technologies" => 0, - _ => 2, + _ => 1, }) } From 3b568ea08759e10a9cef0f97e44673dc3b91cb40 Mon Sep 17 00:00:00 2001 From: Noah Santschi-Cooney Date: Sun, 24 Apr 2022 22:16:45 +0100 Subject: [PATCH 03/13] fix dfs iterator when same file imported multiple times into another --- server/main/src/dfs.rs | 23 ++++----- server/main/src/graph.rs | 28 ++++++----- server/main/src/main.rs | 6 ++- server/main/src/merge_views.rs | 89 +++++++++++++--------------------- 4 files changed, 64 insertions(+), 82 deletions(-) diff --git a/server/main/src/dfs.rs b/server/main/src/dfs.rs index d990bc7..11d3a6f 100644 --- a/server/main/src/dfs.rs +++ b/server/main/src/dfs.rs @@ -63,25 +63,22 @@ impl<'a> Iterator for Dfs<'a> { touch: 1, }); - let mut children: Vec = self.graph.child_node_indexes(child).collect(); + let mut children: Vec<_> = self + .graph + .get_all_child_positions(child) + .collect(); + children.reverse(); if !children.is_empty() { - // sort by line number in parent - children.sort_by(|x, y| { - let graph = &self.graph.graph; - let edge1 = graph.edge_weight(graph.find_edge(child, *x).unwrap()).unwrap(); - let edge2 = graph.edge_weight(graph.find_edge(child, *y).unwrap()).unwrap(); - edge2.line.cmp(&edge1.line) - }); - - match self.check_for_cycle(&children) { + let child_indexes: Vec<_> = children.iter().map(|c| c.0).collect(); + match self.check_for_cycle(&child_indexes) { Ok(_) => {} Err(e) => return Some(Err(e)), }; for child in children { - self.stack.push(child); + self.stack.push(child.0); } } else { self.reset_path_to_branch(); @@ -314,10 +311,10 @@ mod dfs_test { // \ / \ // 6 - 7 - assert!(is_cyclic_directed(&graph.graph)); - let next = dfs.next().unwrap(); assert_that!(next, err()); + + assert!(is_cyclic_directed(&graph.graph)); } { let mut graph = CachedStableGraph::new(); diff --git a/server/main/src/graph.rs b/server/main/src/graph.rs index 993fae1..608a299 100644 --- a/server/main/src/graph.rs +++ b/server/main/src/graph.rs @@ -59,9 +59,9 @@ impl CachedStableGraph { PathBuf::from_str(&self.graph[node]).unwrap() } - /// returns an iterator over all the `IncludePosition`'s between a parent and its child for all the positions + /// Returns an iterator over all the `IncludePosition`'s between a parent and its child for all the positions /// that the child may be imported into the parent, in order of import. - pub fn get_edge_metas(&self, parent: NodeIndex, child: NodeIndex) -> impl Iterator + '_ { + pub fn get_child_positions(&self, parent: NodeIndex, child: NodeIndex) -> impl Iterator + '_ { let mut edges = self .graph .edges(parent) @@ -77,6 +77,18 @@ impl CachedStableGraph { edges.into_iter() } + /// Returns an iterator over all the `(NodeIndex, IncludePosition)` tuples between a node and all its children, in order + /// of import. + pub fn get_all_child_positions(&self, node: NodeIndex) -> impl Iterator + '_ { + let mut edges = self.graph.edges(node).map(|edge| { + let child = self.graph.edge_endpoints(edge.id()).unwrap().1; + (child, self.graph[edge.id()]) + }) + .collect::>(); + edges.sort_by(|x, y| x.1.line.cmp(&y.1.line)); + edges.into_iter() + } + pub fn add_node(&mut self, name: &Path) -> NodeIndex { if let Some(idx) = self.cache.get(name) { return *idx; @@ -99,14 +111,6 @@ impl CachedStableGraph { .and_then(|edge| self.graph.remove_edge(edge)); } - pub fn child_node_metas(&self, node: NodeIndex) -> impl Iterator + '_ { - self.graph.neighbors(node).map(move |n| { - let edge = self.graph.find_edge(node, n).unwrap(); - let edge_meta = self.graph.edge_weight(edge).unwrap(); - return (self.reverse_index.get(&n).unwrap().clone(), *edge_meta); - }) - } - pub fn child_node_indexes(&self, node: NodeIndex) -> impl Iterator + '_ { self.graph.neighbors(node) } @@ -236,9 +240,9 @@ mod graph_test { // / \ // 1 1 - assert_eq!(2, graph.get_edge_metas(idx0, idx1).count()); + assert_eq!(2, graph.get_child_positions(idx0, idx1).count()); - let mut edge_metas = graph.get_edge_metas(idx0, idx1); + let mut edge_metas = graph.get_child_positions(idx0, idx1); assert_eq!(Some(IncludePosition { line: 2, start: 0, end: 0 }), edge_metas.next()); assert_eq!(Some(IncludePosition { line: 4, start: 0, end: 0 }), edge_metas.next()); } diff --git a/server/main/src/main.rs b/server/main/src/main.rs index a8087ed..b5bdc00 100644 --- a/server/main/src/main.rs +++ b/server/main/src/main.rs @@ -251,7 +251,9 @@ impl MinecraftShaderLanguageServer { Some(n) => n, }; - let prev_children: HashSet<_> = HashSet::from_iter(self.graph.borrow().child_node_metas(idx)); + let prev_children: HashSet<_> = HashSet::from_iter(self.graph.borrow().get_all_child_positions(idx).map(|tup| { + (self.graph.borrow().get_node(tup.0), tup.1) + })); let new_children: HashSet<_> = includes.iter().cloned().collect(); let to_be_added = new_children.difference(&prev_children); @@ -825,7 +827,7 @@ impl LanguageServerHandling for MinecraftShaderLanguageServer { .child_node_indexes(node) .filter_map::, _>(|child| { let graph = self.graph.borrow(); - graph.get_edge_metas(node, child).map(|value| { + graph.get_child_positions(node, child).map(|value| { let path = graph.get_node(child); let url = match Url::from_file_path(&path) { Ok(url) => url, diff --git a/server/main/src/merge_views.rs b/server/main/src/merge_views.rs index c61e5cc..8eec146 100644 --- a/server/main/src/merge_views.rs +++ b/server/main/src/merge_views.rs @@ -8,6 +8,7 @@ use std::{ use core::slice::Iter; use petgraph::stable_graph::NodeIndex; +use slog_scope::debug; use crate::graph::CachedStableGraph; use crate::source_mapper::SourceMapper; @@ -88,13 +89,7 @@ impl<'a> MergeViewBuilder<'a> { // ); // last_offset_set.insert((first, None), version_char_offsets.1); - self.last_offset_set.insert( - FilialTuple { - child: first, - parent: None, - }, - 0, - ); + self.set_last_offset_for_tuple(None, first, 0); // stack to keep track of the depth first traversal let mut stack = VecDeque::::new(); @@ -102,13 +97,8 @@ impl<'a> MergeViewBuilder<'a> { self.create_merge_views(&mut merge_list, &mut extra_lines, &mut stack); // now we add a view of the remainder of the root file - let offset = *self - .last_offset_set - .get(&FilialTuple { - child: first, - parent: None, - }) - .unwrap(); + + let offset = self.get_last_offset_for_tuple(None, first).unwrap(); let len = first_source.len(); merge_list.push_back(&first_source[min(offset, len)..]); @@ -135,8 +125,8 @@ impl<'a> MergeViewBuilder<'a> { .parent_child_edge_iterator .entry(*n) .or_insert_with(|| { - let edge_metas = self.graph.get_edge_metas(parent, child); - Box::new(edge_metas) + let child_positions = self.graph.get_child_positions(parent, child); + Box::new(child_positions) }) .next() .unwrap(); @@ -147,15 +137,16 @@ impl<'a> MergeViewBuilder<'a> { let (char_for_line, char_following_line) = self.char_offset_for_line(edge.line, parent_source); let offset = *self - .last_offset_set - .insert( - FilialTuple { - child: parent, - parent: stack.back().copied(), - }, - char_following_line, - ) + .set_last_offset_for_tuple(stack.back().copied(), parent, char_following_line) .get_or_insert(0); + + debug!("creating view to start child file"; + "parent" => parent_path.to_str().unwrap(), "child" => child_path.to_str().unwrap(), + "grandparent" => stack.back().copied().map(|g| self.graph.get_node(g).to_str().unwrap().to_string()), // self.graph.get_node().to_str().unwrap(), + "last_parent_offset" => offset, "line" => edge.line, "char_for_line" => char_for_line, + "char_following_line" => char_following_line, + ); + merge_list.push_back(&parent_source[offset..char_for_line]); self.add_opening_line_directive(&child_path, child, merge_list, extra_lines); @@ -173,13 +164,7 @@ impl<'a> MergeViewBuilder<'a> { } }; merge_list.push_back(&child_source[..offset]); - self.last_offset_set.insert( - FilialTuple { - child, - parent: Some(parent), - }, - 0, - ); + self.set_last_offset_for_tuple(Some(parent), child, 0); // +2 because edge.line is 0 indexed but #line is 1 indexed and references the *following* line self.add_closing_line_directive(edge.line + 2, &parent_path, parent, merge_list, extra_lines); // if the next pair's parent is not the current pair's parent, we need to bubble up @@ -193,29 +178,17 @@ impl<'a> MergeViewBuilder<'a> { self.create_merge_views(merge_list, extra_lines, stack); stack.pop_back(); - let offset = *self - .last_offset_set - .get(&FilialTuple { - child, - parent: Some(parent), - }) - .unwrap(); + let offset = self.get_last_offset_for_tuple(Some(parent), child).unwrap(); let child_source = self.sources.get(&child_path).unwrap(); // this evaluates to false once the file contents have been exhausted aka offset = child_source.len() + 1 let end_offset = match child_source.ends_with('\n') { - true => 1, /* child_source.len()-1 */ - false => 0, /* child_source.len() */ + true => 1, + false => 0, }; if offset < child_source.len() - end_offset { // if ends in \n\n, we want to exclude the last \n for some reason. Ask optilad - merge_list.push_back(&child_source[offset../* std::cmp::max( */child_source.len()-end_offset/* , offset) */]); - self.last_offset_set.insert( - FilialTuple { - child, - parent: Some(parent), - }, - 0, - ); + merge_list.push_back(&child_source[offset..child_source.len() - end_offset]); + self.set_last_offset_for_tuple(Some(parent), child, 0); } // +2 because edge.line is 0 indexed but #line is 1 indexed and references the *following* line @@ -234,13 +207,7 @@ impl<'a> MergeViewBuilder<'a> { false => child_source.len(), }; merge_list.push_back(&child_source[..offset]); - self.last_offset_set.insert( - FilialTuple { - child, - parent: Some(parent), - }, - 0, - ); + self.set_last_offset_for_tuple(Some(parent), child, 0); // +2 because edge.line is 0 indexed but #line is 1 indexed and references the *following* line self.add_closing_line_directive(edge.line + 2, &parent_path, parent, merge_list, extra_lines); } @@ -248,6 +215,18 @@ impl<'a> MergeViewBuilder<'a> { } } + fn set_last_offset_for_tuple(&mut self, parent: Option, child: NodeIndex, offset: usize) -> Option { + debug!("inserting last offset"; + "parent" => parent.map(|p| self.graph.get_node(p).to_str().unwrap().to_string()), + "child" => self.graph.get_node(child).to_str().unwrap().to_string(), + "offset" => offset); + self.last_offset_set.insert(FilialTuple { child, parent }, offset) + } + + fn get_last_offset_for_tuple(&self, parent: Option, child: NodeIndex) -> Option { + self.last_offset_set.get(&FilialTuple { child, parent }).copied() + } + // returns the character offset + 1 of the end of line number `line` and the character // offset + 1 for the end of the line after the previous one fn char_offset_for_line(&self, line_num: usize, source: &str) -> (usize, usize) { From 941822c5c718a446c8f37406b4b546476e37156b Mon Sep 17 00:00:00 2001 From: Noah Santschi-Cooney Date: Sun, 24 Apr 2022 22:17:20 +0100 Subject: [PATCH 04/13] hardcode top-level file set avoids unimported non-toplevel fsh/vsh/etc files being treated as toplevel --- server/main/src/main.rs | 79 ++++++++++++++++++++++++++++++++++------- 1 file changed, 66 insertions(+), 13 deletions(-) diff --git a/server/main/src/main.rs b/server/main/src/main.rs index b5bdc00..b151174 100644 --- a/server/main/src/main.rs +++ b/server/main/src/main.rs @@ -60,6 +60,54 @@ mod test; lazy_static! { static ref RE_INCLUDE: Regex = Regex::new(r#"^(?:\s)*?(?:#include) "(.+)"\r?"#).unwrap(); + static ref TOPLEVEL_FILES: HashSet = { + let mut set = HashSet::with_capacity(6864); + for folder in ["shaders/", "shaders/world0/", "shaders/world1/", "shaders/world-1/"] { + for ext in ["fsh", "vsh", "gsh", "csh"] { + set.insert(format!("{}composite.{}", folder, ext).into()); + for i in 1..=99 { + set.insert(format!("{}composite{}.{}", folder, i, ext).into()); + set.insert(format!("{}deferred{}.{}", folder, i, ext).into()); + set.insert(format!("{}prepare{}.{}", folder, i, ext).into()); + set.insert(format!("{}shadowcomp{}.{}", folder, i, ext).into()); + } + set.insert(format!("{}composite_pre.{}", folder, ext).into()); + set.insert(format!("{}deferred.{}", folder, ext).into()); + set.insert(format!("{}deferred_pre.{}", folder, ext).into()); + set.insert(format!("{}final.{}", folder, ext).into()); + set.insert(format!("{}gbuffers_armor_glint.{}", folder, ext).into()); + set.insert(format!("{}gbuffers_basic.{}", folder, ext).into()); + set.insert(format!("{}gbuffers_beaconbeam.{}", folder, ext).into()); + set.insert(format!("{}gbuffers_block.{}", folder, ext).into()); + set.insert(format!("{}gbuffers_clouds.{}", folder, ext).into()); + set.insert(format!("{}gbuffers_damagedblock.{}", folder, ext).into()); + set.insert(format!("{}gbuffers_entities.{}", folder, ext).into()); + set.insert(format!("{}gbuffers_entities_glowing.{}", folder, ext).into()); + set.insert(format!("{}gbuffers_hand.{}", folder, ext).into()); + set.insert(format!("{}gbuffers_hand.{}", folder, ext).into()); + set.insert(format!("{}gbuffers_hand_water.{}", folder, ext).into()); + set.insert(format!("{}gbuffers_item.{}", folder, ext).into()); + set.insert(format!("{}gbuffers_line.{}", folder, ext).into()); + set.insert(format!("{}gbuffers_skybasic.{}", folder, ext).into()); + set.insert(format!("{}gbuffers_skytextured.{}", folder, ext).into()); + set.insert(format!("{}gbuffers_spidereyes.{}", folder, ext).into()); + set.insert(format!("{}gbuffers_terrain.{}", folder, ext).into()); + set.insert(format!("{}gbuffers_terrain_cutout.{}", folder, ext).into()); + set.insert(format!("{}gbuffers_terrain_cutout_mip.{}", folder, ext).into()); + set.insert(format!("{}gbuffers_terrain_solid.{}", folder, ext).into()); + set.insert(format!("{}gbuffers_textured.{}", folder, ext).into()); + set.insert(format!("{}gbuffers_textured_lit.{}", folder, ext).into()); + set.insert(format!("{}gbuffers_water.{}", folder, ext).into()); + set.insert(format!("{}gbuffers_weather.{}", folder, ext).into()); + set.insert(format!("{}prepare.{}", folder, ext).into()); + set.insert(format!("{}shadow.{}", folder, ext).into()); + set.insert(format!("{}shadow_cutout.{}", folder, ext).into()); + set.insert(format!("{}shadow_solid.{}", folder, ext).into()); + set.insert(format!("{}shadowcomp.{}", folder, ext).into()); + } + } + set + }; } fn main() { @@ -156,7 +204,7 @@ impl MinecraftShaderLanguageServer { } } - pub fn gen_initial_graph(&self) { + fn build_initial_graph(&self) { info!("generating graph for current root"; "root" => self.root.to_str().unwrap()); // filter directories and files not ending in any of the 3 extensions @@ -341,6 +389,13 @@ impl MinecraftShaderLanguageServer { return Ok(diagnostics); } }; + + if !TOPLEVEL_FILES.contains(root_path.strip_prefix(&self.root).unwrap()) { + 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()); + back_fill(&all_sources, &mut diagnostics); + return Ok(diagnostics); + } + let tree_type = if ext == "fsh" { TreeType::Fragment } else if ext == "vsh" { @@ -350,12 +405,7 @@ impl MinecraftShaderLanguageServer { } else if ext == "csh" { TreeType::Compute } else { - warn!( - "got a non fsh|vsh|gsh|csh as a file root ancestor, skipping lint"; - "extension" => ext, "root_ancestor" => root_path.to_str().unwrap() - ); - back_fill(&all_sources, &mut diagnostics); - return Ok(diagnostics); + unreachable!(); }; let stdout = match self.compile_shader_source(&view, tree_type, &root_path) { @@ -387,6 +437,12 @@ impl MinecraftShaderLanguageServer { Some(ext) => ext.to_str().unwrap(), None => continue, }; + + if !TOPLEVEL_FILES.contains(root_path.strip_prefix(&self.root).unwrap()) { + 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()); + continue; + } + let tree_type = if ext == "fsh" { TreeType::Fragment } else if ext == "vsh" { @@ -396,11 +452,7 @@ impl MinecraftShaderLanguageServer { } else if ext == "csh" { TreeType::Compute } else { - warn!( - "got a non fsh|vsh|gsh|csh as a file root ancestor, skipping lint"; - "extension" => ext, "root_ancestor" => root_path.to_str().unwrap() - ); - continue; + unreachable!(); }; let sources = self.load_sources(&nodes)?; @@ -566,7 +618,8 @@ impl LanguageServerHandling for MinecraftShaderLanguageServer { self.root = root; - self.gen_initial_graph(); + + self.build_initial_graph(); self.set_status("ready", "Project initialized", "$(check)"); }); From d8d77ac600beefff18dbac781574f46f75bfaae5 Mon Sep 17 00:00:00 2001 From: Noah Santschi-Cooney Date: Sun, 24 Apr 2022 22:38:20 +0100 Subject: [PATCH 05/13] release 0.9.8 --- CHANGELOG.md | 8 ++++++++ package-lock.json | 4 ++-- package.json | 2 +- server/Cargo.lock | 6 +++--- server/logging/Cargo.toml | 2 +- server/logging_macro/Cargo.toml | 2 +- server/main/Cargo.toml | 2 +- 7 files changed, 17 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d44521d..4556908 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,14 @@ All notable changes to the "vscode-mc-shader" extension will be documented in th The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +## [0.9.8] + +### Fixed + +- NVIDIA diagnostics line offset off-by-one due to confusion with erroneous (non-proper) GLSL files resulting in both -1 and -2 offsets appearing to be valid when only the former is. +- Non-toplevel files being treated as toplevel files when they have .fsh/.vsh/etc and not imported into a valid toplevel file. +- Fix issue in the depth-first-search iterator when a file is imported twice into another file with a different include in between. + ## [0.9.7] ### Fixed diff --git a/package-lock.json b/package-lock.json index 8f8b1aa..0659dea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { "name": "vscode-mc-shader", - "version": "0.9.7", + "version": "0.9.8", "lockfileVersion": 2, "requires": true, "packages": { "": { - "version": "0.9.7", + "version": "0.9.8", "hasInstallScript": true, "license": "MIT", "devDependencies": { diff --git a/package.json b/package.json index 7c3ef15..36dbb57 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-mc-shader", "displayName": "Minecraft GLSL Shaders", "description": "A Visual Studio Code extension for linting/etc Minecraft GLSL Shaders", - "version": "0.9.7", + "version": "0.9.8", "publisher": "Strum355", "author": "Noah Santschi-Cooney (Strum355)", "license": "MIT", diff --git a/server/Cargo.lock b/server/Cargo.lock index 5d97dab..6139526 100644 --- a/server/Cargo.lock +++ b/server/Cargo.lock @@ -656,7 +656,7 @@ dependencies = [ [[package]] name = "logging" -version = "0.9.7" +version = "0.9.8" dependencies = [ "lazy_static", "rand 0.8.5", @@ -668,7 +668,7 @@ dependencies = [ [[package]] name = "logging_macro" -version = "0.9.7" +version = "0.9.8" dependencies = [ "quote", "syn", @@ -703,7 +703,7 @@ checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "mcshader-lsp" -version = "0.9.7" +version = "0.9.8" dependencies = [ "anyhow", "fs_extra", diff --git a/server/logging/Cargo.toml b/server/logging/Cargo.toml index 7b94e66..3714c9e 100644 --- a/server/logging/Cargo.toml +++ b/server/logging/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "logging" -version = "0.9.7" +version = "0.9.8" authors = ["Noah Santschi-Cooney "] edition = "2021" diff --git a/server/logging_macro/Cargo.toml b/server/logging_macro/Cargo.toml index e20d4ed..efce6d8 100644 --- a/server/logging_macro/Cargo.toml +++ b/server/logging_macro/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "logging_macro" -version = "0.9.7" +version = "0.9.8" authors = ["Noah Santschi-Cooney "] edition = "2021" diff --git a/server/main/Cargo.toml b/server/main/Cargo.toml index 30ad346..824a69b 100644 --- a/server/main/Cargo.toml +++ b/server/main/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mcshader-lsp" -version = "0.9.7" +version = "0.9.8" authors = ["Noah Santschi-Cooney "] edition = "2021" From c737409fdebd02a54f088ce672f97849a10208dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A1lint?= Date: Fri, 29 Apr 2022 08:04:34 +0200 Subject: [PATCH 06/13] Doesn't detect vsh files yet --- package-lock.json | 1 + server/main/src/main.rs | 100 ++++++++++++++++++++++------------------ 2 files changed, 55 insertions(+), 46 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0659dea..f455284 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,6 +5,7 @@ "requires": true, "packages": { "": { + "name": "vscode-mc-shader", "version": "0.9.8", "hasInstallScript": true, "license": "MIT", diff --git a/server/main/src/main.rs b/server/main/src/main.rs index b151174..ab6b8ac 100644 --- a/server/main/src/main.rs +++ b/server/main/src/main.rs @@ -58,53 +58,61 @@ mod url_norm; #[cfg(test)] mod test; +pub fn is_top_level(path: &Path) -> bool { + let path = path.as_os_str().to_str().unwrap().replace("\\", "/"); + if !RE_WORLD_FOLDER.is_match(&path) { + return false; + } + let parts: Vec<&str> = path.split("/").collect(); + let len = parts.len(); + (len == 3 || len == 2) && TOPLEVEL_FILES.contains(parts[len - 1]) +} + lazy_static! { static ref RE_INCLUDE: Regex = Regex::new(r#"^(?:\s)*?(?:#include) "(.+)"\r?"#).unwrap(); - static ref TOPLEVEL_FILES: HashSet = { - let mut set = HashSet::with_capacity(6864); - for folder in ["shaders/", "shaders/world0/", "shaders/world1/", "shaders/world-1/"] { - for ext in ["fsh", "vsh", "gsh", "csh"] { - set.insert(format!("{}composite.{}", folder, ext).into()); - for i in 1..=99 { - set.insert(format!("{}composite{}.{}", folder, i, ext).into()); - set.insert(format!("{}deferred{}.{}", folder, i, ext).into()); - set.insert(format!("{}prepare{}.{}", folder, i, ext).into()); - set.insert(format!("{}shadowcomp{}.{}", folder, i, ext).into()); - } - set.insert(format!("{}composite_pre.{}", folder, ext).into()); - set.insert(format!("{}deferred.{}", folder, ext).into()); - set.insert(format!("{}deferred_pre.{}", folder, ext).into()); - set.insert(format!("{}final.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_armor_glint.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_basic.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_beaconbeam.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_block.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_clouds.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_damagedblock.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_entities.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_entities_glowing.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_hand.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_hand.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_hand_water.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_item.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_line.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_skybasic.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_skytextured.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_spidereyes.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_terrain.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_terrain_cutout.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_terrain_cutout_mip.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_terrain_solid.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_textured.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_textured_lit.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_water.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_weather.{}", folder, ext).into()); - set.insert(format!("{}prepare.{}", folder, ext).into()); - set.insert(format!("{}shadow.{}", folder, ext).into()); - set.insert(format!("{}shadow_cutout.{}", folder, ext).into()); - set.insert(format!("{}shadow_solid.{}", folder, ext).into()); - set.insert(format!("{}shadowcomp.{}", folder, ext).into()); + static ref RE_WORLD_FOLDER: Regex = Regex::new(r#"^shaders(/world-?\d+)?"#).unwrap(); + static ref TOPLEVEL_FILES: HashSet = { + let mut set = HashSet::with_capacity(1716); + for ext in ["fsh", "vsh", "gsh", "csh"] { + set.insert(format!("composite.{}", ext)); + set.insert(format!("deferred.{}", ext)); + set.insert(format!("prepare.{}", ext)); + set.insert(format!("shadowcomp.{}", ext)); + for i in 1..=99 { + set.insert(format!("composite{}.{}", i, ext)); + set.insert(format!("deferred{}.{}", i, ext)); + set.insert(format!("prepare{}.{}", i, ext)); + set.insert(format!("shadowcomp{}.{}", i, ext)); } + set.insert(format!("composite_pre.{}", ext)); + set.insert(format!("deferred_pre.{}", ext)); + set.insert(format!("final.{}", ext)); + set.insert(format!("gbuffers_armor_glint.{}", ext)); + set.insert(format!("gbuffers_basic.{}", ext)); + set.insert(format!("gbuffers_beaconbeam.{}", ext)); + set.insert(format!("gbuffers_block.{}", ext)); + set.insert(format!("gbuffers_clouds.{}", ext)); + set.insert(format!("gbuffers_damagedblock.{}", ext)); + set.insert(format!("gbuffers_entities.{}", ext)); + set.insert(format!("gbuffers_entities_glowing.{}", ext)); + set.insert(format!("gbuffers_hand.{}", ext)); + set.insert(format!("gbuffers_hand_water.{}", ext)); + set.insert(format!("gbuffers_item.{}", ext)); + set.insert(format!("gbuffers_line.{}", ext)); + set.insert(format!("gbuffers_skybasic.{}", ext)); + set.insert(format!("gbuffers_skytextured.{}", ext)); + set.insert(format!("gbuffers_spidereyes.{}", ext)); + set.insert(format!("gbuffers_terrain.{}", ext)); + set.insert(format!("gbuffers_terrain_cutout.{}", ext)); + set.insert(format!("gbuffers_terrain_cutout_mip.{}", ext)); + set.insert(format!("gbuffers_terrain_solid.{}", ext)); + set.insert(format!("gbuffers_textured.{}", ext)); + set.insert(format!("gbuffers_textured_lit.{}", ext)); + set.insert(format!("gbuffers_water.{}", ext)); + set.insert(format!("gbuffers_weather.{}", ext)); + set.insert(format!("shadow.{}", ext)); + set.insert(format!("shadow_cutout.{}", ext)); + set.insert(format!("shadow_solid.{}", ext)); } set }; @@ -390,7 +398,7 @@ impl MinecraftShaderLanguageServer { } }; - if !TOPLEVEL_FILES.contains(root_path.strip_prefix(&self.root).unwrap()) { + if !is_top_level(root_path.strip_prefix(&self.root).unwrap()) { 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()); back_fill(&all_sources, &mut diagnostics); return Ok(diagnostics); @@ -438,7 +446,7 @@ impl MinecraftShaderLanguageServer { None => continue, }; - if !TOPLEVEL_FILES.contains(root_path.strip_prefix(&self.root).unwrap()) { + if !is_top_level(root_path.strip_prefix(&self.root).unwrap()) { 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()); continue; } From f8cc2eed2252996180f0f5269c3b06b640bb9dae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A1lint?= Date: Fri, 29 Apr 2022 08:04:34 +0200 Subject: [PATCH 07/13] Fixed issue with modded worlds --- package-lock.json | 1 + server/main/src/main.rs | 100 ++++++++++++++++++++++------------------ 2 files changed, 55 insertions(+), 46 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0659dea..f455284 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,6 +5,7 @@ "requires": true, "packages": { "": { + "name": "vscode-mc-shader", "version": "0.9.8", "hasInstallScript": true, "license": "MIT", diff --git a/server/main/src/main.rs b/server/main/src/main.rs index b151174..ab6b8ac 100644 --- a/server/main/src/main.rs +++ b/server/main/src/main.rs @@ -58,53 +58,61 @@ mod url_norm; #[cfg(test)] mod test; +pub fn is_top_level(path: &Path) -> bool { + let path = path.as_os_str().to_str().unwrap().replace("\\", "/"); + if !RE_WORLD_FOLDER.is_match(&path) { + return false; + } + let parts: Vec<&str> = path.split("/").collect(); + let len = parts.len(); + (len == 3 || len == 2) && TOPLEVEL_FILES.contains(parts[len - 1]) +} + lazy_static! { static ref RE_INCLUDE: Regex = Regex::new(r#"^(?:\s)*?(?:#include) "(.+)"\r?"#).unwrap(); - static ref TOPLEVEL_FILES: HashSet = { - let mut set = HashSet::with_capacity(6864); - for folder in ["shaders/", "shaders/world0/", "shaders/world1/", "shaders/world-1/"] { - for ext in ["fsh", "vsh", "gsh", "csh"] { - set.insert(format!("{}composite.{}", folder, ext).into()); - for i in 1..=99 { - set.insert(format!("{}composite{}.{}", folder, i, ext).into()); - set.insert(format!("{}deferred{}.{}", folder, i, ext).into()); - set.insert(format!("{}prepare{}.{}", folder, i, ext).into()); - set.insert(format!("{}shadowcomp{}.{}", folder, i, ext).into()); - } - set.insert(format!("{}composite_pre.{}", folder, ext).into()); - set.insert(format!("{}deferred.{}", folder, ext).into()); - set.insert(format!("{}deferred_pre.{}", folder, ext).into()); - set.insert(format!("{}final.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_armor_glint.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_basic.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_beaconbeam.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_block.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_clouds.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_damagedblock.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_entities.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_entities_glowing.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_hand.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_hand.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_hand_water.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_item.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_line.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_skybasic.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_skytextured.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_spidereyes.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_terrain.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_terrain_cutout.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_terrain_cutout_mip.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_terrain_solid.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_textured.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_textured_lit.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_water.{}", folder, ext).into()); - set.insert(format!("{}gbuffers_weather.{}", folder, ext).into()); - set.insert(format!("{}prepare.{}", folder, ext).into()); - set.insert(format!("{}shadow.{}", folder, ext).into()); - set.insert(format!("{}shadow_cutout.{}", folder, ext).into()); - set.insert(format!("{}shadow_solid.{}", folder, ext).into()); - set.insert(format!("{}shadowcomp.{}", folder, ext).into()); + static ref RE_WORLD_FOLDER: Regex = Regex::new(r#"^shaders(/world-?\d+)?"#).unwrap(); + static ref TOPLEVEL_FILES: HashSet = { + let mut set = HashSet::with_capacity(1716); + for ext in ["fsh", "vsh", "gsh", "csh"] { + set.insert(format!("composite.{}", ext)); + set.insert(format!("deferred.{}", ext)); + set.insert(format!("prepare.{}", ext)); + set.insert(format!("shadowcomp.{}", ext)); + for i in 1..=99 { + set.insert(format!("composite{}.{}", i, ext)); + set.insert(format!("deferred{}.{}", i, ext)); + set.insert(format!("prepare{}.{}", i, ext)); + set.insert(format!("shadowcomp{}.{}", i, ext)); } + set.insert(format!("composite_pre.{}", ext)); + set.insert(format!("deferred_pre.{}", ext)); + set.insert(format!("final.{}", ext)); + set.insert(format!("gbuffers_armor_glint.{}", ext)); + set.insert(format!("gbuffers_basic.{}", ext)); + set.insert(format!("gbuffers_beaconbeam.{}", ext)); + set.insert(format!("gbuffers_block.{}", ext)); + set.insert(format!("gbuffers_clouds.{}", ext)); + set.insert(format!("gbuffers_damagedblock.{}", ext)); + set.insert(format!("gbuffers_entities.{}", ext)); + set.insert(format!("gbuffers_entities_glowing.{}", ext)); + set.insert(format!("gbuffers_hand.{}", ext)); + set.insert(format!("gbuffers_hand_water.{}", ext)); + set.insert(format!("gbuffers_item.{}", ext)); + set.insert(format!("gbuffers_line.{}", ext)); + set.insert(format!("gbuffers_skybasic.{}", ext)); + set.insert(format!("gbuffers_skytextured.{}", ext)); + set.insert(format!("gbuffers_spidereyes.{}", ext)); + set.insert(format!("gbuffers_terrain.{}", ext)); + set.insert(format!("gbuffers_terrain_cutout.{}", ext)); + set.insert(format!("gbuffers_terrain_cutout_mip.{}", ext)); + set.insert(format!("gbuffers_terrain_solid.{}", ext)); + set.insert(format!("gbuffers_textured.{}", ext)); + set.insert(format!("gbuffers_textured_lit.{}", ext)); + set.insert(format!("gbuffers_water.{}", ext)); + set.insert(format!("gbuffers_weather.{}", ext)); + set.insert(format!("shadow.{}", ext)); + set.insert(format!("shadow_cutout.{}", ext)); + set.insert(format!("shadow_solid.{}", ext)); } set }; @@ -390,7 +398,7 @@ impl MinecraftShaderLanguageServer { } }; - if !TOPLEVEL_FILES.contains(root_path.strip_prefix(&self.root).unwrap()) { + if !is_top_level(root_path.strip_prefix(&self.root).unwrap()) { 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()); back_fill(&all_sources, &mut diagnostics); return Ok(diagnostics); @@ -438,7 +446,7 @@ impl MinecraftShaderLanguageServer { None => continue, }; - if !TOPLEVEL_FILES.contains(root_path.strip_prefix(&self.root).unwrap()) { + if !is_top_level(root_path.strip_prefix(&self.root).unwrap()) { 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()); continue; } From 0768abb1220a7b496761e9847a6b499c816e1084 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A1lint?= Date: Fri, 29 Apr 2022 19:02:15 +0200 Subject: [PATCH 08/13] Replaced slash conversion with lib function --- server/main/src/main.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/main/src/main.rs b/server/main/src/main.rs index ab6b8ac..7798e53 100644 --- a/server/main/src/main.rs +++ b/server/main/src/main.rs @@ -7,6 +7,7 @@ use rust_lsp::lsp::*; use rust_lsp::lsp_types::{notification::*, *}; use petgraph::stable_graph::NodeIndex; +use path_slash::PathExt; use serde::Deserialize; use serde_json::{from_value, Value}; @@ -59,7 +60,7 @@ mod url_norm; mod test; pub fn is_top_level(path: &Path) -> bool { - let path = path.as_os_str().to_str().unwrap().replace("\\", "/"); + let path = path.to_slash().unwrap(); if !RE_WORLD_FOLDER.is_match(&path) { return false; } From 05e52fc8d08c80dddf60abe144222de5ae604928 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tristan=20Dani=C3=ABl=20Maat?= Date: Thu, 18 Aug 2022 04:09:50 +0100 Subject: [PATCH 09/13] Fix crashes when run with eglot as a client This just handles ConfigurationDidChange events in which the "mcglsl" key wasn't set without crashing, by ignoring them; if the configuration changed, but none of our configuration changed, there's nothing we need to update. Obviously there is still a lot that can go wrong here, but this allows running the language server with https://github.com/joaotavora/eglot, as that language server sends a ConfigurationDidChange on startup if any configuration is set (including for other language servers). --- server/main/src/main.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/server/main/src/main.rs b/server/main/src/main.rs index 7798e53..91b1292 100644 --- a/server/main/src/main.rs +++ b/server/main/src/main.rs @@ -651,14 +651,16 @@ impl LanguageServerHandling for MinecraftShaderLanguageServer { log_level: String, } - let config: Configuration = from_value(params.settings.as_object().unwrap().get("mcglsl").unwrap().to_owned()).unwrap(); + if let Some(settings) = params.settings.as_object().unwrap().get("mcglsl") { + let config: Configuration = from_value(settings.to_owned()).unwrap(); - info!("got updated configuration"; "config" => params.settings.as_object().unwrap().get("mcglsl").unwrap().to_string()); + info!("got updated configuration"; "config" => params.settings.as_object().unwrap().get("mcglsl").unwrap().to_string()); - configuration::handle_log_level_change(config.log_level, |level| { - self.log_guard = None; // set to None so Drop is invoked - self.log_guard = Some(logging::set_logger_with_level(level)); - }) + configuration::handle_log_level_change(config.log_level, |level| { + self.log_guard = None; // set to None so Drop is invoked + self.log_guard = Some(logging::set_logger_with_level(level)); + }) + } }); } From b6da5c97fb1a41f5452bd1f2ec26373b1512e424 Mon Sep 17 00:00:00 2001 From: GeForceLegend <512287858@qq.com> Date: Sun, 5 Feb 2023 09:54:56 +0800 Subject: [PATCH 10/13] Update to latest rust nightly I'm not sure if these 2 packages are same since I can't find any document direct to std::lazy::OnceCell --- client/src/extension.ts | 2 +- server/main/src/diagnostics_parser.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/extension.ts b/client/src/extension.ts index b1863db..87efbc3 100644 --- a/client/src/extension.ts +++ b/client/src/extension.ts @@ -25,7 +25,7 @@ export class Extension { readonly package: { version: string - } = vscode.extensions.getExtension(this.extensionID)!.packageJSON; + } = vscode.extensions.getExtension(this.extensionID)!.packageJSON public get context(): vscode.ExtensionContext { return this.extensionContext diff --git a/server/main/src/diagnostics_parser.rs b/server/main/src/diagnostics_parser.rs index 2c4279b..2f61b64 100644 --- a/server/main/src/diagnostics_parser.rs +++ b/server/main/src/diagnostics_parser.rs @@ -1,4 +1,4 @@ -use std::{collections::HashMap, lazy::OnceCell, path::Path}; +use std::{collections::HashMap, cell::OnceCell, path::Path}; use regex::Regex; use rust_lsp::lsp_types::{Diagnostic, DiagnosticSeverity, Position, Range}; From 78b6a6ef1dd1587b05f05de96bc793739b9b3826 Mon Sep 17 00:00:00 2001 From: GeForceLegend <512287858@qq.com> Date: Sun, 5 Feb 2023 09:56:56 +0800 Subject: [PATCH 11/13] Added highlight support for csh with suffixes Compute shader with _a to _z suffix can get highlighted now --- server/main/src/main.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/server/main/src/main.rs b/server/main/src/main.rs index 91b1292..119dbdc 100644 --- a/server/main/src/main.rs +++ b/server/main/src/main.rs @@ -115,6 +115,21 @@ lazy_static! { set.insert(format!("shadow_cutout.{}", ext)); set.insert(format!("shadow_solid.{}", ext)); } + let base_char_num = 'a' as u8; + for suffix_num in 0u8..=25u8 { + let suffix_char = (base_char_num + suffix_num) as char; + set.insert(format!("composite_{}.csh", suffix_char)); + set.insert(format!("deferred_{}.csh", suffix_char)); + set.insert(format!("prepare_{}.csh", suffix_char)); + set.insert(format!("shadowcomp_{}.csh", suffix_char)); + for i in 1..=99 { + let total_suffix = format!("{}_{}", i, suffix_char); + set.insert(format!("composite{}.csh", total_suffix)); + set.insert(format!("deferred{}.csh", total_suffix)); + set.insert(format!("prepare{}.csh", total_suffix)); + set.insert(format!("shadowcomp{}.csh", total_suffix)); + } + } set }; } From 4dd55423556fdb73cab92476066833c939e4c9ef Mon Sep 17 00:00:00 2001 From: GeForceLegend <512287858@qq.com> Date: Sun, 5 Feb 2023 10:53:28 +0800 Subject: [PATCH 12/13] Fixed icons --- README.md | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index dcad726..74fb1d5 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Minecraft GLSL Shaders Language Server ## mcshader-lsp -[![Marketplace Version](https://vsmarketplacebadge.apphb.com/version/strum355.vscode-mc-shader.svg)](https://marketplace.visualstudio.com/items?itemName=strum355.vscode-mc-shader) [![Installs](https://vsmarketplacebadge.apphb.com/installs/strum355.vscode-mc-shader.svg)](https://marketplace.visualstudio.com/items?itemName=strum355.vscode-mc-shader) +[![Marketplace Version](https://img.shields.io/visual-studio-marketplace/v/strum355.vscode-mc-shader.svg)](https://marketplace.visualstudio.com/items?itemName=strum355.vscode-mc-shader) [![Installs](https://img.shields.io/visual-studio-marketplace/i/strum355.vscode-mc-shader.svg)](https://marketplace.visualstudio.com/items?itemName=strum355.vscode-mc-shader) [![license](https://img.shields.io/github/license/Strum355/vscode-mc-shader.svg)](https://github.com/Strum355/mcshader-lsp) [![Issues](https://img.shields.io/github/issues-raw/Strum355/mcshader-lsp.svg)](https://github.com/Strum355/mcshader-lsp/issues) [![Build Status](https://img.shields.io/drone/build/Strum355/mcshader-lsp)](https://cloud.drone.io/Strum355/mcshader-lsp) diff --git a/package.json b/package.json index 36dbb57..36312f3 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "publisher": "Strum355", "author": "Noah Santschi-Cooney (Strum355)", "license": "MIT", - "icon": "logo-mini.png", + "icon": "logo-min.png", "repository": { "url": "https://github.com/Strum355/mcshader-lsp" }, From 85cbb6d81e9e70aadaf94bd2b8eb9a8c54818269 Mon Sep 17 00:00:00 2001 From: Noah Santschi-Cooney Date: Sun, 12 Feb 2023 16:32:38 +0000 Subject: [PATCH 13/13] release 0.9.9 --- CHANGELOG.md | 12 ++++++++++++ package.json | 2 +- server/Cargo.lock | 6 +++--- server/logging/Cargo.toml | 2 +- server/logging_macro/Cargo.toml | 2 +- server/main/Cargo.toml | 2 +- 6 files changed, 19 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4556908..d7e089d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,18 @@ All notable changes to the "vscode-mc-shader" extension will be documented in th The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +## [0.9.9] + +### Added + +- Support for mod world folders, outside the standard world{-1,0,1}. +- Support for compute shader files ending in \_a to \_z. + +### Fixed + +- Crash when running with eglot as LSP client. +- Extension icon client not displaying (encoding issue). + ## [0.9.8] ### Fixed diff --git a/package.json b/package.json index 36312f3..0ecfe79 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-mc-shader", "displayName": "Minecraft GLSL Shaders", "description": "A Visual Studio Code extension for linting/etc Minecraft GLSL Shaders", - "version": "0.9.8", + "version": "0.9.9", "publisher": "Strum355", "author": "Noah Santschi-Cooney (Strum355)", "license": "MIT", diff --git a/server/Cargo.lock b/server/Cargo.lock index 6139526..05c839a 100644 --- a/server/Cargo.lock +++ b/server/Cargo.lock @@ -656,7 +656,7 @@ dependencies = [ [[package]] name = "logging" -version = "0.9.8" +version = "0.9.9" dependencies = [ "lazy_static", "rand 0.8.5", @@ -668,7 +668,7 @@ dependencies = [ [[package]] name = "logging_macro" -version = "0.9.8" +version = "0.9.9" dependencies = [ "quote", "syn", @@ -703,7 +703,7 @@ checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "mcshader-lsp" -version = "0.9.8" +version = "0.9.9" dependencies = [ "anyhow", "fs_extra", diff --git a/server/logging/Cargo.toml b/server/logging/Cargo.toml index 3714c9e..2abdf7e 100644 --- a/server/logging/Cargo.toml +++ b/server/logging/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "logging" -version = "0.9.8" +version = "0.9.9" authors = ["Noah Santschi-Cooney "] edition = "2021" diff --git a/server/logging_macro/Cargo.toml b/server/logging_macro/Cargo.toml index efce6d8..f1e6957 100644 --- a/server/logging_macro/Cargo.toml +++ b/server/logging_macro/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "logging_macro" -version = "0.9.8" +version = "0.9.9" authors = ["Noah Santschi-Cooney "] edition = "2021" diff --git a/server/main/Cargo.toml b/server/main/Cargo.toml index 824a69b..3aa68c2 100644 --- a/server/main/Cargo.toml +++ b/server/main/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mcshader-lsp" -version = "0.9.8" +version = "0.9.9" authors = ["Noah Santschi-Cooney "] edition = "2021"