slang_rs_pragma_handler.cpp revision be27482cdeaf08576bc39b72a15d35d13014a636
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 286e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines#include "slang_assert.h" 296315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_context.h" 306315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr 31e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesnamespace slang { 32462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaonamespace { // Anonymous namespace 34462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 35462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportTypePragmaHandler : public RSPragmaHandler { 369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private: 376315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr void handleItem(const std::string &Item) { 383fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines mContext->addPragma(this->getName(), Item); 399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mContext->addExportType(Item); 409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public: 436315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr RSExportTypePragmaHandler(llvm::StringRef Name, RSContext *Context) 446315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr : RSPragmaHandler(Name, Context) { return; } 459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 46df5bcce1582d839eead432a5e24435236c90fb05Shih-wei Liao void HandlePragma(clang::Preprocessor &PP, 47df5bcce1582d839eead432a5e24435236c90fb05Shih-wei Liao clang::PragmaIntroducerKind Introducer, 48df5bcce1582d839eead432a5e24435236c90fb05Shih-wei Liao clang::Token &FirstToken) { 499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao this->handleItemListPragma(PP, FirstToken); 509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 51462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}; 52462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 53537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liaoclass RSJavaPackageNamePragmaHandler : public RSPragmaHandler { 549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public: 556315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr RSJavaPackageNamePragmaHandler(llvm::StringRef Name, RSContext *Context) 566315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr : RSPragmaHandler(Name, Context) { return; } 579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 58df5bcce1582d839eead432a5e24435236c90fb05Shih-wei Liao void HandlePragma(clang::Preprocessor &PP, 59df5bcce1582d839eead432a5e24435236c90fb05Shih-wei Liao clang::PragmaIntroducerKind Introducer, 60df5bcce1582d839eead432a5e24435236c90fb05Shih-wei Liao clang::Token &FirstToken) { 6135f5b39f0490953f1fe13ef803b43e3ced9a01d9Stephen Hines // FIXME: Need to validate the extracted package name from pragma. 629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Currently "all chars" specified in pragma will be treated as package 639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // name. 649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 18.1 The Grammar of the Java Programming Language 669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // (http://java.sun.com/docs/books/jls/third_edition/html/syntax.html#18.1) 679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // CompilationUnit: 699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // [[Annotations] package QualifiedIdentifier ; ] {ImportDeclaration} 709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // {TypeDeclaration} 719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // QualifiedIdentifier: 739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Identifier { . Identifier } 749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Identifier: 769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // IDENTIFIER 779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 3.8 Identifiers 799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // (http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.8) 809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::Token &PragmaToken = FirstToken; 849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string PackageName; 859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Skip first token, "java_package_name" 879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP.LexUnexpandedToken(PragmaToken); 88537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao 899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Now, the current token must be clang::tok::lpara 909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PragmaToken.isNot(clang::tok::l_paren)) 919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 93be27482cdeaf08576bc39b72a15d35d13014a636Logan while (PragmaToken.isNot(clang::tok::eod)) { 949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Lex package name 959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP.LexUnexpandedToken(PragmaToken); 969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool Invalid; 989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string Spelling = PP.getSpelling(PragmaToken, &Invalid); 999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!Invalid) 1009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PackageName.append(Spelling); 1019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Pre-mature end (syntax error will be triggered by preprocessor later) 103be27482cdeaf08576bc39b72a15d35d13014a636Logan if (PragmaToken.is(clang::tok::eod) || PragmaToken.is(clang::tok::eof)) { 1049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 1056315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr } else { 10696ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines // Next token is ')' (end of pragma) 1079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::Token &NextTok = PP.LookAhead(0); 1089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (NextTok.is(clang::tok::r_paren)) { 1093fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines mContext->addPragma(this->getName(), PackageName); 1109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mContext->setReflectJavaPackageName(PackageName); 111be27482cdeaf08576bc39b72a15d35d13014a636Logan // Lex until meets clang::tok::eod 1129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao do { 1139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP.LexUnexpandedToken(PragmaToken); 114be27482cdeaf08576bc39b72a15d35d13014a636Logan } while (PragmaToken.isNot(clang::tok::eod)); 1159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 116537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao } 1179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 118537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao } 1199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 1209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 121537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao}; 122537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao 123d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsiehclass RSReflectLicensePragmaHandler : public RSPragmaHandler { 1249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private: 1259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void handleItem(const std::string &Item) { 1263fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines mContext->addPragma(this->getName(), Item); 1279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mContext->setLicenseNote(Item); 1289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public: 1319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSReflectLicensePragmaHandler(llvm::StringRef Name, RSContext *Context) 1329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao : RSPragmaHandler(Name, Context) { return; } 1339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 134df5bcce1582d839eead432a5e24435236c90fb05Shih-wei Liao void HandlePragma(clang::Preprocessor &PP, 135df5bcce1582d839eead432a5e24435236c90fb05Shih-wei Liao clang::PragmaIntroducerKind Introducer, 136df5bcce1582d839eead432a5e24435236c90fb05Shih-wei Liao clang::Token &FirstToken) { 1379d2c0fa6490e09b3ff5603796bce42d97788e5c8Stephen Hines this->handleOptionalStringLiteralParamPragma(PP, FirstToken); 1389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 139d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh}; 140d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh 14196ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hinesclass RSVersionPragmaHandler : public RSPragmaHandler { 14296ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines private: 14396ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines void handleInt(const int v) { 1443fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines std::stringstream ss; 1453fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines ss << v; 1463fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines mContext->addPragma(this->getName(), ss.str()); 14796ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines mContext->setVersion(v); 14896ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines } 14996ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 15096ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines public: 15196ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines RSVersionPragmaHandler(llvm::StringRef Name, RSContext *Context) 15296ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines : RSPragmaHandler(Name, Context) { return; } 15396ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 154df5bcce1582d839eead432a5e24435236c90fb05Shih-wei Liao void HandlePragma(clang::Preprocessor &PP, 155df5bcce1582d839eead432a5e24435236c90fb05Shih-wei Liao clang::PragmaIntroducerKind Introducer, 156df5bcce1582d839eead432a5e24435236c90fb05Shih-wei Liao clang::Token &FirstToken) { 15796ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines this->handleIntegerParamPragma(PP, FirstToken); 15896ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines } 15996ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines}; 16096ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 161e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines} // namespace 162462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1639ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler * 1649ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler::CreatePragmaExportTypeHandler(RSContext *Context) { 1659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return new RSExportTypePragmaHandler("export_type", Context); 166462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 167462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1689ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler * 1699ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler::CreatePragmaJavaPackageNameHandler(RSContext *Context) { 1709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return new RSJavaPackageNamePragmaHandler("java_package_name", Context); 171537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao} 172537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao 1739ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler * 1749ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSPragmaHandler::CreatePragmaReflectLicenseHandler(RSContext *Context) { 175d09df09ae1e354c4fa595ab421b365ce5cd58cf3Stephen Hines return new RSReflectLicensePragmaHandler("set_reflect_license", Context); 176d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh} 177d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh 17896ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen HinesRSPragmaHandler * 17996ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen HinesRSPragmaHandler::CreatePragmaVersionHandler(RSContext *Context) { 18096ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines return new RSVersionPragmaHandler("version", Context); 18196ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines} 18296ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 1839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSPragmaHandler::handleItemListPragma(clang::Preprocessor &PP, 1849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::Token &FirstToken) { 1859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::Token &PragmaToken = FirstToken; 186462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Skip first token, like "export_var" 1889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP.LexUnexpandedToken(PragmaToken); 189462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Now, the current token must be clang::tok::lpara 1919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PragmaToken.isNot(clang::tok::l_paren)) 1929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 193462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 194be27482cdeaf08576bc39b72a15d35d13014a636Logan while (PragmaToken.isNot(clang::tok::eod)) { 1959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Lex variable name 1969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP.LexUnexpandedToken(PragmaToken); 1979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PragmaToken.is(clang::tok::identifier)) 1986315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr this->handleItem(PP.getSpelling(PragmaToken)); 1999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 2009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 201462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 202be27482cdeaf08576bc39b72a15d35d13014a636Logan slangAssert(PragmaToken.isNot(clang::tok::eod)); 203462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP.LexUnexpandedToken(PragmaToken); 205462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PragmaToken.isNot(clang::tok::comma)) 2079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 2089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 210462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 211462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2126315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonrvoid RSPragmaHandler::handleNonParamPragma(clang::Preprocessor &PP, 2136315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr clang::Token &FirstToken) { 2146315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr clang::Token &PragmaToken = FirstToken; 215c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh 2169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Skip first token, like "export_var_all" 2179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP.LexUnexpandedToken(PragmaToken); 218c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh 2199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Should be end immediately 220be27482cdeaf08576bc39b72a15d35d13014a636Logan if (PragmaToken.isNot(clang::tok::eod)) 2219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao fprintf(stderr, "RSPragmaHandler::handleNonParamPragma: " 222be27482cdeaf08576bc39b72a15d35d13014a636Logan "expected a clang::tok::eod\n"); 2239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 224c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh} 225c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh 2269d2c0fa6490e09b3ff5603796bce42d97788e5c8Stephen Hinesvoid RSPragmaHandler::handleOptionalStringLiteralParamPragma( 2279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::Preprocessor &PP, clang::Token &FirstToken) { 2289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::Token &PragmaToken = FirstToken; 229d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh 2309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Skip first token, like "set_reflect_license" 2319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP.LexUnexpandedToken(PragmaToken); 232d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh 2339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Now, the current token must be clang::tok::lpara 2349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PragmaToken.isNot(clang::tok::l_paren)) 2359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 236d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh 2379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // If not ')', eat the following string literal as the license 2389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP.LexUnexpandedToken(PragmaToken); 2399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PragmaToken.isNot(clang::tok::r_paren)) { 2409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Eat the whole string literal 2419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::StringLiteralParser StringLiteral(&PragmaToken, 1, PP); 2429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (StringLiteral.hadError) 2439d2c0fa6490e09b3ff5603796bce42d97788e5c8Stephen Hines fprintf(stderr, "RSPragmaHandler::handleOptionalStringLiteralParamPragma" 2449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ": illegal string literal\n"); 2459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 2466315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr this->handleItem(std::string(StringLiteral.GetString())); 2479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // The current token should be clang::tok::r_para 249d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh PP.LexUnexpandedToken(PragmaToken); 2509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PragmaToken.isNot(clang::tok::r_paren)) 2519d2c0fa6490e09b3ff5603796bce42d97788e5c8Stephen Hines fprintf(stderr, "RSPragmaHandler::handleOptionalStringLiteralParamPragma" 2529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ": expected a ')'\n"); 2539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 2549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // If no argument, remove the license 2556315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr this->handleItem(""); 2569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 257d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh} 258e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 25996ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hinesvoid RSPragmaHandler::handleIntegerParamPragma( 26096ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines clang::Preprocessor &PP, clang::Token &FirstToken) { 26196ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines clang::Token &PragmaToken = FirstToken; 26296ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 26396ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines // Skip first token, like "version" 26496ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines PP.LexUnexpandedToken(PragmaToken); 26596ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 26696ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines // Now, the current token must be clang::tok::lpara 26796ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines if (PragmaToken.isNot(clang::tok::l_paren)) 26896ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines return; 26996ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines PP.LexUnexpandedToken(PragmaToken); 27096ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 27196ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines if (PragmaToken.is(clang::tok::numeric_constant)) { 27296ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines clang::NumericLiteralParser NumericLiteral(PragmaToken.getLiteralData(), 27396ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines PragmaToken.getLiteralData() + PragmaToken.getLength(), 27496ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines PragmaToken.getLocation(), PP); 27596ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines if (NumericLiteral.hadError) { 27696ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines fprintf(stderr, "RSPragmaHandler::handleIntegerParamPragma" 27796ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines ": illegal numeric literal\n"); 27896ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines } else { 27996ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines llvm::APInt Val(32, 0); 28096ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines NumericLiteral.GetIntegerValue(Val); 28196ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines this->handleInt(static_cast<int>(Val.getSExtValue())); 28296ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines } 28396ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines PP.LexUnexpandedToken(PragmaToken); 28496ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines } else { 28596ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines // If no argument, set the version to 0 28696ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines this->handleInt(0); 28796ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines } 28896ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 28996ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines if (PragmaToken.isNot(clang::tok::r_paren)) { 29096ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines fprintf(stderr, "RSPragmaHandler::handleIntegerParamPragma" 29196ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines ": expected a ')'\n"); 29296ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines } 29396ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 29496ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines do { 29596ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines PP.LexUnexpandedToken(PragmaToken); 296be27482cdeaf08576bc39b72a15d35d13014a636Logan } while (PragmaToken.isNot(clang::tok::eod)); 29796ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines} 29896ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 299e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines} // namespace slang 300