All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jetbrains.kotlin.descriptors.impl.AbstractTypeAliasDescriptor.kt Maven / Gradle / Ivy

There is a newer version: 2.0.20-RC
Show newest version
/*
 * 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()}]"
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy