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:
@@ -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();
|
||||
|
||||
|
||||
+3
@@ -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) }
|
||||
|
||||
|
||||
+3
-1
@@ -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 ?: "???"}}"
|
||||
}
|
||||
|
||||
+3
-2
@@ -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
|
||||
}
|
||||
|
||||
-6
@@ -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
|
||||
|
||||
+26
@@ -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) }
|
||||
Reference in New Issue
Block a user