//===--- ASTBridgingWrappers.def - Swift AST Metaprogramming ----*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2023 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
//
// This file defines macros used for bridging macro-metaprogramming with AST
// nodes.
//
//===----------------------------------------------------------------------===//

/// AST_BRIDGING_WRAPPER(Name)
///   The default macro to define a bridging wrapper type.

/// AST_BRIDGING_WRAPPER_NULLABLE(Name)
///   Specifies that both a nullable and non-null variant of the wrapper should
///   be created.
#ifndef AST_BRIDGING_WRAPPER_NULLABLE
#define AST_BRIDGING_WRAPPER_NULLABLE(Name) AST_BRIDGING_WRAPPER(Name)
#endif

/// AST_BRIDGING_WRAPPER_NONNULL(Name)
///   Specifies that only a non-null variant of the wrapper should be created.
#ifndef AST_BRIDGING_WRAPPER_NONNULL
#define AST_BRIDGING_WRAPPER_NONNULL(Name) AST_BRIDGING_WRAPPER(Name)
#endif

/// AST_BRIDGING_WRAPPER_CONST(Name)
///   The default macro to define a const bridging wrapper type.
#ifndef AST_BRIDGING_WRAPPER_CONST
#define AST_BRIDGING_WRAPPER_CONST(Name) AST_BRIDGING_WRAPPER(Name)
#endif

/// AST_BRIDGING_WRAPPER_CONST_NULLABLE(Name)
///   Specifies that both a nullable and non-null variant of the wrapper should
///   be created.
#ifndef AST_BRIDGING_WRAPPER_CONST_NULLABLE
#define AST_BRIDGING_WRAPPER_CONST_NULLABLE(Name) AST_BRIDGING_WRAPPER_CONST(Name)
#endif

/// AST_BRIDGING_WRAPPER_CONST_NONNULL(Name)
///   Specifies that only a non-null variant of the wrapper should be created.
#ifndef AST_BRIDGING_WRAPPER_CONST_NONNULL
#define AST_BRIDGING_WRAPPER_CONST_NONNULL(Name) AST_BRIDGING_WRAPPER_CONST(Name)
#endif

#ifndef DECL
#define DECL(Id, Parent) AST_BRIDGING_WRAPPER_NULLABLE(Id##Decl)
#endif
#define ABSTRACT_DECL(Id, Parent) DECL(Id, Parent)
#include "swift/AST/DeclNodes.def"

#ifndef EXPR
#define EXPR(Id, Parent) AST_BRIDGING_WRAPPER_NONNULL(Id##Expr)
#endif
#define ABSTRACT_EXPR(Id, Parent) EXPR(Id, Parent)
#include "swift/AST/ExprNodes.def"

#ifndef STMT
#define STMT(Id, Parent) AST_BRIDGING_WRAPPER_NONNULL(Id##Stmt)
#endif
#define ABSTRACT_STMT(Id, Parent) STMT(Id, Parent)
#include "swift/AST/StmtNodes.def"

#ifndef TYPEREPR
#define TYPEREPR(Id, Parent) AST_BRIDGING_WRAPPER_NONNULL(Id##TypeRepr)
#endif
#define ABSTRACT_TYPEREPR(Id, Parent) TYPEREPR(Id, Parent)
#include "swift/AST/TypeReprNodes.def"

#ifndef PATTERN
#define PATTERN(Id, Parent) AST_BRIDGING_WRAPPER_NONNULL(Id##Pattern)
#endif
#include "swift/AST/PatternNodes.def"

#ifndef DECL_ATTR
#define SIMPLE_DECL_ATTR(...)
#define DECL_ATTR(_, Id, ...) AST_BRIDGING_WRAPPER_NONNULL(Id##Attr)
#endif
#include "swift/AST/DeclAttr.def"

#ifndef TYPE_ATTR
#define SIMPLE_TYPE_ATTR(...)
#define TYPE_ATTR(SPELLING, CLASS) AST_BRIDGING_WRAPPER_NONNULL(CLASS##TypeAttr)
#endif
#include "swift/AST/TypeAttr.def"

// Some of the base classes need to be nullable to allow them to be used as
// optional parameters.
AST_BRIDGING_WRAPPER_NULLABLE(Decl)
AST_BRIDGING_WRAPPER_NONNULL(DeclContext)
AST_BRIDGING_WRAPPER_NONNULL(SourceFile)
AST_BRIDGING_WRAPPER_NULLABLE(Stmt)
AST_BRIDGING_WRAPPER_NULLABLE(Expr)
AST_BRIDGING_WRAPPER_NULLABLE(Pattern)
AST_BRIDGING_WRAPPER_NULLABLE(TypeRepr)
AST_BRIDGING_WRAPPER_NULLABLE(DeclAttribute)
AST_BRIDGING_WRAPPER_NULLABLE(TypeAttribute)

// Misc AST types to generate wrappers for.
AST_BRIDGING_WRAPPER_NULLABLE(GenericParamList)
AST_BRIDGING_WRAPPER_NULLABLE(TrailingWhereClause)
AST_BRIDGING_WRAPPER_NULLABLE(ParameterList)
AST_BRIDGING_WRAPPER_NULLABLE(PatternBindingInitializer)
AST_BRIDGING_WRAPPER_NULLABLE(DefaultArgumentInitializer)
AST_BRIDGING_WRAPPER_NULLABLE(CustomAttributeInitializer)
AST_BRIDGING_WRAPPER_NONNULL(CustomAttribute)
AST_BRIDGING_WRAPPER_NULLABLE(ArgumentList)
AST_BRIDGING_WRAPPER_NULLABLE(AvailabilitySpec)
AST_BRIDGING_WRAPPER_CONST_NONNULL(AvailabilityMacroMap)
AST_BRIDGING_WRAPPER_NONNULL(PoundAvailableInfo)
AST_BRIDGING_WRAPPER_NONNULL(LifetimeEntry)

// Non-AST types to generate wrappers for.
AST_BRIDGING_WRAPPER_NULLABLE(DiagnosticEngine)

#undef AST_BRIDGING_WRAPPER_NONNULL
#undef AST_BRIDGING_WRAPPER_NULLABLE
#undef AST_BRIDGING_WRAPPER_CONST_NONNULL
#undef AST_BRIDGING_WRAPPER_CONST_NULLABLE
#undef AST_BRIDGING_WRAPPER_CONST
#undef AST_BRIDGING_WRAPPER
