use crate::SourceLocation;
use crate::ast::Node;
use crate::symbol::{Symbol, SymbolTable};
use perl_semantic_facts::{GeneratedMember, PackageEdge};
use super::hover::HoverInfo;
use super::tokens::SemanticToken;
use super::{FileExportMetadata, SemanticAnalyzer};
#[derive(Debug)]
pub struct SemanticModel {
analyzer: SemanticAnalyzer,
}
impl SemanticModel {
pub fn build(root: &Node, source: &str) -> Self {
Self { analyzer: SemanticAnalyzer::analyze_with_source(root, source) }
}
pub fn tokens(&self) -> &[SemanticToken] {
self.analyzer.semantic_tokens()
}
pub fn symbol_table(&self) -> &SymbolTable {
self.analyzer.symbol_table()
}
pub fn export_metadata(&self) -> &FileExportMetadata {
self.analyzer.export_metadata()
}
pub fn package_edges(&self) -> &[PackageEdge] {
self.analyzer.package_edges()
}
pub fn generated_members(&self) -> &[GeneratedMember] {
self.analyzer.generated_members()
}
pub fn hover_info_at(&self, location: SourceLocation) -> Option<&HoverInfo> {
self.analyzer.hover_at(location)
}
pub fn definition_at(&self, position: usize) -> Option<&Symbol> {
self.analyzer.find_definition(position)
}
pub fn resolve_inherited_method_location(
&self,
receiver_class: &str,
method_name: &str,
) -> Option<SourceLocation> {
self.analyzer.resolve_inherited_method_location(receiver_class, method_name)
}
pub fn parent_chain(&self, receiver_class: &str) -> Option<Vec<String>> {
self.analyzer.resolve_parent_chain(receiver_class)
}
}