Files
swift-mirror/include/swift/Syntax/SyntaxKind.h.gyb
Alex Hoppen 07b449bbd5 [JSONSerialization] Introduce ScalarReferenceTraits
For ScalarTraits, a buffer was always created on the heap to which the
scalar string value was written just to be copied to the output buffer
again. In case the value already exists in a memory buffer it is way
cheaper to avoid the heap allocation and copy it straight to the output
buffer.
2018-07-27 16:20:34 -07:00

129 lines
3.5 KiB
Plaintext

%{
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 - 2018 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"
#include "llvm/Support/YAMLTraits.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
bool parserShallOmitWhenNoChildren(syntax::SyntaxKind Kind);
namespace json {
/// Serialization traits for SyntaxKind.
template <>
struct ScalarReferenceTraits<syntax::SyntaxKind> {
static StringRef stringRef(const syntax::SyntaxKind &value) {
switch (value) {
case syntax::SyntaxKind::Token:
return "\"Token\"";
case syntax::SyntaxKind::Unknown:
return "\"Unknown\"";
% for node in SYNTAX_NODES:
case syntax::SyntaxKind::${node.syntax_kind}:
return "\"${node.syntax_kind}\"";
% end
}
}
static bool mustQuote(StringRef) {
// The string is already quoted. This is more efficient since it does not
// check for characters that need to be escaped
return false;
}
};
} // end namespace json
} // end namespace swift
namespace llvm {
namespace yaml {
/// Deserialization traits for SyntaxKind.
template <>
struct ScalarEnumerationTraits<swift::syntax::SyntaxKind> {
static void enumeration(IO &in, swift::syntax::SyntaxKind &value) {
in.enumCase(value, "Token", swift::syntax::SyntaxKind::Token);
in.enumCase(value, "Unknown", swift::syntax::SyntaxKind::Unknown);
% for node in SYNTAX_NODES:
in.enumCase(value, "${node.syntax_kind}", swift::syntax::SyntaxKind::${node.syntax_kind});
% end
}
};
} // end namespace yaml
} // end namespace llvm
namespace llvm {
raw_ostream &operator<<(raw_ostream &OS, swift::syntax::SyntaxKind Kind);
} // end namespace llvm
#endif // SWIFT_SYNTAX_KIND_H