Skip to content

Java: RawType getASourceSupertype() is not generic type / getting source declaration or supertype is cumbersome #5521

@Marcono1234

Description

@Marcono1234

It appears that for a RawType the result of getASourceSupertype() will not be the generic type. (This is also described by the getASourceSupertype() documentation.)

In addition to that there are the following issues:

  • CodeQL raw types have a <> at the end of their name, therefore a check for the class name such as getDeclaringType().getASourceSupertype*().hasQualifiedName("java.util", "List") would not hold due to the trailing <>.
  • Access of static fields and methods declared on a generic class, but only when explicitly using the declaring class as qualifier, are treated like accesses on a raw type (fieldAccess.getQualifier().getType() and methodAccess.getDeclaringType() will have a raw type as result).
    Whether that is the correct behavior might be a different story (now Java: Static method access with explicit qualifier on generic type claims declaring type is raw type #5593).

This all combined causes some false negatives for the pattern getDeclaringType().getASourceSupertype*() (which is also used a few times in the CodeQL codebase).
Is there a more 'correct' predicate for this task? A workaround might be getDeclaringType().getASourceSupertype*().getErasure().
If there is no alternative currently, would it make sense to change the behavior of getASourceSupertype() or introduce a new predicate?

Metadata

Metadata

Assignees

No one assigned

    Labels

    questionFurther information is requested

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions