@@ -365,3 +365,81 @@ class DynamicallyCreatedClass extends ClassObjectInternal, TDynamicClass {
365365
366366}
367367
368+ class SubscriptedTypeInternal extends ObjectInternal , TSubscriptedType {
369+
370+ ObjectInternal getGeneric ( ) {
371+ this = TSubscriptedType ( result , _)
372+ }
373+
374+ ObjectInternal getSpecializer ( ) {
375+ this = TSubscriptedType ( _, result )
376+ }
377+
378+ override string getName ( ) { result = this .getGeneric ( ) .getName ( ) }
379+
380+ override string toString ( ) { result = this .getGeneric ( ) .toString ( ) + "[" + this .getSpecializer ( ) .toString ( ) + "]" }
381+
382+ override predicate introducedAt ( ControlFlowNode node , PointsToContext context ) {
383+ exists ( ObjectInternal generic , ObjectInternal index |
384+ this = TSubscriptedType ( generic , index ) and
385+ Expressions:: subscriptPartsPointsTo ( node , context , generic , index )
386+ )
387+ }
388+
389+ /** Gets the class declaration for this object, if it is a class with a declaration. */
390+ override ClassDecl getClassDeclaration ( ) {
391+ result = this .getGeneric ( ) .getClassDeclaration ( )
392+ }
393+
394+ /** True if this "object" is a class. That is, its class inherits from `type` */
395+ override boolean isClass ( ) { result = true }
396+
397+ override ObjectInternal getClass ( ) {
398+ result = this .getGeneric ( ) .getClass ( )
399+ }
400+
401+ override predicate notTestableForEquality ( ) { none ( ) }
402+
403+ override Builtin getBuiltin ( ) { none ( ) }
404+
405+ override ControlFlowNode getOrigin ( ) { none ( ) }
406+
407+ override predicate callResult ( ObjectInternal obj , CfgOrigin origin ) { none ( ) }
408+
409+ override predicate callResult ( PointsToContext callee , ObjectInternal obj , CfgOrigin origin ) { none ( ) }
410+
411+ override predicate calleeAndOffset ( Function scope , int paramOffset ) { none ( ) }
412+
413+ override predicate attribute ( string name , ObjectInternal value , CfgOrigin origin ) { none ( ) }
414+
415+ override predicate attributesUnknown ( ) { none ( ) }
416+
417+ override boolean isDescriptor ( ) { result = false }
418+
419+ override predicate descriptorGetClass ( ObjectInternal cls , ObjectInternal value , CfgOrigin origin ) { none ( ) }
420+
421+ override predicate descriptorGetInstance ( ObjectInternal instance , ObjectInternal value , CfgOrigin origin ) { none ( ) }
422+
423+ override predicate binds ( ObjectInternal instance , string name , ObjectInternal descriptor ) { none ( ) }
424+
425+ override int length ( ) { none ( ) }
426+
427+ override boolean booleanValue ( ) { result = true }
428+
429+ override int intValue ( ) { none ( ) }
430+
431+ override string strValue ( ) { none ( ) }
432+
433+ override predicate subscriptUnknown ( ) { none ( ) }
434+
435+ override predicate contextSensitiveCallee ( ) { none ( ) }
436+
437+ override predicate useOriginAsLegacyObject ( ) { none ( ) }
438+
439+ /* Classes aren't usually iterable, but can e.g. Enums */
440+ override ObjectInternal getIterNext ( ) { result = ObjectInternal:: unknown ( ) }
441+
442+ }
443+
444+
445+
0 commit comments