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