From e1ed5667d4d8c48620646b3496b35e299865a9f4 Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Wed, 5 Aug 2015 16:36:08 +0300 Subject: [PATCH] Add API to record lookups and introduce KotlinLookupLocation to store the processing JetElement --- .../incremental/KotlinLookupLocation.kt | 22 +++++++ .../org/jetbrains/kotlin/incremental/utils.kt | 64 +++++++++++++++++++ .../incremental/components/LookupTracker.kt | 14 +++- 3 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 compiler/frontend/src/org/jetbrains/kotlin/incremental/KotlinLookupLocation.kt create mode 100644 compiler/frontend/src/org/jetbrains/kotlin/incremental/utils.kt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/incremental/KotlinLookupLocation.kt b/compiler/frontend/src/org/jetbrains/kotlin/incremental/KotlinLookupLocation.kt new file mode 100644 index 00000000000..288e23f5bdd --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/kotlin/incremental/KotlinLookupLocation.kt @@ -0,0 +1,22 @@ +/* + * 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 + +import org.jetbrains.kotlin.incremental.components.LookupLocation +import org.jetbrains.kotlin.psi.JetElement + +class KotlinLookupLocation(val element: JetElement) : LookupLocation diff --git a/compiler/frontend/src/org/jetbrains/kotlin/incremental/utils.kt b/compiler/frontend/src/org/jetbrains/kotlin/incremental/utils.kt new file mode 100644 index 00000000000..0c6c80f3edd --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/kotlin/incremental/utils.kt @@ -0,0 +1,64 @@ +/* + * 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 + +import org.jetbrains.kotlin.descriptors.ClassifierDescriptor +import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor +import org.jetbrains.kotlin.diagnostics.DiagnosticUtils.getLineAndColumnInPsiFile +import org.jetbrains.kotlin.incremental.components.LookupLocation +import org.jetbrains.kotlin.incremental.components.LookupTracker +import org.jetbrains.kotlin.incremental.components.ScopeKind +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.psi.doNotAnalyze +import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils +import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe +import org.jetbrains.kotlin.resolve.scopes.JetScope + + +public fun LookupTracker.record(from: LookupLocation, inScope: JetScope, name: Name) { + if (this == LookupTracker.DO_NOTHING || from == LookupLocation.NO_LOCATION) return + + if (from !is KotlinLookupLocation) throw AssertionError("Unexpected location type: ${from.javaClass}") + + val containingJetFile = from.element.getContainingJetFile() + + // TODO: provide additionally info for fake elements/files + if (containingJetFile.doNotAnalyze != null) return + + val containingFilePath = containingJetFile.virtualFile.path + val lookupLocationSuffix = + when { + verbose -> + getLineAndColumnInPsiFile(containingJetFile, from.element.textRange).let { + ":" + it.line + ":" + it.column + } + else -> "" + } + val lookupLocation = "$containingFilePath$lookupLocationSuffix" + + val scopeContainingDeclaration = inScope.getContainingDeclaration() + val scopeFilePath = DescriptorToSourceUtils.getContainingFile(scopeContainingDeclaration)?.virtualFile?.path + + val scopeKind = + when (scopeContainingDeclaration) { + is ClassifierDescriptor -> ScopeKind.CLASSIFIER + is PackageFragmentDescriptor -> ScopeKind.PACKAGE + else -> throw AssertionError("Unexpected containing declaration type: ${scopeContainingDeclaration.javaClass}") + } + + record(lookupLocation, scopeContainingDeclaration.fqNameUnsafe.asString(), scopeFilePath, scopeKind, name.asString()) +} diff --git a/core/descriptors/src/org/jetbrains/kotlin/incremental/components/LookupTracker.kt b/core/descriptors/src/org/jetbrains/kotlin/incremental/components/LookupTracker.kt index 91d8997ecdb..e78197eff3a 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/incremental/components/LookupTracker.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/incremental/components/LookupTracker.kt @@ -17,7 +17,19 @@ package org.jetbrains.kotlin.incremental.components public interface LookupTracker { + val verbose: Boolean + get() = false + + fun record(lookupLocation: String, scopeFqName: String, scopeContainingFile: String?, scopeKind: ScopeKind, name: String) + companion object { - val DO_NOTHING = object : LookupTracker {} + val DO_NOTHING = object : LookupTracker { + override fun record(lookupLocation: String, scopeFqName: String, scopeContainingFile: String?, scopeKind: ScopeKind, name: String) {} + } } } + +public enum class ScopeKind { + PACKAGE, + CLASSIFIER +}