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

