#include "TypeIdentifier.hh" #include "TypeManager.hh" #include "VariableList.hh" namespace pcc { TypeIdentifier::TypeIdentifier(Context* context, std::shared_ptr type) : type_(type) , context_(context) {} TrivialTypeIdentifier::TrivialTypeIdentifier(Context* context, std::shared_ptr type) : TypeIdentifier(context, type) {} std::shared_ptr TrivialTypeIdentifier::GetType() { return type_; } AliasTypeIdentifier::AliasTypeIdentifier(Context* context, std::string&& alias) : TypeIdentifier(context) , alias_(alias) {} std::shared_ptr AliasTypeIdentifier::GetType() { // cache the result, save some time in a "var a,b,c:somealias;" case if (type_ == nullptr) { type_ = context_->GetCurrentScope()->FindTypeAlias(alias_); } return type_; } PointerTypeIdentifier::PointerTypeIdentifier( Context* context, std::shared_ptr ElementType) : TypeIdentifier(context) , ElementType_(ElementType) {} std::shared_ptr PointerTypeIdentifier::GetType() { if (type_ == nullptr) { type_ = context_->GetTypeManager()->GetPointerType(ElementType_->GetType()); } return type_; } ArrayTypeIdentifier::ArrayTypeIdentifier( Context* context, std::shared_ptr ElementType, std::shared_ptr start, std::shared_ptr end) : TypeIdentifier(context) , ElementType_(ElementType) , start_(start) , end_(end) {} std::shared_ptr ArrayTypeIdentifier::GetType() { if (type_ == nullptr) { type_ = context_->GetTypeManager()->CreateArrayType( ElementType_->GetType(), start_, end_); } return type_; } RecordTypeIdentifier::RecordTypeIdentifier(Context* context, std::list&& members) : TypeIdentifier(context) , members_(std::move(members)) {} std::shared_ptr RecordTypeIdentifier::GetType() { if (type_ == nullptr) { std::vector MemberTypes; MemberTypes.reserve(members_.size()); std::transform( members_.cbegin(), members_.cend(), std::back_inserter(MemberTypes), [](const Declaration& member) { return std::make_pair(std::get<0>(member), std::get<1>(member)->GetType()); }); type_ = context_->GetTypeManager()->CreateRecordType(MemberTypes); } return type_; } } // namespace pcc