slang_rs_pragma_handler.cpp revision 9ef2f785e0cc490af678dfd685995dec787321ff
1462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_context.hpp"
2462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_pragma_handler.hpp"
3462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
49ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Basic/TokenKinds.h"
5462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
69ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Lex/LiteralSupport.h"
79ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Lex/Preprocessor.h"
89ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Lex/Token.h"
9462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
10462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaousing namespace slang;
11462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaonamespace {  // Anonymous namespace
13462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoclass RSExportVarPragmaHandler : public RSPragmaHandler {
159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private:
169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void handleItem(const std::string &Item) {
179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mContext->addExportVar(Item);
189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSExportVarPragmaHandler(llvm::StringRef Name, RSContext *Context) :
229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      RSPragmaHandler(Name, Context) {
239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return;
249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
25462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void HandlePragma(clang::Preprocessor &PP, clang::Token &FirstToken) {
279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    this->handleItemListPragma(PP, FirstToken);
289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
29462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao};
30462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
31c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsiehclass RSExportVarAllPragmaHandler : public RSPragmaHandler {
329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSExportVarAllPragmaHandler(llvm::StringRef Name, RSContext *Context) :
349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      RSPragmaHandler(Name, Context) { return; }
359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void HandlePragma(clang::Preprocessor &PP, clang::Token &FirstToken) {
379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    this->handleNonParamPragma(PP, FirstToken);
389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mContext->setExportAllNonStaticVars(true);
399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
40c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh};
41c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh
42462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportFuncPragmaHandler : public RSPragmaHandler {
439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private:
449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void handleItem(const std::string &Item) {
459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mContext->addExportFunc(Item);
469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSExportFuncPragmaHandler(llvm::StringRef Name,
509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                            RSContext *Context) :
519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      RSPragmaHandler(Name, Context) { return; }
529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void HandlePragma(clang::Preprocessor &PP, clang::Token &FirstToken) {
549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    this->handleItemListPragma(PP, FirstToken);
559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
56462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao};
57462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
58c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsiehclass RSExportFuncAllPragmaHandler : public RSPragmaHandler {
599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSExportFuncAllPragmaHandler(llvm::StringRef Name, RSContext *Context) :
619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      RSPragmaHandler(Name, Context) { return; }
629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void HandlePragma(clang::Preprocessor &PP, clang::Token &FirstToken) {
649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    this->handleNonParamPragma(PP, FirstToken);
659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mContext->setExportAllNonStaticFuncs(true);
669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
67c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh};
68c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh
69462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportTypePragmaHandler : public RSPragmaHandler {
709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private:
719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void handleItem(const std::string& Item) {
729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mContext->addExportType(Item);
739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSExportTypePragmaHandler(llvm::StringRef Name, RSContext* Context) :
779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      RSPragmaHandler(Name, Context) { return; }
789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void HandlePragma(clang::Preprocessor& PP, clang::Token& FirstToken) {
809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    this->handleItemListPragma(PP, FirstToken);
819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
82462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao};
83462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
84537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liaoclass RSJavaPackageNamePragmaHandler : public RSPragmaHandler {
859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSJavaPackageNamePragmaHandler(llvm::StringRef Name, RSContext *Context) :
879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      RSPragmaHandler(Name, Context) { return; }
889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void HandlePragma(clang::Preprocessor &PP, clang::Token &FirstToken) {
909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // FIXME: Need to validate the extracted package name from paragma.
919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // Currently "all chars" specified in pragma will be treated as package
929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // name.
939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    //
949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // 18.1 The Grammar of the Java Programming Language
959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // (http://java.sun.com/docs/books/jls/third_edition/html/syntax.html#18.1)
969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    //
979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // CompilationUnit:
989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    //     [[Annotations] package QualifiedIdentifier   ;  ] {ImportDeclaration}
999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    //     {TypeDeclaration}
1009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    //
1019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // QualifiedIdentifier:
1029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    //     Identifier { . Identifier }
1039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    //
1049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // Identifier:
1059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    //     IDENTIFIER
1069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    //
1079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // 3.8 Identifiers
1089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // (http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.8)
1099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    //
1109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    //
1119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    clang::Token &PragmaToken = FirstToken;
1139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    std::string PackageName;
1149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // Skip first token, "java_package_name"
1169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    PP.LexUnexpandedToken(PragmaToken);
117537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao
1189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // Now, the current token must be clang::tok::lpara
1199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (PragmaToken.isNot(clang::tok::l_paren))
1209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return;
1219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    while (PragmaToken.isNot(clang::tok::eom)) {
1239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      // Lex package name
1249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      PP.LexUnexpandedToken(PragmaToken);
1259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      bool Invalid;
1279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      std::string Spelling = PP.getSpelling(PragmaToken, &Invalid);
1289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      if (!Invalid)
1299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        PackageName.append(Spelling);
1309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      // Pre-mature end (syntax error will be triggered by preprocessor later)
1329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      if (PragmaToken.is(clang::tok::eom) || PragmaToken.is(clang::tok::eof))
1339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        break;
1349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      else {
1359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // Next token is ')' (end of paragma)
1369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        const clang::Token &NextTok = PP.LookAhead(0);
1379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (NextTok.is(clang::tok::r_paren)) {
1389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          mContext->setReflectJavaPackageName(PackageName);
1399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          // Lex until meets clang::tok::eom
1409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          do {
1419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            PP.LexUnexpandedToken(PragmaToken);
1429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          } while(PragmaToken.isNot(clang::tok::eom));
1439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          break;
144537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao        }
1459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      }
146537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao    }
1479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return;
1489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
149537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao};
150537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao
151d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsiehclass RSReflectLicensePragmaHandler : public RSPragmaHandler {
1529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private:
1539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void handleItem(const std::string &Item) {
1549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mContext->setLicenseNote(Item);
1559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
1589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSReflectLicensePragmaHandler(llvm::StringRef Name, RSContext *Context)
1599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      : RSPragmaHandler(Name, Context) { return; }
1609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void HandlePragma(clang::Preprocessor &PP, clang::Token &FirstToken) {
1629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    this->handleOptionalStringLiateralParamPragma(PP, FirstToken);
1639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
164d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh};
165d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh
1669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // Anonymous namespace
167462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1689ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler *
1699ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler::CreatePragmaExportVarHandler(RSContext *Context) {
1709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return new RSExportVarPragmaHandler("export_var", Context);
171462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
172462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1739ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler *
1749ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler::CreatePragmaExportVarAllHandler(RSContext *Context) {
1759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return new RSExportVarPragmaHandler("export_var_all", Context);
176c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh}
177c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh
1789ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler *
1799ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler::CreatePragmaExportFuncHandler(RSContext *Context) {
1809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return new RSExportFuncPragmaHandler("export_func", Context);
181462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
182462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1839ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler *
1849ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler::CreatePragmaExportFuncAllHandler(RSContext *Context) {
1859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return new RSExportFuncPragmaHandler("export_func_all", Context);
186c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh}
187c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh
1889ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler *
1899ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler::CreatePragmaExportTypeHandler(RSContext *Context) {
1909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return new RSExportTypePragmaHandler("export_type", Context);
191462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
192462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1939ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler *
1949ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler::CreatePragmaJavaPackageNameHandler(RSContext *Context) {
1959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return new RSJavaPackageNamePragmaHandler("java_package_name", Context);
196537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao}
197537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao
1989ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler *
1999ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler::CreatePragmaReflectLicenseHandler(RSContext *Context) {
2009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return new RSJavaPackageNamePragmaHandler("set_reflect_license", Context);
201d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh}
202d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh
2039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSPragmaHandler::handleItemListPragma(clang::Preprocessor &PP,
2049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                           clang::Token &FirstToken) {
2059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  clang::Token &PragmaToken = FirstToken;
206462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Skip first token, like "export_var"
2089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  PP.LexUnexpandedToken(PragmaToken);
209462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Now, the current token must be clang::tok::lpara
2119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (PragmaToken.isNot(clang::tok::l_paren))
2129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return;
213462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  while (PragmaToken.isNot(clang::tok::eom)) {
2159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // Lex variable name
2169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    PP.LexUnexpandedToken(PragmaToken);
2179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (PragmaToken.is(clang::tok::identifier))
2189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      this->handleItem( PP.getSpelling(PragmaToken) );
2199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    else
2209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      break;
221462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    assert(PragmaToken.isNot(clang::tok::eom));
223462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    PP.LexUnexpandedToken(PragmaToken);
225462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (PragmaToken.isNot(clang::tok::comma))
2279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      break;
2289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
230462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
231462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSPragmaHandler::handleNonParamPragma(clang::Preprocessor& PP,
2339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                           clang::Token& FirstToken) {
2349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  clang::Token& PragmaToken = FirstToken;
235c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh
2369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Skip first token, like "export_var_all"
2379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  PP.LexUnexpandedToken(PragmaToken);
238c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh
2399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Should be end immediately
2409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (PragmaToken.isNot(clang::tok::eom))
2419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    fprintf(stderr, "RSPragmaHandler::handleNonParamPragma: "
2429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    "expected a clang::tok::eom\n");
2439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
244c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh}
245c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh
2469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSPragmaHandler::handleOptionalStringLiateralParamPragma(
2479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    clang::Preprocessor &PP, clang::Token &FirstToken) {
2489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  clang::Token &PragmaToken = FirstToken;
249d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh
2509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Skip first token, like "set_reflect_license"
2519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  PP.LexUnexpandedToken(PragmaToken);
252d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh
2539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Now, the current token must be clang::tok::lpara
2549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (PragmaToken.isNot(clang::tok::l_paren))
2559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return;
256d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh
2579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // If not ')', eat the following string literal as the license
2589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  PP.LexUnexpandedToken(PragmaToken);
2599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (PragmaToken.isNot(clang::tok::r_paren)) {
2609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // Eat the whole string literal
2619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    clang::StringLiteralParser StringLiteral(&PragmaToken, 1, PP);
2629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (StringLiteral.hadError)
2639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      fprintf(stderr, "RSPragmaHandler::handleOptionalStringLiateralParamPragma"
2649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                      ": illegal string literal\n");
2659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    else
2669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      this->handleItem( std::string(StringLiteral.GetString()) );
2679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // The current token should be clang::tok::r_para
269d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh    PP.LexUnexpandedToken(PragmaToken);
2709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (PragmaToken.isNot(clang::tok::r_paren))
2719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      fprintf(stderr, "RSPragmaHandler::handleOptionalStringLiateralParamPragma"
2729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                      ": expected a ')'\n");
2739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  } else {
2749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // If no argument, remove the license
2759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    this->handleItem( "" );
2769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
277d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh}
278