r316278 - [libclang, bindings]: add spelling location

Masud Rahman via cfe-commits cfe-commits at lists.llvm.org
Mon Oct 23 16:43:05 PDT 2017


I created a new revision to review and to fix the tests:
https://reviews.llvm.org/D39217.

On Sat, Oct 21, 2017 at 6:24 PM, Masud Rahman <llvm at masudrahman.com> wrote:

> Thanks, I will take a look.
>
> On Sat, Oct 21, 2017 at 5:53 PM, Aaron Ballman <aaron at aaronballman.com>
> wrote:
>
>> I've reverted back to green in r316279 due to more bots failing.
>>
>> ~Aaron
>>
>> On Sat, Oct 21, 2017 at 5:35 PM, Aaron Ballman <aaron at aaronballman.com>
>> wrote:
>> > This commit appears to have broken several bots. Can you revert or
>> > quickly fix the issue?
>> >
>> > http://lab.llvm.org:8011/builders/clang-ppc64be-linux/builds/11896
>> > http://lab.llvm.org:8011/builders/clang-s390x-linux/builds/12380
>> >
>> > Thanks!
>> >
>> > ~Aaron
>> >
>> > On Sat, Oct 21, 2017 at 4:53 PM, Masud Rahman via cfe-commits
>> > <cfe-commits at lists.llvm.org> wrote:
>> >> Author: frutiger
>> >> Date: Sat Oct 21 13:53:49 2017
>> >> New Revision: 316278
>> >>
>> >> URL: http://llvm.org/viewvc/llvm-project?rev=316278&view=rev
>> >> Log:
>> >> [libclang, bindings]: add spelling location
>> >>
>> >>  o) Add a 'Location' class that represents the four properties of a
>> >>     physical location
>> >>
>> >>  o) Enhance 'SourceLocation' to provide 'expansion' and 'spelling'
>> >>     locations, maintaining backwards compatibility with existing code
>> by
>> >>     forwarding the four properties to 'expansion'.
>> >>
>> >>  o) Update the implementation to use 'clang_getExpansionLocation'
>> >>     instead of the deprecated 'clang_getInstantiationLocation', which
>> >>     has been present since 2011.
>> >>
>> >>  o) Update the implementation of 'clang_getSpellingLocation' to
>> actually
>> >>     obtain spelling location instead of file location.
>> >>
>> >> Modified:
>> >>     cfe/trunk/bindings/python/clang/cindex.py
>> >>     cfe/trunk/bindings/python/tests/cindex/test_location.py
>> >>     cfe/trunk/tools/libclang/CXSourceLocation.cpp
>> >>
>> >> Modified: cfe/trunk/bindings/python/clang/cindex.py
>> >> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/bindings/pytho
>> n/clang/cindex.py?rev=316278&r1=316277&r2=316278&view=diff
>> >> ============================================================
>> ==================
>> >> --- cfe/trunk/bindings/python/clang/cindex.py (original)
>> >> +++ cfe/trunk/bindings/python/clang/cindex.py Sat Oct 21 13:53:49 2017
>> >> @@ -214,25 +214,45 @@ class _CXString(Structure):
>> >>          assert isinstance(res, _CXString)
>> >>          return conf.lib.clang_getCString(res)
>> >>
>> >> +class Location(object):
>> >> +    """A Location is a specific kind of source location.  A
>> SourceLocation
>> >> +    refers to several kinds of locations (e.g.  spelling location vs.
>> expansion
>> >> +    location)."""
>> >> +
>> >> +    def __init__(self, file, line, column, offset):
>> >> +        self._file   = File(file) if file else None
>> >> +        self._line   = int(line.value)
>> >> +        self._column = int(column.value)
>> >> +        self._offset = int(offset.value)
>> >> +
>> >> +
>> >> +    @property
>> >> +    def file(self):
>> >> +        """Get the file represented by this source location."""
>> >> +        return self._file
>> >> +
>> >> +    @property
>> >> +    def line(self):
>> >> +        """Get the line represented by this source location."""
>> >> +        return self._line
>> >> +
>> >> +    @property
>> >> +    def column(self):
>> >> +        """Get the column represented by this source location."""
>> >> +        return self._column
>> >> +
>> >> +    @property
>> >> +    def offset(self):
>> >> +        """Get the file offset represented by this source location."""
>> >> +        return self._offset
>> >>
>> >>  class SourceLocation(Structure):
>> >>      """
>> >>      A SourceLocation represents a particular location within a source
>> file.
>> >>      """
>> >>      _fields_ = [("ptr_data", c_void_p * 2), ("int_data", c_uint)]
>> >> -    _data = None
>> >> -
>> >> -    def _get_instantiation(self):
>> >> -        if self._data is None:
>> >> -            f, l, c, o = c_object_p(), c_uint(), c_uint(), c_uint()
>> >> -            conf.lib.clang_getInstantiationLocation(self, byref(f),
>> byref(l),
>> >> -                    byref(c), byref(o))
>> >> -            if f:
>> >> -                f = File(f)
>> >> -            else:
>> >> -                f = None
>> >> -            self._data = (f, int(l.value), int(c.value), int(o.value))
>> >> -        return self._data
>> >> +    _expansion = None
>> >> +    _spelling = None
>> >>
>> >>      @staticmethod
>> >>      def from_position(tu, file, line, column):
>> >> @@ -253,24 +273,72 @@ class SourceLocation(Structure):
>> >>          return conf.lib.clang_getLocationForOffset(tu, file, offset)
>> >>
>> >>      @property
>> >> +    def expansion(self):
>> >> +        """
>> >> +        The source location where then entity this object is
>> referring to is
>> >> +        expanded.
>> >> +        """
>> >> +        if not self._expansion:
>> >> +            file   = c_object_p()
>> >> +            line   = c_uint()
>> >> +            column = c_uint()
>> >> +            offset = c_uint()
>> >> +            conf.lib.clang_getExpansionLocation(self,
>> >> +                                                byref(file),
>> >> +                                                byref(line),
>> >> +                                                byref(column),
>> >> +                                                byref(offset))
>> >> +
>> >> +            self._expansion = Location(file, line, column, offset)
>> >> +        return self._expansion
>> >> +
>> >> +    @property
>> >> +    def spelling(self):
>> >> +        """
>> >> +        The source location where then entity this object is
>> referring to is
>> >> +        written.
>> >> +        """
>> >> +        if not self._spelling:
>> >> +            file   = c_object_p()
>> >> +            line   = c_uint()
>> >> +            column = c_uint()
>> >> +            offset = c_uint()
>> >> +            conf.lib.clang_getSpellingLocation(self,
>> >> +                                               byref(file),
>> >> +                                               byref(line),
>> >> +                                               byref(column),
>> >> +                                               byref(offset))
>> >> +
>> >> +            self._spelling = Location(file, line, column, offset)
>> >> +        return self._spelling
>> >> +
>> >> +    @property
>> >>      def file(self):
>> >> -        """Get the file represented by this source location."""
>> >> -        return self._get_instantiation()[0]
>> >> +        """Get the file represented by this source location.
>> >> +
>> >> +        DEPRECATED: use expansion.file."""
>> >> +        return self.expansion.file
>> >>
>> >>      @property
>> >>      def line(self):
>> >> -        """Get the line represented by this source location."""
>> >> -        return self._get_instantiation()[1]
>> >> +        """Get the line represented by this source location.
>> >> +
>> >> +        DEPRECATED: use expansion.line."""
>> >> +        return self.expansion.line
>> >>
>> >>      @property
>> >>      def column(self):
>> >> -        """Get the column represented by this source location."""
>> >> -        return self._get_instantiation()[2]
>> >> +        """Get the column represented by this source location.
>> >> +
>> >> +        DEPRECATED: use expansion.column."""
>> >> +        return self.expansion.column
>> >>
>> >>      @property
>> >>      def offset(self):
>> >> -        """Get the file offset represented by this source location."""
>> >> -        return self._get_instantiation()[3]
>> >> +        """Get the file offset represented by this source location.
>> >> +
>> >> +        DEPRECATED: use expansion.offset."""
>> >> +        return self.expansion.offset
>> >>
>> >>      def __eq__(self, other):
>> >>          return conf.lib.clang_equalLocations(self, other)
>> >> @@ -1543,8 +1611,7 @@ class Cursor(Structure):
>> >>      @property
>> >>      def location(self):
>> >>          """
>> >> -        Return the source location (the starting character) of the
>> entity
>> >> -        pointed at by the cursor.
>> >> +        Return the source locations of the entity pointed at by the
>> cursor.
>> >>          """
>> >>          if not hasattr(self, '_loc'):
>> >>              self._loc = conf.lib.clang_getCursorLocation(self)
>> >> @@ -3692,7 +3759,11 @@ functionList = [
>> >>    ("clang_getInclusions",
>> >>     [TranslationUnit, callbacks['translation_unit_includes'],
>> py_object]),
>> >>
>> >> -  ("clang_getInstantiationLocation",
>> >> +  ("clang_getExpansionLocation",
>> >> +   [SourceLocation, POINTER(c_object_p), POINTER(c_uint),
>> POINTER(c_uint),
>> >> +    POINTER(c_uint)]),
>> >> +
>> >> +  ("clang_getSpellingLocation",
>> >>     [SourceLocation, POINTER(c_object_p), POINTER(c_uint),
>> POINTER(c_uint),
>> >>      POINTER(c_uint)]),
>> >>
>> >> @@ -4154,6 +4225,7 @@ __all__ = [
>> >>      'FixIt',
>> >>      'Index',
>> >>      'LinkageKind',
>> >> +    'Location',
>> >>      'SourceLocation',
>> >>      'SourceRange',
>> >>      'TLSKind',
>> >>
>> >> Modified: cfe/trunk/bindings/python/tests/cindex/test_location.py
>> >> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/bindings/pytho
>> n/tests/cindex/test_location.py?rev=316278&r1=316277&r2=316278&view=diff
>> >> ============================================================
>> ==================
>> >> --- cfe/trunk/bindings/python/tests/cindex/test_location.py (original)
>> >> +++ cfe/trunk/bindings/python/tests/cindex/test_location.py Sat Oct
>> 21 13:53:49 2017
>> >> @@ -93,3 +93,10 @@ def test_extent():
>> >>      location3 = SourceLocation.from_position(tu, file, 1, 6)
>> >>      range3 = SourceRange.from_locations(location1, location3)
>> >>      assert range1 != range3
>> >> +
>> >> +def test_spelling_location():
>> >> +    tu = get_tu('''#define ONE int one
>> >> +ONE;''')
>> >> +    one = get_cursor(tu, 'one')
>> >> +    assert one.location.spelling.line == 1
>> >> +    assert one.location.expansion.line == 2
>> >>
>> >> Modified: cfe/trunk/tools/libclang/CXSourceLocation.cpp
>> >> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang
>> /CXSourceLocation.cpp?rev=316278&r1=316277&r2=316278&view=diff
>> >> ============================================================
>> ==================
>> >> --- cfe/trunk/tools/libclang/CXSourceLocation.cpp (original)
>> >> +++ cfe/trunk/tools/libclang/CXSourceLocation.cpp Sat Oct 21 13:53:49
>> 2017
>> >> @@ -318,8 +318,7 @@ void clang_getSpellingLocation(CXSourceL
>> >>
>> >>    const SourceManager &SM =
>> >>    *static_cast<const SourceManager*>(location.ptr_data[0]);
>> >> -  // FIXME: This should call SourceManager::getSpellingLoc().
>> >> -  SourceLocation SpellLoc = SM.getFileLoc(Loc);
>> >> +  SourceLocation SpellLoc = SM.getSpellingLoc(Loc);
>> >>    std::pair<FileID, unsigned> LocInfo = SM.getDecomposedLoc(SpellLoc);
>> >>    FileID FID = LocInfo.first;
>> >>    unsigned FileOffset = LocInfo.second;
>> >>
>> >>
>> >> _______________________________________________
>> >> cfe-commits mailing list
>> >> cfe-commits at lists.llvm.org
>> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20171023/4e2e8e3d/attachment-0001.html>


More information about the cfe-commits mailing list