Skip to content

Commit

Permalink
lookup signal in db
Browse files Browse the repository at this point in the history
  • Loading branch information
vuvoth committed Feb 26, 2024
1 parent 105f2c3 commit 97adaaa
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 108 deletions.
60 changes: 39 additions & 21 deletions crates/lsp/src/database.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,18 @@ use std::{
collections::HashMap,
hash::{DefaultHasher, Hash, Hasher},
path::PathBuf,
sync::Arc,
};

use lsp_types::{Position, Range, Url};

use rowan::{ast::AstNode, TextSize};
use syntax::{
abstract_syntax_tree::{AstCircomProgram, AstTemplateDef},
syntax_node::SyntaxNode,
abstract_syntax_tree::{
AstCircomProgram, AstInputSignalDecl, AstOutputSignalDecl, AstSignalDecl, AstTemplateDef,
AstVarDecl,
},
syntax_node::{SyntaxNode, SyntaxToken},
};

/**
Expand Down Expand Up @@ -119,6 +123,14 @@ impl TokenId for SyntaxNode {
}
}

impl TokenId for SyntaxToken {
fn token_id(&self) -> Id {
let mut hasher = DefaultHasher::new();
self.to_string().hash(&mut hasher);
Id(hasher.finish())
}
}

#[derive(Debug, Clone)]
pub struct SemanticLocations(pub HashMap<Id, Vec<Range>>);

Expand Down Expand Up @@ -201,18 +213,13 @@ impl SemanticDB {
.template_data_semantic
.entry(template_id)
.or_insert(TemplateDataSemantic::new());
if let Some(template_semantic) =
semantic.template_data_semantic.get_mut(&template_id)
{
match template_data_info {
TemplateDataInfo::Component((id, r)) => {
template_semantic.component.insert(id, r)
}
TemplateDataInfo::Variable((id, r)) => {
template_semantic.variable.insert(id, r)
}
TemplateDataInfo::Signal((id, r)) => template_semantic.signal.insert(id, r),

match template_data_info {
TemplateDataInfo::Component((id, r)) => {
template_semantic.component.insert(id, r)
}
TemplateDataInfo::Variable((id, r)) => template_semantic.variable.insert(id, r),
TemplateDataInfo::Signal((id, r)) => template_semantic.signal.insert(id, r),
}
}
}
Expand All @@ -239,8 +246,8 @@ impl SemanticDB {
let template_id = ast_template.syntax().token_id();

if let Some(statements) = ast_template.statements() {
for signal in statements.input_signals() {
if let Some(name) = signal.signal_name() {
for signal in statements.find_children::<AstInputSignalDecl>() {
if let Some(name) = signal.name() {
self.insert(
file_db.file_id,
SemanticInfo::TemplateData((
Expand All @@ -253,8 +260,8 @@ impl SemanticDB {
);
}
}
for signal in statements.output_signals() {
if let Some(name) = signal.signal_name() {
for signal in statements.find_children::<AstOutputSignalDecl>() {
if let Some(name) = signal.name() {
self.insert(
file_db.file_id,
SemanticInfo::TemplateData((
Expand All @@ -268,8 +275,8 @@ impl SemanticDB {
}
}

for signal in statements.internal_signals() {
if let Some(name) = signal.signal_name() {
for signal in statements.find_children::<AstSignalDecl>() {
if let Some(name) = signal.name() {
self.insert(
file_db.file_id,
SemanticInfo::TemplateData((
Expand All @@ -283,8 +290,8 @@ impl SemanticDB {
}
}

for var in statements.variables() {
if let Some(name) = var.variable_name() {
for var in statements.find_children::<AstVarDecl>() {
if let Some(name) = var.name() {
self.insert(
file_db.file_id,
SemanticInfo::TemplateData((
Expand All @@ -300,6 +307,17 @@ impl SemanticDB {
}
}
}

impl SemanticData {
pub fn lookup_signal(&self, template_id: Id, signal: &SyntaxToken) -> Option<&Vec<Range>> {
if let Some(semantic_template) = self.template_data_semantic.get(&template_id) {
return semantic_template.signal.0.get(&signal.token_id());
}
None
}
}


#[cfg(test)]
mod tests {

Expand Down
62 changes: 19 additions & 43 deletions crates/lsp/src/handler/goto_definition.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use lsp_types::{Position, Range};
use parser::token_kind::TokenKind;
use rowan::ast::AstNode;
use rowan::SyntaxText;
use syntax::abstract_syntax_tree::AstCircomProgram;
use syntax::abstract_syntax_tree::{AstCircomProgram, AstComponentDecl, AstVarDecl};
use syntax::abstract_syntax_tree::AstComponentCall;
use syntax::abstract_syntax_tree::AstTemplateDef;
use syntax::abstract_syntax_tree::AstTemplateName;
Expand Down Expand Up @@ -42,7 +42,7 @@ pub fn lookup_token_at_postion(

pub fn lookup_component(template: &AstTemplateDef, text: SyntaxText) -> Option<AstTemplateName> {
if let Some(statements) = template.statements() {
for component in statements.components() {
for component in statements.find_children::<AstComponentDecl>() {
if let Some(iden) = component.component_identifier() {
if iden.name().unwrap().syntax().text() == text {
return component.template();
Expand Down Expand Up @@ -115,16 +115,18 @@ pub fn lookup_definition(
continue;
}

res.extend(lookup_signal_in_template(file, &template, token).into_iter());
if let Some(data) = semantic_data.lookup_signal(template.syntax().token_id(), token) {
res.extend(data);
}

if let Some(component_decl) = template.find_component(token.text()) {
res.push(file.range(component_decl.syntax()));
}

if let Some(fn_body) = template.func_body() {
if let Some(statements) = fn_body.statement_list() {
for var in statements.variables() {
if let Some(name) = var.variable_name() {
for var in statements.find_children::<AstVarDecl>() {
if let Some(name) = var.name() {
if name.syntax().text() == token.text() {
res.push(file.range(var.syntax()));
}
Expand All @@ -140,49 +142,23 @@ pub fn lookup_definition(
.collect()
}

fn lookup_signal_in_template(
file: &FileDB,
ast_template: &AstTemplateDef,
signal_token: &SyntaxToken,
) -> Vec<Range> {
let mut result = Vec::new();
if let Some(block) = ast_template.func_body() {
if let Some(statements) = block.statement_list() {
for signal in statements.input_signals() {
if let Some(name) = signal.signal_name() {
if name.syntax().text() == signal_token.text() {
result.push(file.range(signal.syntax()));
}
}
}

for signal in statements.output_signals() {
if let Some(name) = signal.signal_name() {
if name.syntax().text() == signal_token.text() {
result.push(file.range(signal.syntax()));
}
}
}

for signal in statements.internal_signals() {
if let Some(name) = signal.signal_name() {
if name.syntax().text() == signal_token.text() {
result.push(file.range(signal.syntax()));
}
}
}
}
}
result
}
// fn lookup_signal_in_template(
// file: &FileDB,
// ast_template: &AstTemplateDef,
// signal_token: &SyntaxToken,
// ) -> Vec<Range> {
// let mut result = Vec::new();

// result
// }
#[cfg(test)]
mod tests {
use std::path::Path;

use lsp_types::Url;
use parser::token_kind::TokenKind;
use rowan::ast::AstNode;
use syntax::{abstract_syntax_tree::AstCircomProgram, syntax::SyntaxTreeBuilder};
use syntax::{abstract_syntax_tree::{AstCircomProgram, AstInputSignalDecl}, syntax::SyntaxTreeBuilder};

use crate::{database::FileDB, handler::goto_definition::lookup_node_wrap_token};

Expand Down Expand Up @@ -244,8 +220,8 @@ template Y() {
.unwrap()
.statement_list()
.unwrap()
.input_signals();
let signal_name = inputs[0].signal_name().unwrap();
.find_children::<AstInputSignalDecl>();
let signal_name = inputs[0].name().unwrap();

let tmp = signal_name.syntax().text_range().start();

Expand Down
46 changes: 9 additions & 37 deletions crates/syntax/src/abstract_syntax_tree/ast.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
use std::sync::Arc;

use parser::token_kind::TokenKind::*;
use rowan::ast::AstChildren;
use rowan::SyntaxText;
Expand All @@ -16,32 +18,32 @@ ast_node!(AstOutputSignalDecl, OutputSignalDecl);
ast_node!(AstSignalDecl, SignalDecl);

impl AstInputSignalDecl {
pub fn signal_name(&self) -> Option<AstIdentifier> {
pub fn name(&self) -> Option<AstIdentifier> {
support::child(self.syntax())
}

pub fn same_name(&self, other: &SyntaxText) -> bool {
if let Some(name) = self.signal_name() {
if let Some(name) = self.name() {
return name.equal(other);
}
false
}
}

impl AstOutputSignalDecl {
pub fn signal_name(&self) -> Option<AstIdentifier> {
pub fn name(&self) -> Option<AstIdentifier> {
support::child(self.syntax())
}
}
impl AstSignalDecl {
pub fn signal_name(&self) -> Option<AstIdentifier> {
pub fn name(&self) -> Option<AstIdentifier> {
support::child(self.syntax())
}
}
ast_node!(AstVarDecl, VarDecl);

impl AstVarDecl {
pub fn variable_name(&self) -> Option<AstIdentifier> {
pub fn name(&self) -> Option<AstIdentifier> {
support::child(self.syntax())
}
}
Expand All @@ -66,38 +68,8 @@ impl AstStatementList {
support::children(self.syntax())
}

pub fn input_signals(&self) -> Vec<AstInputSignalDecl> {
self.syntax()
.children()
.filter_map(AstInputSignalDecl::cast)
.collect()
}

pub fn output_signals(&self) -> Vec<AstOutputSignalDecl> {
self.syntax()
.children()
.filter_map(AstOutputSignalDecl::cast)
.collect()
}

pub fn internal_signals(&self) -> Vec<AstSignalDecl> {
self.syntax()
.children()
.filter_map(AstSignalDecl::cast)
.collect()
}
pub fn variables(&self) -> Vec<AstVarDecl> {
self.syntax()
.children()
.filter_map(AstVarDecl::cast)
.collect()
}

pub fn components(&self) -> Vec<AstComponentDecl> {
self.syntax()
.children()
.filter_map(AstComponentDecl::cast)
.collect()
pub fn find_children<N: AstNode<Language = CircomLanguage>>(&self) -> Vec<N> {
self.syntax().children().filter_map(N::cast).collect()
}
}

Expand Down
15 changes: 8 additions & 7 deletions crates/syntax/src/abstract_syntax_tree/template.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ use super::ast::AstOutputSignalDecl;
use super::ast::AstParameterList;
use super::ast::AstSignalDecl;
use super::ast::AstStatementList;
use super::AstVarDecl;

ast_node!(AstTemplateName, TemplateName);

Expand Down Expand Up @@ -47,8 +48,8 @@ impl AstTemplateDef {

pub fn find_input_signal(&self, name: &SyntaxText) -> Option<AstInputSignalDecl> {
if let Some(statements) = self.statements() {
for input_signal in statements.input_signals() {
if let Some(signal_name) = input_signal.signal_name() {
for input_signal in statements.find_children::<AstInputSignalDecl>() {
if let Some(signal_name) = input_signal.name() {
if signal_name.equal(name) {
return Some(input_signal);
}
Expand All @@ -60,8 +61,8 @@ impl AstTemplateDef {

pub fn find_output_signal(&self, name: &SyntaxText) -> Option<AstOutputSignalDecl> {
if let Some(statements) = self.statements() {
for input_signal in statements.output_signals() {
if let Some(signal_name) = input_signal.signal_name() {
for input_signal in statements.find_children::<AstOutputSignalDecl>() {
if let Some(signal_name) = input_signal.name() {
if signal_name.equal(name) {
return Some(input_signal);
}
Expand All @@ -73,8 +74,8 @@ impl AstTemplateDef {

pub fn find_internal_signal(&self, name: &SyntaxText) -> Option<AstSignalDecl> {
if let Some(statements) = self.statements() {
for signal in statements.internal_signals() {
if let Some(signal_name) = signal.signal_name() {
for signal in statements.find_children::<AstSignalDecl>() {
if let Some(signal_name) = signal.name() {
if signal_name.equal(name) {
return Some(signal);
}
Expand All @@ -86,7 +87,7 @@ impl AstTemplateDef {

pub fn find_component(&self, name: &str) -> Option<AstComponentDecl> {
if let Some(statements) = self.statements() {
for component in statements.components() {
for component in statements.find_children::<AstComponentDecl>() {
if let Some(signal_name) = component.component_identifier() {
if let Some(component_name) = signal_name.name() {
if component_name.syntax().text() == name {
Expand Down

0 comments on commit 97adaaa

Please sign in to comment.