/*
 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);
    };

};

#endif /* COMPILECLASS_H */


