From 679d5fe4967dafa05a65361d373e896b93ea2fd8 Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Mon, 20 Jul 2015 16:48:21 +0300 Subject: [PATCH] Introduce UsageCollector --- .../kotlin/cli/jvm/repl/di/injection.kt | 3 ++- .../kotlin/frontend/java/di/injection.kt | 17 ++++++++------ .../IncrementalCompilationComponents.kt | 3 +++ .../jvm/TopDownAnalyzerFacadeForJVM.java | 7 +++++- .../jetbrains/kotlin/frontend/di/injection.kt | 4 +++- .../incremental/components/UsageCollector.kt | 23 +++++++++++++++++++ .../kotlin/resolve/lazy/LazyClassContext.kt | 4 +++- .../kotlin/resolve/lazy/ResolveSession.java | 13 +++++++++++ .../expressions/LocalClassifierAnalyzer.kt | 4 +++- .../AbstractLocalClassProtoTest.kt | 3 ++- .../kotlin/jps/build/KotlinBuilder.kt | 1 + .../IncrementalCompilationComponentsImpl.kt | 3 +++ .../kotlin/frontend/js/di/injection.kt | 2 ++ 13 files changed, 74 insertions(+), 13 deletions(-) create mode 100644 compiler/frontend/src/org/jetbrains/kotlin/incremental/components/UsageCollector.kt diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/di/injection.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/di/injection.kt index b8cb74cb7bf..e01e4234fd6 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/di/injection.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/di/injection.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.container.* import org.jetbrains.kotlin.context.ModuleContext import org.jetbrains.kotlin.frontend.di.configureModule import org.jetbrains.kotlin.frontend.java.di.configureJavaTopDownAnalysis +import org.jetbrains.kotlin.incremental.components.UsageCollector import org.jetbrains.kotlin.load.java.JavaClassFinderImpl import org.jetbrains.kotlin.load.java.lazy.SingleModuleClassResolver import org.jetbrains.kotlin.load.kotlin.KotlinJvmCheckerProvider @@ -39,7 +40,7 @@ public fun createContainerForReplWithJava( moduleContentScope: GlobalSearchScope, additionalFileScopeProvider: FileScopeProvider.AdditionalScopes ): ContainerForReplWithJava = createContainer("ReplWithJava") { configureModule(moduleContext, KotlinJvmCheckerProvider(moduleContext.module), bindingTrace) - configureJavaTopDownAnalysis(moduleContentScope, moduleContext.project) + configureJavaTopDownAnalysis(moduleContentScope, moduleContext.project, UsageCollector.DO_NOTHING) useInstance(additionalFileScopeProvider) useInstance(declarationProviderFactory) diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt index a3d0cd297a6..150099be0bf 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt @@ -32,6 +32,7 @@ import org.jetbrains.kotlin.load.java.structure.impl.JavaPropertyInitializerEval import org.jetbrains.kotlin.load.kotlin.DeserializationComponentsForJava import org.jetbrains.kotlin.load.kotlin.JvmVirtualFileFinderFactory import org.jetbrains.kotlin.load.kotlin.KotlinJvmCheckerProvider +import org.jetbrains.kotlin.incremental.components.UsageCollector import org.jetbrains.kotlin.resolve.BindingTrace import org.jetbrains.kotlin.resolve.BodyResolveCache import org.jetbrains.kotlin.resolve.LazyTopDownAnalyzer @@ -44,9 +45,9 @@ import org.jetbrains.kotlin.resolve.lazy.ResolveSession import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactory import org.jetbrains.kotlin.synthetic.AdditionalScopesWithJavaSyntheticExtensions -public fun StorageComponentContainer.configureJavaTopDownAnalysis(moduleContentScope: GlobalSearchScope, project: Project) { +public fun StorageComponentContainer.configureJavaTopDownAnalysis(moduleContentScope: GlobalSearchScope, project: Project, usageCollector: UsageCollector) { useInstance(moduleContentScope) - + useInstance(usageCollector) useImpl() useImpl() @@ -74,7 +75,7 @@ public fun createContainerForLazyResolveWithJava( moduleContentScope: GlobalSearchScope, moduleClassResolver: ModuleClassResolver ): Pair = createContainer("LazyResolveWithJava") { configureModule(moduleContext, KotlinJvmCheckerProvider(moduleContext.module), bindingTrace) - configureJavaTopDownAnalysis(moduleContentScope, moduleContext.project) + configureJavaTopDownAnalysis(moduleContentScope, moduleContext.project, UsageCollector.DO_NOTHING) useInstance(moduleClassResolver) @@ -90,12 +91,14 @@ public fun createContainerForLazyResolveWithJava( public fun createContainerForTopDownAnalyzerForJvm( - moduleContext: ModuleContext, bindingTrace: BindingTrace, + moduleContext: ModuleContext, + bindingTrace: BindingTrace, declarationProviderFactory: DeclarationProviderFactory, - moduleContentScope: GlobalSearchScope + moduleContentScope: GlobalSearchScope, + usageCollector: UsageCollector ): ContainerForTopDownAnalyzerForJvm = createContainer("TopDownAnalyzerForJvm") { configureModule(moduleContext, KotlinJvmCheckerProvider(moduleContext.module), bindingTrace) - configureJavaTopDownAnalysis(moduleContentScope, moduleContext.project) + configureJavaTopDownAnalysis(moduleContentScope, moduleContext.project, usageCollector) useInstance(declarationProviderFactory) useInstance(BodyResolveCache.ThrowException) @@ -117,4 +120,4 @@ public class ContainerForTopDownAnalyzerForJvm(container: StorageComponentContai val lazyTopDownAnalyzerForTopLevel: LazyTopDownAnalyzerForTopLevel by container val javaDescriptorResolver: JavaDescriptorResolver by container val deserializationComponentsForJava: DeserializationComponentsForJava by container -} \ No newline at end of file +} diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/incremental/components/IncrementalCompilationComponents.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/incremental/components/IncrementalCompilationComponents.kt index 489d26dfb12..5415a7b26cd 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/incremental/components/IncrementalCompilationComponents.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/incremental/components/IncrementalCompilationComponents.kt @@ -16,6 +16,9 @@ package org.jetbrains.kotlin.load.kotlin.incremental.components +import org.jetbrains.kotlin.incremental.components.UsageCollector + public interface IncrementalCompilationComponents { public fun getIncrementalCache(moduleId: String): IncrementalCache + public fun getUsageCollector(): UsageCollector } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java index eda277b55ec..3bdefd86eeb 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.descriptors.ModuleParameters; import org.jetbrains.kotlin.descriptors.PackageFragmentProvider; import org.jetbrains.kotlin.frontend.java.di.ContainerForTopDownAnalyzerForJvm; import org.jetbrains.kotlin.frontend.java.di.DiPackage; +import org.jetbrains.kotlin.incremental.components.UsageCollector; import org.jetbrains.kotlin.load.kotlin.incremental.IncrementalPackageFragmentProvider; import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache; import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents; @@ -123,11 +124,15 @@ public enum TopDownAnalyzerFacadeForJVM { FileBasedDeclarationProviderFactory providerFactory = new FileBasedDeclarationProviderFactory(moduleContext.getStorageManager(), allFiles); + UsageCollector usageCollector = + incrementalCompilationComponents != null ? incrementalCompilationComponents.getUsageCollector() : UsageCollector.DO_NOTHING; + ContainerForTopDownAnalyzerForJvm container = DiPackage.createContainerForTopDownAnalyzerForJvm( moduleContext, trace, providerFactory, - GlobalSearchScope.allScope(project) + GlobalSearchScope.allScope(project), + usageCollector ); List additionalProviders = new ArrayList(); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/frontend/di/injection.kt b/compiler/frontend/src/org/jetbrains/kotlin/frontend/di/injection.kt index c4f678bcaf8..cfcb39c4022 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/frontend/di/injection.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/frontend/di/injection.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.container.* import org.jetbrains.kotlin.context.LazyResolveToken import org.jetbrains.kotlin.context.ModuleContext import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.incremental.components.UsageCollector import org.jetbrains.kotlin.resolve.* import org.jetbrains.kotlin.resolve.calls.CallResolver import org.jetbrains.kotlin.resolve.lazy.FileScopeProvider @@ -109,6 +110,7 @@ private fun createContainerForLazyResolve( useInstance(dynamicTypesSettings) useInstance(declarationProviderFactory) + useInstance(UsageCollector.DO_NOTHING) useImpl() useImpl() @@ -134,4 +136,4 @@ public class ContainerForMacros(container: StorageComponentContainer) { val typeResolver: TypeResolver by container val expressionTypingComponents: ExpressionTypingComponents by container val expressionTypingServices: ExpressionTypingServices by container -} \ No newline at end of file +} diff --git a/compiler/frontend/src/org/jetbrains/kotlin/incremental/components/UsageCollector.kt b/compiler/frontend/src/org/jetbrains/kotlin/incremental/components/UsageCollector.kt new file mode 100644 index 00000000000..0fab8d9435f --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/kotlin/incremental/components/UsageCollector.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2010-2015 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.incremental.components + +public interface UsageCollector { + companion object { + val DO_NOTHING = object : UsageCollector {} + } +} diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyClassContext.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyClassContext.kt index b890d2007d8..e27339a707b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyClassContext.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyClassContext.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.resolve.lazy import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.incremental.components.UsageCollector import org.jetbrains.kotlin.resolve.* import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactory import org.jetbrains.kotlin.storage.StorageManager @@ -32,4 +33,5 @@ public interface LazyClassContext { val typeResolver: TypeResolver val declarationProviderFactory: DeclarationProviderFactory val annotationResolver: AnnotationResolver -} \ No newline at end of file + val usageCollector: UsageCollector +} diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java index 53ee9abfed4..1032aec89df 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java @@ -27,6 +27,7 @@ import org.jetbrains.annotations.ReadOnly; import org.jetbrains.kotlin.context.GlobalContext; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.annotations.Annotations; +import org.jetbrains.kotlin.incremental.components.UsageCollector; import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.psi.*; @@ -75,6 +76,7 @@ public class ResolveSession implements KotlinCodeAnalyzer, LazyClassContext { private LazyDeclarationResolver lazyDeclarationResolver; private FileScopeProvider fileScopeProvider; private DeclarationScopeProvider declarationScopeProvider; + private UsageCollector usageCollector; @Inject public void setJetImportFactory(JetImportsFactory jetImportFactory) { @@ -126,6 +128,11 @@ public class ResolveSession implements KotlinCodeAnalyzer, LazyClassContext { this.declarationScopeProvider = declarationScopeProvider; } + @Inject + public void setUsageCollector(@NotNull UsageCollector usageCollector) { + this.usageCollector = usageCollector; + } + // Only calls from injectors expected @Deprecated public ResolveSession( @@ -401,4 +408,10 @@ public class ResolveSession implements KotlinCodeAnalyzer, LazyClassContext { public FileScopeProvider getFileScopeProvider() { return fileScopeProvider; } + + @NotNull + @Override + public UsageCollector getUsageCollector() { + return usageCollector; + } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/LocalClassifierAnalyzer.kt b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/LocalClassifierAnalyzer.kt index 7ec7c4cf7e2..96ec1b76be1 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/LocalClassifierAnalyzer.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/LocalClassifierAnalyzer.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.frontend.di.createContainerForLazyLocalClassifierAnalyzer +import org.jetbrains.kotlin.incremental.components.UsageCollector import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.JetClassOrObject import org.jetbrains.kotlin.psi.debugText.getDebugText @@ -131,6 +132,7 @@ class LocalClassDescriptorHolder( } override val annotationResolver = this@LocalClassDescriptorHolder.annotationResolver + override val usageCollector: UsageCollector = UsageCollector.DO_NOTHING } , containingDeclaration, @@ -184,4 +186,4 @@ class DeclarationScopeProviderForLocalClassifierAnalyzer( } return super.getOuterDataFlowInfoForDeclaration(elementOfDeclaration) } -} \ No newline at end of file +} diff --git a/compiler/tests/org/jetbrains/kotlin/serialization/AbstractLocalClassProtoTest.kt b/compiler/tests/org/jetbrains/kotlin/serialization/AbstractLocalClassProtoTest.kt index 9482d53b9da..ed7fe62ac04 100644 --- a/compiler/tests/org/jetbrains/kotlin/serialization/AbstractLocalClassProtoTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/serialization/AbstractLocalClassProtoTest.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.frontend.java.di.createContainerForTopDownAnalyzerFo import org.jetbrains.kotlin.jvm.compiler.LoadDescriptorUtil import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.load.java.structure.reflect.classId +import org.jetbrains.kotlin.incremental.components.UsageCollector import org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory import org.jetbrains.kotlin.test.* @@ -57,7 +58,7 @@ public abstract class AbstractLocalClassProtoTest : TestCaseWithTmpdir() { val container = createContainerForTopDownAnalyzerForJvm( moduleContext, CliLightClassGenerationSupport.NoScopeRecordCliBindingTrace(), - providerFactory, GlobalSearchScope.allScope(environment.project) + providerFactory, GlobalSearchScope.allScope(environment.project), UsageCollector.DO_NOTHING ) moduleContext.initializeModuleContents(container.javaDescriptorResolver.packageFragmentProvider) diff --git a/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt b/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt index 478f291a287..ed82ef9b6f2 100644 --- a/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt +++ b/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt @@ -280,6 +280,7 @@ public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR PathUtil.getKotlinPathsForJpsPluginOrJpsTests(), { className -> className.startsWith("org.jetbrains.kotlin.load.kotlin.incremental.components.") + || className.startsWith("org.jetbrains.kotlin.incremental.components.") || className == "org.jetbrains.kotlin.config.Services" || className.startsWith("org.apache.log4j.") // For logging from compiler || className == "org.jetbrains.kotlin.progress.CompilationCanceledStatus" diff --git a/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/IncrementalCompilationComponentsImpl.kt b/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/IncrementalCompilationComponentsImpl.kt index 26ca656d72b..1d0f2f95f8b 100644 --- a/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/IncrementalCompilationComponentsImpl.kt +++ b/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/IncrementalCompilationComponentsImpl.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.jps.incremental import org.jetbrains.jps.incremental.ModuleBuildTarget +import org.jetbrains.kotlin.incremental.components.UsageCollector import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents @@ -26,4 +27,6 @@ public class IncrementalCompilationComponentsImpl(caches: Map() useInstance(BodyResolveCache.ThrowException) + useInstance(UsageCollector.DO_NOTHING) useImpl() useImpl() useImpl()