Declaration Vs Property

Some code constructs can be represented as declarations (declaration-site) and as properties (use-site).

Declaration Site

Consider this annotation class:

annotation class CustomLogger

The above code represents the declaration of the CustomLogger annotation class, the place in the code where this annotation is declared (declaration-site). This declaration can be retrieved by filtering KoScope declarations...

koScope
    .classes()
    .withAnnotationModifier()

For example, such declaration can be used to check if annotations reside in a desired package:

// Every annotation class must reside in the "annotation" package

koScope
    .classes()
    .withAnnotationModifier()
    .assertTrue { it.resideInPackage("..annotation..") }

Use Site

Now consider this function:

@CustomLogger
fun logHello() {
    println("Hello")
}

The above code also contains CustomLogger annotation. However, this time code represents the place in the code where the annotation is used (use-site). Such annotations can be accessed using the annotations property:

koScope
    .functions()
    .annotations

Such properties can be used to check if the function annotated with CustomLogger annotation has the correct name prefix:

// Every function with a name starting with "log" is annotated with CustomLogger

koScope
    .functions()
    .withAllAnnotations("CustomLogger")
    .assertTrue {
        it.hasNameStartingWith("log")
    }

Last updated