/*
 Copyright 2019 Alain Dargelas

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 */

/*
 * File:   CompileClass.h
 * Author: alain
 *
 * Created on June 7, 2018, 10:26 PM
 */

#ifndef COMPILECLASS_H
#define COMPILECLASS_H

#include "CompileHelper.h"

namespace SURELOG {

struct FunctorCompileClass {
  FunctorCompileClass(CompileDesign* compiler, ClassDefinition* classDef,
                      Design* design, SymbolTable* symbols,
                      ErrorContainer* errors)
      : m_compileDesign(compiler),
        m_class(classDef),
        m_design(design),
        m_symbols(symbols),
        m_errors(errors) {}
  int operator()() const;

 private:
  CompileDesign* m_compileDesign;
  ClassDefinition* m_class;
  Design* m_design;
  SymbolTable* m_symbols;
  ErrorContainer* m_errors;
};

class CompileClass {
 public:
  CompileClass(CompileDesign* compiler, ClassDefinition* classDef,
               Design* design, SymbolTable* symbols, ErrorContainer* errors)
      : m_compileDesign(compiler),
        m_class(classDef),
        m_design(design),
        m_symbols(symbols),
        m_errors(errors) {
    m_helper.seterrorReporting(errors, symbols);
  }

  virtual ~CompileClass();

  bool compile();

 private:
  CompileDesign* m_compileDesign;
  ClassDefinition* m_class;
  Design* m_design;
  SymbolTable* m_symbols;
  ErrorContainer* m_errors;
  CompileHelper m_helper;
  bool compile_class_parameters_(FileContent* fC, NodeId id);
  bool compile_class_property_(FileContent* fC, NodeId id);
  bool compile_class_method_(FileContent* fC, NodeId id);
  bool compile_class_constraint_(FileContent* fC, NodeId id);
  bool compile_type_declaration_(FileContent* fC, NodeId id);
  bool compile_class_declaration_(FileContent* fC, NodeId id);
  bool compile_covergroup_declaration_(FileContent* fC, NodeId id);
  bool compile_local_parameter_declaration_(FileContent* fC, NodeId id);
  bool compile_parameter_declaration_(FileContent* fC, NodeId id);
  bool compile_class_type_(FileContent* fC, NodeId id);
};

};  // namespace SURELOG

#endif /* COMPILECLASS_H */
