From 4e217b180a1c4fd29a76f94998b5ae0af6f6c14d Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 25 Jun 2018 14:55:43 +0200 Subject: [PATCH] Pass BindingContext to CodegenUtil.getActualDeclarations Will be used in a subsequent commit. Also rename getActualDeclarations -> getDeclarationsToGenerate --- .../jetbrains/kotlin/backend/common/CodegenUtil.kt | 8 ++++++-- .../kotlin/codegen/MultifileClassCodegen.kt | 14 ++++++++------ .../kotlin/codegen/MultifileClassPartCodegen.kt | 2 +- .../kotlin/codegen/PackageCodegenImpl.java | 2 +- .../kotlin/codegen/PackagePartCodegen.java | 5 +++-- .../kotlin/codegen/SamWrapperCodegen.java | 6 ++++-- .../codegen/AbstractBlackBoxCodegenTest.java | 8 ++++---- 7 files changed, 27 insertions(+), 18 deletions(-) diff --git a/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/CodegenUtil.kt b/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/CodegenUtil.kt index d70875ec983..7e75076b077 100644 --- a/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/CodegenUtil.kt +++ b/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/CodegenUtil.kt @@ -167,9 +167,13 @@ object CodegenUtil { return KtPsiFactory(project, markGenerated = false).createExpression(fakeFunctionCall) as KtCallExpression } + /** + * Returns declarations in the given [file] which should be generated by the back-end. This includes all declarations + * minus all expected declarations. + */ @JvmStatic - fun getActualDeclarations(file: KtFile): List = - file.declarations.filterNot(KtDeclaration::hasExpectModifier) + fun getDeclarationsToGenerate(file: KtFile, bindingContext: BindingContext): List = + file.declarations.filterNot(KtDeclaration::hasExpectModifier) @JvmStatic fun findExpectedFunctionForActual(descriptor: FunctionDescriptor): FunctionDescriptor? { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt index 4fef6c97a53..f44f73864d1 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt @@ -85,7 +85,7 @@ class MultifileClassCodegenImpl( private val partInternalNamesSorted = run { val partInternalNamesSet = hashSetOf() for (file in files) { - if (file.hasDeclarationsForPartClass()) { + if (file.hasDeclarationsForPartClass(state.bindingContext)) { partInternalNamesSet.add(JvmFileClassUtil.getFileClassInternalName(file)) } } @@ -122,7 +122,7 @@ class MultifileClassCodegenImpl( val singleSourceFile = if (previouslyCompiledCallables.isEmpty()) - files.singleOrNull { it.hasDeclarationsForPartClass() } + files.singleOrNull { it.hasDeclarationsForPartClass(state.bindingContext) } else null @@ -209,7 +209,9 @@ class MultifileClassCodegenImpl( generateNonPartClassDeclarations(file, partContext) - if (!state.generateDeclaredClassFilter.shouldGeneratePackagePart(file) || !file.hasDeclarationsForPartClass()) return + if (!state.generateDeclaredClassFilter.shouldGeneratePackagePart(file) || + !file.hasDeclarationsForPartClass(state.bindingContext) + ) return packagePartRegistry.addPart(partType.internalName, facadeClassType.internalName) @@ -243,7 +245,7 @@ class MultifileClassCodegenImpl( private fun addDelegateGenerationTasksForDeclarationsInFile(file: KtFile, packageFragment: PackageFragmentDescriptor, partType: Type) { val facadeContext = state.rootContext.intoMultifileClass(packageFragment, facadeClassType, partType) val memberCodegen = createCodegenForDelegatesInMultifileFacade(facadeContext) - for (declaration in CodegenUtil.getActualDeclarations(file)) { + for (declaration in CodegenUtil.getDeclarationsToGenerate(file, state.bindingContext)) { if (declaration is KtNamedFunction || declaration is KtProperty || declaration is KtTypeAlias) { val descriptor = state.bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, declaration) if (descriptor !is MemberDescriptor) { @@ -375,8 +377,8 @@ class MultifileClassCodegenImpl( return fragments.firstOrNull() } - private fun KtFile.hasDeclarationsForPartClass() = - CodegenUtil.getActualDeclarations(this).any { it is KtProperty || it is KtFunction || it is KtTypeAlias } + private fun KtFile.hasDeclarationsForPartClass(bindingContext: BindingContext) = + CodegenUtil.getDeclarationsToGenerate(this, bindingContext).any { it is KtProperty || it is KtFunction || it is KtTypeAlias } private fun getCompiledPackageFragment( facadeFqName: FqName, state: GenerationState diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt index f782c31de52..b287a5cdba5 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt @@ -132,7 +132,7 @@ class MultifileClassPartCodegen( } override fun generateBody() { - for (declaration in CodegenUtil.getActualDeclarations(element)) { + for (declaration in CodegenUtil.getDeclarationsToGenerate(element, state.bindingContext)) { if (declaration is KtNamedFunction || declaration is KtProperty || declaration is KtTypeAlias) { genSimpleMember(declaration) } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegenImpl.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegenImpl.java index 3854d03e850..17d6a9eb30d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegenImpl.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegenImpl.java @@ -98,7 +98,7 @@ public class PackageCodegenImpl implements PackageCodegen { List classOrObjects = new ArrayList<>(); - for (KtDeclaration declaration : CodegenUtil.getActualDeclarations(file)) { + for (KtDeclaration declaration : CodegenUtil.getDeclarationsToGenerate(file, state.getBindingContext())) { if (isFilePartDeclaration(declaration)) { generatePackagePart = true; } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java index 64a6629d141..476145d7d2b 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java @@ -90,7 +90,7 @@ public class PackagePartCodegen extends MemberCodegen { @Override protected void generateBody() { - for (KtDeclaration declaration : CodegenUtil.getActualDeclarations(element)) { + for (KtDeclaration declaration : CodegenUtil.getDeclarationsToGenerate(element, state.getBindingContext())) { if (declaration instanceof KtNamedFunction || declaration instanceof KtProperty || declaration instanceof KtTypeAlias) { genSimpleMember(declaration); } @@ -123,7 +123,8 @@ public class PackagePartCodegen extends MemberCodegen { @NotNull Type packagePartType ) { BindingContext bindingContext = codegen.bindingContext; - List members = CollectionsKt.mapNotNull(CodegenUtil.getActualDeclarations(codegen.element), declaration -> { + List allDeclarations = CodegenUtil.getDeclarationsToGenerate(codegen.element, bindingContext); + List members = CollectionsKt.mapNotNull(allDeclarations, declaration -> { if (declaration instanceof KtNamedFunction) { return bindingContext.get(BindingContext.FUNCTION, declaration); } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java index a0a1ddace1b..c60b53b1d3c 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java @@ -193,8 +193,10 @@ public class SamWrapperCodegen { @NotNull KtFile containingFile, CallableMemberDescriptor contextDescriptor ) { - boolean hasPackagePartClass = - CollectionsKt.any(CodegenUtil.getActualDeclarations(containingFile), PackageCodegenImpl::isFilePartDeclaration); + boolean hasPackagePartClass = CollectionsKt.any( + CodegenUtil.getDeclarationsToGenerate(containingFile, state.getBindingContext()), + PackageCodegenImpl::isFilePartDeclaration + ); FqName filePartFqName = JvmFileClassUtil.getFileClassInfoNoResolve(containingFile).getFileClassFqName(); FqName outermostOwner; diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/AbstractBlackBoxCodegenTest.java b/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/AbstractBlackBoxCodegenTest.java index 1e68dc3d464..4d8be2bb7e3 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/AbstractBlackBoxCodegenTest.java +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/AbstractBlackBoxCodegenTest.java @@ -12,6 +12,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.backend.common.CodegenUtil; import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil; import org.jetbrains.kotlin.psi.*; +import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.test.InTextDirectivesUtils; import org.jetbrains.kotlin.utils.ExceptionUtilsKt; @@ -87,7 +88,7 @@ public abstract class AbstractBlackBoxCodegenTest extends CodegenTestCase { // If there are many files, the first 'box(): String' function will be executed. GeneratedClassLoader generatedClassLoader = generateAndCreateClassLoader(); for (KtFile firstFile : myFiles.getPsiFiles()) { - String className = getFacadeFqName(firstFile); + String className = getFacadeFqName(firstFile, classFileFactory.getGenerationState().getBindingContext()); if (className == null) continue; Class aClass = getGeneratedClass(generatedClassLoader, className); try { @@ -108,10 +109,9 @@ public abstract class AbstractBlackBoxCodegenTest extends CodegenTestCase { fail("Can't find box method!"); } - @Nullable - private static String getFacadeFqName(@NotNull KtFile firstFile) { - for (KtDeclaration declaration : CodegenUtil.getActualDeclarations(firstFile)) { + private static String getFacadeFqName(@NotNull KtFile firstFile, @NotNull BindingContext bindingContext) { + for (KtDeclaration declaration : CodegenUtil.getDeclarationsToGenerate(firstFile, bindingContext)) { if (declaration instanceof KtProperty || declaration instanceof KtNamedFunction || declaration instanceof KtTypeAlias) { return JvmFileClassUtil.getFileClassInfoNoResolve(firstFile).getFacadeClassFqName().asString(); }