Line data Source code
1 : #include "../../../inc/visitors/typeAnalysis/typeAnalysis.h"
2 : #include "../../../inc/parsingAnalysis/ast/chained/ast_chained.h"
3 : #include <memory>
4 :
5 : namespace nicole {
6 :
7 : /*
8 : - comprueba que base no sea void
9 : - retorna ultimo tipo encontrado
10 : */
11 : std::expected<std::shared_ptr<Type>, Error>
12 0 : TypeAnalysis::visit(const AST_CHAINED *node) const noexcept {
13 0 : if (!node) {
14 0 : return createError(ERROR_TYPE::NULL_NODE, "invalid AST_CHAINED");
15 0 : }
16 0 : auto baseRes = node->base()->accept(*this);
17 0 : if (!baseRes)
18 0 : return createError(baseRes.error());
19 0 : if (const auto enumType{std::dynamic_pointer_cast<EnumType>(*baseRes)}) {
20 0 : if (node->operations().size()) {
21 0 : return createError(ERROR_TYPE::TYPE, "an enum constructor call cannot appear in a chained expression");
22 0 : }
23 0 : node->setReturnedFromAnalysis(*baseRes);
24 0 : return *baseRes;
25 0 : }
26 0 : if (const auto placeHolder{std::dynamic_pointer_cast<PlaceHolder>(*baseRes)}) {
27 0 : node->setReturnedFromAnalysis(*baseRes);
28 0 : return *baseRes;
29 0 : }
30 0 : currentType_ = baseRes.value();
31 :
32 0 : for (const auto &op : node->operations()) {
33 0 : auto opRes = op->accept(*this);
34 0 : if (!opRes)
35 0 : return createError(opRes.error());
36 0 : }
37 0 : node->setReturnedFromAnalysis(currentType_);
38 0 : return currentType_;
39 0 : }
40 :
41 : }
|