Add test for repeatable annotations

This commit is contained in:
Chris Smowton
2022-11-14 15:15:28 +00:00
parent eaa9595ea2
commit d96bca071d
8 changed files with 67 additions and 0 deletions

View File

@@ -0,0 +1,5 @@
public @interface JavaDefinedContainer {
public JavaDefinedRepeatable[] value();
}

View File

@@ -0,0 +1,3 @@
@java.lang.annotation.Repeatable(JavaDefinedContainer.class)
public @interface JavaDefinedRepeatable { }

View File

@@ -0,0 +1,7 @@
@LibRepeatable
@LibRepeatable
@ExplicitContainerRepeatable
@ExplicitContainerRepeatable
@JavaDefinedRepeatable
@JavaDefinedRepeatable
public class JavaUser { }

View File

@@ -0,0 +1,7 @@
@Repeatable
public annotation class LibRepeatable { }
annotation class KtDefinedContainer(val value: Array<ExplicitContainerRepeatable>) { }
@java.lang.annotation.Repeatable(KtDefinedContainer::class)
annotation class ExplicitContainerRepeatable() { }

View File

@@ -0,0 +1,15 @@
| JavaUser.java:7:14:7:21 | JavaUser | out2/JavaUser.class:0:0:0:0 | Container | value | out2/JavaUser.class:0:0:0:0 | {...} |
| JavaUser.java:7:14:7:21 | JavaUser | out2/JavaUser.class:0:0:0:0 | JavaDefinedContainer | value | out2/JavaUser.class:0:0:0:0 | {...} |
| JavaUser.java:7:14:7:21 | JavaUser | out2/JavaUser.class:0:0:0:0 | KtDefinedContainer | value | out2/JavaUser.class:0:0:0:0 | {...} |
| out/ExplicitContainerRepeatable.class:0:0:0:0 | ExplicitContainerRepeatable | out/ExplicitContainerRepeatable.class:0:0:0:0 | Repeatable | value | out/ExplicitContainerRepeatable.class:0:0:0:0 | KtDefinedContainer.class |
| out/ExplicitContainerRepeatable.class:0:0:0:0 | ExplicitContainerRepeatable | out/ExplicitContainerRepeatable.class:0:0:0:0 | Retention | value | out/ExplicitContainerRepeatable.class:0:0:0:0 | RetentionPolicy.RUNTIME |
| out/JavaDefinedRepeatable.class:0:0:0:0 | JavaDefinedRepeatable | out/JavaDefinedRepeatable.class:0:0:0:0 | Repeatable | value | out/JavaDefinedRepeatable.class:0:0:0:0 | JavaDefinedContainer.class |
| out/KtDefinedContainer.class:0:0:0:0 | KtDefinedContainer | out/KtDefinedContainer.class:0:0:0:0 | Retention | value | out/KtDefinedContainer.class:0:0:0:0 | RetentionPolicy.RUNTIME |
| out/LibRepeatable.class:0:0:0:0 | LibRepeatable | out/LibRepeatable.class:0:0:0:0 | Repeatable | value | out/LibRepeatable.class:0:0:0:0 | Container.class |
| out/LibRepeatable.class:0:0:0:0 | LibRepeatable | out/LibRepeatable.class:0:0:0:0 | Retention | value | out/LibRepeatable.class:0:0:0:0 | RetentionPolicy.RUNTIME |
| test.kt:1:1:2:43 | LocalRepeatable | test.kt:0:0:0:0 | Repeatable | value | test.kt:0:0:0:0 | Container.class |
| test.kt:1:1:2:43 | LocalRepeatable | test.kt:0:0:0:0 | Retention | value | test.kt:0:0:0:0 | RetentionPolicy.RUNTIME |
| test.kt:4:1:12:21 | User | test.kt:0:0:0:0 | Container | value | test.kt:0:0:0:0 | {...} |
| test.kt:4:1:12:21 | User | test.kt:0:0:0:0 | Container | value | test.kt:0:0:0:0 | {...} |
| test.kt:4:1:12:21 | User | test.kt:0:0:0:0 | JavaDefinedContainer | value | test.kt:0:0:0:0 | {...} |
| test.kt:4:1:12:21 | User | test.kt:0:0:0:0 | KtDefinedContainer | value | test.kt:0:0:0:0 | {...} |

View File

@@ -0,0 +1,12 @@
@Repeatable
public annotation class LocalRepeatable { }
@LocalRepeatable
@LocalRepeatable
@LibRepeatable
@LibRepeatable
@ExplicitContainerRepeatable
@ExplicitContainerRepeatable
@JavaDefinedRepeatable
@JavaDefinedRepeatable
public class User { }

View File

@@ -0,0 +1,7 @@
from create_database_utils import *
os.mkdir('out')
os.mkdir('out2')
runSuccessfully([get_cmd("kotlinc"), "lib.kt", "-d", "out"])
runSuccessfully([get_cmd("javac"), "JavaDefinedContainer.java", "JavaDefinedRepeatable.java", "-d", "out"])
run_codeql_database_create(["javac JavaUser.java -cp out -d out2", "kotlinc test.kt -cp out -d out2"], lang="java")

View File

@@ -0,0 +1,11 @@
import java
from ClassOrInterface annotated, Annotation a, string valName, Expr val
where
a.getValue(valName) = val and
annotated = a.getAnnotatedElement() and
annotated.getName() in [
"JavaDefinedRepeatable", "JavaDefinedContainer", "KtDefinedContainer", "LibRepeatable",
"ExplicitContainerRepeatable", "LocalRepeatable", "User", "JavaUser"
]
select a.getAnnotatedElement(), a, valName, val