Skip to content

Commit a1d1fa1

Browse files
committed
Remove BackendContext and use SemanticAnalysis directly
Also, create the semantic analysis from the `CompilationUnit` in a similar way as for the current `BindingGraph`.
1 parent cf39d67 commit a1d1fa1

File tree

20 files changed

+231
-227
lines changed

20 files changed

+231
-227
lines changed

crates/solidity/outputs/cargo/crate/src/backend/context/mod.rs

Lines changed: 0 additions & 46 deletions
This file was deleted.
Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,10 @@
11
#![allow(missing_docs)]
22

3-
use std::rc::Rc;
4-
5-
use crate::compilation::CompilationUnit;
6-
73
pub mod binder;
84
pub mod built_ins;
9-
pub mod context;
105
pub mod ir;
116
pub mod passes;
7+
pub mod semantic;
128
pub mod types;
139

14-
pub use context::BackendContext;
15-
16-
pub fn build_context(compilation_unit: Rc<CompilationUnit>) -> Rc<BackendContext> {
17-
Rc::new(BackendContext::build(compilation_unit))
18-
}
10+
pub use semantic::{SemanticAnalysis, SemanticFile};
Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,6 @@
1-
use std::collections::HashMap;
2-
use std::rc::Rc;
3-
41
use crate::backend::ir::ir1_structured_ast::{builder, SourceUnit};
5-
use crate::compilation::CompilationUnit;
6-
7-
pub struct Output {
8-
pub compilation_unit: Rc<CompilationUnit>,
9-
pub files: HashMap<String, SourceUnit>,
10-
}
2+
use crate::compilation::File;
113

12-
pub fn run(input: Rc<CompilationUnit>) -> Output {
13-
let mut files = HashMap::new();
14-
for file in &input.files() {
15-
if let Some(source_unit) = builder::build_source_unit(file.tree()) {
16-
files.insert(file.id().into(), source_unit);
17-
}
18-
}
19-
Output {
20-
compilation_unit: input,
21-
files,
22-
}
4+
pub fn run_file(file: &File) -> Option<SourceUnit> {
5+
builder::build_source_unit(file.tree())
236
}

crates/solidity/outputs/cargo/crate/src/backend/passes/p1_flatten_contracts.rs

Lines changed: 4 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,17 @@
1-
use std::collections::HashMap;
21
use std::rc::Rc;
32

43
use semver::Version;
54

6-
use super::p0_build_ast::Output as Input;
75
use crate::backend::ir::ir2_flat_contracts::transformer::Transformer;
8-
use crate::backend::ir::ir2_flat_contracts::{self as output, input, SourceUnit};
9-
use crate::compilation::CompilationUnit;
6+
use crate::backend::ir::ir2_flat_contracts::{self as output, input};
107
use crate::cst::TerminalNode;
118
use crate::utils::versions::VERSION_0_5_0;
129

13-
pub struct Output {
14-
pub compilation_unit: Rc<CompilationUnit>,
15-
pub files: HashMap<String, SourceUnit>,
16-
}
17-
18-
/// This pass is reserved to make ergonomic changes to the AST in order to make
19-
/// it easier to use. For now, it will only flatten contract specifiers:
20-
/// inheritance and storage layout specifiers. In the future, more
21-
/// transformations will be added.
22-
pub fn run(input: Input) -> Output {
10+
pub fn run_file(language_version: &Version, source_unit: &input::SourceUnit) -> output::SourceUnit {
2311
let mut pass = Pass {
24-
language_version: input.compilation_unit.language_version().clone(),
12+
language_version: language_version.clone(),
2513
};
26-
let files = input
27-
.files
28-
.iter()
29-
.map(|(file_id, source_unit)| (file_id.clone(), pass.transform_source_unit(source_unit)))
30-
.collect();
31-
let compilation_unit = input.compilation_unit;
32-
Output {
33-
compilation_unit,
34-
files,
35-
}
14+
pass.transform_source_unit(source_unit)
3615
}
3716

3817
struct Pass {

crates/solidity/outputs/cargo/crate/src/backend/passes/p2_collect_definitions.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ use std::rc::Rc;
33
use semver::Version;
44

55
use crate::backend::binder::{Binder, Definition, FileScope, ParametersScope, Scope, ScopeId};
6-
use crate::backend::context::SemanticAnalysis;
76
use crate::backend::ir::ir2_flat_contracts::visitor::Visitor;
87
use crate::backend::ir::ir2_flat_contracts::{self as input_ir};
8+
use crate::backend::semantic::SemanticAnalysis;
99
use crate::compilation::File;
1010
use crate::cst::{NodeId, TerminalNode};
1111
use crate::utils::versions::VERSION_0_5_0;
@@ -21,9 +21,8 @@ pub fn run(semantic_analysis: &mut SemanticAnalysis) {
2121
semantic_analysis.language_version().clone(),
2222
&mut semantic_analysis.binder,
2323
);
24-
for (file_id, source_unit) in &semantic_analysis.files {
25-
let file = semantic_analysis.compilation_unit.file(file_id).unwrap();
26-
pass.visit_file(file, source_unit);
24+
for semantic_file in semantic_analysis.files.values() {
25+
pass.visit_file(semantic_file.file(), semantic_file.ir_root());
2726
}
2827
}
2928

@@ -52,10 +51,10 @@ impl<'a> Pass<'a> {
5251
}
5352
}
5453

55-
fn visit_file(&mut self, file: Rc<File>, source_unit: &input_ir::SourceUnit) {
54+
fn visit_file(&mut self, file: &Rc<File>, source_unit: &input_ir::SourceUnit) {
5655
assert!(self.current_file.is_none());
5756

58-
self.current_file = Some(file);
57+
self.current_file = Some(Rc::clone(file));
5958
input_ir::visitor::accept_source_unit(source_unit, self);
6059
self.current_file = None;
6160

crates/solidity/outputs/cargo/crate/src/backend/passes/p3_linearise_contracts/mod.rs

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,39 +5,31 @@ use crate::backend::binder::{
55
Binder, ContractDefinition, Definition, ImportDefinition, InterfaceDefinition,
66
LibraryDefinition, Reference, Resolution, ScopeId,
77
};
8-
use crate::backend::context::SemanticAnalysis;
98
use crate::backend::ir::ir2_flat_contracts::{self as input_ir};
10-
use crate::compilation::CompilationUnit;
9+
use crate::backend::semantic::SemanticAnalysis;
1110
use crate::cst::NodeId;
1211

1312
mod c3;
1413

1514
/// In this pass we collect all bases of contracts and interfaces and then
1615
/// compute the linearisation for each of them.
1716
pub fn run(semantic_analysis: &mut SemanticAnalysis) {
18-
let mut pass = Pass::new(
19-
Rc::clone(&semantic_analysis.compilation_unit),
20-
&mut semantic_analysis.binder,
21-
);
22-
for source_unit in semantic_analysis.files.values() {
23-
pass.visit_file_collect_bases(source_unit);
17+
let mut pass = Pass::new(&mut semantic_analysis.binder);
18+
for semantic_file in semantic_analysis.files.values() {
19+
pass.visit_file_collect_bases(semantic_file.ir_root());
2420
}
25-
for source_unit in semantic_analysis.files.values() {
26-
pass.visit_file_linearise_contracts(source_unit);
21+
for semantic_file in semantic_analysis.files.values() {
22+
pass.visit_file_linearise_contracts(semantic_file.ir_root());
2723
}
2824
}
2925

3026
pub struct Pass<'a> {
31-
pub compilation_unit: Rc<CompilationUnit>,
3227
pub binder: &'a mut Binder,
3328
}
3429

3530
impl<'a> Pass<'a> {
36-
pub fn new(compilation_unit: Rc<CompilationUnit>, binder: &'a mut Binder) -> Self {
37-
Self {
38-
compilation_unit,
39-
binder,
40-
}
31+
pub fn new(binder: &'a mut Binder) -> Self {
32+
Self { binder }
4133
}
4234

4335
fn visit_file_collect_bases(&mut self, source_unit: &input_ir::SourceUnit) {

crates/solidity/outputs/cargo/crate/src/backend/passes/p4_type_definitions/mod.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use semver::Version;
22

33
use crate::backend::binder::{Binder, Definition, Scope, ScopeId};
4-
use crate::backend::context::SemanticAnalysis;
54
use crate::backend::ir::ir2_flat_contracts::{self as input_ir};
5+
use crate::backend::semantic::SemanticAnalysis;
66
use crate::backend::types::{Type, TypeId, TypeRegistry};
77
use crate::cst::NodeId;
88

@@ -25,11 +25,11 @@ pub fn run(semantic_analysis: &mut SemanticAnalysis) {
2525
&mut semantic_analysis.binder,
2626
&mut semantic_analysis.types,
2727
);
28-
for source_unit in semantic_analysis.files.values() {
29-
pass.visit_file(source_unit);
28+
for semantic_file in semantic_analysis.files.values() {
29+
pass.visit_file(semantic_file.ir_root());
3030
}
31-
for source_unit in semantic_analysis.files.values() {
32-
pass.visit_file_type_getters(source_unit);
31+
for semantic_file in semantic_analysis.files.values() {
32+
pass.visit_file_type_getters(semantic_file.ir_root());
3333
}
3434
}
3535

crates/solidity/outputs/cargo/crate/src/backend/passes/p5_resolve_references/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ use semver::Version;
22

33
use crate::backend::binder::{Binder, Scope, ScopeId};
44
use crate::backend::built_ins::BuiltInsResolver;
5-
use crate::backend::context::SemanticAnalysis;
65
use crate::backend::ir::ir2_flat_contracts::{self as input_ir};
6+
use crate::backend::semantic::SemanticAnalysis;
77
use crate::backend::types::TypeRegistry;
88
use crate::cst::NodeId;
99

@@ -23,8 +23,8 @@ pub fn run(semantic_analysis: &mut SemanticAnalysis) {
2323
&mut semantic_analysis.binder,
2424
&mut semantic_analysis.types,
2525
);
26-
for source_unit in semantic_analysis.files.values() {
27-
pass.visit_file(source_unit);
26+
for semantic_file in semantic_analysis.files.values() {
27+
pass.visit_file(semantic_file.ir_root());
2828
}
2929
}
3030

0 commit comments

Comments
 (0)