github / github/codeql

Java: Add predicates for `AnnotationElement` default value

未關閉
#6,275 0 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視
Java question
主要語言
CodeQL
星號
10.1k
分支
2.1k
平均合併
2 天 15 小時
30 天內合併 PR
141

描述

**Description of the issue**
The elements of annotation interfaces can have default values, for example:
```java
@interface MyInterface {
String value() default "test";
}
```

However, currently `AnnotationElement` does not provide any predicates for detecting such default values. It appears they do not even exist in the database unless an annotation of the declaring annotation type is used somewhere. And even then they only exist as expression without source location.
(Note that the `Annotation` predicates always include the default values in their results.)

It would be good to add the following predicates
- `predicate hasDefaultValue()`
Note that the predicate `isDefault()` does not work for this because an annotation element with default value is not a `default` method, in fact it is an abstract method with the `AnnotationDefault` attribute in bytecode (see [JVM spec 16 §4.7.22](https://docs.oracle.com/javase/specs/jvms/se16/html/jvms-4.html#jvms-4.7.22)).
- `Expr getDefaultValue()`
Note that even though an `AnnotationElement` is effectively a method (see #5399), the default value should probably not be modeled as result of a synthetic `return` in the method body, but be stored directly in the database. As pointed out above, an annotation element with default value is not a regular `default` method, therefore modeling it as such would be irritating (e.g. it would have to be modeled as `abstract` method whose `getBody()` has a result).
Ideally this predicate would also work for annotations declared in third party code, not being part of the source, in case that is possible.

貢獻指南

開啟貢獻指南

評估

這個 Issue 還沒有評估資料。

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。