slang_rs_pragma_handler.cpp revision c383a500aa59423264811be3874461bf8adbfea0
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
176315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_pragma_handler.h"
18462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Basic/TokenKinds.h"
20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Lex/LiteralSupport.h"
229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Lex/Preprocessor.h"
239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Lex/Token.h"
24462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
256315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_context.h"
266315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
27462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaousing namespace slang;
28462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaonamespace {  // Anonymous namespace
30462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoclass RSExportVarPragmaHandler : public RSPragmaHandler {
329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private:
339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void handleItem(const std::string &Item) {
349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mContext->addExportVar(Item);
359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
386315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  RSExportVarPragmaHandler(llvm::StringRef Name, RSContext *Context)
396315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr      : RSPragmaHandler(Name, Context) {
409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return;
419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
42462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void HandlePragma(clang::Preprocessor &PP, clang::Token &FirstToken) {
449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    this->handleItemListPragma(PP, FirstToken);
459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
46462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao};
47462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
48c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsiehclass RSExportVarAllPragmaHandler : public RSPragmaHandler {
499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
506315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  RSExportVarAllPragmaHandler(llvm::StringRef Name, RSContext *Context)
516315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr      : RSPragmaHandler(Name, Context) { return; }
529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void HandlePragma(clang::Preprocessor &PP, clang::Token &FirstToken) {
549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    this->handleNonParamPragma(PP, FirstToken);
559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mContext->setExportAllNonStaticVars(true);
569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
57c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh};
58c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh
59462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportFuncPragmaHandler : public RSPragmaHandler {
609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private:
619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void handleItem(const std::string &Item) {
629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mContext->addExportFunc(Item);
639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSExportFuncPragmaHandler(llvm::StringRef Name,
676315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr                            RSContext *Context)
686315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr      : RSPragmaHandler(Name, Context) { return; }
699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void HandlePragma(clang::Preprocessor &PP, clang::Token &FirstToken) {
719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    this->handleItemListPragma(PP, FirstToken);
729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
73462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao};
74462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
75c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsiehclass RSExportFuncAllPragmaHandler : public RSPragmaHandler {
769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
776315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  RSExportFuncAllPragmaHandler(llvm::StringRef Name, RSContext *Context)
786315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr      : RSPragmaHandler(Name, Context) { return; }
799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void HandlePragma(clang::Preprocessor &PP, clang::Token &FirstToken) {
819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    this->handleNonParamPragma(PP, FirstToken);
829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mContext->setExportAllNonStaticFuncs(true);
839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
84c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh};
85c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh
86462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportTypePragmaHandler : public RSPragmaHandler {
879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private:
886315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  void handleItem(const std::string &Item) {
899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mContext->addExportType(Item);
909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
936315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  RSExportTypePragmaHandler(llvm::StringRef Name, RSContext *Context)
946315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr      : RSPragmaHandler(Name, Context) { return; }
959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
966315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  void HandlePragma(clang::Preprocessor &PP, clang::Token &FirstToken) {
979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    this->handleItemListPragma(PP, FirstToken);
989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
99462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao};
100462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
101537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liaoclass RSJavaPackageNamePragmaHandler : public RSPragmaHandler {
1029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
1036315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  RSJavaPackageNamePragmaHandler(llvm::StringRef Name, RSContext *Context)
1046315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr      : RSPragmaHandler(Name, Context) { return; }
1059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void HandlePragma(clang::Preprocessor &PP, clang::Token &FirstToken) {
1079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // FIXME: Need to validate the extracted package name from paragma.
1089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // Currently "all chars" specified in pragma will be treated as package
1099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // name.
1109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    //
1119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // 18.1 The Grammar of the Java Programming Language
1129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // (http://java.sun.com/docs/books/jls/third_edition/html/syntax.html#18.1)
1139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    //
1149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // CompilationUnit:
1159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    //     [[Annotations] package QualifiedIdentifier   ;  ] {ImportDeclaration}
1169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    //     {TypeDeclaration}
1179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    //
1189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // QualifiedIdentifier:
1199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    //     Identifier { . Identifier }
1209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    //
1219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // Identifier:
1229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    //     IDENTIFIER
1239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    //
1249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // 3.8 Identifiers
1259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // (http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.8)
1269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    //
1279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    //
1289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    clang::Token &PragmaToken = FirstToken;
1309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    std::string PackageName;
1319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // Skip first token, "java_package_name"
1339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    PP.LexUnexpandedToken(PragmaToken);
134537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao
1359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // Now, the current token must be clang::tok::lpara
1369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (PragmaToken.isNot(clang::tok::l_paren))
1379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return;
1389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    while (PragmaToken.isNot(clang::tok::eom)) {
1409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      // Lex package name
1419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      PP.LexUnexpandedToken(PragmaToken);
1429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      bool Invalid;
1449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      std::string Spelling = PP.getSpelling(PragmaToken, &Invalid);
1459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      if (!Invalid)
1469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        PackageName.append(Spelling);
1479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      // Pre-mature end (syntax error will be triggered by preprocessor later)
1496315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr      if (PragmaToken.is(clang::tok::eom) || PragmaToken.is(clang::tok::eof)) {
1509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        break;
1516315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr      } else {
1529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // Next token is ')' (end of paragma)
1539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        const clang::Token &NextTok = PP.LookAhead(0);
1549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (NextTok.is(clang::tok::r_paren)) {
1559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          mContext->setReflectJavaPackageName(PackageName);
1569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          // Lex until meets clang::tok::eom
1579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          do {
1589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            PP.LexUnexpandedToken(PragmaToken);
1596315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr          } while (PragmaToken.isNot(clang::tok::eom));
1609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          break;
161537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao        }
1629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      }
163537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao    }
1649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return;
1659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
166537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao};
167537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao
168d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsiehclass RSReflectLicensePragmaHandler : public RSPragmaHandler {
1699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private:
1709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void handleItem(const std::string &Item) {
1719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mContext->setLicenseNote(Item);
1729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
1759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSReflectLicensePragmaHandler(llvm::StringRef Name, RSContext *Context)
1769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      : RSPragmaHandler(Name, Context) { return; }
1779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void HandlePragma(clang::Preprocessor &PP, clang::Token &FirstToken) {
1799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    this->handleOptionalStringLiateralParamPragma(PP, FirstToken);
1809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
181d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh};
182d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh
1839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // Anonymous namespace
184462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1859ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler *
1869ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler::CreatePragmaExportVarHandler(RSContext *Context) {
1879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return new RSExportVarPragmaHandler("export_var", Context);
188462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
189462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1909ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler *
1919ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler::CreatePragmaExportVarAllHandler(RSContext *Context) {
1929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return new RSExportVarPragmaHandler("export_var_all", Context);
193c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh}
194c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh
1959ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler *
1969ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler::CreatePragmaExportFuncHandler(RSContext *Context) {
1979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return new RSExportFuncPragmaHandler("export_func", Context);
198462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
199462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2009ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler *
2019ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler::CreatePragmaExportFuncAllHandler(RSContext *Context) {
2029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return new RSExportFuncPragmaHandler("export_func_all", Context);
203c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh}
204c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh
2059ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler *
2069ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler::CreatePragmaExportTypeHandler(RSContext *Context) {
2079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return new RSExportTypePragmaHandler("export_type", Context);
208462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
209462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2109ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler *
2119ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler::CreatePragmaJavaPackageNameHandler(RSContext *Context) {
2129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return new RSJavaPackageNamePragmaHandler("java_package_name", Context);
213537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao}
214537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao
2159ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler *
2169ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler::CreatePragmaReflectLicenseHandler(RSContext *Context) {
2179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return new RSJavaPackageNamePragmaHandler("set_reflect_license", Context);
218d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh}
219d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh
2209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSPragmaHandler::handleItemListPragma(clang::Preprocessor &PP,
2219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                           clang::Token &FirstToken) {
2229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  clang::Token &PragmaToken = FirstToken;
223462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Skip first token, like "export_var"
2259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  PP.LexUnexpandedToken(PragmaToken);
226462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Now, the current token must be clang::tok::lpara
2289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (PragmaToken.isNot(clang::tok::l_paren))
2299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return;
230462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  while (PragmaToken.isNot(clang::tok::eom)) {
2329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // Lex variable name
2339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    PP.LexUnexpandedToken(PragmaToken);
2349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (PragmaToken.is(clang::tok::identifier))
2356315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr      this->handleItem(PP.getSpelling(PragmaToken));
2369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    else
2379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      break;
238462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    assert(PragmaToken.isNot(clang::tok::eom));
240462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    PP.LexUnexpandedToken(PragmaToken);
242462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (PragmaToken.isNot(clang::tok::comma))
2449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      break;
2459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
247462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
248462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2496315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonrvoid RSPragmaHandler::handleNonParamPragma(clang::Preprocessor &PP,
2506315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr                                           clang::Token &FirstToken) {
2516315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  clang::Token &PragmaToken = FirstToken;
252c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh
2539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Skip first token, like "export_var_all"
2549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  PP.LexUnexpandedToken(PragmaToken);
255c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh
2569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Should be end immediately
2579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (PragmaToken.isNot(clang::tok::eom))
2589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    fprintf(stderr, "RSPragmaHandler::handleNonParamPragma: "
2599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    "expected a clang::tok::eom\n");
2609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
261c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh}
262c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh
2639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSPragmaHandler::handleOptionalStringLiateralParamPragma(
2649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    clang::Preprocessor &PP, clang::Token &FirstToken) {
2659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  clang::Token &PragmaToken = FirstToken;
266d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh
2679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Skip first token, like "set_reflect_license"
2689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  PP.LexUnexpandedToken(PragmaToken);
269d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh
2709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Now, the current token must be clang::tok::lpara
2719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (PragmaToken.isNot(clang::tok::l_paren))
2729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return;
273d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh
2749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // If not ')', eat the following string literal as the license
2759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  PP.LexUnexpandedToken(PragmaToken);
2769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (PragmaToken.isNot(clang::tok::r_paren)) {
2779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // Eat the whole string literal
2789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    clang::StringLiteralParser StringLiteral(&PragmaToken, 1, PP);
2799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (StringLiteral.hadError)
2809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      fprintf(stderr, "RSPragmaHandler::handleOptionalStringLiateralParamPragma"
2819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                      ": illegal string literal\n");
2829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    else
2836315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr      this->handleItem(std::string(StringLiteral.GetString()));
2849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // The current token should be clang::tok::r_para
286d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh    PP.LexUnexpandedToken(PragmaToken);
2879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (PragmaToken.isNot(clang::tok::r_paren))
2889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      fprintf(stderr, "RSPragmaHandler::handleOptionalStringLiateralParamPragma"
2899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                      ": expected a ')'\n");
2909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  } else {
2919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // If no argument, remove the license
2926315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr    this->handleItem("");
2939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
294d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh}
295