Program Listing for File quack_method.h

Return to documentation for file (src/quack_method.h)

//
// Created by Zayd Hammoudeh on 10/4/18.
//

#ifndef PROJECT02_QUACK_METHODS_H
#define PROJECT02_QUACK_METHODS_H


#include <map>
#include <string>
#include <iostream>

#include "keywords.h"
#include "ASTNode.h"
#include "quack_param.h"
#include "symbol_table.h"
#include "initialized_list.h"

namespace CodeGen { class Gen; }

namespace Quack {
  // Forward declarations
  class TypeChecker;
  class Class;
  class Program;

  class Method {
    friend class TypeChecker;
    friend class Quack::Class;
    friend class Quack::Program;
    friend class CodeGen::Gen;
   public:
    class Container : public MapContainer<Method> {
     public:
      const void print_original_src(unsigned int indent_depth) override {
        MapContainer<Method>::print_original_src_(indent_depth, "\n");
      }
    };

    Method(std::string name, const std::string &return_type,
           Param::Container* params, AST::Block* block)
      : name_(std::move(name)), params_(params),
        return_type_name_(return_type.empty()? CLASS_NOTHING : return_type), block_(block) { };

    ~Method() {
      delete params_;
      delete block_;
      delete symbol_table_;
      delete init_list_;
    }
    void print_original_src(unsigned int indent_depth = 0) {
      std::string indent_str = std::string(indent_depth, '\t');
      std::cout << indent_str << KEY_DEF << " " << name_ << "(" <<  std::flush;
      params_->print_original_src(0);
      std::cout << ")";

      if (!return_type_name_.empty())
        std::cout << " " << ": " << return_type_name_;

      std::cout << " {\n";
      block_->print_original_src(indent_depth + 1);
      std::cout << (!block_->empty() ? "\n" : "") << indent_str << "}";
    }
    const std::string name_;
    Class* return_type_;

    Param::Container* params_;

    Symbol::Table* symbol_table_ = nullptr;

    InitializedList* init_list_ = nullptr;
    const std::string return_type_name_;
    Class * obj_class_ = nullptr;
   private:
    AST::Block* block_ = nullptr;
  };
}

#endif //PROJECT02_QUACK_METHODS_H