1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/*
2c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Copyright 2010, The Android Open Source Project
3c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
4c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License");
5c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * you may not use this file except in compliance with the License.
6c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * You may obtain a copy of the License at
7c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
8c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *     http://www.apache.org/licenses/LICENSE-2.0
9c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
10c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Unless required by applicable law or agreed to in writing, software
11c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS,
12c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * See the License for the specific language governing permissions and
14c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * limitations under the License.
15c383a500aa59423264811be3874461bf8adbfea0Zonr Chang */
16c383a500aa59423264811be3874461bf8adbfea0Zonr Chang
17e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#ifndef _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_PRAGMA_HANDLER_H_  // NOLINT
18e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#define _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_PRAGMA_HANDLER_H_
19462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <string>
21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Lex/Pragma.h"
23462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
24462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace clang {
256315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class Token;
266315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class IdentifierInfo;
276315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class Preprocessor;
289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}
29462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
30462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang {
31462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
326315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class RSContext;
33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoclass RSPragmaHandler : public clang::PragmaHandler {
359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao protected:
369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSContext *mContext;
379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSPragmaHandler(llvm::StringRef Name, RSContext *Context)
399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      : clang::PragmaHandler(Name),
409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mContext(Context) {
419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSContext *getContext() const {
439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return this->mContext;
449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
46796e7b1400d3f3f7c07496d88bb48129ea925bb9Jean-Luc Brouillet  virtual void handleItem(const std::string &Item) { }
477aff4a0a124209fdf93ecbcd7aed701d39ba094bStephen Hines  virtual void handleInt(clang::Preprocessor &PP, clang::Token &Tok,
48796e7b1400d3f3f7c07496d88bb48129ea925bb9Jean-Luc Brouillet                         const int v) { }
499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Handle pragma like #pragma rs [name] ([item #1],[item #2],...,[item #i])
519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void handleItemListPragma(clang::Preprocessor &PP,
529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                            clang::Token &FirstToken);
539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Handle pragma like #pragma rs [name]
559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void handleNonParamPragma(clang::Preprocessor &PP,
569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                            clang::Token &FirstToken);
579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Handle pragma like #pragma rs [name] ("string literal")
599d2c0fa6490e09b3ff5603796bce42d97788e5c8Stephen Hines  void handleOptionalStringLiteralParamPragma(clang::Preprocessor &PP,
6096ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines                                              clang::Token &FirstToken);
6196ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines
6296ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines  // Handle pragma like #pragma version (integer)
6396ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines  void handleIntegerParamPragma(clang::Preprocessor &PP,
6496ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines                                clang::Token &FirstToken);
659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  virtual void HandlePragma(clang::Preprocessor &PP,
68df5bcce1582d839eead432a5e24435236c90fb05Shih-wei Liao                            clang::PragmaIntroducerKind Introducer,
699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                            clang::Token &FirstToken) = 0;
70462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao};
71462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
725210d103b523e1f7f8009f178a7face27fbff51eJean-Luc Brouillet// Add handlers for the RS pragmas to the preprocessor.  These handlers
735210d103b523e1f7f8009f178a7face27fbff51eJean-Luc Brouillet// validate the pragmas and, if valid, set fields of the RSContext.
745210d103b523e1f7f8009f178a7face27fbff51eJean-Luc Brouilletvoid AddPragmaHandlers(clang::Preprocessor &PP, RSContext *RsContext);
755210d103b523e1f7f8009f178a7face27fbff51eJean-Luc Brouillet
769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace slang
77462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
78e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#endif  // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_PRAGMA_HANDLER_H_  NOLINT
79