[cfe-commits] r149677 - in /cfe/trunk: include/clang/Basic/SourceLocation.h include/clang/Lex/Lexer.h lib/Lex/Lexer.cpp unittests/Lex/LexerTest.cpp

Argyrios Kyrtzidis akyrtzi at gmail.com
Thu Feb 2 21:58:29 PST 2012


Author: akirtzidis
Date: Thu Feb  2 23:58:29 2012
New Revision: 149677

URL: http://llvm.org/viewvc/llvm-project?rev=149677&view=rev
Log:
Change Lexer::makeFileCharRange() to have it accept a CharSourceRange
instead of a SourceRange, and handle the case where the range is
a char (not token) range.

Modified:
    cfe/trunk/include/clang/Basic/SourceLocation.h
    cfe/trunk/include/clang/Lex/Lexer.h
    cfe/trunk/lib/Lex/Lexer.cpp
    cfe/trunk/unittests/Lex/LexerTest.cpp

Modified: cfe/trunk/include/clang/Basic/SourceLocation.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/SourceLocation.h?rev=149677&r1=149676&r2=149677&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/SourceLocation.h (original)
+++ cfe/trunk/include/clang/Basic/SourceLocation.h Thu Feb  2 23:58:29 2012
@@ -245,6 +245,7 @@
   /// the last token.  Return false if the end of this range specifies the last
   /// character in the range.
   bool isTokenRange() const { return IsTokenRange; }
+  bool isCharRange() const { return !IsTokenRange; }
   
   SourceLocation getBegin() const { return Range.getBegin(); }
   SourceLocation getEnd() const { return Range.getEnd(); }

Modified: cfe/trunk/include/clang/Lex/Lexer.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/Lexer.h?rev=149677&r1=149676&r2=149677&view=diff
==============================================================================
--- cfe/trunk/include/clang/Lex/Lexer.h (original)
+++ cfe/trunk/include/clang/Lex/Lexer.h Thu Feb  2 23:58:29 2012
@@ -331,11 +331,11 @@
                                       const LangOptions &LangOpts,
                                       SourceLocation *MacroEnd = 0);
 
-  /// \brief Accepts a token source range and returns a character range with
-  /// file locations.
+  /// \brief Accepts a range and returns a character range with file locations.
+  ///
   /// Returns a null range if a part of the range resides inside a macro
   /// expansion or the range does not reside on the same FileID.
-  static CharSourceRange makeFileCharRange(SourceRange TokenRange,
+  static CharSourceRange makeFileCharRange(CharSourceRange Range,
                                            const SourceManager &SM,
                                            const LangOptions &LangOpts);
 

Modified: cfe/trunk/lib/Lex/Lexer.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/Lexer.cpp?rev=149677&r1=149676&r2=149677&view=diff
==============================================================================
--- cfe/trunk/lib/Lex/Lexer.cpp (original)
+++ cfe/trunk/lib/Lex/Lexer.cpp Thu Feb  2 23:58:29 2012
@@ -793,14 +793,17 @@
   return isAtEndOfMacroExpansion(expansionLoc, SM, LangOpts, MacroEnd);
 }
 
-static CharSourceRange makeRangeFromFileLocs(SourceLocation Begin,
-                                             SourceLocation End,
+static CharSourceRange makeRangeFromFileLocs(CharSourceRange Range,
                                              const SourceManager &SM,
                                              const LangOptions &LangOpts) {
+  SourceLocation Begin = Range.getBegin();
+  SourceLocation End = Range.getEnd();
   assert(Begin.isFileID() && End.isFileID());
-  End = Lexer::getLocForEndOfToken(End, 0, SM,LangOpts);
-  if (End.isInvalid())
-    return CharSourceRange();
+  if (Range.isTokenRange()) {
+    End = Lexer::getLocForEndOfToken(End, 0, SM,LangOpts);
+    if (End.isInvalid())
+      return CharSourceRange();
+  }
 
   // Break down the source locations.
   FileID FID;
@@ -817,38 +820,49 @@
   return CharSourceRange::getCharRange(Begin, End);
 }
 
-/// \brief Accepts a token source range and returns a character range with
-/// file locations.
+/// \brief Accepts a range and returns a character range with file locations.
+///
 /// Returns a null range if a part of the range resides inside a macro
 /// expansion or the range does not reside on the same FileID.
-CharSourceRange Lexer::makeFileCharRange(SourceRange TokenRange,
+CharSourceRange Lexer::makeFileCharRange(CharSourceRange Range,
                                          const SourceManager &SM,
                                          const LangOptions &LangOpts) {
-  SourceLocation Begin = TokenRange.getBegin();
-  SourceLocation End = TokenRange.getEnd();
+  SourceLocation Begin = Range.getBegin();
+  SourceLocation End = Range.getEnd();
   if (Begin.isInvalid() || End.isInvalid())
     return CharSourceRange();
 
   if (Begin.isFileID() && End.isFileID())
-    return makeRangeFromFileLocs(Begin, End, SM, LangOpts);
+    return makeRangeFromFileLocs(Range, SM, LangOpts);
 
   if (Begin.isMacroID() && End.isFileID()) {
     if (!isAtStartOfMacroExpansion(Begin, SM, LangOpts, &Begin))
       return CharSourceRange();
-    return makeRangeFromFileLocs(Begin, End, SM, LangOpts);
+    Range.setBegin(Begin);
+    return makeRangeFromFileLocs(Range, SM, LangOpts);
   }
 
   if (Begin.isFileID() && End.isMacroID()) {
-    if (!isAtEndOfMacroExpansion(End, SM, LangOpts, &End))
+    if ((Range.isTokenRange() && !isAtEndOfMacroExpansion(End, SM, LangOpts,
+                                                          &End)) ||
+        (Range.isCharRange() && !isAtStartOfMacroExpansion(End, SM, LangOpts,
+                                                           &End)))
       return CharSourceRange();
-    return makeRangeFromFileLocs(Begin, End, SM, LangOpts);
+    Range.setEnd(End);
+    return makeRangeFromFileLocs(Range, SM, LangOpts);
   }
 
   assert(Begin.isMacroID() && End.isMacroID());
   SourceLocation MacroBegin, MacroEnd;
   if (isAtStartOfMacroExpansion(Begin, SM, LangOpts, &MacroBegin) &&
-      isAtEndOfMacroExpansion(End, SM, LangOpts, &MacroEnd))
-    return makeRangeFromFileLocs(MacroBegin, MacroEnd, SM, LangOpts);
+      ((Range.isTokenRange() && isAtEndOfMacroExpansion(End, SM, LangOpts,
+                                                        &MacroEnd)) ||
+       (Range.isCharRange() && isAtStartOfMacroExpansion(End, SM, LangOpts,
+                                                         &MacroEnd)))) {
+    Range.setBegin(MacroBegin);
+    Range.setEnd(MacroEnd);
+    return makeRangeFromFileLocs(Range, SM, LangOpts);
+  }
 
   FileID FID;
   unsigned BeginOffs;
@@ -866,9 +880,9 @@
   if (Expansion.isMacroArgExpansion() &&
       Expansion.getSpellingLoc().isFileID()) {
     SourceLocation SpellLoc = Expansion.getSpellingLoc();
-    return makeRangeFromFileLocs(SpellLoc.getLocWithOffset(BeginOffs),
-                                 SpellLoc.getLocWithOffset(EndOffs),
-                                 SM, LangOpts);
+    Range.setBegin(SpellLoc.getLocWithOffset(BeginOffs));
+    Range.setEnd(SpellLoc.getLocWithOffset(EndOffs));
+    return makeRangeFromFileLocs(Range, SM, LangOpts);
   }
 
   return CharSourceRange();
@@ -878,11 +892,8 @@
                                const SourceManager &SM,
                                const LangOptions &LangOpts,
                                bool *Invalid) {
-  if (Range.isTokenRange())
-    Range = makeFileCharRange(Range.getAsRange(), SM, LangOpts);
-
-  if (Range.isInvalid() ||
-      Range.getBegin().isMacroID() || Range.getEnd().isMacroID()) {
+  Range = makeFileCharRange(Range, SM, LangOpts);
+  if (Range.isInvalid()) {
     if (Invalid) *Invalid = true;
     return StringRef();
   }

Modified: cfe/trunk/unittests/Lex/LexerTest.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Lex/LexerTest.cpp?rev=149677&r1=149676&r2=149677&view=diff
==============================================================================
--- cfe/trunk/unittests/Lex/LexerTest.cpp (original)
+++ cfe/trunk/unittests/Lex/LexerTest.cpp Thu Feb  2 23:58:29 2012
@@ -115,13 +115,13 @@
   EXPECT_TRUE(Lexer::isAtEndOfMacroExpansion(rsqrLoc, SourceMgr, LangOpts, &Loc));
   EXPECT_EQ(Loc, macroRange.getEnd());
 
-  CharSourceRange range = Lexer::makeFileCharRange(SourceRange(lsqrLoc, idLoc),
-                                                   SourceMgr, LangOpts);
+  CharSourceRange range = Lexer::makeFileCharRange(
+           CharSourceRange::getTokenRange(lsqrLoc, idLoc), SourceMgr, LangOpts);
   EXPECT_TRUE(range.isInvalid());
-  range = Lexer::makeFileCharRange(SourceRange(idLoc, rsqrLoc),
+  range = Lexer::makeFileCharRange(CharSourceRange::getTokenRange(idLoc, rsqrLoc),
                                    SourceMgr, LangOpts);
   EXPECT_TRUE(range.isInvalid());
-  range = Lexer::makeFileCharRange(SourceRange(lsqrLoc, rsqrLoc),
+  range = Lexer::makeFileCharRange(CharSourceRange::getTokenRange(lsqrLoc, rsqrLoc),
                                    SourceMgr, LangOpts);
   EXPECT_TRUE(!range.isTokenRange());
   EXPECT_EQ(range.getAsRange(),
@@ -129,8 +129,8 @@
                         macroRange.getEnd().getLocWithOffset(1)));
 
   StringRef text = Lexer::getSourceText(
-                  CharSourceRange::getTokenRange(SourceRange(lsqrLoc, rsqrLoc)),
-                  SourceMgr, LangOpts);
+                               CharSourceRange::getTokenRange(lsqrLoc, rsqrLoc),
+                               SourceMgr, LangOpts);
   EXPECT_EQ(text, "M(foo)");
 
   SourceLocation macroLsqrLoc = toks[3].getLocation();
@@ -140,19 +140,21 @@
   SourceLocation fileIdLoc = SourceMgr.getSpellingLoc(macroIdLoc);
   SourceLocation fileRsqrLoc = SourceMgr.getSpellingLoc(macroRsqrLoc);
 
-  range = Lexer::makeFileCharRange(SourceRange(macroLsqrLoc, macroIdLoc),
-                                   SourceMgr, LangOpts);
+  range = Lexer::makeFileCharRange(
+      CharSourceRange::getTokenRange(macroLsqrLoc, macroIdLoc),
+      SourceMgr, LangOpts);
   EXPECT_EQ(SourceRange(fileLsqrLoc, fileIdLoc.getLocWithOffset(3)),
             range.getAsRange());
 
-  range = Lexer::makeFileCharRange(SourceRange(macroIdLoc, macroRsqrLoc),
+  range = Lexer::makeFileCharRange(CharSourceRange::getTokenRange(macroIdLoc, macroRsqrLoc),
                                    SourceMgr, LangOpts);
   EXPECT_EQ(SourceRange(fileIdLoc, fileRsqrLoc.getLocWithOffset(1)),
             range.getAsRange());
 
   macroPair = SourceMgr.getExpansionRange(macroLsqrLoc);
-  range = Lexer::makeFileCharRange(SourceRange(macroLsqrLoc, macroRsqrLoc),
-                                   SourceMgr, LangOpts);
+  range = Lexer::makeFileCharRange(
+                     CharSourceRange::getTokenRange(macroLsqrLoc, macroRsqrLoc),
+                     SourceMgr, LangOpts);
   EXPECT_EQ(SourceRange(macroPair.first, macroPair.second.getLocWithOffset(1)),
             range.getAsRange());
 





More information about the cfe-commits mailing list