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