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 &GTIO, 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