/*
 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:   ElaborationStep.h
 * Author: alain
 *
 * Created on July 12, 2017, 8:55 PM
 */

#ifndef ELABORATIONSTEP_H
#define ELABORATIONSTEP_H

#include "CompileDesign.h"

namespace SURELOG {

class ElaborationStep {
 public:
  ElaborationStep(CompileDesign* compileDesign)
      : m_compileDesign(compileDesign) {}
  ElaborationStep(const ElaborationStep& orig) = delete;

  virtual bool elaborate() = 0;

  virtual ~ElaborationStep();

 protected:
  DataType* bindTypeDef_(TypeDef* typd, DesignComponent* parent,
                         ErrorDefinition::ErrorType errtype);

  DataType* bindDataType_(std::string type_name, FileContent* fC, NodeId id,
                          DesignComponent* parent,
                          ErrorDefinition::ErrorType errtype);

  Variable* bindVariable_(std::string var_name, Scope* scope, FileContent* fc,
                          NodeId id, DesignComponent* parent,
                          ErrorDefinition::ErrorType errtype,
                          bool returnClassParam);

  Variable* locateVariable_(std::vector<std::string>& var_chain,
                            FileContent* fC, NodeId id, Scope* scope,
                            DesignComponent* parentComponent,
                            ErrorDefinition::ErrorType errtype);

  Variable* locateStaticVariable_(std::vector<std::string>& var_chain,
                                  FileContent* fC, NodeId id, Scope* scope,
                                  DesignComponent* parentComponent,
                                  ErrorDefinition::ErrorType errtype);

  CompileDesign* m_compileDesign;

  std::map<std::string, Variable*> m_staticVariables;
};

};  // namespace SURELOG

#endif /* ELABORATIONSTEP_H */
