Java: Make `Annotatable` abstract / refine `Annotation.getAnnotatedElement()`
- Dominant language
- CodeQL
- Stars
- 10.1k
- Forks
- 2.1k
- Avg merge
- 2d 15h
- Merged PRs (30d)
- 141
Description
Currently `Annotatable` is a regular CodeQL class which extends `Element`. This makes it cover a lot of entity types which are not actually annotatable, such as all expressions, statements (only some statements are annotatable) and files. This is probably not a big issue, but it prevents for example the CodeQL compiler from detecting incompatible casts.
A related issue is how `Annotation.getAnnotatedElement()` is defined (and that it currently has `Element` as result type). At the moment it erroneously has `Annotation` and `ArrayInit` as result when they contain nested annotations, e.g. `@Outer(@Innter)`, or `@Outer({@Inner(1), @Inner(2)})`.
Example query:
```codeql
import java
from Annotatable a
where not (
a instanceof FieldDeclaration
or a instanceof Member
or a instanceof Package
or a instanceof RefType
or a instanceof TypeAccess
or a instanceof Variable
)
select a, a.getPrimaryQlClasses(), a.getAnAnnotation()
```
[Query Console link](https://lgtm.com/query/6189668047736089840/)
If you give me a hint what the desired solution to this is, I can try to give it a go, unless you want to fix this yourselves of course.
Contributor guide
Assessment
This issue has not been assessed yet.