@@ -250,3 +250,156 @@ class PythonModuleObjectInternal extends ModuleObjectInternal, TPythonModule {
250250
251251}
252252
253+ class AbsentModuleObjectInternal extends ModuleObjectInternal , TAbsentModule {
254+
255+ override Builtin getBuiltin ( ) {
256+ none ( )
257+ }
258+
259+ override string toString ( ) {
260+ if exists ( Module m , SyntaxError se | se .getFile ( ) = m .getFile ( ) and m .getName ( ) = this .getName ( ) ) then
261+ result = "Unparsable module " + this .getName ( )
262+ else
263+ result = "Missing module " + this .getName ( )
264+ }
265+
266+ override string getName ( ) {
267+ this = TAbsentModule ( result )
268+ }
269+
270+ override predicate introduced ( ControlFlowNode node , PointsToContext context ) {
271+ missing_imported_module ( node , context , this .getName ( ) )
272+ }
273+
274+ override ClassDecl getClassDeclaration ( ) {
275+ none ( )
276+ }
277+
278+ override Module getSourceModule ( ) {
279+ none ( )
280+ }
281+
282+ PythonModuleObjectInternal getInitModule ( ) {
283+ none ( )
284+ }
285+
286+ override int intValue ( ) {
287+ none ( )
288+ }
289+
290+ override string strValue ( ) {
291+ none ( )
292+ }
293+
294+ override predicate calleeAndOffset ( Function scope , int paramOffset ) {
295+ none ( )
296+ }
297+
298+ pragma [ noinline] override predicate attribute ( string name , ObjectInternal value , CfgOrigin origin ) {
299+ value = TAbsentModuleAttribute ( this , name ) and origin = CfgOrigin:: unknown ( )
300+ }
301+
302+ pragma [ noinline] override predicate attributesUnknown ( ) { none ( ) }
303+
304+ override ControlFlowNode getOrigin ( ) {
305+ none ( )
306+ }
307+
308+ override predicate isMissing ( ) {
309+ any ( )
310+ }
311+
312+ }
313+
314+ class AbsentModuleAttributeObjectInternal extends ObjectInternal , TAbsentModuleAttribute {
315+
316+ override Builtin getBuiltin ( ) {
317+ none ( )
318+ }
319+
320+ override string toString ( ) {
321+ exists ( ModuleObjectInternal mod , string name |
322+ this = TAbsentModuleAttribute ( mod , name ) and
323+ result = "Missing module attribute " + mod .getName ( ) + "." + name
324+ )
325+ }
326+
327+ override predicate introduced ( ControlFlowNode node , PointsToContext context ) {
328+ exists ( ModuleObjectInternal mod , string name |
329+ this = TAbsentModuleAttribute ( mod , name ) |
330+ PointsToInternal:: pointsTo ( node .( AttrNode ) .getObject ( name ) , context , mod , _)
331+ or
332+ PointsToInternal:: pointsTo ( node .( ImportMemberNode ) .getModule ( name ) , context , mod , _)
333+ )
334+ }
335+
336+ override ClassDecl getClassDeclaration ( ) {
337+ none ( )
338+ }
339+
340+ PythonModuleObjectInternal getInitModule ( ) {
341+ none ( )
342+ }
343+
344+ override int intValue ( ) {
345+ none ( )
346+ }
347+
348+ override string strValue ( ) {
349+ none ( )
350+ }
351+
352+ override predicate calleeAndOffset ( Function scope , int paramOffset ) {
353+ none ( )
354+ }
355+
356+ pragma [ noinline] override predicate attribute ( string name , ObjectInternal value , CfgOrigin origin ) {
357+ none ( )
358+ }
359+
360+ pragma [ noinline] override predicate attributesUnknown ( ) { any ( ) }
361+
362+ override ControlFlowNode getOrigin ( ) {
363+ none ( )
364+ }
365+
366+ override predicate callResult ( ObjectInternal obj , CfgOrigin origin ) {
367+ // Don't know, assume not callable.
368+ none ( )
369+ }
370+
371+ override predicate callResult ( PointsToContext callee , ObjectInternal obj , CfgOrigin origin ) {
372+ // Don't know, assume not callable.
373+ none ( )
374+ }
375+
376+ override boolean isClass ( ) { result = maybe ( ) }
377+
378+ override boolean isComparable ( ) { result = false }
379+
380+ override boolean booleanValue ( ) {
381+ result = maybe ( )
382+ }
383+
384+ override ObjectInternal getClass ( ) {
385+ result = ObjectInternal:: unknownClass ( )
386+ }
387+
388+ override boolean isDescriptor ( ) { result = false }
389+
390+ override predicate descriptorGetClass ( ObjectInternal cls , ObjectInternal value , CfgOrigin origin ) { none ( ) }
391+
392+ override predicate descriptorGetInstance ( ObjectInternal instance , ObjectInternal value , CfgOrigin origin ) { none ( ) }
393+
394+ override predicate binds ( ObjectInternal instance , string name , ObjectInternal descriptor ) { none ( ) }
395+
396+ override int length ( ) { none ( ) }
397+
398+ override predicate subscriptUnknown ( ) { any ( ) }
399+
400+ override predicate isMissing ( ) {
401+ any ( )
402+ }
403+
404+ }
405+
0 commit comments