[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/satya-das/cppparser/master/cppparser/src/cpp_entity_builders.h [Back]  [Original]

// Copyright (C) 2022 Satya Das and CppParser contributors
// SPDX-License-Identifier: MIT

#ifndef E7E01B9C_F9F8_41CC_947E_80D6A1262373
#define E7E01B9C_F9F8_41CC_947E_80D6A1262373

#include "memory_util.h"

#include "cppast/cppast.h"
#include "cpptoken.h"

////////////////////////////////////////////////////////////////////////////////////////////////

class CppEntity;

struct CppFunctionData
{
  CppToken                                               funcName;
  std::vector* paramList;
  unsigned int                                           funcAttr;
};

////////////////////////////////////////////////////////////////////////////////////////////////

inline auto NameExpr(std::string name)
{
  return new cppast::CppNameExpr(std::move(name));
}

inline auto NumberLiteralExpr(std::string number)
{
  return new cppast::CppNameExpr(std::move(number));
}

inline auto MonomialExpr(cppast::CppUnaryOperator oper, cppast::CppExpression* term)
{
  return new cppast::CppMonomialExpr(oper, Ptr(term));
}

inline auto BinomialExpr(cppast::CppBinaryOperator oper, cppast::CppExpression* term1, cppast::CppExpression* term2)
{
  return new cppast::CppBinomialExpr(oper, Ptr(term1), Ptr(term2));
}

inline auto BinomialExpr(cppast::CppBinaryOperator oper, cppast::CppExpression* term1, std::string term2)
{
  return BinomialExpr(oper, term1, NameExpr(std::move(term2)));
}

inline auto TrinomialExpr(cppast::CppTernaryOperator oper,
                          cppast::CppExpression*     term1,
                          cppast::CppExpression*     term2,
                          cppast::CppExpression*     term3)
{
  return new cppast::CppTrinomialExpr(oper, Ptr(term1), Ptr(term2), Ptr(term3));
}

inline auto FuncCallExpr(cppast::CppExpression* func)
{
  return new cppast::CppFunctionCallExpr(Ptr(func), {});
}

inline auto FuncCallExpr(cppast::CppExpression* func, cppast::CppExpression* arg)
{
  cppast::CppCallArgs args;
  if (arg)
    args.emplace_back(arg);
  return new cppast::CppFunctionCallExpr(Ptr(func), std::move(args));
}

inline auto FuncCallExpr(cppast::CppExpression* func, cppast::CppCallArgs args)
{
  return new cppast::CppFunctionCallExpr(Ptr(func), std::move(args));
}

inline auto FuncCallExpr(cppast::CppExpression* func, cppast::CppCallArgs* args)
{
  return new cppast::CppFunctionCallExpr(Ptr(func), args ? Obj(args) : cppast::CppCallArgs());
}

inline auto UniformInitExpr(std::string name, cppast::CppCallArgs args)
{
  return new cppast::CppUniformInitializerExpr(std::move(name), std::move(args));
}

inline auto UniformInitExpr(std::string name, cppast::CppCallArgs* args)
{
  return UniformInitExpr(std::move(name), args ? Obj(args) : cppast::CppCallArgs());
}

inline auto UniformInitExpr(std::string name, cppast::CppExpression* arg)
{
  cppast::CppCallArgs args;
  if (arg)
    args.emplace_back(arg);
  return UniformInitExpr(std::move(name), std::move(args));
}

inline auto InitializerListExpr(cppast::CppCallArgs exprList)
{
  return new cppast::CppInitializerListExpr(std::move(exprList));
}

inline auto InitializerListExpr(cppast::CppCallArgs* exprList)
{
  return InitializerListExpr(exprList ? Obj(exprList) : cppast::CppCallArgs());
}

inline auto InitializerListExpr(cppast::CppExpression* expr)
{
  cppast::CppCallArgs args;
  if (expr)
    args.emplace_back(expr);
  return new cppast::CppInitializerListExpr(std::move(args));
}

inline auto CStyleCastExpr(cppast::CppVarType* targetType, cppast::CppExpression* expr)
{
  return new cppast::CppCStyleTypecastExpr(Ptr(targetType), Ptr(expr));
}

inline auto StaticCastExpr(cppast::CppVarType* targetType, cppast::CppExpression* expr)
{
  return new cppast::CppStaticCastExpr(Ptr(targetType), Ptr(expr));
}

inline auto ConstCastExpr(cppast::CppVarType* targetType, cppast::CppExpression* expr)
{
  return new cppast::CppConstCastExpr(Ptr(targetType), Ptr(expr));
}

inline auto DynamiCastExpr(cppast::CppVarType* targetType, cppast::CppExpression* expr)
{
  return new cppast::CppDynamiCastExpr(Ptr(targetType), Ptr(expr));
}

inline auto ReinterpretCastExpr(cppast::CppVarType* targetType, cppast::CppExpression* expr)
{
  return new cppast::CppReinterpretCastExpr(Ptr(targetType), Ptr(expr));
}

inline auto VarTypeExpr(cppast::CppVarType* vartype)
{
  return new cppast::CppVartypeExpr(Ptr(vartype));
}

inline auto VarTypeExpr(std::string baseType, cppast::CppTypeModifier modifier)
{
  return VarTypeExpr(new cppast::CppVarType(std::move(baseType), modifier));
}

inline auto NewExpr(cppast::CppVarType* vartype)
{
  return new cppast::CppVartypeExpr(Ptr(vartype));
}

inline auto LambdaExpression(cppast::CppLambda* lambda)
{
  return new cppast::CppLambdaExpr(Ptr(lambda));
}

/**
 * An Expression-list expression is an expression that uses ',' as operator.
 * e.g.:
 *  1) int x = 2, 3;
 *  2) gcd((3, 4, 6), 4);
 *  3) return 9, 10;
 * In these examples we see expression-lists are expressions.
 */
template 
inline cppast::CppExpression* ExpressionListExpr(ExprItr first, ExprItr end)
{
  static_assert(
    std::is_same_v);
  assert(first != end);
  auto second = first + 1;
  if (second == end)
    return const_cast(first->release());
  auto result = new cppast::CppBinomialExpr(cppast::CppBinaryOperator::COMMA, std::move(*first), std::move(*second));
  auto next   = second + 1;
  if (next == end)
    return result;
  return new cppast::CppBinomialExpr(cppast::CppBinaryOperator::COMMA, Ptr(result), Ptr(ExpressionListExpr(next, end)));
}

inline auto ExpressionListExpr(std::vector exprList)
{
  return ExpressionListExpr(exprList.begin(), exprList.end());
}

inline auto VarDecl(std::string name, cppast::CppVarInitInfo* initInfo)
{
  return initInfo ? cppast::CppVarDecl(name, Obj(initInfo)) : cppast::CppVarDecl(name);
}

inline auto VarInitInfo(cppast::CppExpression* expr)
{
  return new cppast::CppVarInitInfo(Ptr(expr));
}

inline auto VarInitInfo(cppast::CppCallArgs* args, cppast::CppConstructorCallStyle style)
{
  return new cppast::CppVarInitInfo(cppast::CppConstructorCallInfo {args ? Obj(args) : cppast::CppCallArgs(), style});
}

inline auto MemberInit(std::string                                  memberName,
                       std::unique_ptr arg,
                       cppast::CppConstructorCallStyle              style)
{
  cppast::CppCallArgs args;
  if (arg)
    args.emplace_back(arg.release());
  return new cppast::CppMemberInit {std::move(memberName), cppast::CppConstructorCallInfo {std::move(args), style}};
}

inline auto MemberInit(std::string memberName, cppast::CppCallArgs args, cppast::CppConstructorCallStyle style)
{
  return new cppast::CppMemberInit {std::move(memberName), cppast::CppConstructorCallInfo {std::move(args), style}};
}

inline auto MemberInit(std::string memberName, cppast::CppConstructorCallStyle style)
{
  return new cppast::CppMemberInit {std::move(memberName),
                                    cppast::CppConstructorCallInfo {cppast::CppCallArgs(), style}};
}

#endif /* E7E01B9C_F9F8_41CC_947E_80D6A1262373 */

Web Proxy Viewer  |  New URL  |  Original Page