aboutsummaryrefslogtreecommitdiffstats
path: root/slang_rs_pragma_handler.cpp
diff options
context:
space:
mode:
authorVictor Hsieh <victorhsieh@google.com>2010-07-07 19:22:33 +0800
committerVictor Hsieh <victorhsieh@google.com>2010-07-07 19:23:06 +0800
commitd8a0d186a362739f385f1a4af35360d5da69e47b (patch)
treeb880b0a01b785463212e4683df8ed11db668a360 /slang_rs_pragma_handler.cpp
parentdddbcc147f06a1ebf1120240ae270285950450b9 (diff)
downloadframeworks_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.cpp55
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 */