Skip to content

Commit

Permalink
Use TypeHint annotation to indicate correct return type when sip code…
Browse files Browse the repository at this point in the history
… returns SIP_PYOBJECT

Provides correct return type hints to IDEs (and hopefully PyQGIS docs too!)

(cherry picked from commit e23527b)
  • Loading branch information
nyalldawson committed Jan 6, 2019
1 parent 2edb434 commit 3dc7665
Show file tree
Hide file tree
Showing 10 changed files with 25 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -816,7 +816,7 @@ Returns next vertex of the geometry (undefined behavior if hasNext() returns fal
sipRes = sipCpp;
%End

SIP_PYOBJECT __next__();
SIP_PYOBJECT __next__() /TypeHint="QgsPoint"/;
%MethodCode
if ( sipCpp->hasNext() )
sipRes = sipConvertFromType( new QgsPoint( sipCpp->next() ), sipType_QgsPoint, Py_None );
Expand Down Expand Up @@ -863,7 +863,7 @@ Returns next part of the geometry (undefined behavior if hasNext() returns false
sipRes = sipCpp;
%End

SIP_PYOBJECT __next__();
SIP_PYOBJECT __next__() /TypeHint="QgsAbstractGeometry"/;
%MethodCode
if ( sipCpp->hasNext() )
sipRes = sipConvertFromType( sipCpp->next(), sipType_QgsAbstractGeometry, NULL );
Expand Down Expand Up @@ -911,7 +911,7 @@ Returns next part of the geometry (undefined behavior if hasNext() returns false
sipRes = sipCpp;
%End

SIP_PYOBJECT __next__();
SIP_PYOBJECT __next__() /TypeHint="QgsAbstractGeometry"/;
%MethodCode
if ( sipCpp->hasNext() )
sipRes = sipConvertFromType( const_cast< QgsAbstractGeometry * >( sipCpp->next() ), sipType_QgsAbstractGeometry, NULL );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ Returns the number of geometries within the collection.



SIP_PYOBJECT geometryN( int n );
SIP_PYOBJECT geometryN( int n ) /TypeHint="QgsAbstractGeometry"/;
%Docstring
Returns a geometry from within the collection.

Expand Down Expand Up @@ -222,7 +222,7 @@ Returns a geometry without curves. Caller takes ownership



SIP_PYOBJECT __getitem__( int index );
SIP_PYOBJECT __getitem__( int index ) /TypeHint="QgsAbstractGeometry"/;
%Docstring
Returns the geometry at the specified ``index``. An IndexError will be raised if no geometry with the specified ``index`` exists.

Expand Down
4 changes: 2 additions & 2 deletions python/core/auto_generated/geometry/qgslinestring.sip.in
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ Construct a linestring from a single 2d line segment.



SIP_PYOBJECT pointN( int i ) const;
SIP_PYOBJECT pointN( int i ) const /TypeHint="QgsPoint"/;
%Docstring
Returns the point at the specified index. An IndexError will be raised if no point with the specified index exists.

Expand Down Expand Up @@ -508,7 +508,7 @@ of the curve.
sipRes = PyUnicode_FromString( str.toUtf8().constData() );
%End

SIP_PYOBJECT __getitem__( int index );
SIP_PYOBJECT __getitem__( int index ) /TypeHint="QgsPoint"/;
%Docstring
Returns the point at the specified ``index``. An IndexError will be raised if no point with the specified ``index`` exists.

Expand Down
2 changes: 1 addition & 1 deletion python/core/auto_generated/qgsfeatureiterator.sip.in
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ Wrapper for iterator of features from vector data provider or vector layer
sipRes = sipCpp;
%End

SIP_PYOBJECT __next__();
SIP_PYOBJECT __next__() /TypeHint="QgsFeature"/;
%MethodCode
std::unique_ptr< QgsFeature > f = qgis::make_unique< QgsFeature >();
bool result = false;
Expand Down
1 change: 1 addition & 0 deletions scripts/sipify.pl
Original file line number Diff line number Diff line change
Expand Up @@ -393,6 +393,7 @@ sub fix_annotations {
$line =~ s/\bSIP_TRANSFERTHIS\b/\/TransferThis\//;

$line =~ s/SIP_PYNAME\(\s*(\w+)\s*\)/\/PyName=$1\//;
$line =~ s/SIP_TYPEHINT\(\s*(\w+)\s*\)/\/TypeHint="$1"\//;
$line =~ s/SIP_VIRTUALERRORHANDLER\(\s*(\w+)\s*\)/\/VirtualErrorHandler=$1\//;
$line =~ s/SIP_THROW\(\s*(\w+)\s*\)/throw\( $1 \)/;

Expand Down
6 changes: 3 additions & 3 deletions src/core/geometry/qgsabstractgeometry.h
Original file line number Diff line number Diff line change
Expand Up @@ -1039,7 +1039,7 @@ class CORE_EXPORT QgsVertexIterator
sipRes = sipCpp;
% End

SIP_PYOBJECT __next__();
SIP_PYOBJECT __next__() SIP_TYPEHINT( QgsPoint );
% MethodCode
if ( sipCpp->hasNext() )
sipRes = sipConvertFromType( new QgsPoint( sipCpp->next() ), sipType_QgsPoint, Py_None );
Expand Down Expand Up @@ -1088,7 +1088,7 @@ class CORE_EXPORT QgsGeometryPartIterator
sipRes = sipCpp;
% End

SIP_PYOBJECT __next__();
SIP_PYOBJECT __next__() SIP_TYPEHINT( QgsAbstractGeometry );
% MethodCode
if ( sipCpp->hasNext() )
sipRes = sipConvertFromType( sipCpp->next(), sipType_QgsAbstractGeometry, NULL );
Expand Down Expand Up @@ -1138,7 +1138,7 @@ class CORE_EXPORT QgsGeometryConstPartIterator
sipRes = sipCpp;
% End

SIP_PYOBJECT __next__();
SIP_PYOBJECT __next__() SIP_TYPEHINT( QgsAbstractGeometry );
% MethodCode
if ( sipCpp->hasNext() )
sipRes = sipConvertFromType( const_cast< QgsAbstractGeometry * >( sipCpp->next() ), sipType_QgsAbstractGeometry, NULL );
Expand Down
4 changes: 2 additions & 2 deletions src/core/geometry/qgsgeometrycollection.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ class CORE_EXPORT QgsGeometryCollection: public QgsAbstractGeometry
#ifndef SIP_RUN
QgsAbstractGeometry *geometryN( int n );
#else
SIP_PYOBJECT geometryN( int n );
SIP_PYOBJECT geometryN( int n ) SIP_TYPEHINT( QgsAbstractGeometry );
% MethodCode
if ( a0 < 0 || a0 >= sipCpp->numGeometries() )
{
Expand Down Expand Up @@ -238,7 +238,7 @@ class CORE_EXPORT QgsGeometryCollection: public QgsAbstractGeometry
*
* \since QGIS 3.6
*/
SIP_PYOBJECT __getitem__( int index );
SIP_PYOBJECT __getitem__( int index ) SIP_TYPEHINT( QgsAbstractGeometry );
% MethodCode
const int count = sipCpp->numGeometries();
if ( a0 < -count || a0 >= count )
Expand Down
4 changes: 2 additions & 2 deletions src/core/geometry/qgslinestring.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ class CORE_EXPORT QgsLineString: public QgsCurve
* Indexes can be less than 0, in which case they correspond to positions from the end of the line. E.g. an index of -1
* corresponds to the last point in the line.
*/
SIP_PYOBJECT pointN( int i ) const;
SIP_PYOBJECT pointN( int i ) const SIP_TYPEHINT( QgsPoint );
% MethodCode
const int count = sipCpp->numPoints();
if ( a0 < -count || a0 >= count )
Expand Down Expand Up @@ -650,7 +650,7 @@ class CORE_EXPORT QgsLineString: public QgsCurve
*
* \since QGIS 3.6
*/
SIP_PYOBJECT __getitem__( int index );
SIP_PYOBJECT __getitem__( int index ) SIP_TYPEHINT( QgsPoint );
% MethodCode
const int count = sipCpp->numPoints();
if ( a0 < -count || a0 >= count )
Expand Down
8 changes: 8 additions & 0 deletions src/core/qgis_sip.h
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,14 @@
*/
#define SIP_DOC_TEMPLATE

/*
* Specifies the type of the value returned by the function as it will appear in any
* generated docstrings and PEP 484 type hints. It is usually used with results of type
* SIP_PYOBJECT to provide a more specific type.
* Available for SIP 4.18+
*/
#define SIP_TYPEHINT(type)

/*
* Sip supports the final keyword since version 4.19.0, earlier than that
* we will have build issues because it tries to override final methods.
Expand Down
2 changes: 1 addition & 1 deletion src/core/qgsfeatureiterator.h
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ class CORE_EXPORT QgsFeatureIterator
sipRes = sipCpp;
% End

SIP_PYOBJECT __next__();
SIP_PYOBJECT __next__() SIP_TYPEHINT( QgsFeature );
% MethodCode
std::unique_ptr< QgsFeature > f = qgis::make_unique< QgsFeature >();
bool result = false;
Expand Down

0 comments on commit 3dc7665

Please sign in to comment.