Является ли формат данных, хранящихся в kotlin.MetaData документированы где угодно?

Мне интересно узнать, какие данные хранятся в аннотации MetaData, добавленной к каждому классу Kotlin.

Но большинство полей не дают больше деталей, чем

"Метаданные в пользовательском формате. Формат может быть различным (или даже отсутствовать) для разных видов.

https://github.com/JetBrains/kotlin/blob/master/core/runtime.jvm/src/kotlin/Metadata.kt

Есть ли ссылки где-нибудь, что объясняет, как интерпретировать эти данные?

Ответ 1

kotlin.Metadata содержит информацию о символах Котлина, таких как их имена, подписи, отношения между типами и т.д. Некоторые из этой информации уже присутствуют в подписях JVM в файлах классов, но многого нет, так как существует довольно много Котлин -специфические вещи, которые файлы классов JVM не могут представлять должным образом: тип nullability, изменяемые/только для чтения интерфейсы коллекции, дисперсия объявления-сайта и другие.

Никаких конкретных действий не было сделано, чтобы сделать схему данных, закодированных в этой аннотации общедоступной, потому что для большинства пользователей такие данные необходимы для интроспекции программы во время выполнения, а библиотека отражения Kotlin предоставляет для этого хороший API.

Если вам нужно проверить специфические для Kotlin вещи, которые не отображаются через API отражения, или вам просто интересно, что еще хранится в этой аннотации, вы можете взглянуть на реализацию kotlinx.reflect.lite. Это легкая библиотека, ядром которой является синтаксический анализатор, созданный protobuf. В настоящий момент там не так много поддержки, но есть доступные схемы, которые вы можете использовать для чтения любых других данных, которые вам нужны.

UPD (август 2018 года): поскольку на это был дан ответ, мы опубликовали новую (экспериментальную и нестабильную) библиотеку, предназначенную для чтения и модификации метаданных: https://discuss.kotlinlang.org/t/объявляя-kotlinx-метаданные JVM-библиотека-для-чтения модифицирующего-метаданные из-Котлина-Jvm-класс файлы /7980