mirror of
https://github.com/Strum355/mcshader-lsp.git
synced 2025-08-31 13:57:27 +00:00
Light refactoring for less .unwrap
This commit is contained in:
parent
4a062581c4
commit
346e9b0f9f
3 changed files with 59 additions and 41 deletions
7
server/Cargo.lock
generated
7
server/Cargo.lock
generated
|
@ -8,6 +8,11 @@ dependencies = [
|
||||||
"memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "anyhow"
|
||||||
|
version = "1.0.31"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "autocfg"
|
name = "autocfg"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
|
@ -373,6 +378,7 @@ dependencies = [
|
||||||
name = "vscode-mc-shader"
|
name = "vscode-mc-shader"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"anyhow 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"chan 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)",
|
"chan 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"fs_extra 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"fs_extra 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -426,6 +432,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[metadata]
|
[metadata]
|
||||||
"checksum aho-corasick 0.7.13 (registry+https://github.com/rust-lang/crates.io-index)" = "043164d8ba5c4c3035fec9bbee8647c0261d788f3474306f93bb65901cae0e86"
|
"checksum aho-corasick 0.7.13 (registry+https://github.com/rust-lang/crates.io-index)" = "043164d8ba5c4c3035fec9bbee8647c0261d788f3474306f93bb65901cae0e86"
|
||||||
|
"checksum anyhow 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)" = "85bb70cc08ec97ca5450e6eba421deeea5f172c0fc61f78b5357b2a8e8be195f"
|
||||||
"checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d"
|
"checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d"
|
||||||
"checksum base64 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff"
|
"checksum base64 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff"
|
||||||
"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
|
"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
|
||||||
|
|
|
@ -15,6 +15,7 @@ regex = "1.3.9"
|
||||||
chan = "0.1.23"
|
chan = "0.1.23"
|
||||||
url = "2.1.1"
|
url = "2.1.1"
|
||||||
percent-encoding = "2.1.0"
|
percent-encoding = "2.1.0"
|
||||||
|
anyhow = "1.0.31"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
tempdir = "0.3.7"
|
tempdir = "0.3.7"
|
||||||
|
|
|
@ -1,23 +1,20 @@
|
||||||
use rust_lsp::jsonrpc::method_types::*;
|
use rust_lsp::jsonrpc::{*, method_types::*};
|
||||||
use rust_lsp::jsonrpc::*;
|
|
||||||
use rust_lsp::lsp::*;
|
use rust_lsp::lsp::*;
|
||||||
use rust_lsp::lsp_types::*;
|
use rust_lsp::lsp_types::{*, notification::*};
|
||||||
use rust_lsp::lsp_types::notification::*;
|
|
||||||
|
|
||||||
use walkdir;
|
use walkdir;
|
||||||
|
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
use std::fmt::Display;
|
use std::fmt::{Display, Formatter};
|
||||||
use std::fmt::Formatter;
|
use std::io::{stdin, stdout, BufRead, BufReader, Write};
|
||||||
use std::io;
|
|
||||||
use std::io::Write;
|
|
||||||
use std::io::{BufRead, BufReader};
|
|
||||||
use std::ops::Add;
|
use std::ops::Add;
|
||||||
use std::process;
|
use std::process;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
|
use anyhow::Result;
|
||||||
|
|
||||||
use chan::WaitGroup;
|
use chan::WaitGroup;
|
||||||
|
|
||||||
use percent_encoding::percent_decode_str;
|
use percent_encoding::percent_decode_str;
|
||||||
|
@ -45,9 +42,9 @@ static INCLUDE_STR: &'static str = "#extension GL_GOOGLE_include_directive : req
|
||||||
static SOURCE: &'static str = "mc-glsl";
|
static SOURCE: &'static str = "mc-glsl";
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let stdin = std::io::stdin();
|
let stdin = stdin();
|
||||||
|
|
||||||
let endpoint_output = LSPEndpoint::create_lsp_output_with_output_stream(|| io::stdout());
|
let endpoint_output = LSPEndpoint::create_lsp_output_with_output_stream(|| stdout());
|
||||||
|
|
||||||
let cache_graph = graph::CachedStableGraph::new();
|
let cache_graph = graph::CachedStableGraph::new();
|
||||||
|
|
||||||
|
@ -238,21 +235,11 @@ impl MinecraftShaderLanguageServer {
|
||||||
return includes;
|
return includes;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn lint(&self, source: impl Into<String>) -> Vec<Diagnostic> {
|
pub fn lint(&self, source: impl Into<String>) -> Result<Vec<Diagnostic>> {
|
||||||
let source: String = source.into();
|
let source: Rc<String> = Rc::new(source.into());
|
||||||
eprintln!("validator bin path: {}", self.config.glslang_validator_path);
|
|
||||||
let cmd = process::Command::new(&self.config.glslang_validator_path)
|
let stdout = self.invoke_validator(source.as_ref())?;
|
||||||
.args(&["--stdin", "-S", "frag"])
|
|
||||||
.stdin(process::Stdio::piped())
|
|
||||||
.stdout(process::Stdio::piped())
|
|
||||||
.spawn();
|
|
||||||
|
|
||||||
let mut child = cmd.expect("glslangValidator failed to spawn");
|
|
||||||
let stdin = child.stdin.as_mut().expect("no stdin handle found");
|
|
||||||
stdin.write(source.as_bytes()).expect("failed to write to stdin");
|
|
||||||
|
|
||||||
let output = child.wait_with_output().expect("expected output");
|
|
||||||
let stdout = String::from_utf8(output.stdout).unwrap();
|
|
||||||
eprintln!("glslangValidator output: {}\n", stdout);
|
eprintln!("glslangValidator output: {}\n", stdout);
|
||||||
|
|
||||||
let mut diagnostics: Vec<Diagnostic> = vec![];
|
let mut diagnostics: Vec<Diagnostic> = vec![];
|
||||||
|
@ -273,22 +260,23 @@ impl MinecraftShaderLanguageServer {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
let line = match diagnostic_capture
|
let line = match diagnostic_capture.get(3) {
|
||||||
.get(3)
|
Some(c) => match c.as_str().parse::<u64>() {
|
||||||
.expect("third capture group was None")
|
Ok(i) => i,
|
||||||
.as_str()
|
Err(_) => 0,
|
||||||
.parse::<u64>() {
|
},
|
||||||
Ok(line) => line,
|
None => 0,
|
||||||
Err(_) => return,
|
|
||||||
} - 1;
|
} - 1;
|
||||||
|
|
||||||
|
|
||||||
let line_text = source_lines[line as usize];
|
let line_text = source_lines[line as usize];
|
||||||
let leading_whitespace = line_text.len() - line_text.trim_start().len();
|
let leading_whitespace = line_text.len() - line_text.trim_start().len();
|
||||||
|
|
||||||
let severity = match diagnostic_capture.get(0).unwrap().as_str() {
|
let severity = match diagnostic_capture.get(1) {
|
||||||
"ERROR" => DiagnosticSeverity::Error,
|
Some(c) => match c.as_str() {
|
||||||
"WARNING" => DiagnosticSeverity::Warning,
|
"ERROR" => DiagnosticSeverity::Error,
|
||||||
|
"WARNING" => DiagnosticSeverity::Warning,
|
||||||
|
_ => DiagnosticSeverity::Information,
|
||||||
|
}
|
||||||
_ => DiagnosticSeverity::Information,
|
_ => DiagnosticSeverity::Information,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -308,7 +296,25 @@ impl MinecraftShaderLanguageServer {
|
||||||
|
|
||||||
diagnostics.push(diagnostic);
|
diagnostics.push(diagnostic);
|
||||||
});
|
});
|
||||||
diagnostics
|
Ok(diagnostics)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn invoke_validator(&self, source: impl Into<String>) -> Result<String> {
|
||||||
|
let source: String = source.into();
|
||||||
|
eprintln!("validator bin path: {}", self.config.glslang_validator_path);
|
||||||
|
let cmd = process::Command::new(&self.config.glslang_validator_path)
|
||||||
|
.args(&["--stdin", "-S", "frag"])
|
||||||
|
.stdin(process::Stdio::piped())
|
||||||
|
.stdout(process::Stdio::piped())
|
||||||
|
.spawn();
|
||||||
|
|
||||||
|
let mut child = cmd?;//.expect("glslangValidator failed to spawn");
|
||||||
|
let stdin = child.stdin.as_mut().expect("no stdin handle found");
|
||||||
|
stdin.write(source.as_bytes())?;//.expect("failed to write to stdin");
|
||||||
|
|
||||||
|
let output = child.wait_with_output()?;//.expect("expected output");
|
||||||
|
let stdout = String::from_utf8(output.stdout).unwrap();
|
||||||
|
Ok(stdout)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn publish_diagnostic(&self, diagnostics: Vec<Diagnostic>, uri: impl Into<Url>, document_version: Option<i64>) {
|
pub fn publish_diagnostic(&self, diagnostics: Vec<Diagnostic>, uri: impl Into<Url>, document_version: Option<i64>) {
|
||||||
|
@ -427,8 +433,10 @@ impl LanguageServerHandling for MinecraftShaderLanguageServer {
|
||||||
|
|
||||||
fn did_open_text_document(&mut self, params: DidOpenTextDocumentParams) {
|
fn did_open_text_document(&mut self, params: DidOpenTextDocumentParams) {
|
||||||
eprintln!("opened doc {}", params.text_document.uri);
|
eprintln!("opened doc {}", params.text_document.uri);
|
||||||
let diagnostics = self.lint(params.text_document.text);
|
match self.lint(params.text_document.text) {
|
||||||
self.publish_diagnostic(diagnostics, params.text_document.uri, Some(params.text_document.version));
|
Ok(diagnostics) => self.publish_diagnostic(diagnostics, params.text_document.uri, Some(params.text_document.version)),
|
||||||
|
_ => return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn did_change_text_document(&mut self, params: DidChangeTextDocumentParams) {
|
fn did_change_text_document(&mut self, params: DidChangeTextDocumentParams) {
|
||||||
|
@ -447,8 +455,10 @@ impl LanguageServerHandling for MinecraftShaderLanguageServer {
|
||||||
let path: String = percent_encoding::percent_decode_str(params.text_document.uri.path()).decode_utf8().unwrap().into();
|
let path: String = percent_encoding::percent_decode_str(params.text_document.uri.path()).decode_utf8().unwrap().into();
|
||||||
|
|
||||||
let file_content = std::fs::read(path).unwrap();
|
let file_content = std::fs::read(path).unwrap();
|
||||||
let diagnostics = self.lint(String::from_utf8(file_content).unwrap());
|
match self.lint(String::from_utf8(file_content).unwrap()) {
|
||||||
self.publish_diagnostic(diagnostics, params.text_document.uri, None);
|
Ok(diagnostics) => self.publish_diagnostic(diagnostics, params.text_document.uri, None),
|
||||||
|
_ => return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn did_change_watched_files(&mut self, _: DidChangeWatchedFilesParams) {}
|
fn did_change_watched_files(&mut self, _: DidChangeWatchedFilesParams) {}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue