blob: 2f7f8214eadf27c31008efe6b8378d7373903d34 [file] [log] [blame]
/*
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package kotlinx.metadata
import kotlin.reflect.KClass
/**
* A type of the extension visitor expected by the code that uses the visitor API.
*
* Each declaration which can have platform-specific extensions in the metadata has a method `visitExtensions` in its visitor, e.g.:
*
* open fun visitExtensions(type: KmExtensionType): KmFunctionExtensionVisitor?
*
* The client code is supposed to return the extension visitor corresponding to the given type, or to return `null` if the type is
* of no interest to that code. Each platform-specific extension visitor has a [KmExtensionType] instance declared in the `TYPE` property
* its companion object. For example, to load JVM extensions on a function, one could do:
*
* override fun visitExtensions(type: KmExtensionType): KmFunctionExtensionVisitor? {
* if (type != JvmFunctionExtensionVisitor.TYPE) return null
*
* return object : JvmFunctionExtensionVisitor() {
* ...
* }
* }
*
* In case an extension visitor of an unrelated type is returned, the code using the visitor API must ignore that visitor.
*/
class KmExtensionType(private val klass: KClass<out KmExtensionVisitor>) {
override fun equals(other: Any?): Boolean =
other is KmExtensionType && klass == other.klass
override fun hashCode(): Int =
klass.hashCode()
override fun toString(): String =
klass.java.name
}
/**
* A base interface for all extension visitors.
*/
interface KmExtensionVisitor {
/**
* Type of this extension visitor.
*/
val type: KmExtensionType
}
/**
* A visitor to visit platform-specific extensions for a declaration container, such as a class or a package fragment.
*/
interface KmDeclarationContainerExtensionVisitor : KmExtensionVisitor
/**
* A visitor to visit platform-specific extensions for a class.
*/
interface KmClassExtensionVisitor : KmDeclarationContainerExtensionVisitor
/**
* A visitor to visit platform-specific extensions for a package fragment.
*/
interface KmPackageExtensionVisitor : KmDeclarationContainerExtensionVisitor
/**
* A visitor to visit platform-specific extensions for a module fragment.
*/
interface KmModuleFragmentExtensionVisitor : KmExtensionVisitor
/**
* A visitor to visit platform-specific extensions for a function.
*/
interface KmFunctionExtensionVisitor : KmExtensionVisitor
/**
* A visitor to visit platform-specific extensions for a property.
*/
interface KmPropertyExtensionVisitor : KmExtensionVisitor
/**
* A visitor to visit platform-specific extensions for a constructor.
*/
interface KmConstructorExtensionVisitor : KmExtensionVisitor
/**
* A visitor to visit platform-specific extensions for a type parameter.
*/
interface KmTypeParameterExtensionVisitor : KmExtensionVisitor
/**
* A visitor to visit platform-specific extensions for a type.
*/
interface KmTypeExtensionVisitor : KmExtensionVisitor
/**
* A visitor to visit platform-specific extensions for a type alias.
*/
interface KmTypeAliasExtensionVisitor : KmExtensionVisitor
/**
* A visitor to visit platform-specific extensions for a value parameter.
*/
interface KmValueParameterExtensionVisitor : KmExtensionVisitor