-
Notifications
You must be signed in to change notification settings - Fork 0
/
typing.cpp
103 lines (74 loc) · 2.27 KB
/
typing.cpp
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
#include "basically.h"
namespace basically::typing
{
TypeRef::TypeRef(lexing::Token const& ref_token)
: ref_location(ref_token.location),
type_name(ref_token.text),
resolved_type(nullptr)
{
assert(ref_token.type == lexing::Type::Identifier);
}
TypeRef::TypeRef(std::string const& ref_name)
: ref_location(),
type_name(ref_name),
resolved_type(nullptr)
{
}
TypeInfo::TypeInfo(ast::StructureDeclarationStatementPtr const& declaration)
: TypeInfo(declaration->name.text, std::make_shared<StructureInfo>(declaration))
// visibility
{
}
TypeInfo::TypeInfo(std::string const& new_name,
TypeExtraInfo new_extra,
Visibility new_visibility)
: name(new_name),
extra(new_extra),
visibility(new_visibility)
{
}
NumberInfo::NumberInfo(SignedFlag new_is_signed,
FloatingPointFlag new_is_floating_point,
size_t new_size) noexcept
: is_signed(new_is_signed),
is_floating_point(new_is_floating_point),
size(new_size)
{
}
size_t TypeInfo::size() const noexcept
{
size_t new_size;
ExtraInfoHandler handler =
{
.number = [&](auto const& value)
{
new_size = value->size;
},
.structure = [&](auto const& value)
{
size_t size_sum = 0;
for (auto const& field : value->fields)
{
size_sum = field.type.resolved_type->size();
}
new_size = size_sum;
}
};
std::visit(handler, extra);
return new_size;
}
StructureInfo::StructureInfo(ast::StructureDeclarationStatementPtr const& declaration)
{
}
SubInfo::SubInfo(ast::SubDeclarationStatementPtr const& declaration)
: name(declaration->name.text),
parameters(),
body()
{
}
FunctionInfo::FunctionInfo(ast::FunctionDeclarationStatementPtr const& declaration)
: SubInfo(declaration),
return_type(declaration->return_type)
{
}
}