#ifndef NODE_KIND
#define NODE_KIND(NAME, EXTERNAL_NAME)
#endif

#ifndef NODE_ANNOTATION
#define NODE_ANNOTATION(NAME)
#endif

#ifndef NODE_ANNOTATION_CHANGE_KIND
#define NODE_ANNOTATION_CHANGE_KIND(NAME) NODE_ANNOTATION(NAME)
#endif

#ifndef KEY
#define KEY(NAME)
#endif

#ifndef KEY_STRING
#define KEY_STRING(NAME, EXTERNAL_NAME) KEY(EXTERNAL_NAME)
#endif

#ifndef KEY_BOOL
#define KEY_BOOL(NAME, EXTERNAL_NAME) KEY(EXTERNAL_NAME)
#endif

#ifndef KEY_STRING_ARR
#define KEY_STRING_ARR(NAME, EXTERNAL_NAME) KEY(EXTERNAL_NAME)
#endif

#ifndef KEY_UINT
#define KEY_UINT(NAME, EXTERNAL_NAME) KEY(EXTERNAL_NAME)
#endif

#ifndef KNOWN_TYPE
#define KNOWN_TYPE(NAME)
#endif

#ifndef KNOWN_PROTOCOL
#define KNOWN_PROTOCOL(NAME)
#endif

#ifndef DIFF_ITEM_KIND
#define DIFF_ITEM_KIND(NAME)
#endif

#ifndef DIFF_ITEM_KEY_KIND
#define DIFF_ITEM_KEY_KIND(NAME)
#endif

#ifndef SPECIAL_CASE_ID
#define SPECIAL_CASE_ID(NAME)
#endif

#ifndef NODE_KIND_RANGE
#define NODE_KIND_RANGE(ID, First, Last)
#endif

NODE_KIND(Root, Root)
NODE_KIND(Conformance, Conformance)
NODE_KIND(TypeWitness, TypeWitness)
NODE_KIND(TypeNominal, TypeNominal)
NODE_KIND(TypeFunc, TypeFunc)
NODE_KIND(TypeAlias, TypeNameAlias)
NODE_KIND_RANGE(Type, TypeNominal, TypeAlias)

NODE_KIND(DeclFunction, Function)
NODE_KIND(DeclConstructor, Constructor)
NODE_KIND(DeclAccessor, Accessor)
NODE_KIND(DeclSubscript, Subscript)
NODE_KIND_RANGE(DeclAbstractFunc, DeclFunction, DeclSubscript)

NODE_KIND(DeclOperator, OperatorDecl)
NODE_KIND(DeclType, TypeDecl)
NODE_KIND(DeclVar, Var)
NODE_KIND(DeclTypeAlias, TypeAlias)
NODE_KIND(DeclImport, Import)
NODE_KIND(DeclAssociatedType, AssociatedType)
NODE_KIND(DeclMacro, Macro)
NODE_KIND_RANGE(Decl, DeclFunction, DeclMacro)

NODE_ANNOTATION(Added)
NODE_ANNOTATION(Removed)
NODE_ANNOTATION(Updated)
NODE_ANNOTATION(PropertyName)
NODE_ANNOTATION(TypeRewrittenLeft)
NODE_ANNOTATION(TypeRewrittenRight)
NODE_ANNOTATION(RemovedDecl)
NODE_ANNOTATION(RenameOldName)
NODE_ANNOTATION(RenameNewName)
NODE_ANNOTATION(RawTypeLeft)
NODE_ANNOTATION(RawTypeRight)

NODE_ANNOTATION_CHANGE_KIND(ImplicitOptionalToOptional)
NODE_ANNOTATION_CHANGE_KIND(OptionalToImplicitOptional)
NODE_ANNOTATION_CHANGE_KIND(WrapOptional)
NODE_ANNOTATION_CHANGE_KIND(WrapImplicitOptional)
NODE_ANNOTATION_CHANGE_KIND(UnwrapOptional)
NODE_ANNOTATION_CHANGE_KIND(GetterToProperty)
NODE_ANNOTATION_CHANGE_KIND(SetterToProperty)
NODE_ANNOTATION_CHANGE_KIND(DictionaryKeyUpdate)
NODE_ANNOTATION_CHANGE_KIND(OptionalDictionaryKeyUpdate)
NODE_ANNOTATION_CHANGE_KIND(ArrayMemberUpdate)
NODE_ANNOTATION_CHANGE_KIND(OptionalArrayMemberUpdate)
NODE_ANNOTATION_CHANGE_KIND(SimpleStringRepresentableUpdate)
NODE_ANNOTATION_CHANGE_KIND(SimpleOptionalStringRepresentableUpdate)
NODE_ANNOTATION_CHANGE_KIND(TypeAliasDeclToRawRepresentable)
NODE_ANNOTATION_CHANGE_KIND(RevertTypeAliasDeclToRawRepresentable)

NODE_ANNOTATION_CHANGE_KIND(RevertDictionaryKeyUpdate)
NODE_ANNOTATION_CHANGE_KIND(RevertOptionalDictionaryKeyUpdate)
NODE_ANNOTATION_CHANGE_KIND(RevertArrayMemberUpdate)
NODE_ANNOTATION_CHANGE_KIND(RevertOptionalArrayMemberUpdate)
NODE_ANNOTATION_CHANGE_KIND(RevertSimpleStringRepresentableUpdate)
NODE_ANNOTATION_CHANGE_KIND(RevertSimpleOptionalStringRepresentableUpdate)

NODE_ANNOTATION_CHANGE_KIND(ModernizeEnum)
NODE_ANNOTATION_CHANGE_KIND(UnwrapUnmanaged)
NODE_ANNOTATION_CHANGE_KIND(Rename)

// Keep type rewritten the last one.
NODE_ANNOTATION_CHANGE_KIND(TypeRewritten)

KEY_BOOL(IsImplicit, implicit)
KEY_BOOL(IsThrowing, throwing)
KEY_BOOL(IsMutating, mutating)
KEY_BOOL(IsStatic, static)
KEY_BOOL(IsDeprecated, deprecated)
KEY_BOOL(IsOverriding, overriding)
KEY_BOOL(IsProtocolReq, protocolReq)
KEY_BOOL(HasDefaultArg, hasDefaultArg)
KEY_BOOL(IsLet, isLet)
KEY_BOOL(IsOpen, isOpen)
KEY_BOOL(IsInternal, isInternal)
KEY_BOOL(HasStorage, hasStorage)
KEY_BOOL(ReqNewWitnessTableEntry, reqNewWitnessTableEntry)
KEY_BOOL(IsABIPlaceholder, isABIPlaceholder)
KEY_BOOL(IsExternal, isExternal)
KEY_BOOL(IsEnumExhaustive, isEnumExhaustive)
KEY_BOOL(HasMissingDesignatedInitializers, hasMissingDesignatedInitializers)
KEY_BOOL(InheritsConvenienceInitializers, inheritsConvenienceInitializers)
KEY_BOOL(IsFromExtension, isFromExtension)

KEY(kind)

KEY_STRING(Name, name)
KEY_STRING(PrintedName, printedName)
KEY_STRING(Usr, usr)
KEY_STRING(MangledName, mangledName)
KEY_STRING(Location, location)
KEY_STRING(ModuleName, moduleName)
KEY_STRING(SuperclassUsr, superclassUsr)
KEY_STRING(EnumRawTypeName, enumRawTypeName)
KEY_STRING(GenericSig, genericSig)
KEY_STRING(SugaredGenericSig, sugared_genericSig)
KEY_STRING(FuncSelfKind, funcSelfKind)
KEY_STRING(ParamValueOwnership, paramValueOwnership)
KEY_STRING(IntromacOS, intro_Macosx)
KEY_STRING(IntroiOS, intro_iOS)
KEY_STRING(IntrotvOS, intro_tvOS)
KEY_STRING(IntrowatchOS, intro_watchOS)
KEY_STRING(IntrovisionOS, intro_visionOS)
KEY_STRING(Introswift, intro_swift)
KEY_STRING(ObjCName, objc_name)
KEY_STRING(InitKind, init_kind)

KEY_STRING_ARR(SuperclassNames, superclassNames)
KEY_STRING_ARR(ToolArgs, tool_arguments)
KEY_STRING_ARR(SPIGroups, spi_group_names)

KEY_UINT(SelfIndex, selfIndex)
KEY_UINT(FixedBinaryOrder, fixedbinaryorder)
KEY_UINT(JsonFormatVer, json_format_version)

KEY(children)
KEY(conformances)
KEY(typeAttributes)
KEY(declAttributes)
KEY(declKind)
KEY(ownership)
KEY(accessors)
KEY(accessorKind)

KNOWN_TYPE(Optional)
KNOWN_TYPE(ImplicitlyUnwrappedOptional)
KNOWN_TYPE(Void)
KNOWN_TYPE(Unmanaged)
KNOWN_TYPE(Function)
KNOWN_TYPE(Dictionary)
KNOWN_TYPE(String)
KNOWN_TYPE(Array)
KNOWN_TYPE(Int)

KNOWN_PROTOCOL(RawRepresentable)

DIFF_ITEM_KIND(CommonDiffItem)
DIFF_ITEM_KIND(TypeMemberDiffItem)
DIFF_ITEM_KIND(SpecialCaseDiffItem)
DIFF_ITEM_KIND(NoEscapeFuncParam)
DIFF_ITEM_KIND(OverloadedFuncInfo)

#ifndef DIFF_ITEM_KEY_KIND_STRING
#define DIFF_ITEM_KEY_KIND_STRING(NAME) DIFF_ITEM_KEY_KIND(NAME)
#endif

#ifndef DIFF_ITEM_KEY_KIND_INT
#define DIFF_ITEM_KEY_KIND_INT(NAME) DIFF_ITEM_KEY_KIND(NAME)
#endif

DIFF_ITEM_KEY_KIND_STRING(DiffItemKind)
DIFF_ITEM_KEY_KIND_STRING(NodeKind)
DIFF_ITEM_KEY_KIND_STRING(NodeAnnotation)
DIFF_ITEM_KEY_KIND_STRING(Usr)
DIFF_ITEM_KEY_KIND_STRING(ChildIndex)
DIFF_ITEM_KEY_KIND_STRING(LeftUsr)
DIFF_ITEM_KEY_KIND_STRING(LeftComment)
DIFF_ITEM_KEY_KIND_STRING(RightUsr)
DIFF_ITEM_KEY_KIND_STRING(RightComment)
DIFF_ITEM_KEY_KIND_STRING(ModuleName)
DIFF_ITEM_KEY_KIND_STRING(NewTypeName)
DIFF_ITEM_KEY_KIND_STRING(NewPrintedName)
DIFF_ITEM_KEY_KIND_STRING(OldTypeName)
DIFF_ITEM_KEY_KIND_STRING(OldPrintedName)
DIFF_ITEM_KEY_KIND_STRING(SpecialCaseId)

DIFF_ITEM_KEY_KIND_INT(SelfIndex)
DIFF_ITEM_KEY_KIND_INT(RemovedIndex)
DIFF_ITEM_KEY_KIND_INT(Index)

SPECIAL_CASE_ID(NSOpenGLSetOption)
SPECIAL_CASE_ID(NSOpenGLGetOption)
SPECIAL_CASE_ID(StaticAbsToSwiftAbs)
SPECIAL_CASE_ID(NSOpenGLGetVersion)
SPECIAL_CASE_ID(ToIntMax)
SPECIAL_CASE_ID(ToUIntMax)
SPECIAL_CASE_ID(UIApplicationMain)

#undef NODE_KIND_RANGE
#undef SPECIAL_CASE_ID
#undef DIFF_ITEM_KEY_KIND_INT
#undef DIFF_ITEM_KEY_KIND_STRING

#undef DIFF_ITEM_KEY_KIND
#undef DIFF_ITEM_KIND
#undef KNOWN_TYPE
#undef KNOWN_PROTOCOL
#undef KEY_UINT
#undef KEY_STRING_ARR
#undef KEY_BOOL
#undef KEY_STRING
#undef KEY
#undef NODE_ANNOTATION_CHANGE_KIND
#undef NODE_ANNOTATION
#undef NODE_KIND
