%{
  from gyb_syntax_support import *
  from gyb_syntax_support.kinds import SYNTAX_BASE_KINDS
  grouped_nodes = { kind: [] for kind in SYNTAX_BASE_KINDS }
  for node in SYNTAX_NODES:
    grouped_nodes[node.base_kind].append(node)
  # -*- mode: C++ -*-
  # Ignore the following admonition; it applies to the resulting .h file only
}%
//// Automatically Generated From SyntaxKind.h.gyb.
//// Do Not Edit Directly!
//===--------------- SyntaxKind.h - Syntax Kind definitions ---------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 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
//
//===----------------------------------------------------------------------===//

#ifndef SWIFT_SYNTAX_KIND_H
#define SWIFT_SYNTAX_KIND_H

#include "swift/Basic/InlineBitfield.h"
#include "swift/Basic/JSONSerialization.h"

namespace swift {
namespace syntax {

enum class SyntaxKind {
  Token,
% for name, nodes in grouped_nodes.items():
%   for node in nodes:
  ${node.syntax_kind},
%   end
%   if name not in ["Syntax", "SyntaxCollection"]:
%     first_kind = nodes[0].syntax_kind
%     last_kind = nodes[-1].syntax_kind
  First_${name} = ${first_kind},
  Last_${name} = ${last_kind},
%   end
% end

  // NOTE: Unknown must be the last kind.
  Unknown,
};
enum : unsigned {
  NumSyntaxKindBits = countBitsUsed(static_cast<unsigned>(SyntaxKind::Unknown))
};

void dumpSyntaxKind(llvm::raw_ostream &os, const SyntaxKind kind);

/// Whether this kind is a syntax collection.
bool isCollectionKind(SyntaxKind Kind);

bool isDeclKind(SyntaxKind Kind);

bool isTypeKind(SyntaxKind Kind);

bool isStmtKind(SyntaxKind Kind);

bool isExprKind(SyntaxKind Kind);

bool isPatternKind(SyntaxKind Kind);

bool isTokenKind(SyntaxKind Kind);

bool isUnknownKind(SyntaxKind Kind);

SyntaxKind getUnknownKind(SyntaxKind Kind);
} // end namespace syntax

namespace json {

/// Serialization traits for SyntaxKind.
template <>
struct ScalarEnumerationTraits<syntax::SyntaxKind> {
  static void enumeration(Output &out, syntax::SyntaxKind &value) {
    out.enumCase(value, "Token", syntax::SyntaxKind::Token);
    out.enumCase(value, "Unknown", syntax::SyntaxKind::Unknown);
% for node in SYNTAX_NODES:
    out.enumCase(value, "${node.syntax_kind}", syntax::SyntaxKind::${node.syntax_kind});
% end
  }
};

} // end namespace json
} // end namespace swift

#endif // SWIFT_SYNTAX_KIND_H
