r316278 - [libclang, bindings]: add spelling location

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Sat Oct 21 14:35:14 PDT 2017


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/python/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/python/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


More information about the cfe-commits mailing list