FIR: add type alias descriptors

This commit is contained in:
Mikhail Glukhikh
2018-03-21 12:48:09 +03:00
parent bc9175c4e8
commit b83d921445
25 changed files with 148 additions and 40 deletions
@@ -17,5 +17,4 @@ class ConeClassDescriptorImpl(
override val fqName: ClassId, override val fqName: ClassId,
override val superTypes: List<ConeKotlinType>, override val superTypes: List<ConeKotlinType>,
override val nestedClassifiers: List<ConeClassifierDescriptor> override val nestedClassifiers: List<ConeClassifierDescriptor>
) : ConeClassDescriptor, AbstractFirBasedDescriptor<FirResolvedClass>() { ) : ConeClassDescriptor, AbstractFirBasedDescriptor<FirResolvedClass>()
}
@@ -0,0 +1,18 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.descriptors
import org.jetbrains.kotlin.fir.declarations.FirResolvedTypeAlias
import org.jetbrains.kotlin.fir.descriptors.ConeTypeAliasDescriptor
import org.jetbrains.kotlin.fir.descriptors.ConeTypeParameterDescriptor
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.name.ClassId
class ConeTypeAliasDescriptorImpl(
override val typeParameters: List<ConeTypeParameterDescriptor>,
override val fqName: ClassId,
override val expandedType: ConeKotlinType
) : ConeTypeAliasDescriptor, AbstractFirBasedDescriptor<FirResolvedTypeAlias>()
@@ -7,11 +7,9 @@ package org.jetbrains.kotlin.descriptors
import org.jetbrains.kotlin.fir.FirDescriptorOwner import org.jetbrains.kotlin.fir.FirDescriptorOwner
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirResolvedClass
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedClassImpl import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedClassImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedTypeAliasImpl
import org.jetbrains.kotlin.fir.descriptors.ConeClassifierDescriptor import org.jetbrains.kotlin.fir.descriptors.ConeClassifierDescriptor
import org.jetbrains.kotlin.fir.descriptors.ConeTypeParameterDescriptor import org.jetbrains.kotlin.fir.descriptors.ConeTypeParameterDescriptor
import org.jetbrains.kotlin.fir.types.FirResolvedType import org.jetbrains.kotlin.fir.types.FirResolvedType
@@ -66,4 +64,26 @@ class FirClassifierResolveTransformer : FirTransformer<Nothing?>() {
override fun transformResolvedClass(resolvedClass: FirResolvedClass, data: Nothing?): CompositeTransformResult<FirDeclaration> { override fun transformResolvedClass(resolvedClass: FirResolvedClass, data: Nothing?): CompositeTransformResult<FirDeclaration> {
return resolvedClass.compose() return resolvedClass.compose()
} }
override fun transformTypeAlias(typeAlias: FirTypeAlias, data: Nothing?): CompositeTransformResult<FirDeclaration> {
typeAlias.transformChildren(this, data)
val expandedType = (typeAlias.expandedType as FirResolvedType).type
val typeParameters =
typeAlias.typeParameters.filterIsInstance<FirDescriptorOwner<*>>().mapNotNull { it.descriptor as? ConeTypeParameterDescriptor }
val descriptor = ConeTypeAliasDescriptorImpl(
typeParameters,
ClassId(packageFqName, className.child(typeAlias.name), false),
expandedType
)
return FirResolvedTypeAliasImpl(typeAlias, descriptor).compose()
}
override fun transformResolvedTypeAlias(
resolvedTypeAlias: FirResolvedTypeAlias,
data: Nothing?
): CompositeTransformResult<FirDeclaration> {
return resolvedTypeAlias.compose()
}
} }
@@ -143,7 +143,7 @@ class FirTypeResolveTransformer(val superTypesOnly: Boolean = false) : FirTransf
classifier.superTypes.any { it.accept(this, data) } classifier.superTypes.any { it.accept(this, data) }
} }
} }
is FirTypeAlias -> classifier.abbreviatedType.accept(this, data) is FirTypeAlias -> classifier.expandedType.accept(this, data)
} }
return true return true
} }
@@ -48,7 +48,7 @@ class FirQualifierResolverImpl(val session: FirSession) : FirQualifierResolver {
ConeAbbreviatedTypeImpl( ConeAbbreviatedTypeImpl(
abbreviationFqName = fqName, abbreviationFqName = fqName,
typeArguments = parts.toTypeProjections(), typeArguments = parts.toTypeProjections(),
directExpansion = (this.abbreviatedType as FirResolvedType).type directExpansion = (this.expandedType as FirResolvedType).type
) )
} }
@@ -155,6 +155,11 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
visitClass(enumEntry) visitClass(enumEntry)
} }
override fun visitResolvedClass(resolvedClass: FirResolvedClass) {
print("(resolved) ")
visitClass(resolvedClass)
}
override fun visitClass(klass: FirClass) { override fun visitClass(klass: FirClass) {
visitMemberDeclaration(klass) visitMemberDeclaration(klass)
val attributes = listOfNotNull( val attributes = listOfNotNull(
@@ -257,11 +262,16 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
println("}") println("}")
} }
override fun visitResolvedTypeAlias(resolvedTypeAlias: FirResolvedTypeAlias) {
print("(resolved) ")
visitTypeAlias(resolvedTypeAlias)
}
override fun visitTypeAlias(typeAlias: FirTypeAlias) { override fun visitTypeAlias(typeAlias: FirTypeAlias) {
typeAlias.annotations.renderAnnotations() typeAlias.annotations.renderAnnotations()
visitMemberDeclaration(typeAlias) visitMemberDeclaration(typeAlias)
print(" = ") print(" = ")
typeAlias.abbreviatedType.accept(this) typeAlias.expandedType.accept(this)
println() println()
} }
@@ -0,0 +1,14 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.fir.FirDescriptorOwner
import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirResolvedTypeAlias : FirTypeAlias, FirDescriptorOwner<FirResolvedTypeAlias> {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitResolvedTypeAlias(this, data)
}
@@ -9,13 +9,13 @@ import org.jetbrains.kotlin.fir.types.FirType
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirTypeAlias : FirMemberDeclaration { interface FirTypeAlias : FirMemberDeclaration {
val abbreviatedType: FirType val expandedType: FirType
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitTypeAlias(this, data) visitor.visitTypeAlias(this, data)
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) { override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
super.acceptChildren(visitor, data) super.acceptChildren(visitor, data)
abbreviatedType.accept(visitor, data) expandedType.accept(visitor, data)
} }
} }
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.declarations.impl
import org.jetbrains.kotlin.fir.FirBasedDescriptor import org.jetbrains.kotlin.fir.FirBasedDescriptor
import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirResolvedClass import org.jetbrains.kotlin.fir.declarations.FirResolvedClass
import org.jetbrains.kotlin.fir.visitors.FirVisitor
class FirResolvedClassImpl(val delegate: FirClass, override val descriptor: FirBasedDescriptor<FirResolvedClass>) : class FirResolvedClassImpl(val delegate: FirClass, override val descriptor: FirBasedDescriptor<FirResolvedClass>) :
FirResolvedClass, FirClass by delegate { FirResolvedClass, FirClass by delegate {
@@ -16,4 +17,7 @@ class FirResolvedClassImpl(val delegate: FirClass, override val descriptor: FirB
descriptor.bind(this) descriptor.bind(this)
} }
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R {
return super<FirResolvedClass>.accept(visitor, data)
}
} }
@@ -0,0 +1,23 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.declarations.impl
import org.jetbrains.kotlin.fir.FirBasedDescriptor
import org.jetbrains.kotlin.fir.declarations.FirResolvedTypeAlias
import org.jetbrains.kotlin.fir.declarations.FirTypeAlias
import org.jetbrains.kotlin.fir.visitors.FirVisitor
class FirResolvedTypeAliasImpl(val delegate: FirTypeAlias, override val descriptor: FirBasedDescriptor<FirResolvedTypeAlias>) :
FirResolvedTypeAlias, FirTypeAlias by delegate {
init {
descriptor.bind(this)
}
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R {
return super<FirResolvedTypeAlias>.accept(visitor, data)
}
}
@@ -21,10 +21,10 @@ class FirTypeAliasImpl(
psi: PsiElement?, psi: PsiElement?,
name: Name, name: Name,
visibility: Visibility, visibility: Visibility,
override var abbreviatedType: FirType override var expandedType: FirType
) : FirAbstractMemberDeclaration(session, psi, name, visibility, Modality.FINAL), FirTypeAlias { ) : FirAbstractMemberDeclaration(session, psi, name, visibility, Modality.FINAL), FirTypeAlias {
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
abbreviatedType = abbreviatedType.transformSingle(transformer, data) expandedType = expandedType.transformSingle(transformer, data)
return this return this
} }
@@ -74,6 +74,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformMemberDeclaration(typeAlias, data) return transformMemberDeclaration(typeAlias, data)
} }
open fun transformResolvedTypeAlias(resolvedTypeAlias: FirResolvedTypeAlias, data: D): CompositeTransformResult<FirDeclaration> {
return transformTypeAlias(resolvedTypeAlias, data)
}
open fun transformTypeParameter(typeParameter: FirTypeParameter, data: D): CompositeTransformResult<FirDeclaration> { open fun transformTypeParameter(typeParameter: FirTypeParameter, data: D): CompositeTransformResult<FirDeclaration> {
return transformNamedDeclaration(typeParameter, data) return transformNamedDeclaration(typeParameter, data)
} }
@@ -238,6 +242,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformType(type, data) return transformType(type, data)
} }
final override fun visitTypeAlias(typeAlias: FirTypeAlias, data: D): CompositeTransformResult<FirElement> {
return transformTypeAlias(typeAlias, data)
}
final override fun visitTypeProjection(typeProjection: FirTypeProjection, data: D): CompositeTransformResult<FirElement> { final override fun visitTypeProjection(typeProjection: FirTypeProjection, data: D): CompositeTransformResult<FirElement> {
return transformTypeProjection(typeProjection, data) return transformTypeProjection(typeProjection, data)
} }
@@ -314,10 +322,6 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformResolvedImport(resolvedImport, data) return transformResolvedImport(resolvedImport, data)
} }
final override fun visitTypeAlias(typeAlias: FirTypeAlias, data: D): CompositeTransformResult<FirElement> {
return transformTypeAlias(typeAlias, data)
}
final override fun visitTypeParameter(typeParameter: FirTypeParameter, data: D): CompositeTransformResult<FirElement> { final override fun visitTypeParameter(typeParameter: FirTypeParameter, data: D): CompositeTransformResult<FirElement> {
return transformTypeParameter(typeParameter, data) return transformTypeParameter(typeParameter, data)
} }
@@ -338,6 +342,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformImplicitType(implicitType, data) return transformImplicitType(implicitType, data)
} }
final override fun visitResolvedTypeAlias(resolvedTypeAlias: FirResolvedTypeAlias, data: D): CompositeTransformResult<FirElement> {
return transformResolvedTypeAlias(resolvedTypeAlias, data)
}
final override fun visitStarProjection(starProjection: FirStarProjection, data: D): CompositeTransformResult<FirElement> { final override fun visitStarProjection(starProjection: FirStarProjection, data: D): CompositeTransformResult<FirElement> {
return transformStarProjection(starProjection, data) return transformStarProjection(starProjection, data)
} }
@@ -74,6 +74,10 @@ abstract class FirVisitor<out R, in D> {
return visitMemberDeclaration(typeAlias, data) return visitMemberDeclaration(typeAlias, data)
} }
open fun visitResolvedTypeAlias(resolvedTypeAlias: FirResolvedTypeAlias, data: D): R {
return visitTypeAlias(resolvedTypeAlias, data)
}
open fun visitTypeParameter(typeParameter: FirTypeParameter, data: D): R { open fun visitTypeParameter(typeParameter: FirTypeParameter, data: D): R {
return visitNamedDeclaration(typeParameter, data) return visitNamedDeclaration(typeParameter, data)
} }
@@ -74,6 +74,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitMemberDeclaration(typeAlias, null) visitMemberDeclaration(typeAlias, null)
} }
open fun visitResolvedTypeAlias(resolvedTypeAlias: FirResolvedTypeAlias) {
visitTypeAlias(resolvedTypeAlias, null)
}
open fun visitTypeParameter(typeParameter: FirTypeParameter) { open fun visitTypeParameter(typeParameter: FirTypeParameter) {
visitNamedDeclaration(typeParameter, null) visitNamedDeclaration(typeParameter, null)
} }
@@ -238,6 +242,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitType(type) visitType(type)
} }
final override fun visitTypeAlias(typeAlias: FirTypeAlias, data: Nothing?) {
visitTypeAlias(typeAlias)
}
final override fun visitTypeProjection(typeProjection: FirTypeProjection, data: Nothing?) { final override fun visitTypeProjection(typeProjection: FirTypeProjection, data: Nothing?) {
visitTypeProjection(typeProjection) visitTypeProjection(typeProjection)
} }
@@ -314,10 +322,6 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitResolvedImport(resolvedImport) visitResolvedImport(resolvedImport)
} }
final override fun visitTypeAlias(typeAlias: FirTypeAlias, data: Nothing?) {
visitTypeAlias(typeAlias)
}
final override fun visitTypeParameter(typeParameter: FirTypeParameter, data: Nothing?) { final override fun visitTypeParameter(typeParameter: FirTypeParameter, data: Nothing?) {
visitTypeParameter(typeParameter) visitTypeParameter(typeParameter)
} }
@@ -338,6 +342,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitImplicitType(implicitType) visitImplicitType(implicitType)
} }
final override fun visitResolvedTypeAlias(resolvedTypeAlias: FirResolvedTypeAlias, data: Nothing?) {
visitResolvedTypeAlias(resolvedTypeAlias)
}
final override fun visitStarProjection(starProjection: FirStarProjection, data: Nothing?) { final override fun visitStarProjection(starProjection: FirStarProjection, data: Nothing?) {
visitStarProjection(starProjection) visitStarProjection(starProjection)
} }
+2 -2
View File
@@ -1,5 +1,5 @@
FILE: F.kt FILE: F.kt
unknown open class A() { (resolved) unknown open class A() {
} }
unknown final class B() : R/<root>.A/ { (resolved) unknown final class B() : R/<root>.A/ {
} }
+3 -3
View File
@@ -1,11 +1,11 @@
FILE: NestedOfAliasedType.kt FILE: NestedOfAliasedType.kt
unknown abstract class A() { (resolved) unknown abstract class A() {
unknown abstract class Nested() { unknown abstract class Nested() {
} }
} }
unknown final typealias TA = R/<root>.A/ (resolved) unknown final typealias TA = R/<root>.A/
unknown final class B() : R/<root>.TA = <root>.A/ { (resolved) unknown final class B() : R/<root>.TA = <root>.A/ {
unknown final class NestedInB() : R/<root>.A.Nested/ { unknown final class NestedInB() : R/<root>.A.Nested/ {
} }
+2 -2
View File
@@ -1,5 +1,5 @@
FILE: NestedSuperType.kt FILE: NestedSuperType.kt
unknown abstract class My() { (resolved) unknown abstract class My() {
unknown abstract class NestedOne() : R/p.My/ { unknown abstract class NestedOne() : R/p.My/ {
unknown abstract class NestedTwo() : R/p.My.NestedOne/ { unknown abstract class NestedTwo() : R/p.My.NestedOne/ {
} }
@@ -7,7 +7,7 @@ FILE: NestedSuperType.kt
} }
} }
unknown final class Your() : R/p.My/ { (resolved) unknown final class Your() : R/p.My/ {
unknown final class NestedThree() : R/p.My.NestedOne/ { unknown final class NestedThree() : R/p.My.NestedOne/ {
} }
@@ -1,5 +1,5 @@
FILE: TwoDeclarationsInSameFile.kt FILE: TwoDeclarationsInSameFile.kt
unknown open class A() { (resolved) unknown open class A() {
} }
unknown final class B() : R/p.A/ { (resolved) unknown final class B() : R/p.A/ {
} }
@@ -1,5 +1,5 @@
FILE: NestedSuperType.kt FILE: NestedSuperType.kt
unknown final class A() : R/b.B/ { (resolved) unknown final class A() : R/b.B/ {
unknown final class NestedInA1() : R/b.B.NestedInB/ { unknown final class NestedInA1() : R/b.B.NestedInB/ {
} }
@@ -1,3 +1,3 @@
FILE: simpleAliasedImport.kt FILE: simpleAliasedImport.kt
unknown final class YourClass() : R/b.MyClass/ { (resolved) unknown final class YourClass() : R/b.MyClass/ {
} }
+1 -1
View File
@@ -1,3 +1,3 @@
FILE: simpleImport.kt FILE: simpleImport.kt
unknown final class YourClass() : R/b.MyClass/ { (resolved) unknown final class YourClass() : R/b.MyClass/ {
} }
@@ -1,3 +1,3 @@
FILE: simpleImportNested.kt FILE: simpleImportNested.kt
unknown final class YourClass() : R/a.MyClass.MyNested/ { (resolved) unknown final class YourClass() : R/a.MyClass.MyNested/ {
} }
@@ -1,3 +1,3 @@
FILE: simpleImportOuter.kt FILE: simpleImportOuter.kt
unknown final class My() : R/a.Outer.Nested/ { (resolved) unknown final class My() : R/a.Outer.Nested/ {
} }
+2 -2
View File
@@ -1,12 +1,12 @@
FILE: simpleClass.kt FILE: simpleClass.kt
unknown final interface SomeInterface() { (resolved) unknown final interface SomeInterface() {
unknown final function foo(x: R/error: Failed to resolve qualified type/, y: R/error: Failed to resolve qualified type/): R/error: Failed to resolve qualified type/ unknown final function foo(x: R/error: Failed to resolve qualified type/, y: R/error: Failed to resolve qualified type/): R/error: Failed to resolve qualified type/
unknown final property bar(val): R/error: Failed to resolve qualified type/ unknown final property bar(val): R/error: Failed to resolve qualified type/
unknown get(): R/error: Failed to resolve qualified type/ unknown get(): R/error: Failed to resolve qualified type/
} }
unknown final class SomeClass() : R/<root>.SomeInterface/ { (resolved) unknown final class SomeClass() : R/<root>.SomeInterface/ {
private final property baz(val): R/error: Not supported: FirImplicitTypeImpl/ = STUB private final property baz(val): R/error: Not supported: FirImplicitTypeImpl/ = STUB
unknown get(): R/error: Not supported: FirImplicitTypeImpl/ unknown get(): R/error: Not supported: FirImplicitTypeImpl/
+3 -3
View File
@@ -1,6 +1,6 @@
FILE: simpleTypeAlias.kt FILE: simpleTypeAlias.kt
unknown final interface B() { (resolved) unknown final interface B() {
} }
unknown final typealias C = R/<root>.B/ (resolved) unknown final typealias C = R/<root>.B/
unknown final class D() : R/<root>.C = <root>.B/ { (resolved) unknown final class D() : R/<root>.C = <root>.B/ {
} }