From 6c8a326e15a319f90e468c5dbfbbda3686ccc403 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 20 Mar 2018 15:25:16 +0300 Subject: [PATCH] FIR: split transformer into three (imports / types / descriptors) --- .../kotlin/fir/builder/RawFirBuilder.kt | 3 +- .../FirClassifierResolveTransformer.kt | 24 +-------- .../FirImportResolveTransformer.kt | 52 +++++++++++++++++++ .../descriptors/FirTotalResolveTransformer.kt | 32 ++++++++++++ .../descriptors/FirTypeResolveTransformer.kt | 51 ++++++++++++++++++ .../fir/resolve/FirQualifierResolver.kt | 2 - .../resolve/impl/FirQualifierResolverImpl.kt | 27 ---------- .../scopes/impl/FirExplicitImportingScope.kt | 15 ++---- .../kotlin/fir/declarations/FirFile.kt | 2 + .../kotlin/fir/declarations/FirImport.kt | 5 +- .../fir/declarations/FirResolvedClass.kt | 6 ++- .../fir/declarations/FirResolvedImport.kt | 16 ++++++ .../fir/declarations/impl/FirImportImpl.kt | 3 +- .../impl/FirResolvedImportImpl.kt | 19 +++++++ .../fir/visitors/FirTransformerGenerated.kt | 18 +++++-- .../fir/visitors/FirVisitorGenerated.kt | 4 ++ .../fir/visitors/FirVisitorVoidGenerated.kt | 16 ++++-- .../multifile/simpleAliasedImport.1.kt | 3 ++ .../resolve/multifile/simpleAliasedImport.kt | 4 ++ .../resolve/multifile/simpleAliasedImport.txt | 3 ++ .../kotlin/fir/AbstractFirResolveTestCase.kt | 13 ++--- .../fir/FirResolveTestCaseGenerated.java | 6 +++ 22 files changed, 243 insertions(+), 81 deletions(-) create mode 100644 compiler/fir/resolve/src/org/jetbrains/kotlin/descriptors/FirImportResolveTransformer.kt create mode 100644 compiler/fir/resolve/src/org/jetbrains/kotlin/descriptors/FirTotalResolveTransformer.kt create mode 100644 compiler/fir/resolve/src/org/jetbrains/kotlin/descriptors/FirTypeResolveTransformer.kt create mode 100644 compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirResolvedImport.kt create mode 100644 compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirResolvedImportImpl.kt create mode 100644 compiler/testData/fir/resolve/multifile/simpleAliasedImport.1.kt create mode 100644 compiler/testData/fir/resolve/multifile/simpleAliasedImport.kt create mode 100644 compiler/testData/fir/resolve/multifile/simpleAliasedImport.txt diff --git a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index e3001c1ec0e..dc898400bab 100644 --- a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.fir.types.FirType import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.impl.* import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.modalityModifierType import org.jetbrains.kotlin.psi.psiUtil.visibilityModifierType @@ -206,7 +207,7 @@ class RawFirBuilder(val session: FirSession) { importDirective, importDirective.importedFqName, importDirective.isAllUnder, - importDirective.aliasName + importDirective.aliasName?.let { Name.identifier(it) } ) } for (declaration in file.declarations) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/descriptors/FirClassifierResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/descriptors/FirClassifierResolveTransformer.kt index 8093221aa0a..87fd5f1e578 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/descriptors/FirClassifierResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/descriptors/FirClassifierResolveTransformer.kt @@ -33,31 +33,9 @@ class FirClassifierResolveTransformer : FirTransformer() { lateinit var packageFqName: FqNameUnsafe - lateinit var importingScope: FirImportingScope - override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult { packageFqName = file.packageFqName.toUnsafe() - importingScope = FirCompositeImportingScope( - FirExplicitImportingScope(file.imports), - FirSelfImportingScope(file.packageFqName.toUnsafe(), file.session) - ) - return file.also { it.acceptChildren(this, null) }.compose() - } - - // TODO: Extract to separate transformer? - override fun transformType(type: FirType, data: Nothing?): CompositeTransformResult { - val typeResolver = FirTypeResolver.getInstance(type.session) - return FirResolvedTypeImpl( - type.session, - type.psi, - typeResolver.resolveType(type, importingScope), - false, - type.annotations - ).compose() - } - - override fun transformResolvedType(resolvedType: FirResolvedType, data: Nothing?): CompositeTransformResult { - return resolvedType.compose() + return file.also { it.transformChildren(this, null) }.compose() } var className: FqName = FqName.ROOT diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/descriptors/FirImportResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/descriptors/FirImportResolveTransformer.kt new file mode 100644 index 00000000000..00f90d87030 --- /dev/null +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/descriptors/FirImportResolveTransformer.kt @@ -0,0 +1,52 @@ +/* + * 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.FirElement +import org.jetbrains.kotlin.fir.UnambiguousFqName +import org.jetbrains.kotlin.fir.declarations.FirFile +import org.jetbrains.kotlin.fir.declarations.FirImport +import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedImportImpl +import org.jetbrains.kotlin.fir.resolve.FirProvider +import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult +import org.jetbrains.kotlin.fir.visitors.FirTransformer +import org.jetbrains.kotlin.fir.visitors.compose +import org.jetbrains.kotlin.name.FqName + +class FirImportResolveTransformer : FirTransformer() { + override fun transformElement(element: E, data: Nothing?): CompositeTransformResult { + return element.compose() + } + + override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult { + return file.also { it.transformChildren(this, null) }.compose() + } + + override fun transformImport(import: FirImport, data: Nothing?): CompositeTransformResult { + val fqName = import.importedFqName ?: return import.compose() + val firProvider = FirProvider.getInstance(import.session) + + if (!fqName.isRoot) { + val lastPart = mutableListOf() + var firstPart = fqName + + while (!firstPart.isRoot) { + lastPart.add(0, firstPart.shortName().asString()) + firstPart = firstPart.parent() + + val resolvedFqName = UnambiguousFqName(firstPart.toUnsafe(), FqName.fromSegments(lastPart)) + val foundClassifier = firProvider.getFirClassifierByFqName(resolvedFqName) + + if (foundClassifier != null) { + return FirResolvedImportImpl(import, resolvedFqName).compose() + } + } + return import.compose() + } else { + return import.compose() + } + } +} \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/descriptors/FirTotalResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/descriptors/FirTotalResolveTransformer.kt new file mode 100644 index 00000000000..b7cdcc51b3e --- /dev/null +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/descriptors/FirTotalResolveTransformer.kt @@ -0,0 +1,32 @@ +/* + * 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.FirFile +import org.jetbrains.kotlin.fir.visitors.FirTransformer + +class FirTotalResolveTransformer { + + private val transformers: List> = listOf( + FirImportResolveTransformer(), + FirTypeResolveTransformer(), + FirClassifierResolveTransformer() + ) + + fun processFile(firFile: FirFile) { + for (transformer in transformers) { + firFile.transform(transformer, null) + } + } + + fun processFiles(files: List) { + for (transformer in transformers) { + for (firFile in files) { + firFile.transform(transformer, null) + } + } + } +} \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/descriptors/FirTypeResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/descriptors/FirTypeResolveTransformer.kt new file mode 100644 index 00000000000..e965501e17b --- /dev/null +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/descriptors/FirTypeResolveTransformer.kt @@ -0,0 +1,51 @@ +/* + * 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.FirElement +import org.jetbrains.kotlin.fir.declarations.FirFile +import org.jetbrains.kotlin.fir.resolve.FirTypeResolver +import org.jetbrains.kotlin.fir.scopes.FirImportingScope +import org.jetbrains.kotlin.fir.scopes.impl.FirCompositeImportingScope +import org.jetbrains.kotlin.fir.scopes.impl.FirExplicitImportingScope +import org.jetbrains.kotlin.fir.scopes.impl.FirSelfImportingScope +import org.jetbrains.kotlin.fir.types.FirResolvedType +import org.jetbrains.kotlin.fir.types.FirType +import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeImpl +import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult +import org.jetbrains.kotlin.fir.visitors.FirTransformer +import org.jetbrains.kotlin.fir.visitors.compose + +class FirTypeResolveTransformer : FirTransformer() { + override fun transformElement(element: E, data: Nothing?): CompositeTransformResult { + return (element.transformChildren(this, data) as E).compose() + } + + lateinit var importingScope: FirImportingScope + + override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult { + importingScope = FirCompositeImportingScope( + FirExplicitImportingScope(file.imports), + FirSelfImportingScope(file.packageFqName.toUnsafe(), file.session) + ) + return file.also { it.transformChildren(this, null) }.compose() + } + + override fun transformType(type: FirType, data: Nothing?): CompositeTransformResult { + val typeResolver = FirTypeResolver.getInstance(type.session) + return FirResolvedTypeImpl( + type.session, + type.psi, + typeResolver.resolveType(type, importingScope), + false, + type.annotations + ).compose() + } + + override fun transformResolvedType(resolvedType: FirResolvedType, data: Nothing?): CompositeTransformResult { + return resolvedType.compose() + } +} \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirQualifierResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirQualifierResolver.kt index 044bc2acefa..96d6c6bc3cd 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirQualifierResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirQualifierResolver.kt @@ -17,8 +17,6 @@ interface FirQualifierResolver { fun resolveType(parts: List): ConeKotlinType? - fun resolveImport(fqName: FqName): UnambiguousFqName? - companion object { fun getInstance(session: FirSession): FirQualifierResolver = session.service() } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirQualifierResolverImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirQualifierResolverImpl.kt index 339f30b36a8..282b40eec0b 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirQualifierResolverImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirQualifierResolverImpl.kt @@ -71,33 +71,6 @@ class FirQualifierResolverImpl(val session: FirSession) : FirQualifierResolver { } } - // TODO: extract common part from resolveType/Import - override fun resolveImport(fqName: FqName): UnambiguousFqName? { - val firProvider = FirProvider.getInstance(session) - - if (!fqName.isRoot) { - val lastPart = mutableListOf() - var firstPart = fqName - - while (!firstPart.isRoot) { - lastPart.add(0, firstPart.shortName().asString()) - firstPart = firstPart.parent() - - val fqName = UnambiguousFqName(firstPart.toUnsafe(), FqName.fromSegments(lastPart)) - val foundClassifier = firProvider.getFirClassifierByFqName(fqName) - - if (foundClassifier != null) { - return fqName - } - } - return null - } else { - return null - } - } - private fun List.toFqNameUnsafe() = toFqName().toUnsafe() private fun List.toFqName() = fold(FqName.ROOT) { a, b -> a.child(b.name) } - - } \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirExplicitImportingScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirExplicitImportingScope.kt index 18164b79d0b..bceae96c5a6 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirExplicitImportingScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirExplicitImportingScope.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.scopes.impl import org.jetbrains.kotlin.fir.UnambiguousFqName import org.jetbrains.kotlin.fir.declarations.FirImport +import org.jetbrains.kotlin.fir.declarations.FirResolvedImport import org.jetbrains.kotlin.fir.resolve.FirQualifierResolver import org.jetbrains.kotlin.fir.scopes.FirImportingScope import org.jetbrains.kotlin.name.Name @@ -15,20 +16,14 @@ class FirExplicitImportingScope(imports: List) : FirImportingScope { // TODO: Resolve imports! Instead of computing it resolution results here private val simpleImports = - imports.filter { !it.isAllUnder && it.aliasName == null && it.importedFqName != null } - .mapNotNull { it.resolve() } - .groupBy { it.classFqName.shortName() } - - private fun FirImport.resolve(): UnambiguousFqName? { - val session = session - val qualifierResolver = FirQualifierResolver.getInstance(session) - return qualifierResolver.resolveImport(importedFqName!!) - } + imports.filterIsInstance() + .filter { !it.isAllUnder } + .groupBy { it.aliasName ?: it.resolvedFqName.classFqName.shortName() } override fun processClassifiersByName(name: Name, processor: (UnambiguousFqName) -> Boolean): Boolean { val imports = simpleImports[name] ?: return true for (import in imports) { - if (!processor(import)) { + if (!processor(import.resolvedFqName)) { return false } } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirFile.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirFile.kt index 8bb2b166577..6117db4c9cd 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirFile.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirFile.kt @@ -6,8 +6,10 @@ package org.jetbrains.kotlin.fir.declarations import org.jetbrains.kotlin.fir.BaseTransformedType +import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.VisitedSupertype import org.jetbrains.kotlin.fir.expressions.FirAnnotationContainer +import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.name.FqName diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirImport.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirImport.kt index a87038302ea..b2ea9640cb3 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirImport.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirImport.kt @@ -5,16 +5,19 @@ package org.jetbrains.kotlin.fir.declarations +import org.jetbrains.kotlin.fir.BaseTransformedType import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name +@BaseTransformedType interface FirImport : FirElement { val importedFqName: FqName? val isAllUnder: Boolean - val aliasName: String? + val aliasName: Name? override fun accept(visitor: FirVisitor, data: D): R = visitor.visitImport(this, data) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirResolvedClass.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirResolvedClass.kt index 769f2405387..65024595329 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirResolvedClass.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirResolvedClass.kt @@ -6,5 +6,9 @@ package org.jetbrains.kotlin.fir.declarations import org.jetbrains.kotlin.fir.FirDescriptorOwner +import org.jetbrains.kotlin.fir.visitors.FirVisitor -interface FirResolvedClass : FirClass, FirDescriptorOwner \ No newline at end of file +interface FirResolvedClass : FirClass, FirDescriptorOwner { + override fun accept(visitor: FirVisitor, data: D): R = + visitor.visitResolvedClass(this, data) +} \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirResolvedImport.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirResolvedImport.kt new file mode 100644 index 00000000000..459de2a1209 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirResolvedImport.kt @@ -0,0 +1,16 @@ +/* + * 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.UnambiguousFqName +import org.jetbrains.kotlin.fir.visitors.FirVisitor + +interface FirResolvedImport : FirImport { + val resolvedFqName: UnambiguousFqName + + override fun accept(visitor: FirVisitor, data: D): R = + visitor.visitResolvedImport(this, data) +} \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirImportImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirImportImpl.kt index b923e3c6519..c0fc6923a1b 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirImportImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirImportImpl.kt @@ -9,11 +9,12 @@ import com.intellij.psi.PsiElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirImport import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name class FirImportImpl( override val session: FirSession, override val psi: PsiElement?, override val importedFqName: FqName?, override val isAllUnder: Boolean, - override val aliasName: String? + override val aliasName: Name? ) : FirImport \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirResolvedImportImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirResolvedImportImpl.kt new file mode 100644 index 00000000000..39c20e23d14 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirResolvedImportImpl.kt @@ -0,0 +1,19 @@ +/* + * 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.UnambiguousFqName +import org.jetbrains.kotlin.fir.declarations.FirImport +import org.jetbrains.kotlin.fir.declarations.FirResolvedImport +import org.jetbrains.kotlin.fir.visitors.FirVisitor + +class FirResolvedImportImpl( + val delegate: FirImport, + override val resolvedFqName: UnambiguousFqName +) : FirResolvedImport, FirImport by delegate { + override fun accept(visitor: FirVisitor, data: D): R = + visitor.visitResolvedImport(this, data) +} \ No newline at end of file diff --git a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirTransformerGenerated.kt b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirTransformerGenerated.kt index f61be433e01..0bc0e2a7e32 100644 --- a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirTransformerGenerated.kt +++ b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirTransformerGenerated.kt @@ -94,10 +94,14 @@ abstract class FirTransformer : FirVisitor transformImport(import: E, data: D): CompositeTransformResult { + open fun transformImport(import: FirImport, data: D): CompositeTransformResult { return transformElement(import, data) } + open fun transformResolvedImport(resolvedImport: FirResolvedImport, data: D): CompositeTransformResult { + return transformImport(resolvedImport, data) + } + open fun transformPackageFragment(packageFragment: E, data: D): CompositeTransformResult { return transformElement(packageFragment, data) } @@ -210,6 +214,10 @@ abstract class FirTransformer : FirVisitor { + return transformImport(import, data) + } + final override fun visitMemberDeclaration(memberDeclaration: FirMemberDeclaration, data: D): CompositeTransformResult { return transformMemberDeclaration(memberDeclaration, data) } @@ -282,10 +290,6 @@ abstract class FirTransformer : FirVisitor { - return transformImport(import, data) - } - final override fun visitBody(body: FirBody, data: D): CompositeTransformResult { return transformBody(body, data) } @@ -306,6 +310,10 @@ abstract class FirTransformer : FirVisitor { + return transformResolvedImport(resolvedImport, data) + } + final override fun visitTypeAlias(typeAlias: FirTypeAlias, data: D): CompositeTransformResult { return transformTypeAlias(typeAlias, data) } diff --git a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorGenerated.kt b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorGenerated.kt index f0f38803a8b..281165fa1f5 100644 --- a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorGenerated.kt +++ b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorGenerated.kt @@ -98,6 +98,10 @@ abstract class FirVisitor { return visitElement(import, data) } + open fun visitResolvedImport(resolvedImport: FirResolvedImport, data: D): R { + return visitImport(resolvedImport, data) + } + open fun visitPackageFragment(packageFragment: FirPackageFragment, data: D): R { return visitElement(packageFragment, data) } diff --git a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorVoidGenerated.kt b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorVoidGenerated.kt index a9e2769307c..b5f051e22e1 100644 --- a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorVoidGenerated.kt +++ b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorVoidGenerated.kt @@ -98,6 +98,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitElement(import, null) } + open fun visitResolvedImport(resolvedImport: FirResolvedImport) { + visitImport(resolvedImport, null) + } + open fun visitPackageFragment(packageFragment: FirPackageFragment) { visitElement(packageFragment, null) } @@ -210,6 +214,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitFunction(function) } + final override fun visitImport(import: FirImport, data: Nothing?) { + visitImport(import) + } + final override fun visitMemberDeclaration(memberDeclaration: FirMemberDeclaration, data: Nothing?) { visitMemberDeclaration(memberDeclaration) } @@ -282,10 +290,6 @@ abstract class FirVisitorVoid : FirVisitor() { visitAnonymousInitializer(anonymousInitializer) } - final override fun visitImport(import: FirImport, data: Nothing?) { - visitImport(import) - } - final override fun visitBody(body: FirBody, data: Nothing?) { visitBody(body) } @@ -306,6 +310,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitPropertyAccessor(propertyAccessor) } + final override fun visitResolvedImport(resolvedImport: FirResolvedImport, data: Nothing?) { + visitResolvedImport(resolvedImport) + } + final override fun visitTypeAlias(typeAlias: FirTypeAlias, data: Nothing?) { visitTypeAlias(typeAlias) } diff --git a/compiler/testData/fir/resolve/multifile/simpleAliasedImport.1.kt b/compiler/testData/fir/resolve/multifile/simpleAliasedImport.1.kt new file mode 100644 index 00000000000..83ba1cf1ad1 --- /dev/null +++ b/compiler/testData/fir/resolve/multifile/simpleAliasedImport.1.kt @@ -0,0 +1,3 @@ +package b + +abstract class MyClass \ No newline at end of file diff --git a/compiler/testData/fir/resolve/multifile/simpleAliasedImport.kt b/compiler/testData/fir/resolve/multifile/simpleAliasedImport.kt new file mode 100644 index 00000000000..6657ab7935d --- /dev/null +++ b/compiler/testData/fir/resolve/multifile/simpleAliasedImport.kt @@ -0,0 +1,4 @@ +package a +import b.MyClass as HisClass + +class YourClass : HisClass \ No newline at end of file diff --git a/compiler/testData/fir/resolve/multifile/simpleAliasedImport.txt b/compiler/testData/fir/resolve/multifile/simpleAliasedImport.txt new file mode 100644 index 00000000000..811a9c1029b --- /dev/null +++ b/compiler/testData/fir/resolve/multifile/simpleAliasedImport.txt @@ -0,0 +1,3 @@ +FILE: simpleAliasedImport.kt + unknown final class YourClass() : R/b.MyClass/ { + } diff --git a/compiler/tests/org/jetbrains/kotlin/fir/AbstractFirResolveTestCase.kt b/compiler/tests/org/jetbrains/kotlin/fir/AbstractFirResolveTestCase.kt index 19c011174d5..e4b3252fa4f 100644 --- a/compiler/tests/org/jetbrains/kotlin/fir/AbstractFirResolveTestCase.kt +++ b/compiler/tests/org/jetbrains/kotlin/fir/AbstractFirResolveTestCase.kt @@ -6,10 +6,11 @@ package org.jetbrains.kotlin.fir import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment -import org.jetbrains.kotlin.descriptors.FirClassifierResolveTransformer +import org.jetbrains.kotlin.descriptors.FirTotalResolveTransformer import org.jetbrains.kotlin.fir.builder.RawFirBuilder -import org.jetbrains.kotlin.fir.declarations.FirFile -import org.jetbrains.kotlin.fir.resolve.* +import org.jetbrains.kotlin.fir.resolve.FirProvider +import org.jetbrains.kotlin.fir.resolve.FirQualifierResolver +import org.jetbrains.kotlin.fir.resolve.FirTypeResolver import org.jetbrains.kotlin.fir.resolve.impl.FirProviderImpl import org.jetbrains.kotlin.fir.resolve.impl.FirQualifierResolverImpl import org.jetbrains.kotlin.fir.resolve.impl.FirTypeResolverImpl @@ -47,13 +48,13 @@ abstract class AbstractFirResolveTestCase : KotlinTestWithEnvironment() { val builder = RawFirBuilder(session) - val transformer = FirClassifierResolveTransformer() + val transformer = FirTotalResolveTransformer() val firFiles = ktFiles.map { val firFile = builder.buildFirFile(it) (session.service() as FirProviderImpl).recordFile(firFile) firFile - }.onEach { - it.transform(transformer, null) + }.also { + transformer.processFiles(it) } val firFileDump = StringBuilder().also { firFiles.first().accept(FirRenderer(it), null) }.toString() diff --git a/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java b/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java index 319fe18df12..92a182ae4de 100644 --- a/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java @@ -51,6 +51,12 @@ public class FirResolveTestCaseGenerated extends AbstractFirResolveTestCase { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/fir/resolve/multifile"), Pattern.compile("^([^.]+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("simpleAliasedImport.kt") + public void testSimpleAliasedImport() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/fir/resolve/multifile/simpleAliasedImport.kt"); + doTest(fileName); + } + @TestMetadata("simpleImport.kt") public void testSimpleImport() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/fir/resolve/multifile/simpleImport.kt");