/*
 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:   VObject.cpp
 * Author: alain
 *
 * Created on June 14, 2017, 10:58 PM
 */
#include <string>
#include "SourceCompile/SymbolTable.h"
#include "VObject.h"

using namespace SURELOG;

VObject::~VObject() {}

std::string VObject::print(SymbolTable* symbols, unsigned int uniqueId,
                           NodeId definitionFile) {
  std::string text;
  std::string symbol = symbols->getSymbol(m_name);
  if (symbol == symbols->getBadSymbol()) {
    text += "n<>";
  } else {
    text = "n<" + symbols->getSymbol(m_name) + ">";
  }

  text += " ";
  text += "u<" + std::to_string(uniqueId) + ">";
  text += " ";
  std::string type = getTypeName(m_type);
  type.erase(0, 2);
  text += "t<" + type + ">";
  if (m_parent) {
    text += " ";
    text += "p<" + std::to_string(m_parent) + ">";
  }
  if (m_definition) {
    text += " ";
    text += "d<" + std::to_string(m_definition) + ">";
  }
  if (definitionFile) {
    text += " ";
    text += "df<" + std::to_string(definitionFile) + ">";
  }
  if (m_child) {
    text += " ";
    text += "c<" + std::to_string(m_child) + ">";
  }
  if (m_sibling) {
    text += " ";
    text += "s<" + std::to_string(m_sibling) + ">";
  }
  text += " ";
  text += "l<" + std::to_string(m_line) + ">";
  return text;
}
