%{ from gyb_syntax_support import * # -*- mode: C++ -*- # Ignore the following admonition; it applies to the resulting .h file only }% //// Automatically Generated From SyntaxFactory.h.gyb. //// Do Not Edit Directly! //===------------- SyntaxFactory.h - Syntax Factory definition ------------===// // // 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 // //===----------------------------------------------------------------------===// // // This file defines the SyntaxFactory, one of the most important client-facing // types in lib/Syntax and likely to be very commonly used. // // Effectively a namespace, SyntaxFactory is never instantiated, but is *the* // one-stop shop for making new Syntax nodes. Putting all of these into a // collection of static methods provides a single point of API lookup for // clients' convenience and also allows the library to hide all of the // constructors for all Syntax nodes, as the SyntaxFactory is friend to all. // //===----------------------------------------------------------------------===// #ifndef SWIFT_SYNTAX_FACTORY_H #define SWIFT_SYNTAX_FACTORY_H #include "swift/Syntax/SyntaxNodes.h" #include "swift/Syntax/Trivia.h" #include "llvm/ADT/ArrayRef.h" #include namespace swift { namespace syntax { class SyntaxArena; /// The Syntax factory - the one-stop shop for making new Syntax nodes. struct SyntaxFactory { /// Make any kind of token. static TokenSyntax makeToken(tok Kind, StringRef Text, StringRef LeadingTrivia, StringRef TrailingTrivia, SourcePresence Presence, const RC &Arena = SyntaxArena::make() ); /// Collect a list of tokens into a piece of "unknown" syntax. static UnknownSyntax makeUnknownSyntax(llvm::ArrayRef Tokens, const RC &Arena = SyntaxArena::make() ); static Optional createSyntax(SyntaxKind Kind, llvm::ArrayRef Elements, const RC &Arena = SyntaxArena::make() ); static RC createRaw(SyntaxKind Kind, llvm::ArrayRef> Elements, const RC &Arena = SyntaxArena::make() ); /// Count the number of children for a given syntax node kind, /// returning a pair of mininum and maximum count of children. The gap /// between these two numbers is the number of optional children. static std::pair countChildren(SyntaxKind Kind); static Syntax makeBlankCollectionSyntax(SyntaxKind Kind); % for node in SYNTAX_NODES: % if node.children: % child_params = [] % for child in node.children: % param_type = child.type_name % if child.is_optional: % param_type = "llvm::Optional<%s>" % param_type % end % child_params.append("%s %s" % (param_type, child.name)) % end % child_params = ', '.join(child_params) static ${node.name} make${node.syntax_kind}(${child_params}, const RC &Arena = SyntaxArena::make()); % elif node.is_syntax_collection(): static ${node.name} make${node.syntax_kind}( const std::vector<${node.collection_element_type}> &elts, const RC &Arena = SyntaxArena::make()); % end static ${node.name} makeBlank${node.syntax_kind}( const RC &Arena = SyntaxArena::make() ); % end % for token in SYNTAX_TOKENS: % if token.is_keyword: static TokenSyntax make${token.name}Keyword(StringRef LeadingTrivia, StringRef TrailingTrivia, const RC &Arena = SyntaxArena::make()); % elif token.text: static TokenSyntax make${token.name}Token(StringRef LeadingTrivia, StringRef TrailingTrivia, const RC &Arena = SyntaxArena::make()); % else: static TokenSyntax make${token.name}(StringRef Text, StringRef LeadingTrivia, StringRef TrailingTrivia, const RC &Arena = SyntaxArena::make()); % end % end #pragma mark - Convenience APIs static TupleTypeSyntax makeVoidTupleType( const RC &Arena = SyntaxArena::make() ); /// Creates an labelled TupleTypeElementSyntax with the provided label, /// colon, type and optional trailing comma. static TupleTypeElementSyntax makeTupleTypeElement( llvm::Optional Label, llvm::Optional Colon, TypeSyntax Type, llvm::Optional TrailingComma = llvm::None, const RC &Arena = SyntaxArena::make() ); /// Creates an unlabelled TupleTypeElementSyntax with the provided type and /// optional trailing comma. static TupleTypeElementSyntax makeTupleTypeElement(TypeSyntax Type, llvm::Optional TrailingComma = llvm::None, const RC &Arena = SyntaxArena::make() ); /// Creates a TypeIdentifierSyntax with the provided name and leading/trailing /// trivia. static TypeSyntax makeTypeIdentifier(StringRef TypeName, StringRef LeadingTrivia = {}, StringRef TrailingTrivia = {}, const RC &Arena = SyntaxArena::make() ); /// Creates a GenericParameterSyntax with no inheritance clause and an /// optional trailing comma. static GenericParameterSyntax makeGenericParameter(TokenSyntax Name, llvm::Optional TrailingComma, const RC &Arena = SyntaxArena::make() ); /// Creates a TypeIdentifierSyntax for the `Any` type. static TypeSyntax makeAnyTypeIdentifier(StringRef LeadingTrivia = {}, StringRef TrailingTrivia = {}, const RC &Arena = SyntaxArena::make() ); /// Creates a TypeIdentifierSyntax for the `Self` type. static TypeSyntax makeSelfTypeIdentifier(StringRef LeadingTrivia = {}, StringRef TrailingTrivia = {}, const RC &Arena = SyntaxArena::make() ); /// Creates a TokenSyntax for the `Type` identifier. static TokenSyntax makeTypeToken(StringRef LeadingTrivia = {}, StringRef TrailingTrivia = {}, const RC &Arena = SyntaxArena::make() ); /// Creates a TokenSyntax for the `Protocol` identifier. static TokenSyntax makeProtocolToken(StringRef LeadingTrivia = {}, StringRef TrailingTrivia = {}, const RC &Arena = SyntaxArena::make() ); /// Creates an `==` operator token. static TokenSyntax makeEqualityOperator(StringRef LeadingTrivia = {}, StringRef TrailingTrivia = {}, const RC &Arena = SyntaxArena::make() ); /// Whether a raw node kind `MemberKind` can serve as a member in a syntax /// collection of the given syntax collection kind. static bool canServeAsCollectionMemberRaw(SyntaxKind CollectionKind, SyntaxKind MemberKind); /// Whether a raw node `Member` can serve as a member in a syntax collection /// of the given syntax collection kind. static bool canServeAsCollectionMemberRaw(SyntaxKind CollectionKind, const RC &Member); /// Whether a node `Member` can serve as a member in a syntax collection of /// the given syntax collection kind. static bool canServeAsCollectionMember(SyntaxKind CollectionKind, Syntax Member); }; } } #endif // SWIFT_SYNTAX_FACTORY_H