//===--- SyntaxParserResult.h - Syntax Parser Result Wrapper ---*- C++ -*-===// // // 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 // //===----------------------------------------------------------------------===// #include "llvm/ADT/Optional.h" #include "swift/Parse/ParserResult.h" namespace swift { template class SyntaxParserResult { llvm::Optional SyntaxNode; ParserResult ASTResult; template friend class SyntaxParserResult; public: SyntaxParserResult(std::nullptr_t = nullptr) : SyntaxNode(None), ASTResult(nullptr) {} SyntaxParserResult(ParserStatus Status) : SyntaxNode(None), ASTResult(Status) {} SyntaxParserResult(llvm::Optional SyntaxNode, AST *ASTNode) : SyntaxNode(SyntaxNode), ASTResult(ASTNode) {} SyntaxParserResult(ParserStatus Status, llvm::Optional SyntaxNode, AST *ASTNode) : SyntaxNode(SyntaxNode), ASTResult(makeParserResult(Status, ASTNode)) {} /// Convert from a different but compatible parser result. template ::value>::type> SyntaxParserResult(SyntaxParserResult Other) : SyntaxNode(Other.SyntaxNode), ASTResult(Other.ASTResult) {} bool isNull() const { return ASTResult.isNull(); } bool isNonNull() const { return ASTResult.isNonNull(); } bool isParseError() const { return ASTResult.isParseError(); } bool hasCodeCompletion() const { return ASTResult.hasCodeCompletion(); } void setIsParseError() { return ASTResult.setIsParserError(); } void setHasCodeCompletion() { return ASTResult.setHasCodeCompletion(); } const ParserResult &getASTResult() { return ASTResult; } AST *getAST() const { return ASTResult.get(); } bool hasSyntax() const { return SyntaxNode.hasValue(); } Syntax getSyntax() const { assert(SyntaxNode.hasValue() && "getSyntax from None value"); return *SyntaxNode; } SyntaxParserResult & operator=(SyntaxParserResult R){ std::swap(*this, R); return *this; }; }; /// Create a successful parser result. template static inline SyntaxParserResult makeSyntaxResult(llvm::Optional SyntaxNode, AST *ASTNode) { return SyntaxParserResult(SyntaxNode, ASTNode); } /// Create a result with the specified status. template static inline SyntaxParserResult makeSyntaxResult(ParserStatus Status, llvm::Optional SyntaxNode, AST *ASTNode) { return SyntaxParserResult(Status, SyntaxNode, ASTNode); } /// Create a result (null or non-null) with error and code completion bits set. template static inline SyntaxParserResult makeSyntaxCodeCompletionResult(AST *Result = nullptr) { SyntaxParserResult SR; if (Result) SR = SyntaxParserResult(None, Result); SR.setHasCodeCompletion(); return SR; } } // namespace swift