File tree 4 files changed +77
-0
lines changed
4 files changed +77
-0
lines changed Original file line number Diff line number Diff line change @@ -30,6 +30,7 @@ details about the cause of the failure
30
30
- Fix incorrect choice of method to invoke when using keyword arguments.
31
31
- Fix non-delegate types incorrectly appearing as callable.
32
32
- Indexers can now be used with interface objects
33
+ - Fixed a bug where indexers could not be used if they were inherited
33
34
34
35
## [ 2.5.0] [ ] - 2020-06-14
35
36
Original file line number Diff line number Diff line change @@ -389,6 +389,25 @@ private static ClassInfo GetClassInfo(Type type)
389
389
ci . members [ name ] = ob ;
390
390
}
391
391
392
+ if ( ci . indexer == null && type . IsClass )
393
+ {
394
+ // Indexer may be inherited.
395
+ var parent = type . BaseType ;
396
+ while ( parent != null && ci . indexer == null )
397
+ {
398
+ foreach ( var prop in parent . GetProperties ( ) ) {
399
+ var args = prop . GetIndexParameters ( ) ;
400
+ if ( args . GetLength ( 0 ) > 0 )
401
+ {
402
+ ci . indexer = new Indexer ( ) ;
403
+ ci . indexer . AddProperty ( prop ) ;
404
+ break ;
405
+ }
406
+ }
407
+ parent = parent . BaseType ;
408
+ }
409
+ }
410
+
392
411
return ci ;
393
412
}
394
413
}
Original file line number Diff line number Diff line change @@ -411,4 +411,29 @@ public MultiDefaultKeyIndexerTest() : base()
411
411
}
412
412
}
413
413
}
414
+
415
+ public class PublicInheritedIndexerTest : PublicIndexerTest { }
416
+
417
+ public class ProtectedInheritedIndexerTest : ProtectedIndexerTest { }
418
+
419
+ public class PrivateInheritedIndexerTest : ProtectedIndexerTest { }
420
+
421
+ public class InternalInheritedIndexerTest : InternalIndexerTest { }
422
+
423
+ public interface IIndexer
424
+ {
425
+ string this [ int index ] { get ; set ; }
426
+ }
427
+
428
+ public interface IInheritedIndexer : IIndexer { }
429
+
430
+ public class InterfaceInheritedIndexerTest : IndexerBase , IInheritedIndexer {
431
+ private System . Collections . Generic . IDictionary < int , string > d = new System . Collections . Generic . Dictionary < int , string > ( ) ;
432
+
433
+ public string this [ int index ]
434
+ {
435
+ get { return GetValue ( index ) ; }
436
+ set { t [ index ] = value ; }
437
+ }
438
+ }
414
439
}
Original file line number Diff line number Diff line change @@ -614,3 +614,35 @@ def test_using_indexer_on_object_without_indexer():
614
614
615
615
with pytest .raises (TypeError ):
616
616
o [0 ] = 1
617
+
618
+
619
+ def test_inherited_indexer ():
620
+ """Test that inherited indexers are accessible"""
621
+ from Python .Test import PublicInheritedIndexerTest
622
+ from Python .Test import ProtectedInheritedIndexerTest
623
+ from Python .Test import PrivateInheritedIndexerTest
624
+ from Python .Test import InternalInheritedIndexerTest
625
+
626
+ pub = PublicInheritedIndexerTest ()
627
+ pub [0 ] = "zero"
628
+ assert pub [0 ] == "zero"
629
+
630
+ def assert_no_indexer (obj ):
631
+ with pytest .raises (TypeError ):
632
+ obj [0 ]
633
+ with pytest .raises (TypeError ):
634
+ obj [0 ] = "zero"
635
+
636
+ assert_no_indexer (PrivateInheritedIndexerTest )
637
+ assert_no_indexer (ProtectedInheritedIndexerTest )
638
+ assert_no_indexer (InternalInheritedIndexerTest )
639
+
640
+
641
+ def test_inherited_indexer_interface ():
642
+ """Test that indexers inherited from other interfaces are accessible"""
643
+ from Python .Test import InterfaceInheritedIndexerTest , IInheritedIndexer
644
+
645
+ impl = InterfaceInheritedIndexerTest ()
646
+ ifc = IInheritedIndexer (impl )
647
+ ifc [0 ] = "zero"
648
+ assert ifc [0 ] == "zero"
You can’t perform that action at this time.
0 commit comments