RAIIObjectsForParser.h revision 210299
1200583Srdivacky//===--- RAIIObjectsForParser.h - RAII helpers for the parser ---*- C++ -*-===// 2200583Srdivacky// 3200583Srdivacky// The LLVM Compiler Infrastructure 4200583Srdivacky// 5200583Srdivacky// This file is distributed under the University of Illinois Open Source 6200583Srdivacky// License. See LICENSE.TXT for details. 7200583Srdivacky// 8200583Srdivacky//===----------------------------------------------------------------------===// 9200583Srdivacky// 10200583Srdivacky// This file defines and implements the some simple RAII objects that are used 11200583Srdivacky// by the parser to manage bits in recursion. 12200583Srdivacky// 13200583Srdivacky//===----------------------------------------------------------------------===// 14200583Srdivacky 15200583Srdivacky#ifndef LLVM_CLANG_PARSE_RAII_OBJECTS_FOR_PARSER_H 16200583Srdivacky#define LLVM_CLANG_PARSE_RAII_OBJECTS_FOR_PARSER_H 17200583Srdivacky 18200583Srdivacky#include "clang/Parse/ParseDiagnostic.h" 19200583Srdivacky 20200583Srdivackynamespace clang { 21200583Srdivacky // TODO: move ParsingDeclRAIIObject here. 22200583Srdivacky // TODO: move ParsingClassDefinition here. 23200583Srdivacky // TODO: move TentativeParsingAction here. 24200583Srdivacky 25200583Srdivacky 26200583Srdivacky /// ExtensionRAIIObject - This saves the state of extension warnings when 27200583Srdivacky /// constructed and disables them. When destructed, it restores them back to 28200583Srdivacky /// the way they used to be. This is used to handle __extension__ in the 29200583Srdivacky /// parser. 30200583Srdivacky class ExtensionRAIIObject { 31200583Srdivacky void operator=(const ExtensionRAIIObject &); // DO NOT IMPLEMENT 32200583Srdivacky ExtensionRAIIObject(const ExtensionRAIIObject&); // DO NOT IMPLEMENT 33200583Srdivacky Diagnostic &Diags; 34200583Srdivacky public: 35200583Srdivacky ExtensionRAIIObject(Diagnostic &diags) : Diags(diags) { 36200583Srdivacky Diags.IncrementAllExtensionsSilenced(); 37200583Srdivacky } 38200583Srdivacky 39200583Srdivacky ~ExtensionRAIIObject() { 40200583Srdivacky Diags.DecrementAllExtensionsSilenced(); 41200583Srdivacky } 42200583Srdivacky }; 43200583Srdivacky 44200583Srdivacky /// ColonProtectionRAIIObject - This sets the Parser::ColonIsSacred bool and 45200583Srdivacky /// restores it when destroyed. This says that "foo:" should not be 46200583Srdivacky /// considered a possible typo for "foo::" for error recovery purposes. 47200583Srdivacky class ColonProtectionRAIIObject { 48200583Srdivacky Parser &P; 49200583Srdivacky bool OldVal; 50200583Srdivacky public: 51200583Srdivacky ColonProtectionRAIIObject(Parser &p, bool Value = true) 52200583Srdivacky : P(p), OldVal(P.ColonIsSacred) { 53200583Srdivacky P.ColonIsSacred = Value; 54200583Srdivacky } 55200583Srdivacky 56200583Srdivacky /// restore - This can be used to restore the state early, before the dtor 57200583Srdivacky /// is run. 58200583Srdivacky void restore() { 59200583Srdivacky P.ColonIsSacred = OldVal; 60200583Srdivacky } 61200583Srdivacky 62200583Srdivacky ~ColonProtectionRAIIObject() { 63200583Srdivacky restore(); 64200583Srdivacky } 65200583Srdivacky }; 66200583Srdivacky 67200583Srdivacky /// \brief RAII object that makes '>' behave either as an operator 68200583Srdivacky /// or as the closing angle bracket for a template argument list. 69200583Srdivacky class GreaterThanIsOperatorScope { 70200583Srdivacky bool &GreaterThanIsOperator; 71200583Srdivacky bool OldGreaterThanIsOperator; 72200583Srdivacky public: 73200583Srdivacky GreaterThanIsOperatorScope(bool >IO, bool Val) 74200583Srdivacky : GreaterThanIsOperator(GTIO), OldGreaterThanIsOperator(GTIO) { 75200583Srdivacky GreaterThanIsOperator = Val; 76200583Srdivacky } 77200583Srdivacky 78200583Srdivacky ~GreaterThanIsOperatorScope() { 79200583Srdivacky GreaterThanIsOperator = OldGreaterThanIsOperator; 80200583Srdivacky } 81200583Srdivacky }; 82200583Srdivacky 83210299Sed /// \brief RAII object that makes sure paren/bracket/brace count is correct 84210299Sed /// after declaration/statement parsing, even when there's a parsing error. 85210299Sed class ParenBraceBracketBalancer { 86210299Sed Parser &P; 87210299Sed unsigned short ParenCount, BracketCount, BraceCount; 88210299Sed public: 89210299Sed ParenBraceBracketBalancer(Parser &p) 90210299Sed : P(p), ParenCount(p.ParenCount), BracketCount(p.BracketCount), 91210299Sed BraceCount(p.BraceCount) { } 92210299Sed 93210299Sed ~ParenBraceBracketBalancer() { 94210299Sed P.ParenCount = ParenCount; 95210299Sed P.BracketCount = BracketCount; 96210299Sed P.BraceCount = BraceCount; 97210299Sed } 98210299Sed }; 99210299Sed 100200583Srdivacky} // end namespace clang 101200583Srdivacky 102200583Srdivacky#endif 103