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