/*
 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:   Function.cpp
 * Author: alain
 *
 * Created on February 21, 2019, 8:19 PM
 */

#include "Function.h"

using namespace SURELOG;

Function::~Function() {}

bool Function::compile(CompileHelper& compile_helper) {
  bool result = true;
  FileContent* fC = m_fileContent;
  NodeId function_declaration = fC->Child(m_nodeId);
  VObjectType function_type = fC->Type(function_declaration);
  NodeId tf_port_list = 0;
  NodeId function_statement_or_null = 0;
  switch (function_type) {
    case VObjectType::slClass_constructor_declaration: {
      tf_port_list = fC->Sibling(function_declaration);
      if (tf_port_list)
        function_statement_or_null = fC->Sibling(tf_port_list);
      else
        function_statement_or_null = fC->Child(function_declaration);
      break;
    }
    default: {
      NodeId function_body_declaration = fC->Child(function_declaration);
      NodeId function_data_type_or_implicit =
          fC->Child(function_body_declaration);
      NodeId function_name = fC->Sibling(function_data_type_or_implicit);
      tf_port_list = fC->Sibling(function_name);
      function_statement_or_null = tf_port_list;
      break;
    }
  }
  if (fC->Type(tf_port_list) == VObjectType::slTf_port_list) {
    result &=
        compile_helper.compileTfPortList(this, fC, tf_port_list, m_params);
    function_statement_or_null = fC->Sibling(tf_port_list);
  }
  result &= compile_helper.compileScopeBody(this, this, fC,
                                            function_statement_or_null);
  return result;
}
