#include "Utility.h"

std::string clang::ToString(CXString cx_string) {
  std::string string;
  if(cx_string.data!=nullptr) {
    string=clang_getCString(cx_string);
    clang_disposeString(cx_string);
  }
  return string;
}

std::string clang::ToString(CXCursorKind kind) {
  switch (kind) {
  case CXCursor_UnexposedDecl: return "UnexposedDecl";
  case CXCursor_StructDecl: return "StructDecl";
  case CXCursor_UnionDecl: return "UnionDecl";
  case CXCursor_ClassDecl: return "ClassDecl";
  case CXCursor_EnumDecl: return "EnumDecl";
  case CXCursor_FieldDecl: return "FieldDecl";
  case CXCursor_EnumConstantDecl: return "EnumConstantDecl";
  case CXCursor_FunctionDecl: return "FunctionDecl";
  case CXCursor_VarDecl: return "VarDecl";
  case CXCursor_ParmDecl: return "ParmDecl";
  case CXCursor_ObjCInterfaceDecl: return "ObjCInterfaceDecl";
  case CXCursor_ObjCCategoryDecl: return "ObjCCategoryDecl";
  case CXCursor_ObjCProtocolDecl: return "ObjCProtocolDecl";
  case CXCursor_ObjCPropertyDecl: return "ObjCPropertyDecl";
  case CXCursor_ObjCIvarDecl: return "ObjCIvarDecl";
  case CXCursor_ObjCInstanceMethodDecl: return "ObjCInstanceMethodDecl";
  case CXCursor_ObjCClassMethodDecl: return "ObjCClassMethodDecl";
  case CXCursor_ObjCImplementationDecl: return "ObjCImplementationDecl";
  case CXCursor_ObjCCategoryImplDecl: return "ObjCCategoryImplDecl";
  case CXCursor_TypedefDecl: return "TypedefDecl";
  case CXCursor_CXXMethod: return "CXXMethod";
  case CXCursor_Namespace: return "Namespace";
  case CXCursor_LinkageSpec: return "LinkageSpec";
  case CXCursor_Constructor: return "Constructor";
  case CXCursor_Destructor: return "Destructor";
  case CXCursor_ConversionFunction: return "ConversionFunction";
  case CXCursor_TemplateTypeParameter: return "TemplateTypeParameter";
  case CXCursor_NonTypeTemplateParameter: return "NonTypeTemplateParameter";
  case CXCursor_TemplateTemplateParameter: return "TemplateTemplateParameter";
  case CXCursor_FunctionTemplate: return "FunctionTemplate";
  case CXCursor_ClassTemplate: return "ClassTemplate";
  case CXCursor_ClassTemplatePartialSpecialization: return "ClassTemplatePartialSpecialization";
  case CXCursor_NamespaceAlias: return "NamespaceAlias";
  case CXCursor_UsingDirective: return "UsingDirective";
  case CXCursor_UsingDeclaration: return "UsingDeclaration";
  case CXCursor_TypeAliasDecl: return "TypeAliasDecl";
  case CXCursor_ObjCSynthesizeDecl: return "ObjCSynthesizeDecl";
  case CXCursor_ObjCDynamicDecl: return "ObjCDynamicDecl";
  case CXCursor_CXXAccessSpecifier: return "CXXAccessSpecifier";
  //case CXCursor_FirstDecl: return "FirstDecl";
  //case CXCursor_LastDecl: return "LastDecl";
  //case CXCursor_FirstRef: return "FirstRef";
  case CXCursor_ObjCSuperClassRef: return "ObjCSuperClassRef";
  case CXCursor_ObjCProtocolRef: return "ObjCProtocolRef";
  case CXCursor_ObjCClassRef: return "ObjCClassRef";
  case CXCursor_TypeRef: return "TypeRef";
  case CXCursor_CXXBaseSpecifier: return "CXXBaseSpecifier";
  case CXCursor_TemplateRef: return "TemplateRef";
  case CXCursor_NamespaceRef: return "NamespaceRef";
  case CXCursor_MemberRef: return "MemberRef";
  case CXCursor_LabelRef: return "LabelRef";
  case CXCursor_OverloadedDeclRef: return "OverloadedDeclRef";
  case CXCursor_VariableRef: return "VariableRef";
  //case CXCursor_LastRef: return "LastRef";
  //case CXCursor_FirstInvalid: return "FirstInvalid";
  case CXCursor_InvalidFile: return "InvalidFile";
  case CXCursor_NoDeclFound: return "NoDeclFound";
  case CXCursor_NotImplemented: return "NotImplemented";
  case CXCursor_InvalidCode: return "InvalidCode";
  //case CXCursor_LastInvalid: return "LastInvalid";
  //case CXCursor_FirstExpr: return "FirstExpr";
  case CXCursor_UnexposedExpr: return "UnexposedExpr";
  case CXCursor_DeclRefExpr: return "DeclRefExpr";
  case CXCursor_MemberRefExpr: return "MemberRefExpr";
  case CXCursor_CallExpr: return "CallExpr";
  case CXCursor_ObjCMessageExpr: return "ObjCMessageExpr";
  case CXCursor_BlockExpr: return "BlockExpr";
  case CXCursor_IntegerLiteral: return "IntegerLiteral";
  case CXCursor_FloatingLiteral: return "FloatingLiteral";
  case CXCursor_ImaginaryLiteral: return "ImaginaryLiteral";
  case CXCursor_StringLiteral: return "StringLiteral";
  case CXCursor_CharacterLiteral: return "CharacterLiteral";
  case CXCursor_ParenExpr: return "ParenExpr";
  case CXCursor_UnaryOperator: return "UnaryOperator";
  case CXCursor_ArraySubscriptExpr: return "ArraySubscriptExpr";
  case CXCursor_BinaryOperator: return "BinaryOperator";
  case CXCursor_CompoundAssignOperator: return "CompoundAssignOperator";
  case CXCursor_ConditionalOperator: return "ConditionalOperator";
  case CXCursor_CStyleCastExpr: return "CStyleCastExpr";
  case CXCursor_CompoundLiteralExpr: return "CompoundLiteralExpr";
  case CXCursor_InitListExpr: return "InitListExpr";
  case CXCursor_AddrLabelExpr: return "AddrLabelExpr";
  case CXCursor_StmtExpr: return "StmtExpr";
  case CXCursor_GenericSelectionExpr: return "GenericSelectionExpr";
  case CXCursor_GNUNullExpr: return "GNUNullExpr";
  case CXCursor_CXXStaticCastExpr: return "CXXStaticCastExpr";
  case CXCursor_CXXDynamicCastExpr: return "CXXDynamicCastExpr";
  case CXCursor_CXXReinterpretCastExpr: return "CXXReinterpretCastExpr";
  case CXCursor_CXXConstCastExpr: return "CXXConstCastExpr";
  case CXCursor_CXXFunctionalCastExpr: return "CXXFunctionalCastExpr";
  case CXCursor_CXXTypeidExpr: return "CXXTypeidExpr";
  case CXCursor_CXXBoolLiteralExpr: return "CXXBoolLiteralExpr";
  case CXCursor_CXXNullPtrLiteralExpr: return "CXXNullPtrLiteralExpr";
  case CXCursor_CXXThisExpr: return "CXXThisExpr";
  case CXCursor_CXXThrowExpr: return "CXXThrowExpr";
  case CXCursor_CXXNewExpr: return "CXXNewExpr";
  case CXCursor_CXXDeleteExpr: return "CXXDeleteExpr";
  case CXCursor_UnaryExpr: return "UnaryExpr";
  case CXCursor_ObjCStringLiteral: return "ObjCStringLiteral";
  case CXCursor_ObjCEncodeExpr: return "ObjCEncodeExpr";
  case CXCursor_ObjCSelectorExpr: return "ObjCSelectorExpr";
  case CXCursor_ObjCProtocolExpr: return "ObjCProtocolExpr";
  case CXCursor_ObjCBridgedCastExpr: return "ObjCBridgedCastExpr";
  case CXCursor_PackExpansionExpr: return "PackExpansionExpr";
  case CXCursor_SizeOfPackExpr: return "SizeOfPackExpr";
  case CXCursor_LambdaExpr: return "LambdaExpr";
  case CXCursor_ObjCBoolLiteralExpr: return "ObjCBoolLiteralExpr";
  case CXCursor_ObjCSelfExpr: return "ObjCSelfExpr";
  //case CXCursor_LastExpr: return "LastExpr";
  //case CXCursor_FirstStmt: return "FirstStmt";
  case CXCursor_UnexposedStmt: return "UnexposedStmt";
  case CXCursor_LabelStmt: return "LabelStmt";
  case CXCursor_CompoundStmt: return "CompoundStmt";
  case CXCursor_CaseStmt: return "CaseStmt";
  case CXCursor_DefaultStmt: return "DefaultStmt";
  case CXCursor_IfStmt: return "IfStmt";
  case CXCursor_SwitchStmt: return "SwitchStmt";
  case CXCursor_WhileStmt: return "WhileStmt";
  case CXCursor_DoStmt: return "DoStmt";
  case CXCursor_ForStmt: return "ForStmt";
  case CXCursor_GotoStmt: return "GotoStmt";
  case CXCursor_IndirectGotoStmt: return "IndirectGotoStmt";
  case CXCursor_ContinueStmt: return "ContinueStmt";
  case CXCursor_BreakStmt: return "BreakStmt";
  case CXCursor_ReturnStmt: return "ReturnStmt";
  case CXCursor_GCCAsmStmt: return "GCCAsmStmt";
  //case CXCursor_AsmStmt: return "AsmStmt";
  case CXCursor_ObjCAtTryStmt: return "ObjCAtTryStmt";
  case CXCursor_ObjCAtCatchStmt: return "ObjCAtCatchStmt";
  case CXCursor_ObjCAtFinallyStmt: return "ObjCAtFinallyStmt";
  case CXCursor_ObjCAtThrowStmt: return "ObjCAtThrowStmt";
  case CXCursor_ObjCAtSynchronizedStmt: return "ObjCAtSynchronizedStmt";
  case CXCursor_ObjCAutoreleasePoolStmt: return "ObjCAutoreleasePoolStmt";
  case CXCursor_ObjCForCollectionStmt: return "ObjCForCollectionStmt";
  case CXCursor_CXXCatchStmt: return "CXXCatchStmt";
  case CXCursor_CXXTryStmt: return "CXXTryStmt";
  case CXCursor_CXXForRangeStmt: return "CXXForRangeStmt";
  case CXCursor_SEHTryStmt: return "SEHTryStmt";
  case CXCursor_SEHExceptStmt: return "SEHExceptStmt";
  case CXCursor_SEHFinallyStmt: return "SEHFinallyStmt";
  case CXCursor_MSAsmStmt: return "MSAsmStmt";
  case CXCursor_NullStmt: return "NullStmt";
  case CXCursor_DeclStmt: return "DeclStmt";
  case CXCursor_LastStmt: return "LastStmt";
  case CXCursor_TranslationUnit: return "TranslationUnit";
  //case CXCursor_FirstAttr: return "FirstAttr";
  case CXCursor_UnexposedAttr: return "UnexposedAttr";
  case CXCursor_IBActionAttr: return "IBActionAttr";
  case CXCursor_IBOutletAttr: return "IBOutletAttr";
  case CXCursor_IBOutletCollectionAttr: return "IBOutletCollectionAttr";
  case CXCursor_CXXFinalAttr: return "CXXFinalAttr";
  case CXCursor_CXXOverrideAttr: return "CXXOverrideAttr";
  case CXCursor_AnnotateAttr: return "AnnotateAttr";
  case CXCursor_AsmLabelAttr: return "AsmLabelAttr";
  case CXCursor_LastAttr: return "LastAttr";
  case CXCursor_PreprocessingDirective: return "PreprocessingDirective";
  case CXCursor_MacroDefinition: return "MacroDefinition";
  case CXCursor_MacroExpansion: return "MacroExpansion";
  //case CXCursor_MacroInstantiation: return "MacroInstantiation";
  case CXCursor_InclusionDirective: return "InclusionDirective";
  //case CXCursor_FirstPreprocessing: return "FirstPreprocessing";
  //case CXCursor_LastPreprocessing: return "LastPreprocessing";
  case CXCursor_ModuleImportDecl: return "ModuleImportDecl";
  //case CXCursor_FirstExtraDecl: return "FirstExtraDecl";
  case CXCursor_LastExtraDecl: return "LastExtraDecl";
  }
  return "<unknown kind>";
}