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

#include "Task.h"

using namespace SURELOG;

Task::~Task() {}

bool Task::compile(CompileHelper& compile_helper) {
  bool result = true;
  FileContent* fC = m_fileContent;
  NodeId task_declaration = fC->Child(m_nodeId);
  NodeId task_body_declaration = fC->Child(task_declaration);
  NodeId task_name = fC->Child(task_body_declaration);
  NodeId tf_port_list = fC->Sibling(task_name);
  result &= compile_helper.compileTfPortList(this, fC, tf_port_list, m_params);
  return result;
}
