Skip to content

Commit

Permalink
Bugfix(LSP): LSP generates both syntactic and semantic errors (#482)
Browse files Browse the repository at this point in the history
  • Loading branch information
He1pa committed Apr 3, 2023
1 parent 1897f35 commit b39d27f
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 8 deletions.
2 changes: 2 additions & 0 deletions kclvm/tools/src/LSP/src/test_data/diagnostics.k
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
a =
b: str = 1
23 changes: 22 additions & 1 deletion kclvm/tools/src/LSP/src/tests.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,35 @@
use std::path::PathBuf;

use indexmap::IndexSet;
use kclvm_error::Position as KCLPos;
use kclvm_error::ErrorKind::InvalidSyntax;
use kclvm_error::ErrorKind::TypeError;
use kclvm_error::{DiagnosticId, Position as KCLPos};
use lsp_types::{Position, Range, TextDocumentContentChangeEvent};

use crate::{
goto_def::goto_definition,
util::{apply_document_changes, parse_param_and_compile, Param},
};

#[test]
fn diagnostics_test() {
let path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
let mut test_file = path.clone();
test_file.push("src/test_data/diagnostics.k");
let file = test_file.to_str().unwrap();

let (_, _, diags) = parse_param_and_compile(
Param {
file: file.to_string(),
},
None,
)
.unwrap();
assert_eq!(diags.len(), 2);
assert_eq!(diags[0].code, Some(DiagnosticId::Error(InvalidSyntax)));
assert_eq!(diags[1].code, Some(DiagnosticId::Error(TypeError)));
}

#[test]
fn goto_def_test() {
let path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
Expand Down
13 changes: 6 additions & 7 deletions kclvm/tools/src/LSP/src/util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,14 +60,13 @@ pub(crate) fn parse_param_and_compile(
let mut k_code_list = load_files_code_from_vfs(&files, vfs)?;
opt.k_code_list.append(&mut k_code_list);
}
let mut program = load_program(Arc::new(ParseSession::default()), &files, Some(opt)).unwrap();
let prog_scope = resolve_program(&mut program);

Ok((
program,
prog_scope.clone(),
prog_scope.handler.diagnostics.clone(),
))
let sess = Arc::new(ParseSession::default());
let mut program = load_program(sess.clone(), &files, Some(opt)).unwrap();
let prog_scope = resolve_program(&mut program);
sess.append_diagnostic(prog_scope.handler.diagnostics.clone());
let diags = sess.1.borrow().diagnostics.clone();
Ok((program, prog_scope.clone(), diags))
}

/// Update text with TextDocumentContentChangeEvent param
Expand Down

0 comments on commit b39d27f

Please sign in to comment.