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