#![doc = include_str!("../README.md")]
#![warn(missing_docs)]
use std::fmt::Display;
use std::ops::Range;
mod name_resolver;
mod scope_index;
mod scope_name;
mod source;
mod swc;
pub use name_resolver::NameResolver;
pub use scope_index::{ScopeIndex, ScopeIndexError, ScopeLookupResult};
pub use scope_name::{NameComponent, ScopeName};
pub use source::{SourceContext, SourceContextError, SourcePosition};
use swc_common::Spanned;
pub type Scopes = Vec<(Range<u32>, Option<ScopeName>)>;
#[tracing::instrument(level = "trace", skip_all)]
pub fn extract_scope_names(src: &str) -> Result<Scopes, ParseError> {
let mut scopes = swc::parse_with_swc(src).map_err(|e| ParseError { inner: e })?;
for scope in &mut scopes {
if let Some(ref name) = scope.1 {
if name.components.is_empty() {
scope.1 = None;
}
}
}
Ok(scopes)
}
#[derive(Debug)]
pub struct ParseError {
inner: swc::ParseError,
}
impl Display for ParseError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let span = self.inner.span();
f.write_fmt(format_args!(
"{}:{}:{}",
span.lo.0,
span.hi.0,
self.inner.kind().msg()
))
}
}
impl std::error::Error for ParseError {}