diff --git a/.changeset/friendly-timers-beam.md b/.changeset/friendly-timers-beam.md new file mode 100644 index 000000000..6db841000 --- /dev/null +++ b/.changeset/friendly-timers-beam.md @@ -0,0 +1,5 @@ +--- +"@nomicfoundation/slang": minor +--- + +rename `Language` API to `Parser`, in preparation for introducing a multi-file compilation API. diff --git a/crates/codegen/runtime/cargo/src/runtime/cli/commands/parse.rs b/crates/codegen/runtime/cargo/src/runtime/cli/commands/parse.rs index 21d56d64c..edf783852 100644 --- a/crates/codegen/runtime/cargo/src/runtime/cli/commands/parse.rs +++ b/crates/codegen/runtime/cargo/src/runtime/cli/commands/parse.rs @@ -1,13 +1,12 @@ use std::fs; use std::path::PathBuf; -use clap::Parser; use semver::Version; use crate::diagnostic; -use crate::parser::Language; +use crate::parser::Parser; -#[derive(Parser, Debug)] +#[derive(clap::Parser, Debug)] pub struct ParseCommand { /// File path to the source file to parse file_path: PathBuf, @@ -34,8 +33,8 @@ impl ParseCommand { .unwrap_or_else(|_| panic!("File not found: {file_path:?}")); let input = fs::read_to_string(&file_path).unwrap(); - let language = Language::new(version).unwrap(); - let parse_output = language.parse(Language::ROOT_KIND, &input); + let parser = Parser::new(version).unwrap(); + let parse_output = parser.parse(Parser::ROOT_KIND, &input); if !parse_output.is_valid() { const COLOR: bool = true; diff --git a/crates/codegen/runtime/cargo/src/runtime/parser/generated/language.rs b/crates/codegen/runtime/cargo/src/runtime/parser/generated/parser.rs similarity index 89% rename from crates/codegen/runtime/cargo/src/runtime/parser/generated/language.rs rename to crates/codegen/runtime/cargo/src/runtime/parser/generated/parser.rs index adaf65566..d32764b71 100644 --- a/crates/codegen/runtime/cargo/src/runtime/parser/generated/language.rs +++ b/crates/codegen/runtime/cargo/src/runtime/parser/generated/parser.rs @@ -34,12 +34,12 @@ use crate::parser::ParseOutput; #[derive(Debug)] #[cfg_attr(feature = "__private_napi_interfaces", napi(namespace = "parser"))] -pub struct Language { +pub struct Parser { pub(crate) version: Version, } #[derive(thiserror::Error, Debug)] -pub enum LanguageInitializationError { +pub enum ParserInitializationError { #[error("Unsupported language version '{0}'.")] UnsupportedLanguageVersion(Version), @@ -49,22 +49,22 @@ pub enum LanguageInitializationError { } #[cfg(feature = "__private_napi_interfaces")] -impl From for napi::Error { - fn from(value: LanguageInitializationError) -> Self { +impl From for napi::Error { + fn from(value: ParserInitializationError) -> Self { napi::Error::from_reason(value.to_string()) } } -impl Language { +impl Parser { pub const SUPPORTED_VERSIONS: &'static [Version] = &[]; pub const ROOT_KIND: NonterminalKind = NonterminalKind::Stub1; - pub fn new(version: Version) -> std::result::Result { + pub fn new(version: Version) -> std::result::Result { if Self::SUPPORTED_VERSIONS.binary_search(&version).is_ok() { Ok(Self { version }) } else { - Err(LanguageInitializationError::UnsupportedLanguageVersion( + Err(ParserInitializationError::UnsupportedLanguageVersion( version, )) } @@ -79,7 +79,7 @@ impl Language { } } -impl Lexer for Language { +impl Lexer for Parser { fn leading_trivia(&self, input: &mut ParserContext<'_>) -> ParserResult { unreachable!("Invoking leading_trivia in stubs: {input:#?}") } @@ -104,11 +104,11 @@ impl Lexer for Language { // NAPI-exposed functions have to accept owned values. #[allow(clippy::needless_pass_by_value)] #[napi(namespace = "parser")] -impl Language { +impl Parser { #[napi(constructor, catch_unwind)] pub fn new_napi(version: String) -> std::result::Result { let version = Version::parse(&version) - .map_err(|_| LanguageInitializationError::InvalidSemanticVersion(version))?; + .map_err(|_| ParserInitializationError::InvalidSemanticVersion(version))?; Self::new(version).map_err(|e| e.into()) } diff --git a/crates/codegen/runtime/cargo/src/runtime/parser/mod.rs b/crates/codegen/runtime/cargo/src/runtime/parser/mod.rs index fdda01f66..c017c2cc4 100644 --- a/crates/codegen/runtime/cargo/src/runtime/parser/mod.rs +++ b/crates/codegen/runtime/cargo/src/runtime/parser/mod.rs @@ -1,11 +1,12 @@ -#[path = "generated/language.rs"] -mod language; mod lexer; mod parse_error; mod parse_output; +#[allow(clippy::module_inception)] +#[path = "generated/parser.rs"] +mod parser; mod parser_support; mod scanner_macros; -pub use language::{Language, LanguageInitializationError}; pub use parse_error::ParseError; pub use parse_output::ParseOutput; +pub use parser::{Parser, ParserInitializationError}; diff --git a/crates/codegen/runtime/cargo/src/runtime/parser/language.rs.jinja2 b/crates/codegen/runtime/cargo/src/runtime/parser/parser.rs.jinja2 similarity index 95% rename from crates/codegen/runtime/cargo/src/runtime/parser/language.rs.jinja2 rename to crates/codegen/runtime/cargo/src/runtime/parser/parser.rs.jinja2 index 34673701f..7c1f8aa27 100644 --- a/crates/codegen/runtime/cargo/src/runtime/parser/language.rs.jinja2 +++ b/crates/codegen/runtime/cargo/src/runtime/parser/parser.rs.jinja2 @@ -32,7 +32,7 @@ use crate::parser::ParseOutput; #[derive(Debug)] #[cfg_attr(feature = "__private_napi_interfaces", napi(namespace = "parser"))] -pub struct Language { +pub struct Parser { {%- if not rendering_in_stubs -%} {%- for version in model.breaking_language_versions -%} {% if loop.first %} {# The first supported version may not be referenced by the items #} @@ -46,7 +46,7 @@ pub struct Language { } #[derive(thiserror::Error, Debug)] -pub enum LanguageInitializationError { +pub enum ParserInitializationError { #[error("Unsupported language version '{0}'.")] UnsupportedLanguageVersion(Version), @@ -56,13 +56,13 @@ pub enum LanguageInitializationError { } #[cfg(feature = "__private_napi_interfaces")] -impl From for napi::Error { - fn from(value: LanguageInitializationError) -> Self { +impl From for napi::Error { + fn from(value: ParserInitializationError) -> Self { napi::Error::from_reason(value.to_string()) } } -impl Language { +impl Parser { pub const SUPPORTED_VERSIONS: &'static [Version] = &[ {%- if not rendering_in_stubs -%} {% for version in model.all_language_versions %} @@ -73,7 +73,7 @@ impl Language { pub const ROOT_KIND: NonterminalKind = NonterminalKind::{{ model.kinds.root_kind }}; - pub fn new(version: Version) -> std::result::Result { + pub fn new(version: Version) -> std::result::Result { if Self::SUPPORTED_VERSIONS.binary_search(&version).is_ok() { Ok(Self { {%- if not rendering_in_stubs -%} @@ -85,7 +85,7 @@ impl Language { version, }) } else { - Err(LanguageInitializationError::UnsupportedLanguageVersion(version)) + Err(ParserInitializationError::UnsupportedLanguageVersion(version)) } } @@ -138,12 +138,12 @@ impl Language { } } -impl Lexer for Language { +impl Lexer for Parser { fn leading_trivia(&self, input: &mut ParserContext<'_>) -> ParserResult { {%- if rendering_in_stubs -%} unreachable!("Invoking leading_trivia in stubs: {input:#?}") {%- else -%} - Language::leading_trivia(self, input) + Parser::leading_trivia(self, input) {%- endif -%} } @@ -151,7 +151,7 @@ impl Lexer for Language { {%- if rendering_in_stubs -%} unreachable!("Invoking trailing_trivia in stubs: {input:#?}") {%- else -%} - Language::trailing_trivia(self, input) + Parser::trailing_trivia(self, input) {%- endif -%} } @@ -283,11 +283,11 @@ impl Lexer for Language { // NAPI-exposed functions have to accept owned values. #[allow(clippy::needless_pass_by_value)] #[napi(namespace = "parser")] -impl Language { +impl Parser { #[napi(constructor, catch_unwind)] pub fn new_napi(version: String) -> std::result::Result { - let version = Version::parse(&version).map_err(|_| LanguageInitializationError::InvalidSemanticVersion(version))?; + let version = Version::parse(&version).map_err(|_| ParserInitializationError::InvalidSemanticVersion(version))?; Self::new(version).map_err(|e| e.into()) } diff --git a/crates/codegen/runtime/cargo/src/runtime/parser/parser_support/parser_function.rs b/crates/codegen/runtime/cargo/src/runtime/parser/parser_support/parser_function.rs index 058a2395c..16a63be25 100644 --- a/crates/codegen/runtime/cargo/src/runtime/parser/parser_support/parser_function.rs +++ b/crates/codegen/runtime/cargo/src/runtime/parser/parser_support/parser_function.rs @@ -8,22 +8,22 @@ use crate::parser::parser_support::parser_result::{ }; use crate::parser::{ParseError, ParseOutput}; -pub trait ParserFunction +pub trait ParserFunction

where - Self: Fn(&L, &mut ParserContext<'_>) -> ParserResult, + Self: Fn(&P, &mut ParserContext<'_>) -> ParserResult, { - fn parse(&self, language: &L, input: &str) -> ParseOutput; + fn parse(&self, parser: &P, input: &str) -> ParseOutput; } -impl ParserFunction for F +impl ParserFunction

for F where - L: Lexer, - F: Fn(&L, &mut ParserContext<'_>) -> ParserResult, + P: Lexer, + F: Fn(&P, &mut ParserContext<'_>) -> ParserResult, { #[allow(clippy::too_many_lines)] - fn parse(&self, language: &L, input: &str) -> ParseOutput { + fn parse(&self, parser: &P, input: &str) -> ParseOutput { let mut stream = ParserContext::new(input); - let mut result = self(language, &mut stream); + let mut result = self(parser, &mut stream); // For a succesful/recovered parse, collect any remaining trivia as part of the parse result if let ParserResult::Match(r#match) = &mut result { @@ -33,7 +33,7 @@ where ) }; - let eof_trivia = match Lexer::leading_trivia(language, &mut stream) { + let eof_trivia = match Lexer::leading_trivia(parser, &mut stream) { ParserResult::Match(eof_trivia) if !eof_trivia.nodes.is_empty() => { Some(eof_trivia.nodes) } diff --git a/crates/codegen/runtime/cargo/src/runtime/wit/interface/generated/parser.wit b/crates/codegen/runtime/cargo/src/runtime/wit/interface/generated/parser.wit index 8e8875efe..8381cb836 100644 --- a/crates/codegen/runtime/cargo/src/runtime/wit/interface/generated/parser.wit +++ b/crates/codegen/runtime/cargo/src/runtime/wit/interface/generated/parser.wit @@ -4,9 +4,9 @@ interface parser { use cst.{cursor, node, nonterminal-kind, text-range}; use diagnostic.{severity}; - resource language { + resource parser { supported-versions: static func() -> list; - new: static func(version: string) -> result; + new: static func(version: string) -> result; version: func() -> string; parse: func(kind: nonterminal-kind, input: string) -> parse-output; } diff --git a/crates/codegen/runtime/cargo/src/runtime/wit/interface/parser.wit.jinja2 b/crates/codegen/runtime/cargo/src/runtime/wit/interface/parser.wit.jinja2 index 52c8cb13f..475c425c4 100644 --- a/crates/codegen/runtime/cargo/src/runtime/wit/interface/parser.wit.jinja2 +++ b/crates/codegen/runtime/cargo/src/runtime/wit/interface/parser.wit.jinja2 @@ -2,9 +2,9 @@ interface parser { use cst.{cursor, node, nonterminal-kind, text-range}; use diagnostic.{severity}; - resource language { + resource parser { supported-versions: static func() -> list; - new: static func(version: string) -> result; + new: static func(version: string) -> result; version: func() -> string; parse: func(kind: nonterminal-kind, input: string) -> parse-output; } diff --git a/crates/codegen/runtime/cargo/src/runtime/wit/wrappers/parser.rs b/crates/codegen/runtime/cargo/src/runtime/wit/wrappers/parser.rs index d7eb2ef54..535bb8a9e 100644 --- a/crates/codegen/runtime/cargo/src/runtime/wit/wrappers/parser.rs +++ b/crates/codegen/runtime/cargo/src/runtime/wit/wrappers/parser.rs @@ -7,32 +7,32 @@ mod ffi { }; pub use crate::wit::interface::exports::nomic_foundation::slang::diagnostic::Severity; pub use crate::wit::interface::exports::nomic_foundation::slang::parser::{ - Guest, GuestLanguage, GuestParseError, GuestParseOutput, Language, LanguageBorrow, - NonterminalKind, ParseError, ParseErrorBorrow, ParseOutput, ParseOutputBorrow, + Guest, GuestParseError, GuestParseOutput, GuestParser, NonterminalKind, ParseError, + ParseErrorBorrow, ParseOutput, ParseOutputBorrow, Parser, ParserBorrow, }; } mod rust { - pub use crate::parser::{Language, ParseError, ParseOutput}; + pub use crate::parser::{ParseError, ParseOutput, Parser}; } impl ffi::Guest for crate::wit::World { - type Language = LanguageWrapper; + type Parser = ParserWrapper; type ParseError = ParseErrorWrapper; type ParseOutput = ParseOutputWrapper; } //================================================ // -// resource language +// resource parser // //================================================ -define_wrapper! { Language { - fn new(version: String) -> Result { +define_wrapper! { Parser { + fn new(version: String) -> Result { semver::Version::parse(&version) .map_err(|_| format!("Invalid version: {version}")) - .and_then(|version| rust::Language::new(version).map_err(|e| e.to_string())) + .and_then(|version| rust::Parser::new(version).map_err(|e| e.to_string())) .map(IntoFFI::_into_ffi) } @@ -41,7 +41,7 @@ define_wrapper! { Language { } fn supported_versions() -> Vec { - rust::Language::SUPPORTED_VERSIONS + rust::Parser::SUPPORTED_VERSIONS .iter() .map(|v| v.to_string()) .collect() diff --git a/crates/codegen/runtime/npm/src/runtime/napi-bindings/generated/index.d.ts b/crates/codegen/runtime/npm/src/runtime/napi-bindings/generated/index.d.ts index d15dd8a73..6ed526258 100644 --- a/crates/codegen/runtime/npm/src/runtime/napi-bindings/generated/index.d.ts +++ b/crates/codegen/runtime/npm/src/runtime/napi-bindings/generated/index.d.ts @@ -108,7 +108,7 @@ export declare namespace cst { } } export declare namespace parser { - export class Language { + export class Parser { constructor(version: string); get version(): string; static supportedVersions(): Array; diff --git a/crates/codegen/runtime/npm/src/runtime/parser/index.ts b/crates/codegen/runtime/npm/src/runtime/parser/index.ts index d240e92ea..695007ce4 100644 --- a/crates/codegen/runtime/npm/src/runtime/parser/index.ts +++ b/crates/codegen/runtime/npm/src/runtime/parser/index.ts @@ -1,8 +1,8 @@ import * as generated from "../napi-bindings/generated"; import { DiagnosticInterface } from "../diagnostic"; -export const Language = generated.parser.Language; -export type Language = generated.parser.Language; +export const Parser = generated.parser.Parser; +export type Parser = generated.parser.Parser; export const ParseError = generated.parser.ParseError; export type ParseError = generated.parser.ParseError; diff --git a/crates/solidity/outputs/cargo/slang_solidity/generated/public_api.txt b/crates/solidity/outputs/cargo/slang_solidity/generated/public_api.txt index f8ef99c2f..52df7ec3e 100644 --- a/crates/solidity/outputs/cargo/slang_solidity/generated/public_api.txt +++ b/crates/solidity/outputs/cargo/slang_solidity/generated/public_api.txt @@ -879,22 +879,13 @@ pub fn slang_solidity::parser::ParseError::severity(&self) -> slang_solidity::di pub fn slang_solidity::parser::ParseError::text_range(&self) -> metaslang_cst::text_index::TextRange pub fn slang_solidity::diagnostic::render(error: &D, source_id: &str, source: &str, with_color: bool) -> alloc::string::String pub mod slang_solidity::parser -pub enum slang_solidity::parser::LanguageInitializationError -pub slang_solidity::parser::LanguageInitializationError::UnsupportedLanguageVersion(semver::Version) -impl core::error::Error for slang_solidity::parser::LanguageInitializationError -impl core::fmt::Debug for slang_solidity::parser::LanguageInitializationError -pub fn slang_solidity::parser::LanguageInitializationError::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result -impl core::fmt::Display for slang_solidity::parser::LanguageInitializationError -pub fn slang_solidity::parser::LanguageInitializationError::fmt(&self, __formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result -pub struct slang_solidity::parser::Language -impl slang_solidity::parser::Language -pub const slang_solidity::parser::Language::ROOT_KIND: slang_solidity::cst::NonterminalKind -pub const slang_solidity::parser::Language::SUPPORTED_VERSIONS: &'static [semver::Version] -pub fn slang_solidity::parser::Language::new(version: semver::Version) -> core::result::Result -pub fn slang_solidity::parser::Language::parse(&self, kind: slang_solidity::cst::NonterminalKind, input: &str) -> slang_solidity::parser::ParseOutput -pub fn slang_solidity::parser::Language::version(&self) -> &semver::Version -impl core::fmt::Debug for slang_solidity::parser::Language -pub fn slang_solidity::parser::Language::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result +pub enum slang_solidity::parser::ParserInitializationError +pub slang_solidity::parser::ParserInitializationError::UnsupportedLanguageVersion(semver::Version) +impl core::error::Error for slang_solidity::parser::ParserInitializationError +impl core::fmt::Debug for slang_solidity::parser::ParserInitializationError +pub fn slang_solidity::parser::ParserInitializationError::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result +impl core::fmt::Display for slang_solidity::parser::ParserInitializationError +pub fn slang_solidity::parser::ParserInitializationError::fmt(&self, __formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result pub struct slang_solidity::parser::ParseError impl slang_solidity::parser::ParseError pub fn slang_solidity::parser::ParseError::message(&self) -> alloc::string::String @@ -924,4 +915,13 @@ pub fn slang_solidity::parser::ParseOutput::eq(&self, other: &slang_solidity::pa impl core::fmt::Debug for slang_solidity::parser::ParseOutput pub fn slang_solidity::parser::ParseOutput::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result impl core::marker::StructuralPartialEq for slang_solidity::parser::ParseOutput +pub struct slang_solidity::parser::Parser +impl slang_solidity::parser::Parser +pub const slang_solidity::parser::Parser::ROOT_KIND: slang_solidity::cst::NonterminalKind +pub const slang_solidity::parser::Parser::SUPPORTED_VERSIONS: &'static [semver::Version] +pub fn slang_solidity::parser::Parser::new(version: semver::Version) -> core::result::Result +pub fn slang_solidity::parser::Parser::parse(&self, kind: slang_solidity::cst::NonterminalKind, input: &str) -> slang_solidity::parser::ParseOutput +pub fn slang_solidity::parser::Parser::version(&self) -> &semver::Version +impl core::fmt::Debug for slang_solidity::parser::Parser +pub fn slang_solidity::parser::Parser::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result pub mod slang_solidity::wit diff --git a/crates/solidity/outputs/cargo/slang_solidity/src/generated/cli/commands/parse.rs b/crates/solidity/outputs/cargo/slang_solidity/src/generated/cli/commands/parse.rs index 8929c649b..8c5a51610 100644 --- a/crates/solidity/outputs/cargo/slang_solidity/src/generated/cli/commands/parse.rs +++ b/crates/solidity/outputs/cargo/slang_solidity/src/generated/cli/commands/parse.rs @@ -3,13 +3,12 @@ use std::fs; use std::path::PathBuf; -use clap::Parser; use semver::Version; use crate::diagnostic; -use crate::parser::Language; +use crate::parser::Parser; -#[derive(Parser, Debug)] +#[derive(clap::Parser, Debug)] pub struct ParseCommand { /// File path to the source file to parse file_path: PathBuf, @@ -36,8 +35,8 @@ impl ParseCommand { .unwrap_or_else(|_| panic!("File not found: {file_path:?}")); let input = fs::read_to_string(&file_path).unwrap(); - let language = Language::new(version).unwrap(); - let parse_output = language.parse(Language::ROOT_KIND, &input); + let parser = Parser::new(version).unwrap(); + let parse_output = parser.parse(Parser::ROOT_KIND, &input); if !parse_output.is_valid() { const COLOR: bool = true; diff --git a/crates/solidity/outputs/cargo/slang_solidity/src/generated/parser/generated/language.rs b/crates/solidity/outputs/cargo/slang_solidity/src/generated/parser/generated/parser.rs similarity index 99% rename from crates/solidity/outputs/cargo/slang_solidity/src/generated/parser/generated/language.rs rename to crates/solidity/outputs/cargo/slang_solidity/src/generated/parser/generated/parser.rs index c1565f9bb..4e7026296 100644 --- a/crates/solidity/outputs/cargo/slang_solidity/src/generated/parser/generated/language.rs +++ b/crates/solidity/outputs/cargo/slang_solidity/src/generated/parser/generated/parser.rs @@ -34,7 +34,7 @@ use crate::parser::ParseOutput; #[derive(Debug)] #[cfg_attr(feature = "__private_napi_interfaces", napi(namespace = "parser"))] -pub struct Language { +pub struct Parser { #[allow(dead_code)] pub(crate) version_is_at_least_0_4_11: bool, pub(crate) version_is_at_least_0_4_12: bool, @@ -75,7 +75,7 @@ pub struct Language { } #[derive(thiserror::Error, Debug)] -pub enum LanguageInitializationError { +pub enum ParserInitializationError { #[error("Unsupported language version '{0}'.")] UnsupportedLanguageVersion(Version), @@ -85,13 +85,13 @@ pub enum LanguageInitializationError { } #[cfg(feature = "__private_napi_interfaces")] -impl From for napi::Error { - fn from(value: LanguageInitializationError) -> Self { +impl From for napi::Error { + fn from(value: ParserInitializationError) -> Self { napi::Error::from_reason(value.to_string()) } } -impl Language { +impl Parser { pub const SUPPORTED_VERSIONS: &'static [Version] = &[ Version::new(0, 4, 11), Version::new(0, 4, 12), @@ -179,7 +179,7 @@ impl Language { pub const ROOT_KIND: NonterminalKind = NonterminalKind::SourceUnit; - pub fn new(version: Version) -> std::result::Result { + pub fn new(version: Version) -> std::result::Result { if Self::SUPPORTED_VERSIONS.binary_search(&version).is_ok() { Ok(Self { version_is_at_least_0_4_11: Version::new(0, 4, 11) <= version, @@ -220,7 +220,7 @@ impl Language { version, }) } else { - Err(LanguageInitializationError::UnsupportedLanguageVersion( + Err(ParserInitializationError::UnsupportedLanguageVersion( version, )) } @@ -9521,13 +9521,13 @@ impl Language { } } -impl Lexer for Language { +impl Lexer for Parser { fn leading_trivia(&self, input: &mut ParserContext<'_>) -> ParserResult { - Language::leading_trivia(self, input) + Parser::leading_trivia(self, input) } fn trailing_trivia(&self, input: &mut ParserContext<'_>) -> ParserResult { - Language::trailing_trivia(self, input) + Parser::trailing_trivia(self, input) } fn delimiters() -> &'static [(TerminalKind, TerminalKind)] { @@ -13554,11 +13554,11 @@ impl Lexer for Language { // NAPI-exposed functions have to accept owned values. #[allow(clippy::needless_pass_by_value)] #[napi(namespace = "parser")] -impl Language { +impl Parser { #[napi(constructor, catch_unwind)] pub fn new_napi(version: String) -> std::result::Result { let version = Version::parse(&version) - .map_err(|_| LanguageInitializationError::InvalidSemanticVersion(version))?; + .map_err(|_| ParserInitializationError::InvalidSemanticVersion(version))?; Self::new(version).map_err(|e| e.into()) } diff --git a/crates/solidity/outputs/cargo/slang_solidity/src/generated/parser/mod.rs b/crates/solidity/outputs/cargo/slang_solidity/src/generated/parser/mod.rs index 44f4b789c..70c1e946b 100644 --- a/crates/solidity/outputs/cargo/slang_solidity/src/generated/parser/mod.rs +++ b/crates/solidity/outputs/cargo/slang_solidity/src/generated/parser/mod.rs @@ -1,13 +1,14 @@ // This file is generated automatically by infrastructure scripts. Please don't edit by hand. -#[path = "generated/language.rs"] -mod language; mod lexer; mod parse_error; mod parse_output; +#[allow(clippy::module_inception)] +#[path = "generated/parser.rs"] +mod parser; mod parser_support; mod scanner_macros; -pub use language::{Language, LanguageInitializationError}; pub use parse_error::ParseError; pub use parse_output::ParseOutput; +pub use parser::{Parser, ParserInitializationError}; diff --git a/crates/solidity/outputs/cargo/slang_solidity/src/generated/parser/parser_support/parser_function.rs b/crates/solidity/outputs/cargo/slang_solidity/src/generated/parser/parser_support/parser_function.rs index 5565042c6..89682aad9 100644 --- a/crates/solidity/outputs/cargo/slang_solidity/src/generated/parser/parser_support/parser_function.rs +++ b/crates/solidity/outputs/cargo/slang_solidity/src/generated/parser/parser_support/parser_function.rs @@ -10,22 +10,22 @@ use crate::parser::parser_support::parser_result::{ }; use crate::parser::{ParseError, ParseOutput}; -pub trait ParserFunction +pub trait ParserFunction

where - Self: Fn(&L, &mut ParserContext<'_>) -> ParserResult, + Self: Fn(&P, &mut ParserContext<'_>) -> ParserResult, { - fn parse(&self, language: &L, input: &str) -> ParseOutput; + fn parse(&self, parser: &P, input: &str) -> ParseOutput; } -impl ParserFunction for F +impl ParserFunction

for F where - L: Lexer, - F: Fn(&L, &mut ParserContext<'_>) -> ParserResult, + P: Lexer, + F: Fn(&P, &mut ParserContext<'_>) -> ParserResult, { #[allow(clippy::too_many_lines)] - fn parse(&self, language: &L, input: &str) -> ParseOutput { + fn parse(&self, parser: &P, input: &str) -> ParseOutput { let mut stream = ParserContext::new(input); - let mut result = self(language, &mut stream); + let mut result = self(parser, &mut stream); // For a succesful/recovered parse, collect any remaining trivia as part of the parse result if let ParserResult::Match(r#match) = &mut result { @@ -35,7 +35,7 @@ where ) }; - let eof_trivia = match Lexer::leading_trivia(language, &mut stream) { + let eof_trivia = match Lexer::leading_trivia(parser, &mut stream) { ParserResult::Match(eof_trivia) if !eof_trivia.nodes.is_empty() => { Some(eof_trivia.nodes) } diff --git a/crates/solidity/outputs/cargo/slang_solidity/src/generated/wit/interface/generated/parser.wit b/crates/solidity/outputs/cargo/slang_solidity/src/generated/wit/interface/generated/parser.wit index 8e8875efe..8381cb836 100644 --- a/crates/solidity/outputs/cargo/slang_solidity/src/generated/wit/interface/generated/parser.wit +++ b/crates/solidity/outputs/cargo/slang_solidity/src/generated/wit/interface/generated/parser.wit @@ -4,9 +4,9 @@ interface parser { use cst.{cursor, node, nonterminal-kind, text-range}; use diagnostic.{severity}; - resource language { + resource parser { supported-versions: static func() -> list; - new: static func(version: string) -> result; + new: static func(version: string) -> result; version: func() -> string; parse: func(kind: nonterminal-kind, input: string) -> parse-output; } diff --git a/crates/solidity/outputs/cargo/slang_solidity/src/generated/wit/wrappers/parser.rs b/crates/solidity/outputs/cargo/slang_solidity/src/generated/wit/wrappers/parser.rs index e13c5ca53..56a33eb3a 100644 --- a/crates/solidity/outputs/cargo/slang_solidity/src/generated/wit/wrappers/parser.rs +++ b/crates/solidity/outputs/cargo/slang_solidity/src/generated/wit/wrappers/parser.rs @@ -9,32 +9,32 @@ mod ffi { }; pub use crate::wit::interface::exports::nomic_foundation::slang::diagnostic::Severity; pub use crate::wit::interface::exports::nomic_foundation::slang::parser::{ - Guest, GuestLanguage, GuestParseError, GuestParseOutput, Language, LanguageBorrow, - NonterminalKind, ParseError, ParseErrorBorrow, ParseOutput, ParseOutputBorrow, + Guest, GuestParseError, GuestParseOutput, GuestParser, NonterminalKind, ParseError, + ParseErrorBorrow, ParseOutput, ParseOutputBorrow, Parser, ParserBorrow, }; } mod rust { - pub use crate::parser::{Language, ParseError, ParseOutput}; + pub use crate::parser::{ParseError, ParseOutput, Parser}; } impl ffi::Guest for crate::wit::World { - type Language = LanguageWrapper; + type Parser = ParserWrapper; type ParseError = ParseErrorWrapper; type ParseOutput = ParseOutputWrapper; } //================================================ // -// resource language +// resource parser // //================================================ -define_wrapper! { Language { - fn new(version: String) -> Result { +define_wrapper! { Parser { + fn new(version: String) -> Result { semver::Version::parse(&version) .map_err(|_| format!("Invalid version: {version}")) - .and_then(|version| rust::Language::new(version).map_err(|e| e.to_string())) + .and_then(|version| rust::Parser::new(version).map_err(|e| e.to_string())) .map(IntoFFI::_into_ffi) } @@ -43,7 +43,7 @@ define_wrapper! { Language { } fn supported_versions() -> Vec { - rust::Language::SUPPORTED_VERSIONS + rust::Parser::SUPPORTED_VERSIONS .iter() .map(|v| v.to_string()) .collect() diff --git a/crates/solidity/outputs/cargo/tests/src/bindings_assertions/runner.rs b/crates/solidity/outputs/cargo/tests/src/bindings_assertions/runner.rs index 2db5b98c7..4862676d7 100644 --- a/crates/solidity/outputs/cargo/tests/src/bindings_assertions/runner.rs +++ b/crates/solidity/outputs/cargo/tests/src/bindings_assertions/runner.rs @@ -4,7 +4,7 @@ use std::sync::Arc; use anyhow::Result; use infra_utils::cargo::CargoWorkspace; use semver::Version; -use slang_solidity::parser::Language; +use slang_solidity::parser::Parser; use slang_solidity::{bindings, diagnostic}; use crate::bindings_assertions::assertions::{ @@ -29,7 +29,7 @@ pub fn run(group_name: &str, test_name: &str) -> Result<()> { } fn check_assertions_with_version(version: &Version, contents: &str) -> Result<()> { - let language = Language::new(version.clone())?; + let parser = Parser::new(version.clone())?; let mut bindings = bindings::create_with_resolver(version.clone(), Arc::new(TestsPathResolver {})); let mut assertions = Assertions::new(); @@ -42,7 +42,7 @@ fn check_assertions_with_version(version: &Version, contents: &str) -> Result<() contents: file_contents, } in &multi_part.parts { - let parse_output = language.parse(Language::ROOT_KIND, file_contents); + let parse_output = parser.parse(Parser::ROOT_KIND, file_contents); if !parse_output.is_valid() { let report = parse_output diff --git a/crates/solidity/outputs/cargo/tests/src/bindings_output/runner.rs b/crates/solidity/outputs/cargo/tests/src/bindings_output/runner.rs index cde749cac..219388fe7 100644 --- a/crates/solidity/outputs/cargo/tests/src/bindings_output/runner.rs +++ b/crates/solidity/outputs/cargo/tests/src/bindings_output/runner.rs @@ -8,7 +8,7 @@ use infra_utils::paths::PathExtensions; use metaslang_graph_builder::graph::Graph; use slang_solidity::bindings; use slang_solidity::cst::KindTypes; -use slang_solidity::parser::{Language, ParseOutput}; +use slang_solidity::parser::{ParseOutput, Parser}; use super::graph::{render_dot_graph, render_graph}; use super::renderer::render_bindings; @@ -38,7 +38,7 @@ pub fn run(group_name: &str, test_name: &str) -> Result<()> { let mut last_bindings_output = None; for version in &VERSION_BREAKS { - let language = Language::new(version.clone())?; + let parser = Parser::new(version.clone())?; let mut bindings = bindings::create_with_resolver(version.clone(), Arc::new(TestsPathResolver {})); let mut parsed_parts: Vec> = Vec::new(); @@ -49,7 +49,7 @@ pub fn run(group_name: &str, test_name: &str) -> Result<()> { contents, } in &multi_part.parts { - let parse_output = language.parse(Language::ROOT_KIND, contents); + let parse_output = parser.parse(Parser::ROOT_KIND, contents); let graph = bindings.add_file_returning_graph(path, parse_output.create_tree_cursor()); parsed_parts.push(ParsedPart { path, diff --git a/crates/solidity/outputs/cargo/tests/src/cst_output/runner.rs b/crates/solidity/outputs/cargo/tests/src/cst_output/runner.rs index 0c1178d22..768adfebb 100644 --- a/crates/solidity/outputs/cargo/tests/src/cst_output/runner.rs +++ b/crates/solidity/outputs/cargo/tests/src/cst_output/runner.rs @@ -5,7 +5,7 @@ use infra_utils::cargo::CargoWorkspace; use infra_utils::codegen::CodegenFileSystem; use infra_utils::paths::PathExtensions; use slang_solidity::cst::NonterminalKind; -use slang_solidity::parser::Language; +use slang_solidity::parser::Parser; use strum_macros::Display; use crate::cst_output::renderer::render; @@ -37,7 +37,7 @@ pub fn run(parser_name: &str, test_name: &str) -> Result<()> { let tested_kind = NonterminalKind::from_str(parser_name) .unwrap_or_else(|_| panic!("No such parser: {parser_name}")); - let output = Language::new(version.clone())?.parse(tested_kind, &source); + let output = Parser::new(version.clone())?.parse(tested_kind, &source); let output = match last_output { // Skip this version if it produces the same output. diff --git a/crates/solidity/outputs/cargo/tests/src/doc_examples/tree_query_language.rs b/crates/solidity/outputs/cargo/tests/src/doc_examples/tree_query_language.rs index f4d1422bc..e03fda884 100644 --- a/crates/solidity/outputs/cargo/tests/src/doc_examples/tree_query_language.rs +++ b/crates/solidity/outputs/cargo/tests/src/doc_examples/tree_query_language.rs @@ -2,7 +2,7 @@ use once_cell::sync::Lazy; use regex::Regex; use semver::Version; use slang_solidity::cst::{NonterminalKind, Query, QueryMatchIterator}; -use slang_solidity::parser::Language; +use slang_solidity::parser::Parser; static SNIPPET_MARKER_RE: Lazy = Lazy::new(|| Regex::new("// --8<-- \\[(start|end):([a-z0-9-]+)\\]").unwrap()); @@ -19,8 +19,8 @@ impl RemoveMkdocSnippetMarkers for &str { } fn assert_matches(query: &Query, kind: NonterminalKind, source: &str) -> QueryMatchIterator { - let language = Language::new(Version::new(0, 8, 12)).unwrap(); - let cursor = language.parse(kind, source).create_tree_cursor(); + let parser = Parser::new(Version::new(0, 8, 12)).unwrap(); + let cursor = parser.parse(kind, source).create_tree_cursor(); let tree = cursor.node(); assert!( diff --git a/crates/solidity/outputs/cargo/tests/src/doc_examples/using_queries.rs b/crates/solidity/outputs/cargo/tests/src/doc_examples/using_queries.rs index 30f616b91..bed1a9c18 100644 --- a/crates/solidity/outputs/cargo/tests/src/doc_examples/using_queries.rs +++ b/crates/solidity/outputs/cargo/tests/src/doc_examples/using_queries.rs @@ -4,16 +4,16 @@ use anyhow::Result; use infra_utils::paths::PathExtensions; use semver::Version; use slang_solidity::cst::{NonterminalKind, Query, QueryMatchIterator}; -use slang_solidity::parser::{Language, ParseOutput}; +use slang_solidity::parser::{ParseOutput, Parser}; fn parse_doc_input_file>(path: T) -> Result { let input_path = Path::repo_path("documentation/public/user-guide/inputs").join(path.as_ref()); let source = input_path.read_to_string()?; - let language = Language::new(Version::new(0, 8, 0))?; + let parser = Parser::new(Version::new(0, 8, 0))?; - Ok(language.parse(NonterminalKind::SourceUnit, source.trim())) + Ok(parser.parse(NonterminalKind::SourceUnit, source.trim())) } #[test] diff --git a/crates/solidity/outputs/cargo/tests/src/doc_examples/using_the_cursor.rs b/crates/solidity/outputs/cargo/tests/src/doc_examples/using_the_cursor.rs index f69633628..f7a8a3a57 100644 --- a/crates/solidity/outputs/cargo/tests/src/doc_examples/using_the_cursor.rs +++ b/crates/solidity/outputs/cargo/tests/src/doc_examples/using_the_cursor.rs @@ -9,7 +9,7 @@ fn using_the_cursor() -> Result<()> { // --8<-- [start:imports] use semver::Version; use slang_solidity::cst::{EdgeLabel, NonterminalKind, TerminalKind, TextRangeExtensions}; - use slang_solidity::parser::Language; + use slang_solidity::parser::Parser; // --8<-- [end:imports] let input_path = Path::repo_path("documentation/public/user-guide/inputs/using-the-cursor.sol"); @@ -19,9 +19,9 @@ fn using_the_cursor() -> Result<()> { let source = source.trim(); // --8<-- [start:parse-input] - let language = Language::new(Version::parse("0.8.0")?)?; + let parser = Parser::new(Version::parse("0.8.0")?)?; - let parse_output = language.parse(NonterminalKind::SourceUnit, source); + let parse_output = parser.parse(NonterminalKind::SourceUnit, source); // --8<-- [end:parse-input] { diff --git a/crates/solidity/outputs/cargo/tests/src/doc_examples/using_the_parser.rs b/crates/solidity/outputs/cargo/tests/src/doc_examples/using_the_parser.rs index afc65c19f..32133271b 100644 --- a/crates/solidity/outputs/cargo/tests/src/doc_examples/using_the_parser.rs +++ b/crates/solidity/outputs/cargo/tests/src/doc_examples/using_the_parser.rs @@ -9,7 +9,7 @@ fn using_the_parser() -> Result<()> { // --8<-- [start:imports] use semver::Version; use slang_solidity::cst::{Node, NonterminalKind, TerminalKind}; - use slang_solidity::parser::Language; + use slang_solidity::parser::Parser; // --8<-- [end:imports] let input_path = Path::repo_path("documentation/public/user-guide/inputs/using-the-parser.sol"); @@ -19,9 +19,9 @@ fn using_the_parser() -> Result<()> { let source = source.trim(); // --8<-- [start:parse-input] - let language = Language::new(Version::parse("0.8.0")?)?; + let parser = Parser::new(Version::parse("0.8.0")?)?; - let parse_output = language.parse(NonterminalKind::ContractDefinition, source); + let parse_output = parser.parse(NonterminalKind::ContractDefinition, source); // --8<-- [end:parse-input] // --8<-- [start:print-errors] diff --git a/crates/solidity/outputs/cargo/tests/src/trivia.rs b/crates/solidity/outputs/cargo/tests/src/trivia.rs index 511d9d65f..c1dae14bf 100644 --- a/crates/solidity/outputs/cargo/tests/src/trivia.rs +++ b/crates/solidity/outputs/cargo/tests/src/trivia.rs @@ -1,7 +1,7 @@ use anyhow::Result; use semver::Version; use slang_solidity::cst::{Node, NonterminalKind, TerminalKind}; -use slang_solidity::parser::Language; +use slang_solidity::parser::Parser; #[test] fn end_of_line() -> Result<()> { @@ -22,9 +22,9 @@ fn end_of_line() -> Result<()> { fn compare_end_of_lines(input: &str, expected: &[&str]) -> Result<()> { let version = Version::parse("0.8.0")?; - let language = &Language::new(version)?; + let parser = Parser::new(version)?; - let output = language.parse(NonterminalKind::SourceUnit, input); + let output = parser.parse(NonterminalKind::SourceUnit, input); assert!(output.is_valid()); let actual = output diff --git a/crates/solidity/outputs/npm/package/src/generated/napi-bindings/generated/index.d.ts b/crates/solidity/outputs/npm/package/src/generated/napi-bindings/generated/index.d.ts index d4e20711f..a5ee013ef 100644 --- a/crates/solidity/outputs/npm/package/src/generated/napi-bindings/generated/index.d.ts +++ b/crates/solidity/outputs/npm/package/src/generated/napi-bindings/generated/index.d.ts @@ -810,7 +810,7 @@ export declare namespace cst { } } export declare namespace parser { - export class Language { + export class Parser { constructor(version: string); get version(): string; static supportedVersions(): Array; diff --git a/crates/solidity/outputs/npm/package/src/generated/parser/index.ts b/crates/solidity/outputs/npm/package/src/generated/parser/index.ts index 1693fe402..f3c36eefe 100644 --- a/crates/solidity/outputs/npm/package/src/generated/parser/index.ts +++ b/crates/solidity/outputs/npm/package/src/generated/parser/index.ts @@ -3,8 +3,8 @@ import * as generated from "../napi-bindings/generated"; import { DiagnosticInterface } from "../diagnostic"; -export const Language = generated.parser.Language; -export type Language = generated.parser.Language; +export const Parser = generated.parser.Parser; +export type Parser = generated.parser.Parser; export const ParseError = generated.parser.ParseError; export type ParseError = generated.parser.ParseError; diff --git a/crates/solidity/outputs/npm/tests/src/doc-examples/using-queries.ts b/crates/solidity/outputs/npm/tests/src/doc-examples/using-queries.ts index c86e09ebd..b105d53cc 100644 --- a/crates/solidity/outputs/npm/tests/src/doc-examples/using-queries.ts +++ b/crates/solidity/outputs/npm/tests/src/doc-examples/using-queries.ts @@ -3,14 +3,14 @@ import path from "node:path"; import assert from "node:assert"; import fs from "node:fs/promises"; -import { Language } from "@nomicfoundation/slang/parser"; +import { Parser } from "@nomicfoundation/slang/parser"; import { NonterminalKind, NonterminalNode, Query, QueryMatchIterator, TerminalNode } from "@nomicfoundation/slang/cst"; async function parseDocInputFile(filePath: string) { const inputPath = path.join(repoPath("documentation/public/user-guide/inputs"), filePath); const source = await fs.readFile(inputPath, "utf8").then((source) => source.trim()); - const language = new Language("0.8.0"); - return language.parse(NonterminalKind.SourceUnit, source); + const parser = new Parser("0.8.0"); + return parser.parse(NonterminalKind.SourceUnit, source); } test("using queries", async () => { diff --git a/crates/solidity/outputs/npm/tests/src/doc-examples/using-the-ast.ts b/crates/solidity/outputs/npm/tests/src/doc-examples/using-the-ast.ts index 8af327ff7..ef67caaaf 100644 --- a/crates/solidity/outputs/npm/tests/src/doc-examples/using-the-ast.ts +++ b/crates/solidity/outputs/npm/tests/src/doc-examples/using-the-ast.ts @@ -3,7 +3,7 @@ import fs from "node:fs/promises"; // --8<-- [start:imports] import assert from "node:assert"; -import { Language } from "@nomicfoundation/slang/parser"; +import { Parser } from "@nomicfoundation/slang/parser"; import { NonterminalKind, NonterminalNode } from "@nomicfoundation/slang/cst"; import { FunctionDefinition } from "@nomicfoundation/slang/ast"; // --8<-- [end:imports] @@ -13,9 +13,9 @@ test("using the ast", async () => { const source = (await fs.readFile(inputPath, "utf8")).trim(); // --8<-- [start:parse-input] - const language = new Language("0.8.0"); + const parser = new Parser("0.8.0"); - const parseOutput = language.parse(NonterminalKind.FunctionDefinition, source); + const parseOutput = parser.parse(NonterminalKind.FunctionDefinition, source); // --8<-- [end:parse-input] // --8<-- [start:create-node] diff --git a/crates/solidity/outputs/npm/tests/src/doc-examples/using-the-cursor.ts b/crates/solidity/outputs/npm/tests/src/doc-examples/using-the-cursor.ts index 0f82dcafe..88fe0297c 100644 --- a/crates/solidity/outputs/npm/tests/src/doc-examples/using-the-cursor.ts +++ b/crates/solidity/outputs/npm/tests/src/doc-examples/using-the-cursor.ts @@ -3,7 +3,7 @@ import fs from "node:fs/promises"; // --8<-- [start:imports] import assert from "node:assert"; -import { Language } from "@nomicfoundation/slang/parser"; +import { Parser } from "@nomicfoundation/slang/parser"; import { NonterminalKind, NonterminalNode, TerminalKind, TerminalNode } from "@nomicfoundation/slang/cst"; // --8<-- [end:imports] @@ -12,9 +12,9 @@ test("using the cursor", async () => { const source = (await fs.readFile(inputPath, "utf8")).trim(); // --8<-- [start:parse-input] - const language = new Language("0.8.0"); + const parser = new Parser("0.8.0"); - const parseOutput = language.parse(NonterminalKind.SourceUnit, source); + const parseOutput = parser.parse(NonterminalKind.SourceUnit, source); // --8<-- [end:parse-input] { diff --git a/crates/solidity/outputs/npm/tests/src/doc-examples/using-the-parser.ts b/crates/solidity/outputs/npm/tests/src/doc-examples/using-the-parser.ts index 7c5600e0b..91ef79675 100644 --- a/crates/solidity/outputs/npm/tests/src/doc-examples/using-the-parser.ts +++ b/crates/solidity/outputs/npm/tests/src/doc-examples/using-the-parser.ts @@ -3,7 +3,7 @@ import fs from "node:fs/promises"; // --8<-- [start:imports] import assert from "node:assert"; -import { Language } from "@nomicfoundation/slang/parser"; +import { Parser } from "@nomicfoundation/slang/parser"; import { NonterminalKind, NonterminalNode, TerminalKind } from "@nomicfoundation/slang/cst"; // --8<-- [end:imports] @@ -12,9 +12,9 @@ test("using the parser", async () => { const source = (await fs.readFile(inputPath, "utf8")).trim(); // --8<-- [start:parse-input] - const language = new Language("0.8.0"); + const parser = new Parser("0.8.0"); - const parseOutput = language.parse(NonterminalKind.ContractDefinition, source); + const parseOutput = parser.parse(NonterminalKind.ContractDefinition, source); // --8<-- [end:parse-input] // --8<-- [start:print-errors] diff --git a/crates/solidity/testing/perf/benches/iai/tests/parser.rs b/crates/solidity/testing/perf/benches/iai/tests/parser.rs index 7d1cc45ab..b17facf6d 100644 --- a/crates/solidity/testing/perf/benches/iai/tests/parser.rs +++ b/crates/solidity/testing/perf/benches/iai/tests/parser.rs @@ -1,7 +1,7 @@ use std::path::PathBuf; use slang_solidity::cst::Node; -use slang_solidity::parser::Language; +use slang_solidity::parser::Parser; use crate::dataset::{SourceFile, SOLC_VERSION}; @@ -19,12 +19,12 @@ pub fn setup() -> Vec { } pub fn run(files: Vec) -> Vec { - let language = Language::new(SOLC_VERSION).unwrap(); + let parser = Parser::new(SOLC_VERSION).unwrap(); let mut results = vec![]; for SourceFile { path, contents } in files { - let parse_output = language.parse(Language::ROOT_KIND, &contents); + let parse_output = parser.parse(Parser::ROOT_KIND, &contents); assert!( parse_output.is_valid(), diff --git a/crates/solidity/testing/sanctuary/src/tests.rs b/crates/solidity/testing/sanctuary/src/tests.rs index 06bf3f3d1..79fdea3cc 100644 --- a/crates/solidity/testing/sanctuary/src/tests.rs +++ b/crates/solidity/testing/sanctuary/src/tests.rs @@ -6,7 +6,7 @@ use infra_utils::paths::PathExtensions; use itertools::Itertools; use semver::Version; use slang_solidity::cst::NonterminalKind; -use slang_solidity::parser::Language; +use slang_solidity::parser::Parser; use crate::datasets::{DataSet, SourceFile}; use crate::events::{Events, TestOutcome}; @@ -98,8 +98,8 @@ pub fn run_test(file: &SourceFile, events: &Events) -> Result<()> { // https://github.com/tintinweb/smart-contract-sanctuary/issues/32 .replace("'", "\""); - let language = Language::new(version.clone())?; - let output = language.parse(NonterminalKind::SourceUnit, &source); + let parser = Parser::new(version.clone())?; + let output = parser.parse(NonterminalKind::SourceUnit, &source); if output.is_valid() { events.test(TestOutcome::Passed); @@ -134,7 +134,7 @@ fn extract_compiler_version(compiler: &str) -> Option { panic!("Unrecognized compiler/version: '{compiler}'"); }; - if &version < Language::SUPPORTED_VERSIONS.first().unwrap() { + if &version < Parser::SUPPORTED_VERSIONS.first().unwrap() { // Version is too early: return None; } diff --git a/crates/testlang/outputs/cargo/slang_testlang/src/generated/cli/commands/parse.rs b/crates/testlang/outputs/cargo/slang_testlang/src/generated/cli/commands/parse.rs index 8929c649b..8c5a51610 100644 --- a/crates/testlang/outputs/cargo/slang_testlang/src/generated/cli/commands/parse.rs +++ b/crates/testlang/outputs/cargo/slang_testlang/src/generated/cli/commands/parse.rs @@ -3,13 +3,12 @@ use std::fs; use std::path::PathBuf; -use clap::Parser; use semver::Version; use crate::diagnostic; -use crate::parser::Language; +use crate::parser::Parser; -#[derive(Parser, Debug)] +#[derive(clap::Parser, Debug)] pub struct ParseCommand { /// File path to the source file to parse file_path: PathBuf, @@ -36,8 +35,8 @@ impl ParseCommand { .unwrap_or_else(|_| panic!("File not found: {file_path:?}")); let input = fs::read_to_string(&file_path).unwrap(); - let language = Language::new(version).unwrap(); - let parse_output = language.parse(Language::ROOT_KIND, &input); + let parser = Parser::new(version).unwrap(); + let parse_output = parser.parse(Parser::ROOT_KIND, &input); if !parse_output.is_valid() { const COLOR: bool = true; diff --git a/crates/testlang/outputs/cargo/slang_testlang/src/generated/parser/generated/language.rs b/crates/testlang/outputs/cargo/slang_testlang/src/generated/parser/generated/parser.rs similarity index 98% rename from crates/testlang/outputs/cargo/slang_testlang/src/generated/parser/generated/language.rs rename to crates/testlang/outputs/cargo/slang_testlang/src/generated/parser/generated/parser.rs index 8371c3a10..bfbfd0add 100644 --- a/crates/testlang/outputs/cargo/slang_testlang/src/generated/parser/generated/language.rs +++ b/crates/testlang/outputs/cargo/slang_testlang/src/generated/parser/generated/parser.rs @@ -34,14 +34,14 @@ use crate::parser::ParseOutput; #[derive(Debug)] #[cfg_attr(feature = "__private_napi_interfaces", napi(namespace = "parser"))] -pub struct Language { +pub struct Parser { #[allow(dead_code)] pub(crate) version_is_at_least_1_0_0: bool, pub(crate) version: Version, } #[derive(thiserror::Error, Debug)] -pub enum LanguageInitializationError { +pub enum ParserInitializationError { #[error("Unsupported language version '{0}'.")] UnsupportedLanguageVersion(Version), @@ -51,13 +51,13 @@ pub enum LanguageInitializationError { } #[cfg(feature = "__private_napi_interfaces")] -impl From for napi::Error { - fn from(value: LanguageInitializationError) -> Self { +impl From for napi::Error { + fn from(value: ParserInitializationError) -> Self { napi::Error::from_reason(value.to_string()) } } -impl Language { +impl Parser { pub const SUPPORTED_VERSIONS: &'static [Version] = &[ Version::new(1, 0, 0), Version::new(1, 0, 1), @@ -67,14 +67,14 @@ impl Language { pub const ROOT_KIND: NonterminalKind = NonterminalKind::SourceUnit; - pub fn new(version: Version) -> std::result::Result { + pub fn new(version: Version) -> std::result::Result { if Self::SUPPORTED_VERSIONS.binary_search(&version).is_ok() { Ok(Self { version_is_at_least_1_0_0: Version::new(1, 0, 0) <= version, version, }) } else { - Err(LanguageInitializationError::UnsupportedLanguageVersion( + Err(ParserInitializationError::UnsupportedLanguageVersion( version, )) } @@ -685,13 +685,13 @@ impl Language { } } -impl Lexer for Language { +impl Lexer for Parser { fn leading_trivia(&self, input: &mut ParserContext<'_>) -> ParserResult { - Language::leading_trivia(self, input) + Parser::leading_trivia(self, input) } fn trailing_trivia(&self, input: &mut ParserContext<'_>) -> ParserResult { - Language::trailing_trivia(self, input) + Parser::trailing_trivia(self, input) } fn delimiters() -> &'static [(TerminalKind, TerminalKind)] { @@ -833,11 +833,11 @@ impl Lexer for Language { // NAPI-exposed functions have to accept owned values. #[allow(clippy::needless_pass_by_value)] #[napi(namespace = "parser")] -impl Language { +impl Parser { #[napi(constructor, catch_unwind)] pub fn new_napi(version: String) -> std::result::Result { let version = Version::parse(&version) - .map_err(|_| LanguageInitializationError::InvalidSemanticVersion(version))?; + .map_err(|_| ParserInitializationError::InvalidSemanticVersion(version))?; Self::new(version).map_err(|e| e.into()) } diff --git a/crates/testlang/outputs/cargo/slang_testlang/src/generated/parser/mod.rs b/crates/testlang/outputs/cargo/slang_testlang/src/generated/parser/mod.rs index 44f4b789c..70c1e946b 100644 --- a/crates/testlang/outputs/cargo/slang_testlang/src/generated/parser/mod.rs +++ b/crates/testlang/outputs/cargo/slang_testlang/src/generated/parser/mod.rs @@ -1,13 +1,14 @@ // This file is generated automatically by infrastructure scripts. Please don't edit by hand. -#[path = "generated/language.rs"] -mod language; mod lexer; mod parse_error; mod parse_output; +#[allow(clippy::module_inception)] +#[path = "generated/parser.rs"] +mod parser; mod parser_support; mod scanner_macros; -pub use language::{Language, LanguageInitializationError}; pub use parse_error::ParseError; pub use parse_output::ParseOutput; +pub use parser::{Parser, ParserInitializationError}; diff --git a/crates/testlang/outputs/cargo/slang_testlang/src/generated/parser/parser_support/parser_function.rs b/crates/testlang/outputs/cargo/slang_testlang/src/generated/parser/parser_support/parser_function.rs index 5565042c6..89682aad9 100644 --- a/crates/testlang/outputs/cargo/slang_testlang/src/generated/parser/parser_support/parser_function.rs +++ b/crates/testlang/outputs/cargo/slang_testlang/src/generated/parser/parser_support/parser_function.rs @@ -10,22 +10,22 @@ use crate::parser::parser_support::parser_result::{ }; use crate::parser::{ParseError, ParseOutput}; -pub trait ParserFunction +pub trait ParserFunction

where - Self: Fn(&L, &mut ParserContext<'_>) -> ParserResult, + Self: Fn(&P, &mut ParserContext<'_>) -> ParserResult, { - fn parse(&self, language: &L, input: &str) -> ParseOutput; + fn parse(&self, parser: &P, input: &str) -> ParseOutput; } -impl ParserFunction for F +impl ParserFunction

for F where - L: Lexer, - F: Fn(&L, &mut ParserContext<'_>) -> ParserResult, + P: Lexer, + F: Fn(&P, &mut ParserContext<'_>) -> ParserResult, { #[allow(clippy::too_many_lines)] - fn parse(&self, language: &L, input: &str) -> ParseOutput { + fn parse(&self, parser: &P, input: &str) -> ParseOutput { let mut stream = ParserContext::new(input); - let mut result = self(language, &mut stream); + let mut result = self(parser, &mut stream); // For a succesful/recovered parse, collect any remaining trivia as part of the parse result if let ParserResult::Match(r#match) = &mut result { @@ -35,7 +35,7 @@ where ) }; - let eof_trivia = match Lexer::leading_trivia(language, &mut stream) { + let eof_trivia = match Lexer::leading_trivia(parser, &mut stream) { ParserResult::Match(eof_trivia) if !eof_trivia.nodes.is_empty() => { Some(eof_trivia.nodes) } diff --git a/crates/testlang/outputs/cargo/slang_testlang/src/generated/wit/interface/generated/parser.wit b/crates/testlang/outputs/cargo/slang_testlang/src/generated/wit/interface/generated/parser.wit index 8e8875efe..8381cb836 100644 --- a/crates/testlang/outputs/cargo/slang_testlang/src/generated/wit/interface/generated/parser.wit +++ b/crates/testlang/outputs/cargo/slang_testlang/src/generated/wit/interface/generated/parser.wit @@ -4,9 +4,9 @@ interface parser { use cst.{cursor, node, nonterminal-kind, text-range}; use diagnostic.{severity}; - resource language { + resource parser { supported-versions: static func() -> list; - new: static func(version: string) -> result; + new: static func(version: string) -> result; version: func() -> string; parse: func(kind: nonterminal-kind, input: string) -> parse-output; } diff --git a/crates/testlang/outputs/cargo/slang_testlang/src/generated/wit/wrappers/parser.rs b/crates/testlang/outputs/cargo/slang_testlang/src/generated/wit/wrappers/parser.rs index e13c5ca53..56a33eb3a 100644 --- a/crates/testlang/outputs/cargo/slang_testlang/src/generated/wit/wrappers/parser.rs +++ b/crates/testlang/outputs/cargo/slang_testlang/src/generated/wit/wrappers/parser.rs @@ -9,32 +9,32 @@ mod ffi { }; pub use crate::wit::interface::exports::nomic_foundation::slang::diagnostic::Severity; pub use crate::wit::interface::exports::nomic_foundation::slang::parser::{ - Guest, GuestLanguage, GuestParseError, GuestParseOutput, Language, LanguageBorrow, - NonterminalKind, ParseError, ParseErrorBorrow, ParseOutput, ParseOutputBorrow, + Guest, GuestParseError, GuestParseOutput, GuestParser, NonterminalKind, ParseError, + ParseErrorBorrow, ParseOutput, ParseOutputBorrow, Parser, ParserBorrow, }; } mod rust { - pub use crate::parser::{Language, ParseError, ParseOutput}; + pub use crate::parser::{ParseError, ParseOutput, Parser}; } impl ffi::Guest for crate::wit::World { - type Language = LanguageWrapper; + type Parser = ParserWrapper; type ParseError = ParseErrorWrapper; type ParseOutput = ParseOutputWrapper; } //================================================ // -// resource language +// resource parser // //================================================ -define_wrapper! { Language { - fn new(version: String) -> Result { +define_wrapper! { Parser { + fn new(version: String) -> Result { semver::Version::parse(&version) .map_err(|_| format!("Invalid version: {version}")) - .and_then(|version| rust::Language::new(version).map_err(|e| e.to_string())) + .and_then(|version| rust::Parser::new(version).map_err(|e| e.to_string())) .map(IntoFFI::_into_ffi) } @@ -43,7 +43,7 @@ define_wrapper! { Language { } fn supported_versions() -> Vec { - rust::Language::SUPPORTED_VERSIONS + rust::Parser::SUPPORTED_VERSIONS .iter() .map(|v| v.to_string()) .collect() diff --git a/crates/testlang/outputs/cargo/tests/src/errors/mod.rs b/crates/testlang/outputs/cargo/tests/src/errors/mod.rs index 7a6dea018..d08d698a7 100644 --- a/crates/testlang/outputs/cargo/tests/src/errors/mod.rs +++ b/crates/testlang/outputs/cargo/tests/src/errors/mod.rs @@ -1,10 +1,10 @@ use semver::Version; -use slang_testlang::parser::Language; +use slang_testlang::parser::Parser; #[test] fn unsupported_language_version() { let version = Version::parse("0.0.0").unwrap(); - let error = Language::new(version).unwrap_err(); + let error = Parser::new(version).unwrap_err(); assert_eq!(error.to_string(), "Unsupported language version '0.0.0'."); } diff --git a/crates/testlang/outputs/cargo/tests/src/graph/mod.rs b/crates/testlang/outputs/cargo/tests/src/graph/mod.rs index 27cc8d8f3..c4ba18179 100644 --- a/crates/testlang/outputs/cargo/tests/src/graph/mod.rs +++ b/crates/testlang/outputs/cargo/tests/src/graph/mod.rs @@ -3,12 +3,12 @@ use metaslang_graph_builder::functions::Functions; use metaslang_graph_builder::{ExecutionConfig, NoCancellation, Variables}; use semver::Version; use slang_testlang::cst::NonterminalKind; -use slang_testlang::parser::Language; +use slang_testlang::parser::Parser; #[test] fn builds_a_graph() { let version = Version::parse("1.0.0").unwrap(); - let language = Language::new(version).unwrap(); + let parser = Parser::new(version).unwrap(); let msgb_source = r" @tree [Tree] { @@ -36,7 +36,7 @@ fn builds_a_graph() { assert!(msgb.check().is_ok()); let source = "tree $t1 [A [B C]];"; - let parse_output = language.parse(NonterminalKind::SourceUnit, source); + let parse_output = parser.parse(NonterminalKind::SourceUnit, source); assert!(parse_output.is_valid()); let tree = parse_output.create_tree_cursor(); diff --git a/crates/testlang/outputs/cargo/tests/src/versions/mod.rs b/crates/testlang/outputs/cargo/tests/src/versions/mod.rs index 3a6fcc600..079d19dfb 100644 --- a/crates/testlang/outputs/cargo/tests/src/versions/mod.rs +++ b/crates/testlang/outputs/cargo/tests/src/versions/mod.rs @@ -1,9 +1,9 @@ use semver::Version; -use slang_testlang::parser::Language; +use slang_testlang::parser::Parser; #[test] fn list_supported_versions() { - let versions = Language::SUPPORTED_VERSIONS; + let versions = Parser::SUPPORTED_VERSIONS; assert!(!versions.is_empty()); assert!(!versions.contains(&Version::new(0, 0, 0))); diff --git a/crates/testlang/outputs/npm/package/src/generated/napi-bindings/generated/index.d.ts b/crates/testlang/outputs/npm/package/src/generated/napi-bindings/generated/index.d.ts index 99748cce1..aeaa69ccb 100644 --- a/crates/testlang/outputs/npm/package/src/generated/napi-bindings/generated/index.d.ts +++ b/crates/testlang/outputs/npm/package/src/generated/napi-bindings/generated/index.d.ts @@ -136,7 +136,7 @@ export declare namespace cst { } } export declare namespace parser { - export class Language { + export class Parser { constructor(version: string); get version(): string; static supportedVersions(): Array; diff --git a/crates/testlang/outputs/npm/package/src/generated/parser/index.ts b/crates/testlang/outputs/npm/package/src/generated/parser/index.ts index 1693fe402..f3c36eefe 100644 --- a/crates/testlang/outputs/npm/package/src/generated/parser/index.ts +++ b/crates/testlang/outputs/npm/package/src/generated/parser/index.ts @@ -3,8 +3,8 @@ import * as generated from "../napi-bindings/generated"; import { DiagnosticInterface } from "../diagnostic"; -export const Language = generated.parser.Language; -export type Language = generated.parser.Language; +export const Parser = generated.parser.Parser; +export type Parser = generated.parser.Parser; export const ParseError = generated.parser.ParseError; export type ParseError = generated.parser.ParseError; diff --git a/crates/testlang/outputs/npm/tests/src/tests/ast.ts b/crates/testlang/outputs/npm/tests/src/tests/ast.ts index 2b75113a5..d07dc15ec 100644 --- a/crates/testlang/outputs/npm/tests/src/tests/ast.ts +++ b/crates/testlang/outputs/npm/tests/src/tests/ast.ts @@ -1,5 +1,5 @@ import assert from "node:assert"; -import { Language } from "@slang-private/slang-testlang/parser"; +import { Parser } from "@slang-private/slang-testlang/parser"; import { AdditionExpression, Expression, @@ -17,9 +17,9 @@ import { NonterminalKind, TerminalKind, TerminalNode } from "@slang-private/slan test("create and use sequence types", () => { const source = `tree [A B C];`.trim(); - const language = new Language("1.0.0"); + const parser = new Parser("1.0.0"); - const parseOutput = language.parse(NonterminalKind.Tree, source); + const parseOutput = parser.parse(NonterminalKind.Tree, source); expect(parseOutput.errors()).toHaveLength(0); const cst = parseOutput.tree(); @@ -34,9 +34,9 @@ test("create and use sequence types", () => { test("create and use choice types", () => { const source = `[B]`.trim(); - const language = new Language("1.0.0"); + const parser = new Parser("1.0.0"); - const parseOutput = language.parse(NonterminalKind.TreeNodeChild, source); + const parseOutput = parser.parse(NonterminalKind.TreeNodeChild, source); expect(parseOutput.errors()).toHaveLength(0); const cst = parseOutput.tree(); @@ -56,9 +56,9 @@ test("create and use choice types", () => { test("create and use repeated types", () => { const source = `tree [A B C];`.trim(); - const language = new Language("1.0.0"); + const parser = new Parser("1.0.0"); - const parseOutput = language.parse(NonterminalKind.Tree, source); + const parseOutput = parser.parse(NonterminalKind.Tree, source); expect(parseOutput.errors()).toHaveLength(0); const cst = parseOutput.tree(); @@ -79,9 +79,9 @@ test("create and use repeated types", () => { test("create and use separated types", () => { const source = `Foo.Bar.Baz`; - const language = new Language("1.0.0"); + const parser = new Parser("1.0.0"); - const parseOutput = language.parse(NonterminalKind.SeparatedIdentifiers, source); + const parseOutput = parser.parse(NonterminalKind.SeparatedIdentifiers, source); expect(parseOutput.errors()).toHaveLength(0); const cst = parseOutput.tree(); @@ -100,9 +100,9 @@ test("create and use separated types", () => { test("throws an exception on initializing the wrong type", () => { const source = `tree [A];`; - const language = new Language("1.0.0"); + const parser = new Parser("1.0.0"); - const parseOutput = language.parse(NonterminalKind.Tree, source); + const parseOutput = parser.parse(NonterminalKind.Tree, source); expect(parseOutput.errors()).toHaveLength(0); const cst = parseOutput.tree(); @@ -114,9 +114,9 @@ test("throws an exception on initializing the wrong type", () => { test("throws an exception on on using an incorrect/incomplete CST node", () => { const source = `tree`; - const language = new Language("1.0.0"); + const parser = new Parser("1.0.0"); - const parseOutput = language.parse(NonterminalKind.Tree, source); + const parseOutput = parser.parse(NonterminalKind.Tree, source); expect(parseOutput.errors()).toHaveLength(1); const cst = parseOutput.tree(); @@ -139,9 +139,9 @@ test("throws an exception on on using an incorrect/incomplete CST node", () => { test("create and use prefix expressions", () => { const source = `!foo`; - const language = new Language("1.0.0"); + const parser = new Parser("1.0.0"); - const parseOutput = language.parse(NonterminalKind.Expression, source); + const parseOutput = parser.parse(NonterminalKind.Expression, source); expect(parseOutput.errors()).toHaveLength(0); const cst = parseOutput.tree(); @@ -158,9 +158,9 @@ test("create and use prefix expressions", () => { test("create and use postfix expressions", () => { const source = `foo.bar`; - const language = new Language("1.0.0"); + const parser = new Parser("1.0.0"); - const parseOutput = language.parse(NonterminalKind.Expression, source); + const parseOutput = parser.parse(NonterminalKind.Expression, source); expect(parseOutput.errors()).toHaveLength(0); const cst = parseOutput.tree(); @@ -178,9 +178,9 @@ test("create and use postfix expressions", () => { test("create and use binary expressions", () => { const source = `foo + bar`; - const language = new Language("1.0.0"); + const parser = new Parser("1.0.0"); - const parseOutput = language.parse(NonterminalKind.Expression, source); + const parseOutput = parser.parse(NonterminalKind.Expression, source); expect(parseOutput.errors()).toHaveLength(0); const cst = parseOutput.tree(); diff --git a/crates/testlang/outputs/npm/tests/src/tests/cst-cursor.ts b/crates/testlang/outputs/npm/tests/src/tests/cst-cursor.ts index 85c002693..c4a021e8a 100644 --- a/crates/testlang/outputs/npm/tests/src/tests/cst-cursor.ts +++ b/crates/testlang/outputs/npm/tests/src/tests/cst-cursor.ts @@ -1,12 +1,12 @@ -import { Language } from "@slang-private/slang-testlang/parser"; +import { Parser } from "@slang-private/slang-testlang/parser"; import { expectNonterminal, expectTerminal } from "../utils/cst-helpers"; import { Cursor, EdgeLabel, NodeType, NonterminalKind, TerminalKind } from "@slang-private/slang-testlang/cst"; test("use cursor", () => { const source = "tree [A [B C] D];"; - const language = new Language("1.0.0"); + const parser = new Parser("1.0.0"); - const parseOutput = language.parse(NonterminalKind.SourceUnit, source); + const parseOutput = parser.parse(NonterminalKind.SourceUnit, source); const cursor: Cursor = parseOutput.createTreeCursor(); expectNonterminal(cursor.node(), NonterminalKind.SourceUnit); @@ -93,8 +93,8 @@ test("use cursor", () => { test("access the node using its name", () => { const source = "tree [A [B C] D];"; - const language = new Language("1.0.0"); - const parseTree = language.parse(NonterminalKind.SourceUnit, source); + const parser = new Parser("1.0.0"); + const parseTree = parser.parse(NonterminalKind.SourceUnit, source); const cursor = parseTree.createTreeCursor(); let names: string[] = []; diff --git a/crates/testlang/outputs/npm/tests/src/tests/cst-output.ts b/crates/testlang/outputs/npm/tests/src/tests/cst-output.ts index 436a5b45a..bab0bad74 100644 --- a/crates/testlang/outputs/npm/tests/src/tests/cst-output.ts +++ b/crates/testlang/outputs/npm/tests/src/tests/cst-output.ts @@ -1,12 +1,12 @@ -import { Language } from "@slang-private/slang-testlang/parser"; +import { Parser } from "@slang-private/slang-testlang/parser"; import { NonterminalKind, TerminalKind } from "@slang-private/slang-testlang/cst"; import { expectNonterminal, expectTerminal } from "../utils/cst-helpers"; test("parse terminal", () => { const source = "About_time"; - const language = new Language("1.0.0"); + const parser = new Parser("1.0.0"); - const parseTree = language.parse(NonterminalKind.TreeNodeChild, source).tree(); + const parseTree = parser.parse(NonterminalKind.TreeNodeChild, source).tree(); expectNonterminal(parseTree, NonterminalKind.TreeNodeChild); const children = parseTree.children(); @@ -17,9 +17,9 @@ test("parse terminal", () => { test("parse nonterminal", () => { const source = `tree [A [B C] D];`; - const language = new Language("1.0.0"); + const parser = new Parser("1.0.0"); - const parseTree = language.parse(NonterminalKind.SourceUnit, source).tree(); + const parseTree = parser.parse(NonterminalKind.SourceUnit, source).tree(); expectNonterminal(parseTree, NonterminalKind.SourceUnit); const children = parseTree.children(); @@ -30,9 +30,9 @@ test("parse nonterminal", () => { test("trivial cursor access", () => { const source = `tree [A [B C] D];`; - const language = new Language("1.0.0"); + const parser = new Parser("1.0.0"); - const parseOutput = language.parse(NonterminalKind.SourceUnit, source); + const parseOutput = parser.parse(NonterminalKind.SourceUnit, source); const node = parseOutput.createTreeCursor().node(); expectNonterminal(node, NonterminalKind.SourceUnit); @@ -42,9 +42,9 @@ test("trivial cursor access", () => { test("calculate unicode characters text length", () => { const source = `"some 😁 emoji"`; - const language = new Language("1.0.0"); + const parser = new Parser("1.0.0"); - const parseTree = language.parse(NonterminalKind.Literal, source).tree(); + const parseTree = parser.parse(NonterminalKind.Literal, source).tree(); expectNonterminal(parseTree, NonterminalKind.Literal); expect(parseTree.textLength).toEqual({ @@ -69,9 +69,9 @@ test("calculate unicode characters text length", () => { test("can unparse nonterminal nodes", () => { const source = `tree [A [B C] D];`; - const language = new Language("1.0.0"); + const parser = new Parser("1.0.0"); - const parseTree = language.parse(NonterminalKind.SourceUnit, source).tree(); + const parseTree = parser.parse(NonterminalKind.SourceUnit, source).tree(); expectNonterminal(parseTree, NonterminalKind.SourceUnit); expect(parseTree.unparse()).toEqual(source); diff --git a/crates/testlang/outputs/npm/tests/src/tests/errors.ts b/crates/testlang/outputs/npm/tests/src/tests/errors.ts index a93dab545..c405695d7 100644 --- a/crates/testlang/outputs/npm/tests/src/tests/errors.ts +++ b/crates/testlang/outputs/npm/tests/src/tests/errors.ts @@ -1,12 +1,12 @@ -import { Language } from "@slang-private/slang-testlang/parser"; +import { Parser } from "@slang-private/slang-testlang/parser"; import { NonterminalKind, TextIndex } from "@slang-private/slang-testlang/cst"; import { Severity } from "@slang-private/slang-testlang/diagnostic"; test("render error reports", () => { const source = "tree [AB;"; - const language = new Language("1.0.0"); + const parser = new Parser("1.0.0"); - const errors = language.parse(NonterminalKind.SourceUnit, source).errors(); + const errors = parser.parse(NonterminalKind.SourceUnit, source).errors(); expect(errors).toHaveLength(1); expect(errors[0]!.severity()).toBe(Severity.Error); @@ -16,9 +16,9 @@ test("render error reports", () => { }); test("invalid semantic version", () => { - expect(() => new Language("foo_bar")).toThrow("Invalid semantic version 'foo_bar'."); + expect(() => new Parser("foo_bar")).toThrow("Invalid semantic version 'foo_bar'."); }); test("unsupported language version", () => { - expect(() => new Language("0.0.0")).toThrow("Unsupported language version '0.0.0'."); + expect(() => new Parser("0.0.0")).toThrow("Unsupported language version '0.0.0'."); }); diff --git a/crates/testlang/outputs/npm/tests/src/tests/public-api.ts b/crates/testlang/outputs/npm/tests/src/tests/public-api.ts index 29b9bbc0d..e1a1c3aeb 100644 --- a/crates/testlang/outputs/npm/tests/src/tests/public-api.ts +++ b/crates/testlang/outputs/npm/tests/src/tests/public-api.ts @@ -1,6 +1,6 @@ import * as slang from "@slang-private/slang-testlang"; import { NonterminalKind, TerminalKind } from "@slang-private/slang-testlang/cst"; -import { Language } from "@slang-private/slang-testlang/parser"; +import { Parser } from "@slang-private/slang-testlang/parser"; test("use namespace imports of the API", () => { expect(slang.cst.NonterminalKind.SourceUnit).toEqual("SourceUnit"); @@ -15,5 +15,5 @@ test("use nested imports of the API", () => { }); test("language exposes a root kind", () => { - expect(Language.rootKind()).toEqual(NonterminalKind.SourceUnit); + expect(Parser.rootKind()).toEqual(NonterminalKind.SourceUnit); }); diff --git a/crates/testlang/outputs/npm/tests/src/tests/query.ts b/crates/testlang/outputs/npm/tests/src/tests/query.ts index 72964f719..964e60181 100644 --- a/crates/testlang/outputs/npm/tests/src/tests/query.ts +++ b/crates/testlang/outputs/npm/tests/src/tests/query.ts @@ -1,11 +1,11 @@ import { NonterminalKind, TerminalKind, Query } from "@slang-private/slang-testlang/cst"; -import { Language } from "@slang-private/slang-testlang/parser"; +import { Parser } from "@slang-private/slang-testlang/parser"; import { expectTerminal } from "../utils/cst-helpers"; test("simple query", () => { - const language = new Language("1.0.0"); + const parser = new Parser("1.0.0"); const tree_source = `tree [A [B C] D];`; - const parse_output = language.parse(NonterminalKind.Tree, tree_source); + const parse_output = parser.parse(NonterminalKind.Tree, tree_source); const query_source = `[TreeNodeChild @id [DelimitedIdentifier]]`; const query = Query.parse(query_source); diff --git a/crates/testlang/outputs/npm/tests/src/tests/versions.ts b/crates/testlang/outputs/npm/tests/src/tests/versions.ts index dc8e00afc..cb03ac121 100644 --- a/crates/testlang/outputs/npm/tests/src/tests/versions.ts +++ b/crates/testlang/outputs/npm/tests/src/tests/versions.ts @@ -1,7 +1,7 @@ -import { Language } from "@slang-private/slang-testlang/parser"; +import { Parser } from "@slang-private/slang-testlang/parser"; test("list supported versions", () => { - const versions = Language.supportedVersions(); + const versions = Parser.supportedVersions(); expect(versions.length).toBeGreaterThan(0); diff --git a/documentation/public/user-guide/concepts.md b/documentation/public/user-guide/concepts.md index 0ec4e148d..56721f525 100644 --- a/documentation/public/user-guide/concepts.md +++ b/documentation/public/user-guide/concepts.md @@ -5,14 +5,14 @@ This is a departure from the classic approach of "black-box" compilers, which ar ## Language Versions -To use Slang, you start by initializing a `Language` object with a specific version of the language. +To use Slang, you start by initializing a `Parser` object with a specific version of the language. The earliest Solidity version we support is `0.4.11`, and we plan on supporting all future versions as they are released. -From a `Language` object, you can analyze any source text according to the nonterminals of that specific version. +From a `Parser` object, you can analyze any source text according to the nonterminals of that specific version. Providing an accurate language version is important, as it affects the shape of the syntax tree, and possible errors produced. -You can use the `Language::getSupportedVersions()` API to get a list of all supported versions for the current Slang release. +You can use the `Parser::getSupportedVersions()` API to get a list of all supported versions for the current Slang release. -The `Language::parse()` API is the main entry point for the parser, and to generate concrete syntax trees (CSTs) that can be used for further analysis. +The `Parser::parse()` API is the main entry point for the parser, and to generate concrete syntax trees (CSTs) that can be used for further analysis. Each `parse()` operation accepts the input source code, and a `NonterminalKind` variant. This allows callers to parse entire source files (`NonterminalKind::SourceUnit`), individual contracts (`NonterminalKind::ContractDefinition`), methods (`NonterminalKind::FunctionDefinition`), or any other syntax nodes. diff --git a/documentation/public/user-guide/npm-package/using-the-parser.md b/documentation/public/user-guide/npm-package/using-the-parser.md index 02703e5d4..95bc8a2af 100644 --- a/documentation/public/user-guide/npm-package/using-the-parser.md +++ b/documentation/public/user-guide/npm-package/using-the-parser.md @@ -10,7 +10,7 @@ Let's start with this simple source file, that contains a single contract: --8<-- "documentation/public/user-guide/inputs/using-the-parser.sol" ``` -We begin by creating a `Language` object with a specified version. This is an entry point for our parser API. +We begin by creating a `Parser` object with a specified version. This is an entry point for our parser API. Then we can use it to parse the source file, specifying the top-level nonterminal to parse: ```{ .ts } diff --git a/documentation/public/user-guide/rust-crate/using-the-parser.md b/documentation/public/user-guide/rust-crate/using-the-parser.md index fc9a3f158..6430730ef 100644 --- a/documentation/public/user-guide/rust-crate/using-the-parser.md +++ b/documentation/public/user-guide/rust-crate/using-the-parser.md @@ -10,7 +10,7 @@ Let's start with this simple source file, that contains a single contract: --8<-- "documentation/public/user-guide/inputs/using-the-parser.sol" ``` -We begin by creating a `Language` object with a specified version. This is an entry point for our parser API. +We begin by creating a `Parser` object with a specified version. This is an entry point for our parser API. Then we can use it to parse the source file, specifying the top-level nonterminal to parse: ```{ .rust }