slang_rs_pragma_handler.cpp revision 3fd0a94a5cf1656569b1aea07043cc63939dcb46
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 193fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines#include <sstream> 20e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <string> 21e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Basic/TokenKinds.h" 23462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Lex/LiteralSupport.h" 259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Lex/Preprocessor.h" 269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Lex/Token.h" 27462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 286315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_context.h" 296315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr 30e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesnamespace slang { 31462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaonamespace { // Anonymous namespace 33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 34462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportTypePragmaHandler : public RSPragmaHandler { 359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private: 366315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr void handleItem(const std::string &Item) { 373fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines mContext->addPragma(this->getName(), Item); 389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mContext->addExportType(Item); 399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public: 426315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr RSExportTypePragmaHandler(llvm::StringRef Name, RSContext *Context) 436315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr : RSPragmaHandler(Name, Context) { return; } 449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 456315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr void HandlePragma(clang::Preprocessor &PP, clang::Token &FirstToken) { 469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao this->handleItemListPragma(PP, FirstToken); 479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 48462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}; 49462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 50537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liaoclass RSJavaPackageNamePragmaHandler : public RSPragmaHandler { 519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public: 526315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr RSJavaPackageNamePragmaHandler(llvm::StringRef Name, RSContext *Context) 536315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr : RSPragmaHandler(Name, Context) { return; } 549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void HandlePragma(clang::Preprocessor &PP, clang::Token &FirstToken) { 5635f5b39f0490953f1fe13ef803b43e3ced9a01d9Stephen Hines // FIXME: Need to validate the extracted package name from pragma. 579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Currently "all chars" specified in pragma will be treated as package 589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // name. 599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 18.1 The Grammar of the Java Programming Language 619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // (http://java.sun.com/docs/books/jls/third_edition/html/syntax.html#18.1) 629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // CompilationUnit: 649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // [[Annotations] package QualifiedIdentifier ; ] {ImportDeclaration} 659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // {TypeDeclaration} 669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // QualifiedIdentifier: 689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Identifier { . Identifier } 699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Identifier: 719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // IDENTIFIER 729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 3.8 Identifiers 749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // (http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.8) 759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::Token &PragmaToken = FirstToken; 799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string PackageName; 809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Skip first token, "java_package_name" 829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP.LexUnexpandedToken(PragmaToken); 83537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao 849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Now, the current token must be clang::tok::lpara 859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PragmaToken.isNot(clang::tok::l_paren)) 869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao while (PragmaToken.isNot(clang::tok::eom)) { 899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Lex package name 909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP.LexUnexpandedToken(PragmaToken); 919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool Invalid; 939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string Spelling = PP.getSpelling(PragmaToken, &Invalid); 949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!Invalid) 959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PackageName.append(Spelling); 969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Pre-mature end (syntax error will be triggered by preprocessor later) 986315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr if (PragmaToken.is(clang::tok::eom) || PragmaToken.is(clang::tok::eof)) { 999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 1006315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr } else { 10196ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines // Next token is ')' (end of pragma) 1029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::Token &NextTok = PP.LookAhead(0); 1039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (NextTok.is(clang::tok::r_paren)) { 1043fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines mContext->addPragma(this->getName(), PackageName); 1059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mContext->setReflectJavaPackageName(PackageName); 1069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Lex until meets clang::tok::eom 1079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao do { 1089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP.LexUnexpandedToken(PragmaToken); 1096315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr } while (PragmaToken.isNot(clang::tok::eom)); 1109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 111537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao } 1129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 113537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao } 1149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 1159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 116537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao}; 117537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao 118d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsiehclass RSReflectLicensePragmaHandler : public RSPragmaHandler { 1199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private: 1209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void handleItem(const std::string &Item) { 1213fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines mContext->addPragma(this->getName(), Item); 1229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mContext->setLicenseNote(Item); 1239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public: 1269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSReflectLicensePragmaHandler(llvm::StringRef Name, RSContext *Context) 1279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao : RSPragmaHandler(Name, Context) { return; } 1289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void HandlePragma(clang::Preprocessor &PP, clang::Token &FirstToken) { 1309d2c0fa6490e09b3ff5603796bce42d97788e5c8Stephen Hines this->handleOptionalStringLiteralParamPragma(PP, FirstToken); 1319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 132d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh}; 133d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh 13496ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hinesclass RSVersionPragmaHandler : public RSPragmaHandler { 13596ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines private: 13696ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines void handleInt(const int v) { 1373fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines std::stringstream ss; 1383fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines ss << v; 1393fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines mContext->addPragma(this->getName(), ss.str()); 14096ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines mContext->setVersion(v); 14196ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines } 14296ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 14396ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines public: 14496ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines RSVersionPragmaHandler(llvm::StringRef Name, RSContext *Context) 14596ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines : RSPragmaHandler(Name, Context) { return; } 14696ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 14796ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines void HandlePragma(clang::Preprocessor &PP, clang::Token &FirstToken) { 14896ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines this->handleIntegerParamPragma(PP, FirstToken); 14996ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines } 15096ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines}; 15196ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 152e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines} // namespace 153462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1549ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler * 1559ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler::CreatePragmaExportTypeHandler(RSContext *Context) { 1569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return new RSExportTypePragmaHandler("export_type", Context); 157462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 158462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1599ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler * 1609ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler::CreatePragmaJavaPackageNameHandler(RSContext *Context) { 1619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return new RSJavaPackageNamePragmaHandler("java_package_name", Context); 162537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao} 163537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao 1649ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler * 1659ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler::CreatePragmaReflectLicenseHandler(RSContext *Context) { 1669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return new RSJavaPackageNamePragmaHandler("set_reflect_license", Context); 167d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh} 168d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh 16996ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen HinesRSPragmaHandler * 17096ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen HinesRSPragmaHandler::CreatePragmaVersionHandler(RSContext *Context) { 17196ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines return new RSVersionPragmaHandler("version", Context); 17296ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines} 17396ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 1749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSPragmaHandler::handleItemListPragma(clang::Preprocessor &PP, 1759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::Token &FirstToken) { 1769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::Token &PragmaToken = FirstToken; 177462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Skip first token, like "export_var" 1799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP.LexUnexpandedToken(PragmaToken); 180462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Now, the current token must be clang::tok::lpara 1829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PragmaToken.isNot(clang::tok::l_paren)) 1839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 184462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao while (PragmaToken.isNot(clang::tok::eom)) { 1869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Lex variable name 1879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP.LexUnexpandedToken(PragmaToken); 1889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PragmaToken.is(clang::tok::identifier)) 1896315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr this->handleItem(PP.getSpelling(PragmaToken)); 1909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 1919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 192462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao assert(PragmaToken.isNot(clang::tok::eom)); 194462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP.LexUnexpandedToken(PragmaToken); 196462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PragmaToken.isNot(clang::tok::comma)) 1989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 1999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 201462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 202462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2036315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonrvoid RSPragmaHandler::handleNonParamPragma(clang::Preprocessor &PP, 2046315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr clang::Token &FirstToken) { 2056315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr clang::Token &PragmaToken = FirstToken; 206c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh 2079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Skip first token, like "export_var_all" 2089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP.LexUnexpandedToken(PragmaToken); 209c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh 2109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Should be end immediately 2119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PragmaToken.isNot(clang::tok::eom)) 2129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao fprintf(stderr, "RSPragmaHandler::handleNonParamPragma: " 2139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "expected a clang::tok::eom\n"); 2149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 215c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh} 216c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh 2179d2c0fa6490e09b3ff5603796bce42d97788e5c8Stephen Hinesvoid RSPragmaHandler::handleOptionalStringLiteralParamPragma( 2189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::Preprocessor &PP, clang::Token &FirstToken) { 2199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::Token &PragmaToken = FirstToken; 220d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh 2219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Skip first token, like "set_reflect_license" 2229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP.LexUnexpandedToken(PragmaToken); 223d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh 2249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Now, the current token must be clang::tok::lpara 2259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PragmaToken.isNot(clang::tok::l_paren)) 2269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 227d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh 2289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // If not ')', eat the following string literal as the license 2299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP.LexUnexpandedToken(PragmaToken); 2309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PragmaToken.isNot(clang::tok::r_paren)) { 2319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Eat the whole string literal 2329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::StringLiteralParser StringLiteral(&PragmaToken, 1, PP); 2339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (StringLiteral.hadError) 2349d2c0fa6490e09b3ff5603796bce42d97788e5c8Stephen Hines fprintf(stderr, "RSPragmaHandler::handleOptionalStringLiteralParamPragma" 2359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ": illegal string literal\n"); 2369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 2376315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr this->handleItem(std::string(StringLiteral.GetString())); 2389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // The current token should be clang::tok::r_para 240d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh PP.LexUnexpandedToken(PragmaToken); 2419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PragmaToken.isNot(clang::tok::r_paren)) 2429d2c0fa6490e09b3ff5603796bce42d97788e5c8Stephen Hines fprintf(stderr, "RSPragmaHandler::handleOptionalStringLiteralParamPragma" 2439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ": expected a ')'\n"); 2449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 2459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // If no argument, remove the license 2466315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr this->handleItem(""); 2479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 248d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh} 249e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 25096ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hinesvoid RSPragmaHandler::handleIntegerParamPragma( 25196ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines clang::Preprocessor &PP, clang::Token &FirstToken) { 25296ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines clang::Token &PragmaToken = FirstToken; 25396ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 25496ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines // Skip first token, like "version" 25596ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines PP.LexUnexpandedToken(PragmaToken); 25696ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 25796ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines // Now, the current token must be clang::tok::lpara 25896ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines if (PragmaToken.isNot(clang::tok::l_paren)) 25996ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines return; 26096ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines PP.LexUnexpandedToken(PragmaToken); 26196ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 26296ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines if (PragmaToken.is(clang::tok::numeric_constant)) { 26396ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines clang::NumericLiteralParser NumericLiteral(PragmaToken.getLiteralData(), 26496ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines PragmaToken.getLiteralData() + PragmaToken.getLength(), 26596ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines PragmaToken.getLocation(), PP); 26696ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines if (NumericLiteral.hadError) { 26796ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines fprintf(stderr, "RSPragmaHandler::handleIntegerParamPragma" 26896ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines ": illegal numeric literal\n"); 26996ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines } else { 27096ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines llvm::APInt Val(32, 0); 27196ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines NumericLiteral.GetIntegerValue(Val); 27296ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines this->handleInt(static_cast<int>(Val.getSExtValue())); 27396ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines } 27496ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines PP.LexUnexpandedToken(PragmaToken); 27596ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines } else { 27696ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines // If no argument, set the version to 0 27796ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines this->handleInt(0); 27896ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines } 27996ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 28096ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines if (PragmaToken.isNot(clang::tok::r_paren)) { 28196ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines fprintf(stderr, "RSPragmaHandler::handleIntegerParamPragma" 28296ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines ": expected a ')'\n"); 28396ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines } 28496ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 28596ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines do { 28696ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines PP.LexUnexpandedToken(PragmaToken); 28796ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines } while (PragmaToken.isNot(clang::tok::eom)); 28896ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines} 28996ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 290e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines} // namespace slang 291