Skip to content

Commit

Permalink
Merge pull request #566 from veryl-lang/refactor_symbol_table
Browse files Browse the repository at this point in the history
Refactor symbol table
  • Loading branch information
dalance committed Mar 16, 2024
2 parents 82a919b + 4d31a11 commit 123602c
Show file tree
Hide file tree
Showing 7 changed files with 165 additions and 192 deletions.
35 changes: 10 additions & 25 deletions crates/analyzer/src/handlers/create_reference.rs
Original file line number Diff line number Diff line change
Expand Up @@ -94,11 +94,8 @@ impl<'a> VerylGrammarTrait for CreateReference<'a> {
if let HandlerPoint::Before = self.point {
match symbol_table::resolve(arg) {
Ok(symbol) => {
for symbol in symbol.full_path {
symbol_table::add_reference(
symbol.token.id,
&arg.identifier.identifier_token.token,
);
for id in symbol.full_path {
symbol_table::add_reference(id, &arg.identifier.identifier_token.token);
}
}
Err(err) => {
Expand Down Expand Up @@ -139,11 +136,8 @@ impl<'a> VerylGrammarTrait for CreateReference<'a> {

match symbol_table::resolve(arg) {
Ok(symbol) => {
for symbol in symbol.full_path {
symbol_table::add_reference(
symbol.token.id,
&arg.identifier.identifier_token.token,
);
for id in symbol.full_path {
symbol_table::add_reference(id, &arg.identifier.identifier_token.token);
}
}
Err(err) => {
Expand Down Expand Up @@ -182,11 +176,8 @@ impl<'a> VerylGrammarTrait for CreateReference<'a> {

match symbol_table::resolve(arg) {
Ok(symbol) => {
for symbol in symbol.full_path {
symbol_table::add_reference(
symbol.token.id,
&arg.identifier.identifier_token.token,
);
for id in symbol.full_path {
symbol_table::add_reference(id, &arg.identifier.identifier_token.token);
}
}
Err(err) => {
Expand All @@ -207,11 +198,8 @@ impl<'a> VerylGrammarTrait for CreateReference<'a> {
if let HandlerPoint::Before = self.point {
match symbol_table::resolve(arg.identifier.as_ref()) {
Ok(symbol) => {
for symbol in symbol.full_path {
symbol_table::add_reference(
symbol.token.id,
&arg.identifier.identifier_token.token,
);
for id in symbol.full_path {
symbol_table::add_reference(id, &arg.identifier.identifier_token.token);
}
}
Err(err) => {
Expand All @@ -228,11 +216,8 @@ impl<'a> VerylGrammarTrait for CreateReference<'a> {
if arg.inst_port_item_opt.is_none() {
match symbol_table::resolve(arg.identifier.as_ref()) {
Ok(symbol) => {
for symbol in symbol.full_path {
symbol_table::add_reference(
symbol.token.id,
&arg.identifier.identifier_token.token,
);
for id in symbol.full_path {
symbol_table::add_reference(id, &arg.identifier.identifier_token.token);
}
}
Err(err) => {
Expand Down
69 changes: 27 additions & 42 deletions crates/analyzer/src/handlers/create_symbol_table.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ use crate::namespace_table;
use crate::symbol::Direction as SymDirection;
use crate::symbol::Type as SymType;
use crate::symbol::{
DocComment, EnumMember, EnumMemberProperty, EnumProperty, FunctionProperty, InstanceProperty,
InterfaceProperty, ModportMember, ModportMemberProperty, ModportProperty, ModuleProperty,
PackageProperty, ParameterProperty, ParameterScope, ParameterValue, PortProperty, StructMember,
StructMemberProperty, StructProperty, Symbol, SymbolKind, TypeDefProperty, TypeKind,
UnionMember, UnionMemberProperty, UnionProperty, VariableProperty,
DocComment, EnumMemberProperty, EnumProperty, FunctionProperty, InstanceProperty,
InterfaceProperty, ModportMemberProperty, ModportProperty, ModuleProperty, PackageProperty,
ParameterProperty, ParameterScope, ParameterValue, PortProperty, StructMemberProperty,
StructProperty, Symbol, SymbolId, SymbolKind, TypeDefProperty, TypeKind, UnionMemberProperty,
UnionProperty, VariableProperty,
};
use crate::symbol_table;
use std::collections::HashSet;
Expand All @@ -31,9 +31,8 @@ pub struct CreateSymbolTable<'a> {
anonymous_namespace: usize,
attribute_lines: HashSet<u32>,
struct_or_union: Option<StructOrUnion>,
enum_members: Vec<EnumMember>,
struct_members: Vec<StructMember>,
union_members: Vec<UnionMember>,
enum_members: Vec<Option<SymbolId>>,
struct_union_members: Vec<Option<SymbolId>>,
}

#[derive(Clone)]
Expand All @@ -50,7 +49,12 @@ impl<'a> CreateSymbolTable<'a> {
}
}

fn insert_symbol(&mut self, token: &VerylToken, kind: SymbolKind, public: bool) {
fn insert_symbol(
&mut self,
token: &VerylToken,
kind: SymbolKind,
public: bool,
) -> Option<SymbolId> {
let line = token.token.line;
let doc_comment = if let TokenSource::File(file) = token.token.source {
if line == 0 {
Expand Down Expand Up @@ -82,12 +86,14 @@ impl<'a> CreateSymbolTable<'a> {
symbol.allow_unused = true;
}

if !symbol_table::insert(&token.token, symbol) {
let id = symbol_table::insert(&token.token, symbol);
if id.is_none() {
let text = resource_table::get_str_value(token.token.text).unwrap();
self.errors.push(AnalyzerError::duplicated_identifier(
&text, self.text, token,
));
}
id
}
}

Expand Down Expand Up @@ -209,21 +215,18 @@ impl<'a> VerylGrammarTrait for CreateSymbolTable<'a> {

for item in items {
let direction: crate::symbol::Direction = item.direction.as_ref().into();
let member = ModportMember {
name: item.identifier.identifier_token.token.text,
direction: direction.clone(),
};
let property = ModportMemberProperty { direction };
members.push(member);
self.insert_symbol(
let id = self.insert_symbol(
&item.identifier.identifier_token,
SymbolKind::ModportMember(property),
false,
);
members.push(id);
}

self.namespace.pop();

let members: Vec<_> = members.into_iter().flatten().collect();
let property = ModportProperty { members };
let kind = SymbolKind::Modport(property);
self.insert_symbol(&arg.identifier.identifier_token, kind, false);
Expand All @@ -241,7 +244,7 @@ impl<'a> VerylGrammarTrait for CreateSymbolTable<'a> {
self.namespace.pop();

let r#type = arg.scalar_type.as_ref().into();
let members: Vec<_> = self.enum_members.drain(0..).collect();
let members: Vec<_> = self.enum_members.drain(0..).flatten().collect();
let property = EnumProperty { r#type, members };
let kind = SymbolKind::Enum(property);
self.insert_symbol(&arg.identifier.identifier_token, kind, false);
Expand All @@ -255,12 +258,8 @@ impl<'a> VerylGrammarTrait for CreateSymbolTable<'a> {
let value = arg.enum_item_opt.as_ref().map(|x| *x.expression.clone());
let property = EnumMemberProperty { value };
let kind = SymbolKind::EnumMember(property);
self.insert_symbol(&arg.identifier.identifier_token, kind, false);

let member = EnumMember {
name: arg.identifier.identifier_token.token.text,
};
self.enum_members.push(member);
let id = self.insert_symbol(&arg.identifier.identifier_token, kind, false);
self.enum_members.push(id);
}
Ok(())
}
Expand All @@ -280,14 +279,13 @@ impl<'a> VerylGrammarTrait for CreateSymbolTable<'a> {
self.struct_or_union = None;
self.namespace.pop();

let members: Vec<_> = self.struct_union_members.drain(0..).flatten().collect();
let kind = match &*arg.struct_union {
StructUnion::Struct(_) => {
let members: Vec<_> = self.struct_members.drain(0..).collect();
let property = StructProperty { members };
SymbolKind::Struct(property)
}
StructUnion::Union(_) => {
let members: Vec<_> = self.union_members.drain(0..).collect();
let property = UnionProperty { members };
SymbolKind::Union(property)
}
Expand All @@ -313,29 +311,16 @@ impl<'a> VerylGrammarTrait for CreateSymbolTable<'a> {
let r#type: SymType = arg.scalar_type.as_ref().into();
let kind = match self.struct_or_union.clone().unwrap() {
StructOrUnion::InStruct => {
let property = StructMemberProperty {
r#type: r#type.clone(),
};
let member = StructMember {
name: arg.identifier.identifier_token.token.text,
r#type,
};
self.struct_members.push(member);
let property = StructMemberProperty { r#type };
SymbolKind::StructMember(property)
}
StructOrUnion::InUnion => {
let property = UnionMemberProperty {
r#type: r#type.clone(),
};
let member = UnionMember {
name: arg.identifier.identifier_token.token.text,
r#type,
};
self.union_members.push(member);
let property = UnionMemberProperty { r#type };
SymbolKind::UnionMember(property)
}
};
self.insert_symbol(&arg.identifier.identifier_token, kind, false);
let id = self.insert_symbol(&arg.identifier.identifier_token, kind, false);
self.struct_union_members.push(id);
}
Ok(())
}
Expand Down
31 changes: 4 additions & 27 deletions crates/analyzer/src/symbol.rs
Original file line number Diff line number Diff line change
Expand Up @@ -622,13 +622,7 @@ pub struct PackageProperty {

#[derive(Debug, Clone)]
pub struct StructProperty {
pub members: Vec<StructMember>,
}

#[derive(Debug, Clone)]
pub struct StructMember {
pub name: StrId,
pub r#type: Type,
pub members: Vec<SymbolId>,
}

#[derive(Debug, Clone)]
Expand All @@ -638,13 +632,7 @@ pub struct StructMemberProperty {

#[derive(Debug, Clone)]
pub struct UnionProperty {
pub members: Vec<UnionMember>,
}

#[derive(Debug, Clone)]
pub struct UnionMember {
pub name: StrId,
pub r#type: Type,
pub members: Vec<SymbolId>,
}

#[derive(Debug, Clone)]
Expand All @@ -660,12 +648,7 @@ pub struct TypeDefProperty {
#[derive(Debug, Clone)]
pub struct EnumProperty {
pub r#type: Type,
pub members: Vec<EnumMember>,
}

#[derive(Debug, Clone)]
pub struct EnumMember {
pub name: StrId,
pub members: Vec<SymbolId>,
}

#[derive(Debug, Clone)]
Expand All @@ -675,13 +658,7 @@ pub struct EnumMemberProperty {

#[derive(Debug, Clone)]
pub struct ModportProperty {
pub members: Vec<ModportMember>,
}

#[derive(Debug, Clone)]
pub struct ModportMember {
pub name: StrId,
pub direction: Direction,
pub members: Vec<SymbolId>,
}

#[derive(Debug, Clone)]
Expand Down
Loading

0 comments on commit 123602c

Please sign in to comment.