text: // ----------------------------------------------------------------------------
  // <auto-generated>
  // This is autogenerated code by CppSharp.
  // Do not edit this file or all your changes will be lost after re-generation.
  // </auto-generated>
  // ----------------------------------------------------------------------------
  
  
  #include "AST.h"
  #include "Parser.h"
  #include <clang/AST/Expr.h>
  #include <clang/AST/ExprCXX.h>
  
  namespace CppSharp { namespace CppParser {
  
  AST::Expr* Parser::WalkExpression(const clang::Expr* Expr)
  {
      if (Expr == nullptr)
          return nullptr;
  
      AST::Expr* _Expr= 0;
  
      switch (Expr->getStmtClass())
      {
      case clang::Stmt::ConstantExprClass:
      {
          auto S = const_cast<clang::ConstantExpr*>(llvm::cast<clang::ConstantExpr>(Expr));
          auto _S = new AST::ConstantExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->subExpr = static_cast<AST::Expr*>(WalkExpression(S->getSubExpr()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::OpaqueValueExprClass:
      {
          auto S = const_cast<clang::OpaqueValueExpr*>(llvm::cast<clang::OpaqueValueExpr>(Expr));
          auto _S = new AST::OpaqueValueExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->isUnique = S->isUnique();
          _S->sourceExpr = static_cast<AST::Expr*>(WalkExpression(S->getSourceExpr()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::DeclRefExprClass:
      {
          auto S = const_cast<clang::DeclRefExpr*>(llvm::cast<clang::DeclRefExpr>(Expr));
          auto _S = new AST::DeclRefExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->hadMultipleCandidates = S->hadMultipleCandidates();
          _S->hasQualifier = S->hasQualifier();
          _S->foundDecl = static_cast<AST::Declaration*>(WalkDeclaration(S->getFoundDecl()));
          _S->hasTemplateKWAndArgsInfo = S->hasTemplateKWAndArgsInfo();
          _S->hasTemplateKeyword = S->hasTemplateKeyword();
          _S->hasExplicitTemplateArgs = S->hasExplicitTemplateArgs();
          _S->numTemplateArgs = S->getNumTemplateArgs();
          _S->refersToEnclosingVariableOrCapture = S->refersToEnclosingVariableOrCapture();
          _Expr = _S;
          break;
      }
      case clang::Stmt::IntegerLiteralClass:
      {
          auto S = const_cast<clang::IntegerLiteral*>(llvm::cast<clang::IntegerLiteral>(Expr));
          auto _S = new AST::IntegerLiteral();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->value = S->getValue().getLimitedValue();
          _Expr = _S;
          break;
      }
      case clang::Stmt::FixedPointLiteralClass:
      {
          auto S = const_cast<clang::FixedPointLiteral*>(llvm::cast<clang::FixedPointLiteral>(Expr));
          auto _S = new AST::FixedPointLiteral();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->value = S->getValue().getLimitedValue();
          _Expr = _S;
          break;
      }
      case clang::Stmt::CharacterLiteralClass:
      {
          auto S = const_cast<clang::CharacterLiteral*>(llvm::cast<clang::CharacterLiteral>(Expr));
          auto _S = new AST::CharacterLiteral();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->kind = (CharacterLiteral::CharacterKind) S->getKind();
          _S->value = S->getValue();
          _Expr = _S;
          break;
      }
      case clang::Stmt::FloatingLiteralClass:
      {
          auto S = const_cast<clang::FloatingLiteral*>(llvm::cast<clang::FloatingLiteral>(Expr));
          auto _S = new AST::FloatingLiteral();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->exact = S->isExact();
          _S->valueAsApproximateDouble = S->getValueAsApproximateDouble();
          _Expr = _S;
          break;
      }
      case clang::Stmt::ImaginaryLiteralClass:
      {
          auto S = const_cast<clang::ImaginaryLiteral*>(llvm::cast<clang::ImaginaryLiteral>(Expr));
          auto _S = new AST::ImaginaryLiteral();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->subExpr = static_cast<AST::Expr*>(WalkExpression(S->getSubExpr()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::StringLiteralClass:
      {
          auto S = const_cast<clang::StringLiteral*>(llvm::cast<clang::StringLiteral>(Expr));
          auto _S = new AST::StringLiteral();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->string = S->getString().str();
          _S->bytes = S->getBytes().str();
          _S->byteLength = S->getByteLength();
          _S->length = S->getLength();
          _S->charByteWidth = S->getCharByteWidth();
          _S->kind = (StringLiteral::StringKind) S->getKind();
          _S->isAscii = S->isAscii();
          _S->isWide = S->isWide();
          _S->isUTF8 = S->isUTF8();
          _S->isUTF16 = S->isUTF16();
          _S->isUTF32 = S->isUTF32();
          _S->isPascal = S->isPascal();
          _S->containsNonAscii = S->containsNonAscii();
          _S->containsNonAsciiOrNull = S->containsNonAsciiOrNull();
          _S->numConcatenated = S->getNumConcatenated();
          _Expr = _S;
          break;
      }
      case clang::Stmt::PredefinedExprClass:
      {
          auto S = const_cast<clang::PredefinedExpr*>(llvm::cast<clang::PredefinedExpr>(Expr));
          auto _S = new AST::PredefinedExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->identKind = (PredefinedExpr::IdentKind) S->getIdentKind();
          _Expr = _S;
          break;
      }
      case clang::Stmt::ParenExprClass:
      {
          auto S = const_cast<clang::ParenExpr*>(llvm::cast<clang::ParenExpr>(Expr));
          auto _S = new AST::ParenExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->subExpr = static_cast<AST::Expr*>(WalkExpression(S->getSubExpr()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::UnaryOperatorClass:
      {
          auto S = const_cast<clang::UnaryOperator*>(llvm::cast<clang::UnaryOperator>(Expr));
          auto _S = new AST::UnaryOperator();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->opcode = (UnaryOperatorKind) S->getOpcode();
          _S->subExpr = static_cast<AST::Expr*>(WalkExpression(S->getSubExpr()));
          _S->canOverflow = S->canOverflow();
          _S->isPrefix = S->isPrefix();
          _S->isPostfix = S->isPostfix();
          _S->isIncrementOp = S->isIncrementOp();
          _S->isDecrementOp = S->isDecrementOp();
          _S->isIncrementDecrementOp = S->isIncrementDecrementOp();
          _S->isArithmeticOp = S->isArithmeticOp();
          _Expr = _S;
          break;
      }
      case clang::Stmt::OffsetOfExprClass:
      {
          auto S = const_cast<clang::OffsetOfExpr*>(llvm::cast<clang::OffsetOfExpr>(Expr));
          auto _S = new AST::OffsetOfExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->numComponents = S->getNumComponents();
          _S->numExpressions = S->getNumExpressions();
          _Expr = _S;
          break;
      }
      case clang::Stmt::UnaryExprOrTypeTraitExprClass:
      {
          auto S = const_cast<clang::UnaryExprOrTypeTraitExpr*>(llvm::cast<clang::UnaryExprOrTypeTraitExpr>(Expr));
          auto _S = new AST::UnaryExprOrTypeTraitExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->kind = (UnaryExprOrTypeTrait) S->getKind();
          _S->isArgumentType = S->isArgumentType();
          if (S->isArgumentType())
              _S->argumentType = GetQualifiedType(S->getArgumentType());
          _S->argumentExpr = static_cast<AST::Expr*>(WalkExpression(S->getArgumentExpr()));
          _S->typeOfArgument = GetQualifiedType(S->getTypeOfArgument());
          _Expr = _S;
          break;
      }
      case clang::Stmt::ArraySubscriptExprClass:
      {
          auto S = const_cast<clang::ArraySubscriptExpr*>(llvm::cast<clang::ArraySubscriptExpr>(Expr));
          auto _S = new AST::ArraySubscriptExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->lHS = static_cast<AST::Expr*>(WalkExpression(S->getLHS()));
          _S->rHS = static_cast<AST::Expr*>(WalkExpression(S->getRHS()));
          _S->base = static_cast<AST::Expr*>(WalkExpression(S->getBase()));
          _S->idx = static_cast<AST::Expr*>(WalkExpression(S->getIdx()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::CallExprClass:
      {
          auto S = const_cast<clang::CallExpr*>(llvm::cast<clang::CallExpr>(Expr));
          auto _S = new AST::CallExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->callee = static_cast<AST::Expr*>(WalkExpression(S->getCallee()));
          _S->calleeDecl = static_cast<AST::Declaration*>(WalkDeclaration(S->getCalleeDecl()));
          _S->directCallee = static_cast<AST::Function*>(WalkDeclaration(S->getDirectCallee()));
          _S->numArgs = S->getNumArgs();
          _S->numCommas = S->getNumCommas();
          _S->builtinCallee = S->getBuiltinCallee();
          _S->isCallToStdMove = S->isCallToStdMove();
          for (auto _E : S->arguments())
          {
              auto _ES = WalkExpression(_E);
              _S->addarguments(_ES);
          }
          _Expr = _S;
          break;
      }
      case clang::Stmt::MemberExprClass:
      {
          auto S = const_cast<clang::MemberExpr*>(llvm::cast<clang::MemberExpr>(Expr));
          auto _S = new AST::MemberExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->base = static_cast<AST::Expr*>(WalkExpression(S->getBase()));
          _S->arrow = S->isArrow();
          _S->hadMultipleCandidates = S->hadMultipleCandidates();
          _S->hasQualifier = S->hasQualifier();
          _S->hasTemplateKeyword = S->hasTemplateKeyword();
          _S->hasExplicitTemplateArgs = S->hasExplicitTemplateArgs();
          _S->numTemplateArgs = S->getNumTemplateArgs();
          _S->isImplicitAccess = S->isImplicitAccess();
          _Expr = _S;
          break;
      }
      case clang::Stmt::CompoundLiteralExprClass:
      {
          auto S = const_cast<clang::CompoundLiteralExpr*>(llvm::cast<clang::CompoundLiteralExpr>(Expr));
          auto _S = new AST::CompoundLiteralExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->initializer = static_cast<AST::Expr*>(WalkExpression(S->getInitializer()));
          _S->fileScope = S->isFileScope();
          _Expr = _S;
          break;
      }
      case clang::Stmt::ImplicitCastExprClass:
      {
          auto S = const_cast<clang::ImplicitCastExpr*>(llvm::cast<clang::ImplicitCastExpr>(Expr));
          auto _S = new AST::ImplicitCastExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->castKind = (CastKind) S->getCastKind();
          _S->subExpr = static_cast<AST::Expr*>(WalkExpression(S->getSubExpr()));
          _S->castKindName = S->getCastKindName();
          _S->subExprAsWritten = static_cast<AST::Expr*>(WalkExpression(S->getSubExprAsWritten()));
          _S->conversionFunction = static_cast<AST::Declaration*>(WalkDeclaration(S->getConversionFunction()));
          _S->path_empty = S->path_empty();
          _S->path_size = S->path_size();
          _S->isPartOfExplicitCast = S->isPartOfExplicitCast();
          _Expr = _S;
          break;
      }
      case clang::Stmt::CStyleCastExprClass:
      {
          auto S = const_cast<clang::CStyleCastExpr*>(llvm::cast<clang::CStyleCastExpr>(Expr));
          auto _S = new AST::CStyleCastExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->castKind = (CastKind) S->getCastKind();
          _S->subExpr = static_cast<AST::Expr*>(WalkExpression(S->getSubExpr()));
          _S->castKindName = S->getCastKindName();
          _S->subExprAsWritten = static_cast<AST::Expr*>(WalkExpression(S->getSubExprAsWritten()));
          _S->conversionFunction = static_cast<AST::Declaration*>(WalkDeclaration(S->getConversionFunction()));
          _S->path_empty = S->path_empty();
          _S->path_size = S->path_size();
          _S->typeAsWritten = GetQualifiedType(S->getTypeAsWritten());
          _Expr = _S;
          break;
      }
      case clang::Stmt::BinaryOperatorClass:
      {
          auto S = const_cast<clang::BinaryOperator*>(llvm::cast<clang::BinaryOperator>(Expr));
          auto _S = new AST::BinaryOperator();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->opcode = (BinaryOperatorKind) S->getOpcode();
          _S->lHS = static_cast<AST::Expr*>(WalkExpression(S->getLHS()));
          _S->rHS = static_cast<AST::Expr*>(WalkExpression(S->getRHS()));
          _S->opcodeStr = S->getOpcodeStr().str();
          _S->isPtrMemOp = S->isPtrMemOp();
          _S->isMultiplicativeOp = S->isMultiplicativeOp();
          _S->isAdditiveOp = S->isAdditiveOp();
          _S->isShiftOp = S->isShiftOp();
          _S->isBitwiseOp = S->isBitwiseOp();
          _S->isRelationalOp = S->isRelationalOp();
          _S->isEqualityOp = S->isEqualityOp();
          _S->isComparisonOp = S->isComparisonOp();
          _S->isLogicalOp = S->isLogicalOp();
          _S->isAssignmentOp = S->isAssignmentOp();
          _S->isCompoundAssignmentOp = S->isCompoundAssignmentOp();
          _S->isShiftAssignOp = S->isShiftAssignOp();
          _S->isFPContractableWithinStatement = S->isFPContractableWithinStatement();
          _S->isFEnvAccessOn = S->isFEnvAccessOn();
          _Expr = _S;
          break;
      }
      case clang::Stmt::CompoundAssignOperatorClass:
      {
          auto S = const_cast<clang::CompoundAssignOperator*>(llvm::cast<clang::CompoundAssignOperator>(Expr));
          auto _S = new AST::CompoundAssignOperator();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->opcode = (BinaryOperatorKind) S->getOpcode();
          _S->lHS = static_cast<AST::Expr*>(WalkExpression(S->getLHS()));
          _S->rHS = static_cast<AST::Expr*>(WalkExpression(S->getRHS()));
          _S->opcodeStr = S->getOpcodeStr().str();
          _S->isPtrMemOp = S->isPtrMemOp();
          _S->isMultiplicativeOp = S->isMultiplicativeOp();
          _S->isAdditiveOp = S->isAdditiveOp();
          _S->isShiftOp = S->isShiftOp();
          _S->isBitwiseOp = S->isBitwiseOp();
          _S->isRelationalOp = S->isRelationalOp();
          _S->isEqualityOp = S->isEqualityOp();
          _S->isComparisonOp = S->isComparisonOp();
          _S->isLogicalOp = S->isLogicalOp();
          _S->isAssignmentOp = S->isAssignmentOp();
          _S->isCompoundAssignmentOp = S->isCompoundAssignmentOp();
          _S->isShiftAssignOp = S->isShiftAssignOp();
          _S->isFPContractableWithinStatement = S->isFPContractableWithinStatement();
          _S->isFEnvAccessOn = S->isFEnvAccessOn();
          _S->computationLHSType = GetQualifiedType(S->getComputationLHSType());
          _S->computationResultType = GetQualifiedType(S->getComputationResultType());
          _Expr = _S;
          break;
      }
      case clang::Stmt::ConditionalOperatorClass:
      {
          auto S = const_cast<clang::ConditionalOperator*>(llvm::cast<clang::ConditionalOperator>(Expr));
          auto _S = new AST::ConditionalOperator();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->cond = static_cast<AST::Expr*>(WalkExpression(S->getCond()));
          _S->trueExpr = static_cast<AST::Expr*>(WalkExpression(S->getTrueExpr()));
          _S->falseExpr = static_cast<AST::Expr*>(WalkExpression(S->getFalseExpr()));
          _S->cond = static_cast<AST::Expr*>(WalkExpression(S->getCond()));
          _S->trueExpr = static_cast<AST::Expr*>(WalkExpression(S->getTrueExpr()));
          _S->falseExpr = static_cast<AST::Expr*>(WalkExpression(S->getFalseExpr()));
          _S->lHS = static_cast<AST::Expr*>(WalkExpression(S->getLHS()));
          _S->rHS = static_cast<AST::Expr*>(WalkExpression(S->getRHS()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::BinaryConditionalOperatorClass:
      {
          auto S = const_cast<clang::BinaryConditionalOperator*>(llvm::cast<clang::BinaryConditionalOperator>(Expr));
          auto _S = new AST::BinaryConditionalOperator();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->cond = static_cast<AST::Expr*>(WalkExpression(S->getCond()));
          _S->trueExpr = static_cast<AST::Expr*>(WalkExpression(S->getTrueExpr()));
          _S->falseExpr = static_cast<AST::Expr*>(WalkExpression(S->getFalseExpr()));
          _S->common = static_cast<AST::Expr*>(WalkExpression(S->getCommon()));
          _S->opaqueValue = static_cast<AST::OpaqueValueExpr*>(WalkExpression(S->getOpaqueValue()));
          _S->cond = static_cast<AST::Expr*>(WalkExpression(S->getCond()));
          _S->trueExpr = static_cast<AST::Expr*>(WalkExpression(S->getTrueExpr()));
          _S->falseExpr = static_cast<AST::Expr*>(WalkExpression(S->getFalseExpr()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::AddrLabelExprClass:
      {
          auto S = const_cast<clang::AddrLabelExpr*>(llvm::cast<clang::AddrLabelExpr>(Expr));
          auto _S = new AST::AddrLabelExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _Expr = _S;
          break;
      }
      case clang::Stmt::StmtExprClass:
      {
          auto S = const_cast<clang::StmtExpr*>(llvm::cast<clang::StmtExpr>(Expr));
          auto _S = new AST::StmtExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->subStmt = static_cast<AST::CompoundStmt*>(WalkStatement(S->getSubStmt()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::ShuffleVectorExprClass:
      {
          auto S = const_cast<clang::ShuffleVectorExpr*>(llvm::cast<clang::ShuffleVectorExpr>(Expr));
          auto _S = new AST::ShuffleVectorExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->numSubExprs = S->getNumSubExprs();
          _Expr = _S;
          break;
      }
      case clang::Stmt::ConvertVectorExprClass:
      {
          auto S = const_cast<clang::ConvertVectorExpr*>(llvm::cast<clang::ConvertVectorExpr>(Expr));
          auto _S = new AST::ConvertVectorExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->srcExpr = static_cast<AST::Expr*>(WalkExpression(S->getSrcExpr()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::ChooseExprClass:
      {
          auto S = const_cast<clang::ChooseExpr*>(llvm::cast<clang::ChooseExpr>(Expr));
          auto _S = new AST::ChooseExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->isConditionTrue = S->isConditionTrue();
          _S->cond = static_cast<AST::Expr*>(WalkExpression(S->getCond()));
          _S->lHS = static_cast<AST::Expr*>(WalkExpression(S->getLHS()));
          _S->rHS = static_cast<AST::Expr*>(WalkExpression(S->getRHS()));
          _S->isConditionDependent = S->isConditionDependent();
          _S->chosenSubExpr = static_cast<AST::Expr*>(WalkExpression(S->getChosenSubExpr()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::GNUNullExprClass:
      {
          auto S = const_cast<clang::GNUNullExpr*>(llvm::cast<clang::GNUNullExpr>(Expr));
          auto _S = new AST::GNUNullExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _Expr = _S;
          break;
      }
      case clang::Stmt::VAArgExprClass:
      {
          auto S = const_cast<clang::VAArgExpr*>(llvm::cast<clang::VAArgExpr>(Expr));
          auto _S = new AST::VAArgExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->subExpr = static_cast<AST::Expr*>(WalkExpression(S->getSubExpr()));
          _S->isMicrosoftABI = S->isMicrosoftABI();
          _Expr = _S;
          break;
      }
      case clang::Stmt::InitListExprClass:
      {
          auto S = const_cast<clang::InitListExpr*>(llvm::cast<clang::InitListExpr>(Expr));
          auto _S = new AST::InitListExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->arrayFiller = static_cast<AST::Expr*>(WalkExpression(S->getArrayFiller()));
          if (S->isSyntacticForm())
              _S->syntacticForm = static_cast<AST::InitListExpr*>(WalkExpression(S->getSyntacticForm()));
          _S->numInits = S->getNumInits();
          _S->hasArrayFiller = S->hasArrayFiller();
          _S->isExplicit = S->isExplicit();
          _S->isStringLiteralInit = S->isStringLiteralInit();
          _S->isTransparent = S->isTransparent();
          _S->isSemanticForm = S->isSemanticForm();
          if (S->isSemanticForm())
              _S->semanticForm = static_cast<AST::InitListExpr*>(WalkExpression(S->getSemanticForm()));
          _S->isSyntacticForm = S->isSyntacticForm();
          _Expr = _S;
          break;
      }
      case clang::Stmt::DesignatedInitExprClass:
      {
          auto S = const_cast<clang::DesignatedInitExpr*>(llvm::cast<clang::DesignatedInitExpr>(Expr));
          auto _S = new AST::DesignatedInitExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->init = static_cast<AST::Expr*>(WalkExpression(S->getInit()));
          _S->size = S->size();
          _S->usesGNUSyntax = S->usesGNUSyntax();
          _S->numSubExprs = S->getNumSubExprs();
          _Expr = _S;
          break;
      }
      case clang::Stmt::NoInitExprClass:
      {
          auto S = const_cast<clang::NoInitExpr*>(llvm::cast<clang::NoInitExpr>(Expr));
          auto _S = new AST::NoInitExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _Expr = _S;
          break;
      }
      case clang::Stmt::DesignatedInitUpdateExprClass:
      {
          auto S = const_cast<clang::DesignatedInitUpdateExpr*>(llvm::cast<clang::DesignatedInitUpdateExpr>(Expr));
          auto _S = new AST::DesignatedInitUpdateExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->base = static_cast<AST::Expr*>(WalkExpression(S->getBase()));
          _S->updater = static_cast<AST::InitListExpr*>(WalkExpression(S->getUpdater()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::ArrayInitLoopExprClass:
      {
          auto S = const_cast<clang::ArrayInitLoopExpr*>(llvm::cast<clang::ArrayInitLoopExpr>(Expr));
          auto _S = new AST::ArrayInitLoopExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->commonExpr = static_cast<AST::OpaqueValueExpr*>(WalkExpression(S->getCommonExpr()));
          _S->subExpr = static_cast<AST::Expr*>(WalkExpression(S->getSubExpr()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::ArrayInitIndexExprClass:
      {
          auto S = const_cast<clang::ArrayInitIndexExpr*>(llvm::cast<clang::ArrayInitIndexExpr>(Expr));
          auto _S = new AST::ArrayInitIndexExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _Expr = _S;
          break;
      }
      case clang::Stmt::ImplicitValueInitExprClass:
      {
          auto S = const_cast<clang::ImplicitValueInitExpr*>(llvm::cast<clang::ImplicitValueInitExpr>(Expr));
          auto _S = new AST::ImplicitValueInitExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _Expr = _S;
          break;
      }
      case clang::Stmt::ParenListExprClass:
      {
          auto S = const_cast<clang::ParenListExpr*>(llvm::cast<clang::ParenListExpr>(Expr));
          auto _S = new AST::ParenListExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->numExprs = S->getNumExprs();
          _Expr = _S;
          break;
      }
      case clang::Stmt::GenericSelectionExprClass:
      {
          auto S = const_cast<clang::GenericSelectionExpr*>(llvm::cast<clang::GenericSelectionExpr>(Expr));
          auto _S = new AST::GenericSelectionExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->numAssocs = S->getNumAssocs();
          _S->controllingExpr = static_cast<AST::Expr*>(WalkExpression(S->getControllingExpr()));
          _S->isResultDependent = S->isResultDependent();
          _S->resultIndex = S->getResultIndex();
          _S->resultExpr = static_cast<AST::Expr*>(WalkExpression(S->getResultExpr()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::ExtVectorElementExprClass:
      {
          auto S = const_cast<clang::ExtVectorElementExpr*>(llvm::cast<clang::ExtVectorElementExpr>(Expr));
          auto _S = new AST::ExtVectorElementExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->base = static_cast<AST::Expr*>(WalkExpression(S->getBase()));
          _S->numElements = S->getNumElements();
          _S->containsDuplicateElements = S->containsDuplicateElements();
          _S->isArrow = S->isArrow();
          _Expr = _S;
          break;
      }
      case clang::Stmt::BlockExprClass:
      {
          auto S = const_cast<clang::BlockExpr*>(llvm::cast<clang::BlockExpr>(Expr));
          auto _S = new AST::BlockExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->body = static_cast<AST::Stmt*>(WalkStatement(S->getBody()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::AsTypeExprClass:
      {
          auto S = const_cast<clang::AsTypeExpr*>(llvm::cast<clang::AsTypeExpr>(Expr));
          auto _S = new AST::AsTypeExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->srcExpr = static_cast<AST::Expr*>(WalkExpression(S->getSrcExpr()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::PseudoObjectExprClass:
      {
          auto S = const_cast<clang::PseudoObjectExpr*>(llvm::cast<clang::PseudoObjectExpr>(Expr));
          auto _S = new AST::PseudoObjectExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->syntacticForm = static_cast<AST::Expr*>(WalkExpression(S->getSyntacticForm()));
          _S->resultExprIndex = S->getResultExprIndex();
          _S->resultExpr = static_cast<AST::Expr*>(WalkExpression(S->getResultExpr()));
          _S->numSemanticExprs = S->getNumSemanticExprs();
          _Expr = _S;
          break;
      }
      case clang::Stmt::AtomicExprClass:
      {
          auto S = const_cast<clang::AtomicExpr*>(llvm::cast<clang::AtomicExpr>(Expr));
          auto _S = new AST::AtomicExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->ptr = static_cast<AST::Expr*>(WalkExpression(S->getPtr()));
          _S->order = static_cast<AST::Expr*>(WalkExpression(S->getOrder()));
          _S->scope = static_cast<AST::Expr*>(WalkExpression(S->getScope()));
          _S->val1 = static_cast<AST::Expr*>(WalkExpression(S->getVal1()));
          _S->orderFail = static_cast<AST::Expr*>(WalkExpression(S->getOrderFail()));
          _S->val2 = static_cast<AST::Expr*>(WalkExpression(S->getVal2()));
          _S->weak = static_cast<AST::Expr*>(WalkExpression(S->getWeak()));
          _S->valueType = GetQualifiedType(S->getValueType());
          _S->op = (AtomicExpr::AtomicOp) S->getOp();
          _S->numSubExprs = S->getNumSubExprs();
          _S->isVolatile = S->isVolatile();
          _S->isCmpXChg = S->isCmpXChg();
          _S->isOpenCL = S->isOpenCL();
          _Expr = _S;
          break;
      }
      case clang::Stmt::TypoExprClass:
      {
          auto S = const_cast<clang::TypoExpr*>(llvm::cast<clang::TypoExpr>(Expr));
          auto _S = new AST::TypoExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXOperatorCallExprClass:
      {
          auto S = const_cast<clang::CXXOperatorCallExpr*>(llvm::cast<clang::CXXOperatorCallExpr>(Expr));
          auto _S = new AST::CXXOperatorCallExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->callee = static_cast<AST::Expr*>(WalkExpression(S->getCallee()));
          _S->calleeDecl = static_cast<AST::Declaration*>(WalkDeclaration(S->getCalleeDecl()));
          _S->directCallee = static_cast<AST::Function*>(WalkDeclaration(S->getDirectCallee()));
          _S->numArgs = S->getNumArgs();
          _S->numCommas = S->getNumCommas();
          _S->builtinCallee = S->getBuiltinCallee();
          _S->isCallToStdMove = S->isCallToStdMove();
          for (auto _E : S->arguments())
          {
              auto _ES = WalkExpression(_E);
              _S->addarguments(_ES);
          }
          _S->_operator = (OverloadedOperatorKind) S->getOperator();
          _S->isAssignmentOp = S->isAssignmentOp();
          _S->isInfixBinaryOp = S->isInfixBinaryOp();
          _S->isFPContractableWithinStatement = S->isFPContractableWithinStatement();
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXMemberCallExprClass:
      {
          auto S = const_cast<clang::CXXMemberCallExpr*>(llvm::cast<clang::CXXMemberCallExpr>(Expr));
          auto _S = new AST::CXXMemberCallExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->callee = static_cast<AST::Expr*>(WalkExpression(S->getCallee()));
          _S->calleeDecl = static_cast<AST::Declaration*>(WalkDeclaration(S->getCalleeDecl()));
          _S->directCallee = static_cast<AST::Function*>(WalkDeclaration(S->getDirectCallee()));
          _S->numArgs = S->getNumArgs();
          _S->numCommas = S->getNumCommas();
          _S->builtinCallee = S->getBuiltinCallee();
          _S->isCallToStdMove = S->isCallToStdMove();
          for (auto _E : S->arguments())
          {
              auto _ES = WalkExpression(_E);
              _S->addarguments(_ES);
          }
          _S->implicitObjectArgument = static_cast<AST::Expr*>(WalkExpression(S->getImplicitObjectArgument()));
          _S->methodDecl = static_cast<AST::Method*>(WalkDeclaration(S->getMethodDecl()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::CUDAKernelCallExprClass:
      {
          auto S = const_cast<clang::CUDAKernelCallExpr*>(llvm::cast<clang::CUDAKernelCallExpr>(Expr));
          auto _S = new AST::CUDAKernelCallExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->callee = static_cast<AST::Expr*>(WalkExpression(S->getCallee()));
          _S->calleeDecl = static_cast<AST::Declaration*>(WalkDeclaration(S->getCalleeDecl()));
          _S->directCallee = static_cast<AST::Function*>(WalkDeclaration(S->getDirectCallee()));
          _S->numArgs = S->getNumArgs();
          _S->numCommas = S->getNumCommas();
          _S->builtinCallee = S->getBuiltinCallee();
          _S->isCallToStdMove = S->isCallToStdMove();
          for (auto _E : S->arguments())
          {
              auto _ES = WalkExpression(_E);
              _S->addarguments(_ES);
          }
          _S->config = static_cast<AST::CallExpr*>(WalkExpression(S->getConfig()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXStaticCastExprClass:
      {
          auto S = const_cast<clang::CXXStaticCastExpr*>(llvm::cast<clang::CXXStaticCastExpr>(Expr));
          auto _S = new AST::CXXStaticCastExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->castKind = (CastKind) S->getCastKind();
          _S->subExpr = static_cast<AST::Expr*>(WalkExpression(S->getSubExpr()));
          _S->castKindName = S->getCastKindName();
          _S->subExprAsWritten = static_cast<AST::Expr*>(WalkExpression(S->getSubExprAsWritten()));
          _S->conversionFunction = static_cast<AST::Declaration*>(WalkDeclaration(S->getConversionFunction()));
          _S->path_empty = S->path_empty();
          _S->path_size = S->path_size();
          _S->typeAsWritten = GetQualifiedType(S->getTypeAsWritten());
          _S->castName = S->getCastName();
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXDynamicCastExprClass:
      {
          auto S = const_cast<clang::CXXDynamicCastExpr*>(llvm::cast<clang::CXXDynamicCastExpr>(Expr));
          auto _S = new AST::CXXDynamicCastExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->castKind = (CastKind) S->getCastKind();
          _S->subExpr = static_cast<AST::Expr*>(WalkExpression(S->getSubExpr()));
          _S->castKindName = S->getCastKindName();
          _S->subExprAsWritten = static_cast<AST::Expr*>(WalkExpression(S->getSubExprAsWritten()));
          _S->conversionFunction = static_cast<AST::Declaration*>(WalkDeclaration(S->getConversionFunction()));
          _S->path_empty = S->path_empty();
          _S->path_size = S->path_size();
          _S->typeAsWritten = GetQualifiedType(S->getTypeAsWritten());
          _S->castName = S->getCastName();
          _S->isAlwaysNull = S->isAlwaysNull();
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXReinterpretCastExprClass:
      {
          auto S = const_cast<clang::CXXReinterpretCastExpr*>(llvm::cast<clang::CXXReinterpretCastExpr>(Expr));
          auto _S = new AST::CXXReinterpretCastExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->castKind = (CastKind) S->getCastKind();
          _S->subExpr = static_cast<AST::Expr*>(WalkExpression(S->getSubExpr()));
          _S->castKindName = S->getCastKindName();
          _S->subExprAsWritten = static_cast<AST::Expr*>(WalkExpression(S->getSubExprAsWritten()));
          _S->conversionFunction = static_cast<AST::Declaration*>(WalkDeclaration(S->getConversionFunction()));
          _S->path_empty = S->path_empty();
          _S->path_size = S->path_size();
          _S->typeAsWritten = GetQualifiedType(S->getTypeAsWritten());
          _S->castName = S->getCastName();
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXConstCastExprClass:
      {
          auto S = const_cast<clang::CXXConstCastExpr*>(llvm::cast<clang::CXXConstCastExpr>(Expr));
          auto _S = new AST::CXXConstCastExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->castKind = (CastKind) S->getCastKind();
          _S->subExpr = static_cast<AST::Expr*>(WalkExpression(S->getSubExpr()));
          _S->castKindName = S->getCastKindName();
          _S->subExprAsWritten = static_cast<AST::Expr*>(WalkExpression(S->getSubExprAsWritten()));
          _S->conversionFunction = static_cast<AST::Declaration*>(WalkDeclaration(S->getConversionFunction()));
          _S->path_empty = S->path_empty();
          _S->path_size = S->path_size();
          _S->typeAsWritten = GetQualifiedType(S->getTypeAsWritten());
          _S->castName = S->getCastName();
          _Expr = _S;
          break;
      }
      case clang::Stmt::UserDefinedLiteralClass:
      {
          auto S = const_cast<clang::UserDefinedLiteral*>(llvm::cast<clang::UserDefinedLiteral>(Expr));
          auto _S = new AST::UserDefinedLiteral();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->callee = static_cast<AST::Expr*>(WalkExpression(S->getCallee()));
          _S->calleeDecl = static_cast<AST::Declaration*>(WalkDeclaration(S->getCalleeDecl()));
          _S->directCallee = static_cast<AST::Function*>(WalkDeclaration(S->getDirectCallee()));
          _S->numArgs = S->getNumArgs();
          _S->numCommas = S->getNumCommas();
          _S->builtinCallee = S->getBuiltinCallee();
          _S->isCallToStdMove = S->isCallToStdMove();
          for (auto _E : S->arguments())
          {
              auto _ES = WalkExpression(_E);
              _S->addarguments(_ES);
          }
          _S->literalOperatorKind = (UserDefinedLiteral::LiteralOperatorKind) S->getLiteralOperatorKind();
          _S->cookedLiteral = static_cast<AST::Expr*>(WalkExpression(S->getCookedLiteral()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXBoolLiteralExprClass:
      {
          auto S = const_cast<clang::CXXBoolLiteralExpr*>(llvm::cast<clang::CXXBoolLiteralExpr>(Expr));
          auto _S = new AST::CXXBoolLiteralExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->value = S->getValue();
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXNullPtrLiteralExprClass:
      {
          auto S = const_cast<clang::CXXNullPtrLiteralExpr*>(llvm::cast<clang::CXXNullPtrLiteralExpr>(Expr));
          auto _S = new AST::CXXNullPtrLiteralExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXStdInitializerListExprClass:
      {
          auto S = const_cast<clang::CXXStdInitializerListExpr*>(llvm::cast<clang::CXXStdInitializerListExpr>(Expr));
          auto _S = new AST::CXXStdInitializerListExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->subExpr = static_cast<AST::Expr*>(WalkExpression(S->getSubExpr()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXTypeidExprClass:
      {
          auto S = const_cast<clang::CXXTypeidExpr*>(llvm::cast<clang::CXXTypeidExpr>(Expr));
          auto _S = new AST::CXXTypeidExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->exprOperand = static_cast<AST::Expr*>(WalkExpression(S->getExprOperand()));
          _S->isPotentiallyEvaluated = S->isPotentiallyEvaluated();
          _S->isTypeOperand = S->isTypeOperand();
          _Expr = _S;
          break;
      }
      case clang::Stmt::MSPropertyRefExprClass:
      {
          auto S = const_cast<clang::MSPropertyRefExpr*>(llvm::cast<clang::MSPropertyRefExpr>(Expr));
          auto _S = new AST::MSPropertyRefExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->isImplicitAccess = S->isImplicitAccess();
          _S->baseExpr = static_cast<AST::Expr*>(WalkExpression(S->getBaseExpr()));
          _S->isArrow = S->isArrow();
          _Expr = _S;
          break;
      }
      case clang::Stmt::MSPropertySubscriptExprClass:
      {
          auto S = const_cast<clang::MSPropertySubscriptExpr*>(llvm::cast<clang::MSPropertySubscriptExpr>(Expr));
          auto _S = new AST::MSPropertySubscriptExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->base = static_cast<AST::Expr*>(WalkExpression(S->getBase()));
          _S->idx = static_cast<AST::Expr*>(WalkExpression(S->getIdx()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXUuidofExprClass:
      {
          auto S = const_cast<clang::CXXUuidofExpr*>(llvm::cast<clang::CXXUuidofExpr>(Expr));
          auto _S = new AST::CXXUuidofExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->exprOperand = static_cast<AST::Expr*>(WalkExpression(S->getExprOperand()));
          _S->uuidStr = S->getUuidStr().str();
          _S->isTypeOperand = S->isTypeOperand();
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXThisExprClass:
      {
          auto S = const_cast<clang::CXXThisExpr*>(llvm::cast<clang::CXXThisExpr>(Expr));
          auto _S = new AST::CXXThisExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->implicit = S->isImplicit();
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXThrowExprClass:
      {
          auto S = const_cast<clang::CXXThrowExpr*>(llvm::cast<clang::CXXThrowExpr>(Expr));
          auto _S = new AST::CXXThrowExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->subExpr = static_cast<AST::Expr*>(WalkExpression(S->getSubExpr()));
          _S->isThrownVariableInScope = S->isThrownVariableInScope();
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXDefaultArgExprClass:
      {
          auto S = const_cast<clang::CXXDefaultArgExpr*>(llvm::cast<clang::CXXDefaultArgExpr>(Expr));
          auto _S = new AST::CXXDefaultArgExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->expr = static_cast<AST::Expr*>(WalkExpression(S->getExpr()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXDefaultInitExprClass:
      {
          auto S = const_cast<clang::CXXDefaultInitExpr*>(llvm::cast<clang::CXXDefaultInitExpr>(Expr));
          auto _S = new AST::CXXDefaultInitExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->field = static_cast<AST::Field*>(WalkDeclaration(S->getField()));
          _S->expr = static_cast<AST::Expr*>(WalkExpression(S->getExpr()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXBindTemporaryExprClass:
      {
          auto S = const_cast<clang::CXXBindTemporaryExpr*>(llvm::cast<clang::CXXBindTemporaryExpr>(Expr));
          auto _S = new AST::CXXBindTemporaryExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->subExpr = static_cast<AST::Expr*>(WalkExpression(S->getSubExpr()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXConstructExprClass:
      {
          auto S = const_cast<clang::CXXConstructExpr*>(llvm::cast<clang::CXXConstructExpr>(Expr));
          auto _S = new AST::CXXConstructExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->elidable = S->isElidable();
          _S->hadMultipleCandidates = S->hadMultipleCandidates();
          _S->listInitialization = S->isListInitialization();
          _S->stdInitListInitialization = S->isStdInitListInitialization();
          _S->requiresZeroInitialization = S->requiresZeroInitialization();
          _S->numArgs = S->getNumArgs();
          for (auto _E : S->arguments())
          {
              auto _ES = WalkExpression(_E);
              _S->addarguments(_ES);
          }
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXInheritedCtorInitExprClass:
      {
          auto S = const_cast<clang::CXXInheritedCtorInitExpr*>(llvm::cast<clang::CXXInheritedCtorInitExpr>(Expr));
          auto _S = new AST::CXXInheritedCtorInitExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->constructsVBase = S->constructsVBase();
          _S->inheritedFromVBase = S->inheritedFromVBase();
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXFunctionalCastExprClass:
      {
          auto S = const_cast<clang::CXXFunctionalCastExpr*>(llvm::cast<clang::CXXFunctionalCastExpr>(Expr));
          auto _S = new AST::CXXFunctionalCastExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->castKind = (CastKind) S->getCastKind();
          _S->subExpr = static_cast<AST::Expr*>(WalkExpression(S->getSubExpr()));
          _S->castKindName = S->getCastKindName();
          _S->subExprAsWritten = static_cast<AST::Expr*>(WalkExpression(S->getSubExprAsWritten()));
          _S->conversionFunction = static_cast<AST::Declaration*>(WalkDeclaration(S->getConversionFunction()));
          _S->path_empty = S->path_empty();
          _S->path_size = S->path_size();
          _S->typeAsWritten = GetQualifiedType(S->getTypeAsWritten());
          _S->isListInitialization = S->isListInitialization();
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXTemporaryObjectExprClass:
      {
          auto S = const_cast<clang::CXXTemporaryObjectExpr*>(llvm::cast<clang::CXXTemporaryObjectExpr>(Expr));
          auto _S = new AST::CXXTemporaryObjectExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->elidable = S->isElidable();
          _S->hadMultipleCandidates = S->hadMultipleCandidates();
          _S->listInitialization = S->isListInitialization();
          _S->stdInitListInitialization = S->isStdInitListInitialization();
          _S->requiresZeroInitialization = S->requiresZeroInitialization();
          _S->numArgs = S->getNumArgs();
          for (auto _E : S->arguments())
          {
              auto _ES = WalkExpression(_E);
              _S->addarguments(_ES);
          }
          _Expr = _S;
          break;
      }
      case clang::Stmt::LambdaExprClass:
      {
          auto S = const_cast<clang::LambdaExpr*>(llvm::cast<clang::LambdaExpr>(Expr));
          auto _S = new AST::LambdaExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->capture_size = S->capture_size();
          _S->callOperator = static_cast<AST::Method*>(WalkDeclaration(S->getCallOperator()));
          _S->isGenericLambda = S->isGenericLambda();
          _S->body = static_cast<AST::CompoundStmt*>(WalkStatement(S->getBody()));
          _S->isMutable = S->isMutable();
          _S->hasExplicitParameters = S->hasExplicitParameters();
          _S->hasExplicitResultType = S->hasExplicitResultType();
          for (auto _E : S->capture_inits())
          {
              auto _ES = WalkExpression(_E);
              _S->addcapture_inits(_ES);
          }
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXScalarValueInitExprClass:
      {
          auto S = const_cast<clang::CXXScalarValueInitExpr*>(llvm::cast<clang::CXXScalarValueInitExpr>(Expr));
          auto _S = new AST::CXXScalarValueInitExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXNewExprClass:
      {
          auto S = const_cast<clang::CXXNewExpr*>(llvm::cast<clang::CXXNewExpr>(Expr));
          auto _S = new AST::CXXNewExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->operatorNew = static_cast<AST::Function*>(WalkDeclaration(S->getOperatorNew()));
          _S->operatorDelete = static_cast<AST::Function*>(WalkDeclaration(S->getOperatorDelete()));
          _S->allocatedType = GetQualifiedType(S->getAllocatedType());
          _S->isArray = S->isArray();
          _S->arraySize = static_cast<AST::Expr*>(WalkExpression(S->getArraySize().getValue()));
          _S->numPlacementArgs = S->getNumPlacementArgs();
          _S->isParenTypeId = S->isParenTypeId();
          _S->isGlobalNew = S->isGlobalNew();
          _S->hasInitializer = S->hasInitializer();
          _S->initializationStyle = (CXXNewExpr::InitializationStyle) S->getInitializationStyle();
          _S->initializer = static_cast<AST::Expr*>(WalkExpression(S->getInitializer()));
          _S->constructExpr = static_cast<AST::CXXConstructExpr*>(WalkExpression(S->getConstructExpr()));
          for (auto _E : S->placement_arguments())
          {
              auto _ES = WalkExpression(_E);
              _S->addplacement_arguments(_ES);
          }
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXDeleteExprClass:
      {
          auto S = const_cast<clang::CXXDeleteExpr*>(llvm::cast<clang::CXXDeleteExpr>(Expr));
          auto _S = new AST::CXXDeleteExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->isGlobalDelete = S->isGlobalDelete();
          _S->isArrayForm = S->isArrayForm();
          _S->isArrayFormAsWritten = S->isArrayFormAsWritten();
          _S->operatorDelete = static_cast<AST::Function*>(WalkDeclaration(S->getOperatorDelete()));
          _S->argument = static_cast<AST::Expr*>(WalkExpression(S->getArgument()));
          _S->destroyedType = GetQualifiedType(S->getDestroyedType());
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXPseudoDestructorExprClass:
      {
          auto S = const_cast<clang::CXXPseudoDestructorExpr*>(llvm::cast<clang::CXXPseudoDestructorExpr>(Expr));
          auto _S = new AST::CXXPseudoDestructorExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->base = static_cast<AST::Expr*>(WalkExpression(S->getBase()));
          _S->hasQualifier = S->hasQualifier();
          _S->isArrow = S->isArrow();
          _S->destroyedType = GetQualifiedType(S->getDestroyedType());
          _Expr = _S;
          break;
      }
      case clang::Stmt::TypeTraitExprClass:
      {
          auto S = const_cast<clang::TypeTraitExpr*>(llvm::cast<clang::TypeTraitExpr>(Expr));
          auto _S = new AST::TypeTraitExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->value = S->getValue();
          _S->numArgs = S->getNumArgs();
          _Expr = _S;
          break;
      }
      case clang::Stmt::ArrayTypeTraitExprClass:
      {
          auto S = const_cast<clang::ArrayTypeTraitExpr*>(llvm::cast<clang::ArrayTypeTraitExpr>(Expr));
          auto _S = new AST::ArrayTypeTraitExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->queriedType = GetQualifiedType(S->getQueriedType());
          _S->value = S->getValue();
          _S->dimensionExpression = static_cast<AST::Expr*>(WalkExpression(S->getDimensionExpression()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::ExpressionTraitExprClass:
      {
          auto S = const_cast<clang::ExpressionTraitExpr*>(llvm::cast<clang::ExpressionTraitExpr>(Expr));
          auto _S = new AST::ExpressionTraitExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->queriedExpression = static_cast<AST::Expr*>(WalkExpression(S->getQueriedExpression()));
          _S->value = S->getValue();
          _Expr = _S;
          break;
      }
      case clang::Stmt::UnresolvedLookupExprClass:
      {
          auto S = const_cast<clang::UnresolvedLookupExpr*>(llvm::cast<clang::UnresolvedLookupExpr>(Expr));
          auto _S = new AST::UnresolvedLookupExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->numDecls = S->getNumDecls();
          _S->hasTemplateKeyword = S->hasTemplateKeyword();
          _S->hasExplicitTemplateArgs = S->hasExplicitTemplateArgs();
          _S->numTemplateArgs = S->getNumTemplateArgs();
          _S->requiresADL = S->requiresADL();
          _S->isOverloaded = S->isOverloaded();
          _Expr = _S;
          break;
      }
      case clang::Stmt::DependentScopeDeclRefExprClass:
      {
          auto S = const_cast<clang::DependentScopeDeclRefExpr*>(llvm::cast<clang::DependentScopeDeclRefExpr>(Expr));
          auto _S = new AST::DependentScopeDeclRefExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->hasTemplateKeyword = S->hasTemplateKeyword();
          _S->hasExplicitTemplateArgs = S->hasExplicitTemplateArgs();
          _S->numTemplateArgs = S->getNumTemplateArgs();
          _Expr = _S;
          break;
      }
      case clang::Stmt::ExprWithCleanupsClass:
      {
          auto S = const_cast<clang::ExprWithCleanups*>(llvm::cast<clang::ExprWithCleanups>(Expr));
          auto _S = new AST::ExprWithCleanups();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->subExpr = static_cast<AST::Expr*>(WalkExpression(S->getSubExpr()));
          _S->numObjects = S->getNumObjects();
          _S->cleanupsHaveSideEffects = S->cleanupsHaveSideEffects();
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXUnresolvedConstructExprClass:
      {
          auto S = const_cast<clang::CXXUnresolvedConstructExpr*>(llvm::cast<clang::CXXUnresolvedConstructExpr>(Expr));
          auto _S = new AST::CXXUnresolvedConstructExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->typeAsWritten = GetQualifiedType(S->getTypeAsWritten());
          _S->isListInitialization = S->isListInitialization();
          _S->arg_size = S->arg_size();
          for (auto _E : S->arguments())
          {
              auto _ES = WalkExpression(_E);
              _S->addarguments(_ES);
          }
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXDependentScopeMemberExprClass:
      {
          auto S = const_cast<clang::CXXDependentScopeMemberExpr*>(llvm::cast<clang::CXXDependentScopeMemberExpr>(Expr));
          auto _S = new AST::CXXDependentScopeMemberExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->isImplicitAccess = S->isImplicitAccess();
          _S->base = static_cast<AST::Expr*>(WalkExpression(S->getBase()));
          _S->baseType = GetQualifiedType(S->getBaseType());
          _S->isArrow = S->isArrow();
          _S->firstQualifierFoundInScope = static_cast<AST::Declaration*>(WalkDeclaration(S->getFirstQualifierFoundInScope()));
          _S->hasTemplateKeyword = S->hasTemplateKeyword();
          _S->hasExplicitTemplateArgs = S->hasExplicitTemplateArgs();
          _S->numTemplateArgs = S->getNumTemplateArgs();
          _Expr = _S;
          break;
      }
      case clang::Stmt::UnresolvedMemberExprClass:
      {
          auto S = const_cast<clang::UnresolvedMemberExpr*>(llvm::cast<clang::UnresolvedMemberExpr>(Expr));
          auto _S = new AST::UnresolvedMemberExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->numDecls = S->getNumDecls();
          _S->hasTemplateKeyword = S->hasTemplateKeyword();
          _S->hasExplicitTemplateArgs = S->hasExplicitTemplateArgs();
          _S->numTemplateArgs = S->getNumTemplateArgs();
          _S->isImplicitAccess = S->isImplicitAccess();
          _S->base = static_cast<AST::Expr*>(WalkExpression(S->getBase()));
          _S->baseType = GetQualifiedType(S->getBaseType());
          _S->hasUnresolvedUsing = S->hasUnresolvedUsing();
          _S->isArrow = S->isArrow();
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXNoexceptExprClass:
      {
          auto S = const_cast<clang::CXXNoexceptExpr*>(llvm::cast<clang::CXXNoexceptExpr>(Expr));
          auto _S = new AST::CXXNoexceptExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->operand = static_cast<AST::Expr*>(WalkExpression(S->getOperand()));
          _S->value = S->getValue();
          _Expr = _S;
          break;
      }
      case clang::Stmt::PackExpansionExprClass:
      {
          auto S = const_cast<clang::PackExpansionExpr*>(llvm::cast<clang::PackExpansionExpr>(Expr));
          auto _S = new AST::PackExpansionExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->pattern = static_cast<AST::Expr*>(WalkExpression(S->getPattern()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::SizeOfPackExprClass:
      {
          auto S = const_cast<clang::SizeOfPackExpr*>(llvm::cast<clang::SizeOfPackExpr>(Expr));
          auto _S = new AST::SizeOfPackExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->pack = static_cast<AST::Declaration*>(WalkDeclaration(S->getPack()));
          _S->packLength = S->getPackLength();
          _S->isPartiallySubstituted = S->isPartiallySubstituted();
          _Expr = _S;
          break;
      }
      case clang::Stmt::SubstNonTypeTemplateParmExprClass:
      {
          auto S = const_cast<clang::SubstNonTypeTemplateParmExpr*>(llvm::cast<clang::SubstNonTypeTemplateParmExpr>(Expr));
          auto _S = new AST::SubstNonTypeTemplateParmExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->replacement = static_cast<AST::Expr*>(WalkExpression(S->getReplacement()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::SubstNonTypeTemplateParmPackExprClass:
      {
          auto S = const_cast<clang::SubstNonTypeTemplateParmPackExpr*>(llvm::cast<clang::SubstNonTypeTemplateParmPackExpr>(Expr));
          auto _S = new AST::SubstNonTypeTemplateParmPackExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->argumentPack = WalkTemplateArgument(S->getArgumentPack());
          _Expr = _S;
          break;
      }
      case clang::Stmt::FunctionParmPackExprClass:
      {
          auto S = const_cast<clang::FunctionParmPackExpr*>(llvm::cast<clang::FunctionParmPackExpr>(Expr));
          auto _S = new AST::FunctionParmPackExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->numExpansions = S->getNumExpansions();
          _Expr = _S;
          break;
      }
      case clang::Stmt::MaterializeTemporaryExprClass:
      {
          auto S = const_cast<clang::MaterializeTemporaryExpr*>(llvm::cast<clang::MaterializeTemporaryExpr>(Expr));
          auto _S = new AST::MaterializeTemporaryExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->temporary = static_cast<AST::Stmt*>(WalkStatement(S->getSubExpr()));
          _S->TemporaryExpr = static_cast<AST::Expr*>(WalkExpression(S->getSubExpr()));
          _S->manglingNumber = S->getManglingNumber();
          _S->isBoundToLvalueReference = S->isBoundToLvalueReference();
          _Expr = _S;
          break;
      }
      case clang::Stmt::CXXFoldExprClass:
      {
          auto S = const_cast<clang::CXXFoldExpr*>(llvm::cast<clang::CXXFoldExpr>(Expr));
          auto _S = new AST::CXXFoldExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->lHS = static_cast<AST::Expr*>(WalkExpression(S->getLHS()));
          _S->rHS = static_cast<AST::Expr*>(WalkExpression(S->getRHS()));
          _S->isRightFold = S->isRightFold();
          _S->isLeftFold = S->isLeftFold();
          _S->pattern = static_cast<AST::Expr*>(WalkExpression(S->getPattern()));
          _S->init = static_cast<AST::Expr*>(WalkExpression(S->getInit()));
          _S->_operator = (BinaryOperatorKind) S->getOperator();
          _Expr = _S;
          break;
      }
      case clang::Stmt::CoawaitExprClass:
      {
          auto S = const_cast<clang::CoawaitExpr*>(llvm::cast<clang::CoawaitExpr>(Expr));
          auto _S = new AST::CoawaitExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->commonExpr = static_cast<AST::Expr*>(WalkExpression(S->getCommonExpr()));
          _S->opaqueValue = static_cast<AST::OpaqueValueExpr*>(WalkExpression(S->getOpaqueValue()));
          _S->readyExpr = static_cast<AST::Expr*>(WalkExpression(S->getReadyExpr()));
          _S->suspendExpr = static_cast<AST::Expr*>(WalkExpression(S->getSuspendExpr()));
          _S->resumeExpr = static_cast<AST::Expr*>(WalkExpression(S->getResumeExpr()));
          _S->isImplicit = S->isImplicit();
          _S->operand = static_cast<AST::Expr*>(WalkExpression(S->getOperand()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::DependentCoawaitExprClass:
      {
          auto S = const_cast<clang::DependentCoawaitExpr*>(llvm::cast<clang::DependentCoawaitExpr>(Expr));
          auto _S = new AST::DependentCoawaitExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->operand = static_cast<AST::Expr*>(WalkExpression(S->getOperand()));
          _S->operatorCoawaitLookup = static_cast<AST::UnresolvedLookupExpr*>(WalkExpression(S->getOperatorCoawaitLookup()));
          _Expr = _S;
          break;
      }
      case clang::Stmt::CoyieldExprClass:
      {
          auto S = const_cast<clang::CoyieldExpr*>(llvm::cast<clang::CoyieldExpr>(Expr));
          auto _S = new AST::CoyieldExpr();
          _S->type = GetQualifiedType(S->getType());
          _S->valueDependent = S->isValueDependent();
          _S->typeDependent = S->isTypeDependent();
          _S->instantiationDependent = S->isInstantiationDependent();
          _S->containsUnexpandedParameterPack = S->containsUnexpandedParameterPack();
          _S->isLValue = S->isLValue();
          _S->isRValue = S->isRValue();
          _S->isXValue = S->isXValue();
          _S->isGLValue = S->isGLValue();
          _S->isOrdinaryOrBitFieldObject = S->isOrdinaryOrBitFieldObject();
          _S->sourceBitField = static_cast<AST::Field*>(WalkDeclaration(S->getSourceBitField()));
          _S->referencedDeclOfCallee = static_cast<AST::Declaration*>(WalkDeclaration(S->getReferencedDeclOfCallee()));
          _S->hasPlaceholderType = S->hasPlaceholderType();
          _S->commonExpr = static_cast<AST::Expr*>(WalkExpression(S->getCommonExpr()));
          _S->opaqueValue = static_cast<AST::OpaqueValueExpr*>(WalkExpression(S->getOpaqueValue()));
          _S->readyExpr = static_cast<AST::Expr*>(WalkExpression(S->getReadyExpr()));
          _S->suspendExpr = static_cast<AST::Expr*>(WalkExpression(S->getSuspendExpr()));
          _S->resumeExpr = static_cast<AST::Expr*>(WalkExpression(S->getResumeExpr()));
          _S->operand = static_cast<AST::Expr*>(WalkExpression(S->getOperand()));
          _Expr = _S;
          break;
      }
      default:
          printf("Unhandled statement kind: %s\n", Expr->getStmtClassName());
      }
  
      return _Expr;
  }
  
  } }
  