From 1090face1e6f89dfe53e0d529be9d6cc7d40be7c Mon Sep 17 00:00:00 2001 From: LSTM-Kirigaya <1193466151@qq.com> Date: Fri, 13 Dec 2024 18:10:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20directives?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/completion/directives.rs | 419 ++++++++++++++++++++++++++++++++++ src/completion/feature.rs | 4 +- src/completion/keyword.rs | 44 +--- src/completion/mod.rs | 1 + src/completion/sv.rs | 1 + src/core/cache_storage.rs | 3 +- src/core/scope_tree/common.rs | 96 ++------ src/core/scope_tree/parse.rs | 4 +- src/format/mod.rs | 1 - src/request/linter.rs | 1 + src/request/primitives.rs | 1 + src/server.rs | 9 +- 12 files changed, 451 insertions(+), 133 deletions(-) create mode 100644 src/completion/directives.rs diff --git a/src/completion/directives.rs b/src/completion/directives.rs new file mode 100644 index 0000000..e197ae3 --- /dev/null +++ b/src/completion/directives.rs @@ -0,0 +1,419 @@ +use tower_lsp::lsp_types::*; + +/// 文档:IEEE 1364-2005 +/// author: LSTM-Kirigaya +/// date: 2024.12.13 + +pub const VLOG_DIRECTIVES: &[(&str, &str, &str)] = &[ + ( + "__FILE__", + "`__FILE__", +r#"用于获取当前文件名 +```verilog +// 文件名: /path/to/your/project/test.v +`timescale 1ns/1ps + +module test; + initial begin + // 输出 当前文件名:/path/to/your/project/test.v + $display("当前文件名: %s", `__FILE__); + end +endmodule +``` +"#), + ( + "__LINE__", + "`__LINE__", +r#"用于获取当前行号 +```verilog +// 文件名: /path/to/your/project/test.v +`timescale 1ns/1ps + +module test; + initial begin + // 使用 __FILE__ 和 __LINE__ 宏输出当前文件名和行号 + $display("当前文件名: %s, 当前行号: %0d", `__FILE__, `__LINE__); + end +endmodule +``` +"#), + ( + "begin_keywords", + "`begin_keywords\n$1\n`end_keywords ", +r#"`begin_keywords` 和 `end_keywords` 是用于指定 Verilog 语言版本的编译指令。它们允许设计者在同一个文件中使用不同版本的 Verilog 语法,从而实现兼容性或逐步迁移到新版本。 + +`begin_keywords` 支持以下 Verilog 版本: + +- `1364-1995`:Verilog-1995 标准。 +- `1364-2001`:Verilog-2001 标准。 +- `1364-2005`:Verilog-2005 标准。 +- `1800-2009`:SystemVerilog-2009 标准。 +- `1800-2012`:SystemVerilog-2012 标准。 + +```verilog +// 使用 begin_keywords 和 end_keywords 指定 Verilog 版本 +`begin_keywords "1364-2001" // 指定 Verilog-2001 语法 + +module my_module; + reg [7:0] data; + initial begin + data = 8'hFF; // 使用 Verilog-2001 的语法 + $display("Verilog-2001 语法: data = %h", data); + end +endmodule + +`end_keywords // 结束 Verilog-2001 语法 + +// 恢复默认的 Verilog 语法 +module another_module; + reg [7:0] data; + initial begin + data = 8'hAA; // 使用默认的 Verilog 语法 + $display("默认语法: data = %h", data); + end +endmodule +``` +"#), + ( + "celldefine", + "`celldefine\n$1\n`endcelldefine", +r#"开始定义单元格 +`celldefine` 和 `endcelldefine` 是用于定义单元库模块的编译指令。它们通常用于定义可重用的硬件模块(如标准单元库),并控制这些模块的编译行为。 +```verilog +// 使用 celldefine 和 endcelldefine 定义一个单元库模块 +`celldefine +module my_cell ( + input a, + input b, + output out +); + assign out = a & b; // 简单的与门逻辑 +endmodule +`endcelldefine + +// 测试模块 +module test; + reg a, b; + wire out; + + // 实例化单元库模块 + my_cell uut ( + .a(a), + .b(b), + .out(out) + ); + + initial begin + // 初始化输入 + a = 0; + b = 0; + + // 仿真逻辑 + #10; + a = 1; + #10; + b = 1; + #10; + $display("输出结果: %b", out); + end +endmodule +``` + +使用 `celldefine` 的优势: +- 编译器可以将 `celldefine` 模块视为标准单元库的一部分,从而进行更高效的编译优化。例如,编译器可以提前处理这些模块的逻辑,减少仿真时的计算开销。 +- 在大型设计中,标准单元库模块可能会被多次实例化。使用 celldefine 可以避免重复编译相同的模块,从而减少编译时间和内存占用。 +"#), + ( + "default_nettype", + "`default_nettype $1", + "设置默认的网络类型" + ), + ( + "define", + "`define $1 $2", +r#"定义一个宏 + +### 语法 + +```verilog +`define MACRO_NAME value +``` + +### 示例 + +```verilog +// 使用 `define 定义常量和代码片段 +`define PORT_NUM 8 // 定义常量 PORT_NUM 为 8 +`define ADD_ONE(x) (x + 1) // 定义带参数的宏 ADD_ONE + +module test; + reg [(`PORT_NUM - 1):0] data; // 使用常量 PORT_NUM + integer value; + + initial begin + // 使用宏 ADD_ONE + value = 5; + $display("原始值: %0d", value); + value = `ADD_ONE(value); + $display("加一后的值: %0d", value); + + // 使用常量 PORT_NUM + data = 8'hFF; + $display("数据宽度: %0d 位", `PORT_NUM); + $display("数据值: %h", data); + end +endmodule +``` +"#), + ( + "else", + "`else", + "条件编译的 else 分支" + ), + ( + "elsif", + "`elsif $1", + "条件编译的 elsif 分支" + ), + ( + "end_keywords", + "`end_keywords", + "结束关键字版本指定" + ), + ( + "endcelldefine", + "`endcelldefine", + "结束单元格定义" + ), + ( + "endif", + "`endif", + "结束条件编译" + ), + ( + "ifdef", + "`ifdef $1\n\t//ifdef\n\t$2\n`else\n//else\n\t$3\n`endif", +r#"ifdef、else 和 endif 是条件编译指令,用于根据宏定义的存在与否来选择性地编译代码。它们通常用于实现条件编译逻辑,以便在不同的编译环境下生成不同的代码。 + +### 语法 + +```verilog +`ifdef MACRO_NAME + // 如果 MACRO_NAME 已定义,编译此段代码 +`else + // 如果 MACRO_NAME 未定义,编译此段代码 +`endif +``` + +### 示例 + +```verilog +// 使用 `ifdef 和 `else 进行条件编译 +`define DEBUG // 定义 DEBUG 宏 + +module test; + reg [7:0] data; + + initial begin + data = 8'hFF; + + // 使用 `ifdef 和 `else 进行条件编译 + `ifdef DEBUG + $display("调试模式: 数据值 = %h", data); + `else + $display("发布模式: 数据值 = %h", data); + `endif + end +endmodule +``` + +假设上述代码保存在文件 test.v 中,仿真输出可能如下: + +``` +调试模式: 数据值 = FF +``` + +"# + ), + ( + "ifndef", + "`ifndef $1", + "如果未定义宏,则编译代码" + ), + ( + "include", + "`include $1", + "包含一个外部文件" + ), + ( + "line", + "`line $1 $2 $3", +r#"`line` 用于指定当前代码的行号和文件名。它通常用于调试或日志记录,以便在仿真或编译时能够追踪代码的来源。 + +### 语法 +```verilog +`line line_number "filename" level +``` + +### 示例 +```verilog +// 使用 `line 指令指定行号和文件名 +`line 10 "example.v" 0 + +module test; + initial begin + $display("当前行号: %0d", `__LINE__); + $display("当前文件名: %s", `__FILE__); + end +endmodule +``` +"# + ), + ( + "unconnected_drive", + "`unconnected_drive ${1:pull1}\n$2\n`nounconnected_drive\n", +r#"`nounconnected_drive` 和 `unconnected_drive` 是配合使用的编译指令,用于控制未连接端口的驱动行为。它们通常成对出现,分别用于禁用和启用未连接端口的驱动处理。 +### 语法 +```verilog +`unconnected_drive (pull1 | pull0) // 启用未连接端口的驱动,若为 pull1,则默认驱动为高电平,若为 pull0,则默认为低电平 + // 你的 verilog 代码 +`nounconnected_drive // 禁用未连接端口的驱动 +``` + +"# + ), + ( + "nounconnected_drive", + "`nounconnected_drive", +r#"`nounconnected_drive` 和 `unconnected_drive` 是配合使用的编译指令,用于控制未连接端口的驱动行为。它们通常成对出现,分别用于禁用和启用未连接端口的驱动处理。 +### 语法 +```verilog +`unconnected_drive (pull1 | pull0) // 启用未连接端口的驱动,若为 pull1,则默认驱动为高电平,若为 pull0,则默认为低电平 + // 你的 verilog 代码 +`nounconnected_drive // 禁用未连接端口的驱动 +``` +"# + ), + ( + "pragma", + "`pragma $1", + "编译指示,用于传递编译器指令" + ), + ( + "resetall", + "`resetall", +r#"`resetall` 用于重置所有编译器设置为默认值。它通常用于在模块或文件的末尾清除所有编译器设置,以确保后续代码不受之前设置的影响。 + +```verilog +`timescale 1ns/1ps // 设置时间单位和精度 + +module test; + // 一些 verilog 代码 +endmodule + +`resetall // 重置所有编译器设置,上文的 timescale 设置自此开始无效 +``` +"# + ), + ( + "timescale", + "`timescale ${1:1ns}/${2:1ps}", +r#"设置时间单位和精度,设置时间单位和精度,格式为 `timescale 仿真时间单位/时间精度,仿真时间单位 必须大于 时间精度,例如 +```verilog +`timescale 1ns/1ps + +module test; + initial begin + $display("当前时间单位: %0t", $time); // 输出当前时间 + #10; // 延迟 10 纳秒 + $display("延迟 10 纳秒后的时间: %0t", $time); + end +endmodule +``` +如果延迟是 #10.5,仿真器会将其解释为 10.5 纳秒,但精度会精确到皮秒级别。 + +在编译过程中,`timescale` 指令影响这一编译器指令后面所有模块中的时延值,直至遇到另一个 `timescale` 指令 `resetall` 指令。 +"#), + ( + "undef", + "`undef $1", + "取消定义一个宏" + ), + ( + "undefineall", + "`undefineall", + "取消定义所有宏" + ), + ( + "default_decay_time", + "`default_decay_time $1", +r#"`default_decay_time` 用于设置电荷衰减时间(decay time)的默认值。它通常用于模拟电荷存储元件(如电容或寄生电容)的行为。 + +### 语法 +```verilog +`default_decay_time time_value +``` +``` + +"# + ), + ( + "default_trireg_strength", + "`default_trireg_strength $1", +r#"`default_trireg_strength ` 用于设置三态寄存器(trireg)的默认驱动强度(strength)。三态寄存器是一种特殊的寄存器,可以存储电荷,并且在未被驱动时会衰减。"# + ), + ( + "delay_mode_distributed", + "`delay_mode_distributed", +r#"`delay_mode_distributed` 用于设置延迟模式的类型。它通常用于控制逻辑门和网络的延迟分布方式。"# + ), + ( + "delay_mode_path", + "`delay_mode_path", +r#"`delay_mode_path` 用于设置延迟模式的类型。它通常用于控制路径延迟(path delay)的计算方式,特别是在时序逻辑电路中。"# + ), + ( + "delay_mode_unit", + "`delay_mode_unit", +r#"`delay_mode_unit` 用于设置延迟模式的类型。它通常用于控制逻辑门和网络的延迟计算方式,特别是在仿真中需要精确控制延迟时。"# + ), + ( + "delay_mode_zero", + "`delay_mode_zero", +r#"`delay_mode_zero` 用于设置延迟模式的类型。它通常用于控制逻辑门和网络的延迟计算方式,特别是在仿真中需要忽略延迟时。"# + ), +]; + +fn make_function_profile( + description: &str +) -> MarkupContent { + MarkupContent { + kind: MarkupKind::Markdown, + value: format!("{}", description) + } +} + +pub fn provide_vlog_directives_completions() -> Vec { + let mut completion_items: Vec = Vec::new(); + + for (label, snippet_code, description) in VLOG_DIRECTIVES { + let function_profile = make_function_profile(description); + let label_details = CompletionItemLabelDetails { + description: Some("directive".to_string()), + ..Default::default() + }; + completion_items.push(CompletionItem { + label: label.to_string(), + detail: Some("directive".to_string()), + label_details: Some(label_details), + documentation: Some(Documentation::MarkupContent(function_profile)), + kind: Some(CompletionItemKind::FUNCTION), + insert_text: Some(snippet_code.to_string()), + insert_text_format: Some(InsertTextFormat::SNIPPET), + insert_text_mode: Some(InsertTextMode::ADJUST_INDENTATION), + ..CompletionItem::default() + }); + } + + completion_items +} \ No newline at end of file diff --git a/src/completion/feature.rs b/src/completion/feature.rs index 84954a9..97c9a5c 100644 --- a/src/completion/feature.rs +++ b/src/completion/feature.rs @@ -125,7 +125,7 @@ pub fn vlog_directives_completion( }; let documentation = Documentation::MarkupContent(MarkupContent { kind: tower_lsp::lsp_types::MarkupKind::Markdown, - value: format!("```verilog\n`define {} {}\n```", define.name, define.replacement) + value: format!("```verilog\n`define {} {}\n```", define.name.trim(), define.replacement.trim()) }); completion_items.push(CompletionItem { label: define.name.to_string(), @@ -169,7 +169,7 @@ pub fn vlog_directives_completion_without_prefix( }; let documentation = Documentation::MarkupContent(MarkupContent { kind: tower_lsp::lsp_types::MarkupKind::Markdown, - value: format!("```verilog\n`define {} {}\n```", define.name, define.replacement) + value: format!("```verilog\n`define {} {}\n```", define.name.trim(), define.replacement.trim()) }); completion_items.push(CompletionItem { label: define.name.to_string(), diff --git a/src/completion/keyword.rs b/src/completion/keyword.rs index b42d2f6..075cd44 100644 --- a/src/completion/keyword.rs +++ b/src/completion/keyword.rs @@ -1,7 +1,7 @@ use tower_lsp::lsp_types::*; -pub fn keyword_completions(keywords: &[(&str, &str)]) -> Vec { +pub fn provide_keyword_completions(keywords: &[(&str, &str)]) -> Vec { let mut items: Vec = Vec::new(); for key in keywords { let label_details = CompletionItemLabelDetails { @@ -29,17 +29,6 @@ pub fn keyword_completions(keywords: &[(&str, &str)]) -> Vec { items } -pub fn other_completions(tasks: &[&str]) -> Vec { - tasks - .iter() - .map(|x| CompletionItem { - label: x.to_string(), - kind: Some(CompletionItemKind::FUNCTION), - ..CompletionItem::default() - }) - .collect() -} - /// (&str, &str, &str): (label, snippet, description) pub const VLOG_KEYWORDS: &[(&str, &str)] = &[ ("accept_on", ""), @@ -292,37 +281,6 @@ pub const VLOG_KEYWORDS: &[(&str, &str)] = &[ ("xor", ""), ]; -pub const DIRECTIVES: &[&str] = &[ - "__FILE__", - "__LINE__", - "begin_keywords", - "celldefine", - "default_nettype", - "define", - "else", - "elsif", - "end_keywords", - "endcelldefine", - "endif", - "ifdef", - "ifndef", - "include", - "line", - "nounconnected_drive", - "pragma", - "resetall", - "timescale", - "unconnected_drive", - "undef", - "undefineall", - "default_decay_time", - "default_trireg_strength", - "delay_mode_distributed", - "delay_mode_path", - "delay_mode_unit", - "delay_mode_zero", -]; - pub const VHDL_KEYWORDS: &[(&str, &str)] = &[ ("abs", ""), ("access", ""), diff --git a/src/completion/mod.rs b/src/completion/mod.rs index 4e31c71..c3ace95 100644 --- a/src/completion/mod.rs +++ b/src/completion/mod.rs @@ -4,6 +4,7 @@ use tower_lsp::lsp_types::*; pub mod keyword; pub mod feature; pub mod sys_tasks; +pub mod directives; pub use sys_tasks::provide_vlog_sys_tasks_completions; diff --git a/src/completion/sv.rs b/src/completion/sv.rs index ae039fa..3409fa6 100644 --- a/src/completion/sv.rs +++ b/src/completion/sv.rs @@ -1,4 +1,5 @@ use crate::{completion::feature::{get_dot_completion, include_path_completion}, core, hover::feature::make_module_profile_code, server::LspServer, sources::LSPSupport, utils::{get_definition_token, get_language_id_by_uri, is_character_ordered_match}}; +#[allow(unused)] use log::info; use tower_lsp::lsp_types::*; diff --git a/src/core/cache_storage.rs b/src/core/cache_storage.rs index 190b12d..4656524 100644 --- a/src/core/cache_storage.rs +++ b/src/core/cache_storage.rs @@ -106,7 +106,7 @@ impl CacheManager { fn check_dir(dir: &PathBuf) { if !dir.exists() { - fs::create_dir_all(dir); + let _ = fs::create_dir_all(dir); } } @@ -118,6 +118,7 @@ impl CacheManager { false } + #[allow(unused)] pub fn uri_is_big_file(uri: &Url) -> bool { let path = PathBuf::from_str(uri.path()).unwrap(); let path = to_escape_path(&path); diff --git a/src/core/scope_tree/common.rs b/src/core/scope_tree/common.rs index c4651ee..a6ab085 100644 --- a/src/core/scope_tree/common.rs +++ b/src/core/scope_tree/common.rs @@ -65,9 +65,23 @@ pub fn copy_scopes(scopes: &[Box]) -> Vec> { scope_decs } -/// 用于定义一个 Symbol 或者 Scope 的内部变量 +/// Definition 是所有非 scope 类型 symbol 的父类 pub trait Definition: std::fmt::Debug + Sync + Send { /// symbol 或者 scope 的名字,identity 的缩写 + /// + /// 对于 definition,而言 ident 就是它的字面量,比如 + /// ```verilog + /// parameter wire_size = 12; + /// ``` + /// 上面的 `wire_size` 这个 symbol 的 name 就是 `wire_size` + /// + /// 对于 scope 而言 + /// ```verilog + /// module beginner(); + /// adwadwa + /// endmodule + /// 上面这个 module scope 的 ident 就是 `beginner` + /// ``` fn ident(&self) -> String; /// 相对于文本的偏移量,可以利用 Rope 的 `byte_to_pos` 函数转换成 Position fn byte_idx(&self) -> usize; @@ -85,9 +99,9 @@ pub trait Definition: std::fmt::Debug + Sync + Send { fn starts_with(&self, token: &str) -> bool; /// 构造 completion 的 item fn completion(&self) -> CompletionItem; - fn dot_completion(&self, scope_tree: &GenericScope) -> Vec; } +/// Scope 是所有 scope 类型 symbol 的父类 pub trait Scope: std::fmt::Debug + Definition + Sync + Send { // the start byte of this scope fn start(&self) -> usize; @@ -342,7 +356,7 @@ impl Definition for PortDec { } fn completion(&self) -> CompletionItem { let label_details = CompletionItemLabelDetails { - description: Some("port desciption".to_string()), + description: Some("module port".to_string()), ..Default::default() }; CompletionItem { @@ -353,31 +367,6 @@ impl Definition for PortDec { ..CompletionItem::default() } } - fn dot_completion(&self, scope_tree: &GenericScope) -> Vec { - for scope in &scope_tree.scopes { - if let Some(interface) = &self.interface { - if &scope.ident() == interface { - return match &self.modport { - Some(modport) => { - for def in scope.defs() { - if def.starts_with(modport) { - return def.dot_completion(scope_tree); - } - } - Vec::new() - } - None => scope - .defs() - .iter() - .filter(|x| !x.starts_with(&scope.ident())) - .map(|x| x.completion()) - .collect(), - }; - } - } - } - Vec::new() - } } #[derive(Debug)] @@ -439,9 +428,6 @@ impl Definition for GenericDec { ..CompletionItem::default() } } - fn dot_completion(&self, _: &GenericScope) -> Vec { - Vec::new() - } } #[derive(Debug)] @@ -506,9 +492,6 @@ impl Definition for PackageImport { ..CompletionItem::default() } } - fn dot_completion(&self, _: &GenericScope) -> Vec { - Vec::new() - } } #[derive(Debug)] @@ -577,9 +560,6 @@ impl Definition for SubDec { ..CompletionItem::default() } } - fn dot_completion(&self, _: &GenericScope) -> Vec { - Vec::new() - } } impl Scope for SubDec { @@ -659,9 +639,6 @@ impl Definition for ModportDec { ..CompletionItem::default() } } - fn dot_completion(&self, _: &GenericScope) -> Vec { - self.ports.iter().map(|x| x.completion()).collect() - } } #[derive(Debug)] @@ -724,19 +701,6 @@ impl Definition for ModInst { ..CompletionItem::default() } } - fn dot_completion(&self, scope_tree: &GenericScope) -> Vec { - for scope in &scope_tree.scopes { - if scope.ident() == self.mod_ident { - return scope - .defs() - .iter() - .filter(|x| !x.starts_with(&scope.ident())) - .map(|x| x.completion()) - .collect(); - } - } - Vec::new() - } } pub struct VhdlProject { @@ -811,19 +775,6 @@ impl Definition for GenericScope { ..CompletionItem::default() } } - fn dot_completion(&self, scope_tree: &GenericScope) -> Vec { - for scope in scope_tree.scopes() { - if scope.ident() == self.ident { - return scope - .defs() - .iter() - .filter(|x| !x.starts_with(&scope.ident())) - .map(|x| x.completion()) - .collect(); - } - } - Vec::new() - } } impl Scope for GenericScope { @@ -916,19 +867,6 @@ impl Definition for ClassDec { ..CompletionItem::default() } } - fn dot_completion(&self, scope_tree: &GenericScope) -> Vec { - for scope in scope_tree.scopes() { - if scope.ident() == self.ident { - return scope - .defs() - .iter() - .filter(|x| !x.starts_with(&scope.ident())) - .map(|x| x.completion()) - .collect(); - } - } - Vec::new() - } } impl Scope for ClassDec { diff --git a/src/core/scope_tree/parse.rs b/src/core/scope_tree/parse.rs index 3d10caa..1c54a78 100644 --- a/src/core/scope_tree/parse.rs +++ b/src/core/scope_tree/parse.rs @@ -1,9 +1,7 @@ use super::common::*; use super::match_definitions; -#[allow(unused)] use log::info; - use sv_parser::*; use tower_lsp::lsp_types::*; @@ -2347,7 +2345,7 @@ pub fn text_macro_def( let ident = get_ident(tree, RefNode::TextMacroIdentifier(&node.nodes.2.nodes.0)); text_macro.ident = ident.0; text_macro.byte_idx = ident.1; - let type_str = &mut text_macro.type_str; + let mut type_str = &mut text_macro.type_str; advance_until_enter!( type_str, diff --git a/src/format/mod.rs b/src/format/mod.rs index a13b880..584248a 100644 --- a/src/format/mod.rs +++ b/src/format/mod.rs @@ -1,5 +1,4 @@ use crate::server::LspServer; -use crate::sources::LSPSupport; use log::info; use ropey::Rope; use std::process::{Command, Stdio}; diff --git a/src/request/linter.rs b/src/request/linter.rs index 1d10bae..fd8d887 100644 --- a/src/request/linter.rs +++ b/src/request/linter.rs @@ -1,5 +1,6 @@ use std::{borrow::Cow, sync::Arc}; use std::future; +#[allow(unused)] use log::info; use serde::{Deserialize, Serialize}; use tower_lsp::jsonrpc::Result; diff --git a/src/request/primitives.rs b/src/request/primitives.rs index 87b2897..507f314 100644 --- a/src/request/primitives.rs +++ b/src/request/primitives.rs @@ -1,5 +1,6 @@ use std::future; use std::sync::Arc; +#[allow(unused)] use log::info; use serde::{Deserialize, Serialize}; use tower_lsp::jsonrpc::Result; diff --git a/src/server.rs b/src/server.rs index 63a8a31..9d0c5c8 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1,5 +1,6 @@ +use crate::completion::directives::provide_vlog_directives_completions; use crate::core::cache_storage::CacheManager; -use crate::diagnostics::{DigitalLinterConfiguration, DigitalLinterMode, ModelsimConfiguration, VeribleConfiguration, VerilatorConfiguration, VivadoConfiguration}; +use crate::diagnostics::{DigitalLinterConfiguration, DigitalLinterMode}; use crate::sources::*; use crate::completion::{keyword::*, provide_vlog_sys_tasks_completions}; use flexi_logger::LoggerHandle; @@ -38,10 +39,10 @@ impl LspServer { LspServer { srcs: Sources::new(), cache: CacheManager::new(dide_home), - vlog_keyword_completion_items: keyword_completions(VLOG_KEYWORDS), - vhdl_keyword_completiom_items: keyword_completions(VHDL_KEYWORDS), + vlog_keyword_completion_items: provide_keyword_completions(VLOG_KEYWORDS), + vhdl_keyword_completiom_items: provide_keyword_completions(VHDL_KEYWORDS), vlog_sys_tasks_completion_items: provide_vlog_sys_tasks_completions(), - vlog_directives: other_completions(DIRECTIVES), + vlog_directives: provide_vlog_directives_completions(), configuration: Arc::new(RwLock::new(LspConfiguration::default())), log_handle: Mutex::new(log_handle), }