1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
use crate::FfiDeclaration;
use super::*;
impl Scope {
pub(super) fn convert_ffi_declaration<T: ImportResolver + 'static>(
ffi: &FfiDeclaration,
resolver: &T,
program: &RefCell<Program>,
) -> AsgResult<()> {
match ffi.ffi_type {
ast::FfiType::Type => {
if let Some(obj) = resolver.resolve_ffi_type(&ffi.name.name)? {
if let Some(defined) =
program.borrow().types.get(&ffi.name.name)
{
return Err(AsgError::TypeRedefinition(
ffi.name.name.clone(),
ffi.span,
defined.span,
));
}
let field = Arc::new(Field {
name: ffi.name.name.clone(),
arguments: RefCell::new(obj.arguments()),
type_: RefCell::new(Type::Foreign(Arc::new(
ForeignType {
name: ffi.name.name.clone(),
span: ffi.span,
obj,
},
))),
condition: RefCell::new(None),
transforms: RefCell::new(vec![]),
span: ffi.span,
toplevel: true,
is_auto: Cell::new(false),
is_maybe_cyclical: Cell::new(false),
is_pad: Cell::new(false),
});
program
.borrow_mut()
.types
.insert(ffi.name.name.clone(), field.clone());
} else {
return Err(AsgError::FfiMissing(
ffi.name.name.clone(),
ffi.span,
));
}
}
ast::FfiType::Transform => {
if let Some(obj) = resolver.resolve_ffi_transform(&ffi.name.name)? {
if let Some(defined) =
program.borrow().transforms.get(&ffi.name.name)
{
return Err(AsgError::TransformRedefinition(
ffi.name.name.clone(),
ffi.span,
defined.span,
));
}
program.borrow_mut().transforms.insert(
ffi.name.name.clone(),
Arc::new(Transform {
name: ffi.name.name.clone(),
span: ffi.span.clone(),
arguments: obj.arguments(),
inner: obj,
}),
);
} else {
return Err(AsgError::FfiMissing(
ffi.name.name.clone(),
ffi.span,
));
}
}
ast::FfiType::Function => {
if let Some(obj) = resolver.resolve_ffi_function(&ffi.name.name)? {
if let Some(defined) =
program.borrow().functions.get(&ffi.name.name)
{
return Err(AsgError::FunctionRedefinition(
ffi.name.name.clone(),
ffi.span,
defined.span,
));
}
program.borrow_mut().functions.insert(
ffi.name.name.clone(),
Arc::new(Function {
name: ffi.name.name.clone(),
span: ffi.span.clone(),
arguments: obj.arguments(),
inner: obj,
}),
);
} else {
return Err(AsgError::FfiMissing(
ffi.name.name.clone(),
ffi.span,
));
}
}
}
Ok(())
}
}