sway_core/language/parsed/
mod.rs1mod code_block;
3pub mod declaration;
4mod expression;
5mod include_statement;
6mod module;
7mod program;
8mod use_statement;
9
10pub use code_block::*;
11pub use declaration::*;
12pub use expression::*;
13pub use include_statement::IncludeStatement;
14pub use module::{ModuleEvaluationOrder, ParseModule, ParseSubmodule};
15pub use program::{ParseProgram, TreeType};
16use sway_error::handler::ErrorEmitted;
17use sway_types::span::Span;
18pub use use_statement::{ImportType, UseStatement};
19
20use crate::{
21 engine_threading::{EqWithEngines, PartialEqWithEngines, PartialEqWithEnginesContext},
22 Engines,
23};
24
25#[derive(Debug, Clone)]
28pub struct ParseTree {
29 pub root_nodes: Vec<AstNode>,
31 pub span: Span,
33}
34
35#[derive(Debug, Clone)]
38pub struct AstNode {
39 pub content: AstNodeContent,
42 pub span: Span,
44}
45
46impl EqWithEngines for AstNode {}
47impl PartialEqWithEngines for AstNode {
48 fn eq(&self, other: &Self, ctx: &PartialEqWithEnginesContext) -> bool {
49 self.content.eq(&other.content, ctx)
50 }
51}
52
53#[allow(clippy::large_enum_variant)]
55#[derive(Debug, Clone)]
56pub enum AstNodeContent {
57 UseStatement(UseStatement),
59 Declaration(Declaration),
62 Expression(Expression),
64 IncludeStatement(IncludeStatement),
66 Error(Box<[Span]>, ErrorEmitted),
72}
73
74impl EqWithEngines for AstNodeContent {}
75impl PartialEqWithEngines for AstNodeContent {
76 fn eq(&self, other: &Self, ctx: &PartialEqWithEnginesContext) -> bool {
77 match (self, other) {
78 (AstNodeContent::UseStatement(lhs), AstNodeContent::UseStatement(rhs)) => lhs.eq(rhs),
79 (AstNodeContent::Declaration(lhs), AstNodeContent::Declaration(rhs)) => {
80 lhs.eq(rhs, ctx)
81 }
82 (AstNodeContent::Expression(lhs), AstNodeContent::Expression(rhs)) => lhs.eq(rhs, ctx),
83 (AstNodeContent::IncludeStatement(lhs), AstNodeContent::IncludeStatement(rhs)) => {
84 lhs.eq(rhs)
85 }
86 (AstNodeContent::Error(lhs, ..), AstNodeContent::Error(rhs, ..)) => lhs.eq(rhs),
87 _ => false,
88 }
89 }
90}
91
92impl ParseTree {
93 pub(crate) fn exclude_tests(&mut self, engines: &Engines) {
95 self.root_nodes.retain(|node| !node.is_test(engines));
96 }
97}
98
99impl AstNode {
100 pub(crate) fn is_test(&self, engines: &Engines) -> bool {
102 if let AstNodeContent::Declaration(decl) = &self.content {
103 decl.is_test(engines)
104 } else {
105 false
106 }
107 }
108}