summaryrefslogtreecommitdiffstats
path: root/clang/Driver/RewriteTest.cpp
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2008-01-18 01:15:54 +0000
committerFariborz Jahanian <fjahanian@apple.com>2008-01-18 01:15:54 +0000
commit159ee39f4d3382165e8374a6879850808509d827 (patch)
tree8e3894fe53b397c27ade1e18b4db828992e4048b /clang/Driver/RewriteTest.cpp
parent111ede6c007f348b438fe0beb23c9d8a34df13de (diff)
downloadbcm5719-llvm-159ee39f4d3382165e8374a6879850808509d827.tar.gz
bcm5719-llvm-159ee39f4d3382165e8374a6879850808509d827.zip
Insert #pragma once when rewriting a header file.
llvm-svn: 46155
Diffstat (limited to 'clang/Driver/RewriteTest.cpp')
-rw-r--r--clang/Driver/RewriteTest.cpp41
1 files changed, 34 insertions, 7 deletions
diff --git a/clang/Driver/RewriteTest.cpp b/clang/Driver/RewriteTest.cpp
index 8d3035bd121..fb52dfe29f7 100644
--- a/clang/Driver/RewriteTest.cpp
+++ b/clang/Driver/RewriteTest.cpp
@@ -65,6 +65,9 @@ namespace {
ObjCMethodDecl *CurMethodDecl;
RecordDecl *SuperStructDecl;
+ // Needed for header files being rewritten
+ bool IsHeader;
+
static const int OBJC_ABI_VERSION =7 ;
public:
void Initialize(ASTContext &context) {
@@ -96,7 +99,8 @@ namespace {
Rewrite.setSourceMgr(Context->getSourceManager());
// declaring objc_selector outside the parameter list removes a silly
// scope related warning...
- const char *s = "struct objc_selector; struct objc_class;\n"
+ const char *s = "#pragma once\n"
+ "struct objc_selector; struct objc_class;\n"
"#ifndef OBJC_SUPER\n"
"struct objc_super { struct objc_object *o; "
"struct objc_object *superClass; };\n"
@@ -136,15 +140,23 @@ namespace {
"unsigned long extra[5];\n};\n"
"#define __FASTENUMERATIONSTATE\n"
"#endif\n";
-
- Rewrite.InsertText(SourceLocation::getFileLoc(MainFileID, 0),
- s, strlen(s));
+ if (IsHeader) {
+ // insert the whole string when rewriting a header file
+ Rewrite.InsertText(SourceLocation::getFileLoc(MainFileID, 0),
+ s, strlen(s));
+ }
+ else {
+ // Not rewriting header, exclude the #pragma once pragma
+ const char *p = s + strlen("#pragma once\n");
+ Rewrite.InsertText(SourceLocation::getFileLoc(MainFileID, 0),
+ p, strlen(p));
+ }
}
// Top Level Driver code.
virtual void HandleTopLevelDecl(Decl *D);
void HandleDeclInMainFile(Decl *D);
- RewriteTest(Diagnostic &D) : Diags(D) {}
+ RewriteTest(bool isHeader, Diagnostic &D) : Diags(D) {IsHeader = isHeader;}
~RewriteTest();
// Syntactic Rewriting.
@@ -226,8 +238,23 @@ namespace {
};
}
-ASTConsumer *clang::CreateCodeRewriterTest(Diagnostic &Diags) {
- return new RewriteTest(Diags);
+static bool IsHeaderFile(const std::string &Filename) {
+ std::string::size_type DotPos = Filename.rfind('.');
+
+ if (DotPos == std::string::npos) {
+ // no file extension
+ return false;
+ }
+
+ std::string Ext = std::string(Filename.begin()+DotPos+1, Filename.end());
+ // C header: .h
+ // C++ header: .hh or .H;
+ return Ext == "h" || Ext == "hh" || Ext == "H";
+}
+
+ASTConsumer *clang::CreateCodeRewriterTest(const std::string& InFile,
+ Diagnostic &Diags) {
+ return new RewriteTest(IsHeaderFile(InFile), Diags);
}
//===----------------------------------------------------------------------===//
OpenPOWER on IntegriCloud