Псевдоним Аннотация, которая принимает аргумент - PullRequest
6 голосов
/ 27 января 2020

Я пытаюсь преобразовать свою библиотеку Android в многоплатформенную библиотеку Kotlin.

Одна из вещей, которую я хочу сохранить, - это все android конкретная c аннотация для Android Линт Я смог преобразовать большинство из них, выполнив простые вещи, такие как

@MustBeDocumented
@Retention(AnnotationRetention.BINARY)

@Target(
    AnnotationTarget.FUNCTION,
    AnnotationTarget.PROPERTY_GETTER,
    AnnotationTarget.PROPERTY_SETTER,
    AnnotationTarget.CONSTRUCTOR,
    AnnotationTarget.ANNOTATION_CLASS,
    AnnotationTarget.CLASS,
    AnnotationTarget.VALUE_PARAMETER
)
expect annotation class MainThread()

actual typealias MainThread = androidx.annotation.MainThread

Это не сработало с RestrictTo, потому что оно принимает аргумент.

Аннотация android RestrictTo выглядит как

@Retention(CLASS)
@Target({ANNOTATION_TYPE,TYPE,METHOD,CONSTRUCTOR,FIELD,PACKAGE})
public @interface RestrictTo {

    /**
     * The scope to which usage should be restricted.
     */
    Scope[] value();

    enum Scope {
    }
}

Я не могу сделать так, чтобы компилятор был доволен типом для значения.

Если я получу ожидание, будет похоже на

@Target(
    AnnotationTarget.FUNCTION,
    AnnotationTarget.PROPERTY_GETTER,
    AnnotationTarget.PROPERTY_SETTER,
    AnnotationTarget.FIELD,
    AnnotationTarget.CONSTRUCTOR,
    AnnotationTarget.ANNOTATION_CLASS,
    AnnotationTarget.CLASS
)
@MustBeDocumented
@Retention(AnnotationRetention.BINARY)
expect annotation class RestrictTo(vararg val value: RestrictScope)

Я получу ошибка компиляции

public expect final val value: Array<out RestrictScope /* = RestrictTo.Scope */>

The following declaration is incompatible because return type is different:
    public final val value: Array<RestrictTo.Scope>

Если я изменяю значение с vararg на Array, я получаю эту ошибку.

public constructor RestrictTo(value: Array<RestrictScope /* = RestrictTo.Scope */>)

The following declaration is incompatible because parameter types are different:
    public constructor RestrictTo(vararg value: RestrictTo.Scope)

Есть ли в любом случае, чтобы заставить типы работать как для конструктора, так и для метода значений?

1 Ответ

0 голосов
/ 09 февраля 2020

Это ошибка - https://youtrack.jetbrains.com/issue/KT-20900

Не стесняйтесь поднять вопрос. enter image description here

...