/*
 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:   Statement.cpp
 * Author: alain
 * 
 * Created on May 25, 2019, 11:34 AM
 */

#include "Statement.h"
using namespace SURELOG;


Statement::~Statement () { }

std::string SubRoutineCallStmt::getVarName(NodeId base_name)
{
  FileContent* fC = getFileContent(); 
  std::string baseName;
  VObjectType type = fC->Type (base_name);
  if (type == VObjectType::slSuper_keyword)
    baseName = "super";
  else if (type == VObjectType::slThis_keyword)
    baseName = "this";
  else if (type == VObjectType::slThis_dot_super)
    baseName = "super";
  else if (type == VObjectType::slSuper_dot_new)
    baseName = "super";
  else if (type == VObjectType::slStringConst)
    baseName = fC->SymName (base_name);
  else
    baseName = "UNKNOWN_VAR_NAME";
  return baseName;
}

std::vector<std::string> SubRoutineCallStmt::getVarChainNames() {
  std::vector<std::string> result;
  for (auto node : m_var_chain)
    {
      result.push_back(getVarName(node));
    } 
  return result;
}
