org.jetbrains.kotlin.descriptors.impl.AbstractTypeAliasDescriptor.kt Maven / Gradle / Ivy
/*
* Copyright 2010-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.descriptors.impl
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.types.*
abstract class AbstractTypeAliasDescriptor(
containingDeclaration: DeclarationDescriptor,
annotations: Annotations,
name: Name,
sourceElement: SourceElement,
private val visibilityImpl: Visibility
) : DeclarationDescriptorNonRootImpl(containingDeclaration, annotations, name, sourceElement),
TypeAliasDescriptor {
protected abstract val storageManager: StorageManager
// TODO kotlinize some interfaces
private lateinit var declaredTypeParametersImpl: List
fun initialize(declaredTypeParameters: List) {
this.declaredTypeParametersImpl = declaredTypeParameters
}
override fun accept(visitor: DeclarationDescriptorVisitor, data: D): R =
visitor.visitTypeAliasDescriptor(this, data)
override fun isInner(): Boolean =
// NB: it's ok to use underlyingType here, since referenced inner type aliases also capture type parameters.
// Using expandedType looks "proper", but in fact will cause a recursion in expandedType resolution,
// which will silently produce wrong result.
TypeUtils.contains(underlyingType) { type ->
!type.isError && run {
val constructorDescriptor = type.constructor.declarationDescriptor
constructorDescriptor is TypeParameterDescriptor &&
constructorDescriptor.containingDeclaration != this@AbstractTypeAliasDescriptor
}
}
fun getTypeAliasConstructors(): Collection {
val classDescriptor = this.classDescriptor ?: return emptyList()
return classDescriptor.constructors.mapNotNull {
TypeAliasConstructorDescriptorImpl.createIfAvailable(storageManager, this, it)
}
}
override fun getDeclaredTypeParameters(): List =
declaredTypeParametersImpl
override fun getModality() = Modality.FINAL
override fun getVisibility() = visibilityImpl
override fun isHeader(): Boolean = false
override fun isImpl(): Boolean = false
override fun isExternal() = false
override fun getTypeConstructor(): TypeConstructor =
typeConstructor
override fun toString(): String = "typealias ${name.asString()}"
override fun getOriginal(): TypeAliasDescriptor = super.getOriginal() as TypeAliasDescriptor
protected abstract fun getTypeConstructorTypeParameters(): List
protected fun computeDefaultType(): SimpleType =
TypeUtils.makeUnsubstitutedType(this, classDescriptor?.unsubstitutedMemberScope ?: MemberScope.Empty)
private val typeConstructor = object : TypeConstructor {
override fun getDeclarationDescriptor(): TypeAliasDescriptor =
this@AbstractTypeAliasDescriptor
override fun getParameters(): List =
getTypeConstructorTypeParameters()
override fun getSupertypes(): Collection =
declarationDescriptor.underlyingType.constructor.supertypes
override fun isFinal(): Boolean =
declarationDescriptor.underlyingType.constructor.isFinal
override fun isDenotable(): Boolean =
true
override fun getBuiltIns(): KotlinBuiltIns =
declarationDescriptor.builtIns
override fun toString(): String = "[typealias ${declarationDescriptor.name.asString()}]"
}
}