diff options
author | Victor Hsieh <victorhsieh@google.com> | 2010-07-07 19:22:33 +0800 |
---|---|---|
committer | Victor Hsieh <victorhsieh@google.com> | 2010-07-07 19:23:06 +0800 |
commit | d8a0d186a362739f385f1a4af35360d5da69e47b (patch) | |
tree | b880b0a01b785463212e4683df8ed11db668a360 /slang_rs_pragma_handler.cpp | |
parent | dddbcc147f06a1ebf1120240ae270285950450b9 (diff) | |
download | frameworks_compile_slang-d8a0d186a362739f385f1a4af35360d5da69e47b.tar.gz frameworks_compile_slang-d8a0d186a362739f385f1a4af35360d5da69e47b.tar.bz2 frameworks_compile_slang-d8a0d186a362739f385f1a4af35360d5da69e47b.zip |
Add pragma rs set_reflect_license
Change-Id: I9c3d9505c108a11b6c3fd85499fbac10da9f2532
Diffstat (limited to 'slang_rs_pragma_handler.cpp')
-rw-r--r-- | slang_rs_pragma_handler.cpp | 55 |
1 files changed, 54 insertions, 1 deletions
diff --git a/slang_rs_pragma_handler.cpp b/slang_rs_pragma_handler.cpp index 3184c01..ed058bc 100644 --- a/slang_rs_pragma_handler.cpp +++ b/slang_rs_pragma_handler.cpp @@ -3,7 +3,8 @@ #include "clang/Lex/Preprocessor.h" /* for class Preprocessor */ #include "clang/Lex/Token.h" /* for class Token */ -#include "clang/Basic/TokenKinds.h" /* for class Token */ +#include "clang/Lex/LiteralSupport.h" /* for class StringLiteralParser */ +#include "clang/Basic/TokenKinds.h" /* for class Token */ #include "clang/Basic/IdentifierTable.h" /* for class IdentifierInfo */ @@ -136,6 +137,20 @@ public: } }; +class RSReflectLicensePragmaHandler : public RSPragmaHandler { +private: + void handleItem(const std::string& Item) { + mContext->setLicenseNote(Item); + } + +public: + RSReflectLicensePragmaHandler(IdentifierInfo* II, RSContext* Context) : RSPragmaHandler(II, Context) { return; } + + void HandlePragma(Preprocessor& PP, Token& FirstToken) { + this->handleOptionalStringLiateralParamPragma(PP, FirstToken); + } +}; + } /* anonymous namespace */ namespace slang { @@ -188,6 +203,14 @@ RSPragmaHandler* RSPragmaHandler::CreatePragmaJavaPackageNameHandler(RSContext* return NULL; } +RSPragmaHandler* RSPragmaHandler::CreatePragmaReflectLicenseHandler(RSContext* Context) { + IdentifierInfo* II = Context->getPreprocessor()->getIdentifierInfo("set_reflect_license"); + if(II != NULL) + return new RSReflectLicensePragmaHandler(II, Context); + else + return NULL; +} + void RSPragmaHandler::handleItemListPragma(Preprocessor& PP, Token& FirstToken) { Token& PragmaToken = FirstToken; @@ -228,4 +251,34 @@ void RSPragmaHandler::handleNonParamPragma(Preprocessor& PP, Token& FirstToken) return; } +void RSPragmaHandler::handleOptionalStringLiateralParamPragma(Preprocessor& PP, Token& FirstToken) { + Token& PragmaToken = FirstToken; + + /* Skip first token, like "set_reflect_license" */ + PP.LexUnexpandedToken(PragmaToken); + + /* Now, the current token must be tok::lpara */ + if(PragmaToken.isNot(tok::l_paren)) + return; + + /* If not ')', eat the following string literal as the license */ + PP.LexUnexpandedToken(PragmaToken); + if(PragmaToken.isNot(tok::r_paren)) { + /* Eat the whole string literal */ + StringLiteralParser StringLiteral(&PragmaToken, 1, PP); + if (StringLiteral.hadError) + printf("RSPragmaHandler::handleOptionalStringLiateralParamPragma: illegal string literal\n"); + else + this->handleItem( std::string(StringLiteral.GetString()) ); + + /* The current token should be tok::r_para */ + PP.LexUnexpandedToken(PragmaToken); + if (PragmaToken.isNot(tok::r_paren)) + printf("RSPragmaHandler::handleOptionalStringLiateralParamPragma: expected a ')'\n"); + } else { + /* If no argument, remove the license */ + this->handleItem( "" ); + } +} + } /* namespace slang */ |