slang_rs_pragma_handler.cpp revision 96ab06cbe40b2d73c0eb614f814cd761d8962b6b
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 19e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <string> 20e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Basic/TokenKinds.h" 22462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Lex/LiteralSupport.h" 249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Lex/Preprocessor.h" 259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Lex/Token.h" 26462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 276315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_context.h" 286315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr 29e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesnamespace slang { 30462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaonamespace { // Anonymous namespace 32462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportTypePragmaHandler : public RSPragmaHandler { 349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private: 356315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr void handleItem(const std::string &Item) { 369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mContext->addExportType(Item); 379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public: 406315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr RSExportTypePragmaHandler(llvm::StringRef Name, RSContext *Context) 416315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr : RSPragmaHandler(Name, Context) { return; } 429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 436315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr void HandlePragma(clang::Preprocessor &PP, clang::Token &FirstToken) { 449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao this->handleItemListPragma(PP, FirstToken); 459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 46462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}; 47462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 48537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liaoclass RSJavaPackageNamePragmaHandler : public RSPragmaHandler { 499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public: 506315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr RSJavaPackageNamePragmaHandler(llvm::StringRef Name, RSContext *Context) 516315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr : RSPragmaHandler(Name, Context) { return; } 529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void HandlePragma(clang::Preprocessor &PP, clang::Token &FirstToken) { 5435f5b39f0490953f1fe13ef803b43e3ced9a01d9Stephen Hines // FIXME: Need to validate the extracted package name from pragma. 559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Currently "all chars" specified in pragma will be treated as package 569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // name. 579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 18.1 The Grammar of the Java Programming Language 599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // (http://java.sun.com/docs/books/jls/third_edition/html/syntax.html#18.1) 609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // CompilationUnit: 629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // [[Annotations] package QualifiedIdentifier ; ] {ImportDeclaration} 639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // {TypeDeclaration} 649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // QualifiedIdentifier: 669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Identifier { . Identifier } 679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Identifier: 699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // IDENTIFIER 709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 3.8 Identifiers 729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // (http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.8) 739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::Token &PragmaToken = FirstToken; 779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string PackageName; 789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Skip first token, "java_package_name" 809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP.LexUnexpandedToken(PragmaToken); 81537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao 829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Now, the current token must be clang::tok::lpara 839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PragmaToken.isNot(clang::tok::l_paren)) 849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao while (PragmaToken.isNot(clang::tok::eom)) { 879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Lex package name 889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP.LexUnexpandedToken(PragmaToken); 899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool Invalid; 919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string Spelling = PP.getSpelling(PragmaToken, &Invalid); 929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!Invalid) 939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PackageName.append(Spelling); 949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Pre-mature end (syntax error will be triggered by preprocessor later) 966315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr if (PragmaToken.is(clang::tok::eom) || PragmaToken.is(clang::tok::eof)) { 979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 986315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr } else { 9996ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines // Next token is ')' (end of pragma) 1009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::Token &NextTok = PP.LookAhead(0); 1019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (NextTok.is(clang::tok::r_paren)) { 1029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mContext->setReflectJavaPackageName(PackageName); 1039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Lex until meets clang::tok::eom 1049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao do { 1059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP.LexUnexpandedToken(PragmaToken); 1066315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr } while (PragmaToken.isNot(clang::tok::eom)); 1079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 108537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao } 1099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 110537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao } 1119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 1129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 113537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao}; 114537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao 115d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsiehclass RSReflectLicensePragmaHandler : public RSPragmaHandler { 1169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private: 1179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void handleItem(const std::string &Item) { 1189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mContext->setLicenseNote(Item); 1199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public: 1229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSReflectLicensePragmaHandler(llvm::StringRef Name, RSContext *Context) 1239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao : RSPragmaHandler(Name, Context) { return; } 1249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void HandlePragma(clang::Preprocessor &PP, clang::Token &FirstToken) { 1269d2c0fa6490e09b3ff5603796bce42d97788e5c8Stephen Hines this->handleOptionalStringLiteralParamPragma(PP, FirstToken); 1279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 128d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh}; 129d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh 13096ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hinesclass RSVersionPragmaHandler : public RSPragmaHandler { 13196ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines private: 13296ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines void handleInt(const int v) { 13396ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines mContext->setVersion(v); 13496ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines } 13596ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 13696ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines public: 13796ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines RSVersionPragmaHandler(llvm::StringRef Name, RSContext *Context) 13896ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines : RSPragmaHandler(Name, Context) { return; } 13996ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 14096ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines void HandlePragma(clang::Preprocessor &PP, clang::Token &FirstToken) { 14196ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines this->handleIntegerParamPragma(PP, FirstToken); 14296ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines } 14396ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines}; 14496ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 145e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines} // namespace 146462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1479ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler * 1489ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler::CreatePragmaExportTypeHandler(RSContext *Context) { 1499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return new RSExportTypePragmaHandler("export_type", Context); 150462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 151462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1529ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler * 1539ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler::CreatePragmaJavaPackageNameHandler(RSContext *Context) { 1549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return new RSJavaPackageNamePragmaHandler("java_package_name", Context); 155537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao} 156537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao 1579ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler * 1589ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler::CreatePragmaReflectLicenseHandler(RSContext *Context) { 1599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return new RSJavaPackageNamePragmaHandler("set_reflect_license", Context); 160d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh} 161d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh 16296ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen HinesRSPragmaHandler * 16396ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen HinesRSPragmaHandler::CreatePragmaVersionHandler(RSContext *Context) { 16496ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines return new RSVersionPragmaHandler("version", Context); 16596ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines} 16696ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 1679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSPragmaHandler::handleItemListPragma(clang::Preprocessor &PP, 1689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::Token &FirstToken) { 1699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::Token &PragmaToken = FirstToken; 170462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Skip first token, like "export_var" 1729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP.LexUnexpandedToken(PragmaToken); 173462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Now, the current token must be clang::tok::lpara 1759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PragmaToken.isNot(clang::tok::l_paren)) 1769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 177462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao while (PragmaToken.isNot(clang::tok::eom)) { 1799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Lex variable name 1809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP.LexUnexpandedToken(PragmaToken); 1819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PragmaToken.is(clang::tok::identifier)) 1826315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr this->handleItem(PP.getSpelling(PragmaToken)); 1839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 1849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 185462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao assert(PragmaToken.isNot(clang::tok::eom)); 187462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP.LexUnexpandedToken(PragmaToken); 189462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PragmaToken.isNot(clang::tok::comma)) 1919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 1929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 194462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 195462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1966315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonrvoid RSPragmaHandler::handleNonParamPragma(clang::Preprocessor &PP, 1976315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr clang::Token &FirstToken) { 1986315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr clang::Token &PragmaToken = FirstToken; 199c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh 2009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Skip first token, like "export_var_all" 2019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP.LexUnexpandedToken(PragmaToken); 202c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh 2039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Should be end immediately 2049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PragmaToken.isNot(clang::tok::eom)) 2059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao fprintf(stderr, "RSPragmaHandler::handleNonParamPragma: " 2069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "expected a clang::tok::eom\n"); 2079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 208c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh} 209c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh 2109d2c0fa6490e09b3ff5603796bce42d97788e5c8Stephen Hinesvoid RSPragmaHandler::handleOptionalStringLiteralParamPragma( 2119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::Preprocessor &PP, clang::Token &FirstToken) { 2129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::Token &PragmaToken = FirstToken; 213d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh 2149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Skip first token, like "set_reflect_license" 2159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP.LexUnexpandedToken(PragmaToken); 216d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh 2179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Now, the current token must be clang::tok::lpara 2189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PragmaToken.isNot(clang::tok::l_paren)) 2199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 220d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh 2219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // If not ')', eat the following string literal as the license 2229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP.LexUnexpandedToken(PragmaToken); 2239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PragmaToken.isNot(clang::tok::r_paren)) { 2249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Eat the whole string literal 2259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::StringLiteralParser StringLiteral(&PragmaToken, 1, PP); 2269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (StringLiteral.hadError) 2279d2c0fa6490e09b3ff5603796bce42d97788e5c8Stephen Hines fprintf(stderr, "RSPragmaHandler::handleOptionalStringLiteralParamPragma" 2289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ": illegal string literal\n"); 2299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 2306315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr this->handleItem(std::string(StringLiteral.GetString())); 2319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // The current token should be clang::tok::r_para 233d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh PP.LexUnexpandedToken(PragmaToken); 2349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PragmaToken.isNot(clang::tok::r_paren)) 2359d2c0fa6490e09b3ff5603796bce42d97788e5c8Stephen Hines fprintf(stderr, "RSPragmaHandler::handleOptionalStringLiteralParamPragma" 2369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ": expected a ')'\n"); 2379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 2389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // If no argument, remove the license 2396315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr this->handleItem(""); 2409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 241d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh} 242e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 24396ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hinesvoid RSPragmaHandler::handleIntegerParamPragma( 24496ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines clang::Preprocessor &PP, clang::Token &FirstToken) { 24596ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines clang::Token &PragmaToken = FirstToken; 24696ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 24796ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines // Skip first token, like "version" 24896ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines PP.LexUnexpandedToken(PragmaToken); 24996ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 25096ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines // Now, the current token must be clang::tok::lpara 25196ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines if (PragmaToken.isNot(clang::tok::l_paren)) 25296ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines return; 25396ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines PP.LexUnexpandedToken(PragmaToken); 25496ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 25596ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines if (PragmaToken.is(clang::tok::numeric_constant)) { 25696ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines clang::NumericLiteralParser NumericLiteral(PragmaToken.getLiteralData(), 25796ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines PragmaToken.getLiteralData() + PragmaToken.getLength(), 25896ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines PragmaToken.getLocation(), PP); 25996ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines if (NumericLiteral.hadError) { 26096ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines fprintf(stderr, "RSPragmaHandler::handleIntegerParamPragma" 26196ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines ": illegal numeric literal\n"); 26296ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines } else { 26396ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines llvm::APInt Val(32, 0); 26496ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines NumericLiteral.GetIntegerValue(Val); 26596ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines this->handleInt(static_cast<int>(Val.getSExtValue())); 26696ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines } 26796ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines PP.LexUnexpandedToken(PragmaToken); 26896ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines } else { 26996ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines // If no argument, set the version to 0 27096ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines this->handleInt(0); 27196ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines } 27296ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 27396ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines if (PragmaToken.isNot(clang::tok::r_paren)) { 27496ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines fprintf(stderr, "RSPragmaHandler::handleIntegerParamPragma" 27596ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines ": expected a ')'\n"); 27696ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines } 27796ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 27896ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines do { 27996ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines PP.LexUnexpandedToken(PragmaToken); 28096ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines } while (PragmaToken.isNot(clang::tok::eom)); 28196ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines} 28296ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 283e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines} // namespace slang 284