/*
 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:   DesignElement.h
 * Author: alain
 *
 * Created on June 8, 2017, 8:05 PM
 */

#ifndef DESIGNELEMENT_H
#define DESIGNELEMENT_H

namespace SURELOG {

class DesignElement {
 public:
  typedef enum {
    Module,
    Primitive,
    Interface,
    Program,
    Package,
    Config,
    Checker,
    Class,     // Class is not a Design element per Standard, but is a major
               // component tracked
    Function,  // Function is not a Design Element per Standard, but in a
               // package it is a element worth tracking
    Task,
    SLline  // Used to split files with correct file info
  } ElemType;

  DesignElement(SymbolId name, SymbolId fileId, ElemType type,
                SymbolId uniqueId, unsigned int line, SymbolId parent);
  virtual ~DesignElement();

  SymbolId m_name;
  SymbolId m_fileId;
  ElemType m_type;
  SymbolId m_uniqueId;
  unsigned int m_line;
  TimeInfo m_timeInfo;
  SymbolId m_parent;
  NodeId m_node;
  void* m_context;  // Not persisted field, only used to build the DesignElement
                    // -> VNode relation
 private:
};

};  // namespace SURELOG

#endif /* DESIGNELEMENT_H */
