Do not force loading all kt-files inside LazyPackageDescriptor constructor

Effectively it leads to all stubs being built for any once used package

The idea is that they only were used for FILE_TO_PACKAGE_FRAGMENT
that is mostly read in backend and rarely in the IDE, so we can replace
its usages with searching through related package-fragments
This commit is contained in:
Denis Zharkov
2017-11-23 17:45:57 +03:00
parent d655c4075c
commit ac56965a99
15 changed files with 80 additions and 40 deletions
@@ -262,7 +262,6 @@ public interface BindingContext {
WritableSlice<ClassDescriptor, FunctionDescriptor> DATA_CLASS_COPY_FUNCTION = Slices.createSimpleSlice();
WritableSlice<FqNameUnsafe, ClassDescriptor> FQNAME_TO_CLASS_DESCRIPTOR = new BasicWritableSlice<>(DO_NOTHING, true);
WritableSlice<KtFile, PackageFragmentDescriptor> FILE_TO_PACKAGE_FRAGMENT = Slices.createSimpleSlice();
WritableSlice<FqName, Collection<KtFile>> PACKAGE_TO_FILES = Slices.createSimpleSlice();
WritableSlice<KtBinaryExpressionWithTypeRHS, Boolean> CAST_TYPE_USED_AS_EXPECTED_TYPE = Slices.createSimpleSlice();
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.resolve.lazy.declarations
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtDestructuringDeclarationEntry
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
class CombinedPackageMemberDeclarationProvider(
@@ -27,6 +28,8 @@ class CombinedPackageMemberDeclarationProvider(
override fun getPackageFiles() = providers.flatMap { it.getPackageFiles() }
override fun containsFile(file: KtFile) = providers.any { it.containsFile(file) }
override fun getDeclarations(kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean)
= providers.flatMap { it.getDeclarations(kindFilter, nameFilter) }
@@ -16,9 +16,9 @@
package org.jetbrains.kotlin.resolve.lazy.declarations
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.storage.StorageManager
class FileBasedPackageMemberDeclarationProvider(
@@ -45,6 +45,8 @@ class FileBasedPackageMemberDeclarationProvider(
override fun getPackageFiles() = packageFiles
override fun containsFile(file: KtFile) = file in packageFiles
override fun toString() = "Declarations for package $fqName with files ${packageFiles.map { it.name }} " +
"with declarations inside ${packageFiles.flatMap { it.declarations }.map { it.name ?: "???"}}"
}
@@ -16,13 +16,14 @@
package org.jetbrains.kotlin.resolve.lazy.declarations
import org.jetbrains.annotations.ReadOnly
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtFile
interface PackageMemberDeclarationProvider : DeclarationProvider {
fun getAllDeclaredSubPackages(nameFilter: (Name) -> Boolean): Collection<FqName>
fun getPackageFiles(): Collection<KtFile>
fun containsFile(file: KtFile): Boolean
}
@@ -20,8 +20,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.descriptors.ModuleDescriptor;
import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl;
import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.psi.KtFile;
import org.jetbrains.kotlin.resolve.BindingContext;
import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil;
import org.jetbrains.kotlin.resolve.lazy.LazyEntity;
import org.jetbrains.kotlin.resolve.lazy.ResolveSession;
@@ -42,10 +40,6 @@ public class LazyPackageDescriptor extends PackageFragmentDescriptorImpl impleme
this.declarationProvider = declarationProvider;
this.memberScope = new LazyPackageMemberScope(resolveSession, declarationProvider, this);
for (KtFile file : declarationProvider.getPackageFiles()) {
resolveSession.getTrace().record(BindingContext.FILE_TO_PACKAGE_FRAGMENT, file, this);
}
}
@NotNull
@@ -0,0 +1,26 @@
/*
* Copyright 2010-2017 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.resolve.lazy.descriptors
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.psi.KtFile
fun ModuleDescriptor.findPackageFragmentForFile(ktFile: KtFile): PackageFragmentDescriptor? =
getPackage(ktFile.packageFqName).fragments
.filterIsInstance<LazyPackageDescriptor>()
.firstOrNull { it.declarationProvider.containsFile(ktFile) }