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