diff --git a/compiler/frontend/src/org/jetbrains/kotlin/incremental/KotlinLookupLocation.kt b/compiler/frontend/src/org/jetbrains/kotlin/incremental/KotlinLookupLocation.kt index 6db271ec1ff..15d30a931b6 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/incremental/KotlinLookupLocation.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/incremental/KotlinLookupLocation.kt @@ -16,7 +16,26 @@ package org.jetbrains.kotlin.incremental +import org.jetbrains.kotlin.diagnostics.DiagnosticUtils.getLineAndColumnInPsiFile +import org.jetbrains.kotlin.incremental.components.LocationInfo +import org.jetbrains.kotlin.incremental.components.LocationInfo.Position import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.psi.KtElement +import org.jetbrains.kotlin.psi.doNotAnalyze -class KotlinLookupLocation(val element: KtElement) : LookupLocation +class KotlinLookupLocation(val element: KtElement) : LookupLocation { + + override val location: LocationInfo? + get() { + val containingJetFile = element.getContainingJetFile() + + if (containingJetFile.doNotAnalyze != null) return null + + return object : LocationInfo { + override val filePath = containingJetFile.virtualFile.path + + override val position: Position + get() = getLineAndColumnInPsiFile(containingJetFile, element.textRange).let { Position(it.line, it.column) } + } + } +} diff --git a/compiler/rmi/kotlinr/src/org/jetbrains/kotlin/rmi/kotlinr/CompilerCallbackServicesFacadeServer.kt b/compiler/rmi/kotlinr/src/org/jetbrains/kotlin/rmi/kotlinr/CompilerCallbackServicesFacadeServer.kt index fe7470b0875..a6a8e7ac2dd 100644 --- a/compiler/rmi/kotlinr/src/org/jetbrains/kotlin/rmi/kotlinr/CompilerCallbackServicesFacadeServer.kt +++ b/compiler/rmi/kotlinr/src/org/jetbrains/kotlin/rmi/kotlinr/CompilerCallbackServicesFacadeServer.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.rmi.kotlinr +import org.jetbrains.kotlin.incremental.components.LocationInfo import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.ScopeKind import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents @@ -64,8 +65,8 @@ public class CompilerCallbackServicesFacadeServer( incrementalCompilationComponents!!.getIncrementalCache(target).close() } - override fun lookupTracker_record(lookupContainingFile: String, lookupLine: Int?, lookupColumn: Int?, scopeFqName: String, scopeKind: ScopeKind, name: String) { - incrementalCompilationComponents!!.getLookupTracker().record(lookupContainingFile, lookupLine, lookupColumn, scopeFqName, scopeKind, name) + override fun lookupTracker_record(locationInfo: LocationInfo, scopeFqName: String, scopeKind: ScopeKind, name: String) { + incrementalCompilationComponents!!.getLookupTracker().record(locationInfo, scopeFqName, scopeKind, name) } private val lookupTracker_isDoNothing: Boolean = incrementalCompilationComponents != null && incrementalCompilationComponents.getLookupTracker() == LookupTracker.DO_NOTHING diff --git a/compiler/rmi/rmi-interface/src/org/jetbrains/kotlin/rmi/CompilerCallbackServicesFacade.kt b/compiler/rmi/rmi-interface/src/org/jetbrains/kotlin/rmi/CompilerCallbackServicesFacade.kt index b51a1d917a2..4ae7d4d0011 100644 --- a/compiler/rmi/rmi-interface/src/org/jetbrains/kotlin/rmi/CompilerCallbackServicesFacade.kt +++ b/compiler/rmi/rmi-interface/src/org/jetbrains/kotlin/rmi/CompilerCallbackServicesFacade.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.rmi +import org.jetbrains.kotlin.incremental.components.LocationInfo import org.jetbrains.kotlin.incremental.components.ScopeKind import org.jetbrains.kotlin.load.kotlin.incremental.components.JvmPackagePartProto import org.jetbrains.kotlin.modules.TargetId @@ -71,14 +72,7 @@ public interface CompilerCallbackServicesFacade : Remote { // ---------------------------------------------------- // LookupTracker @Throws(RemoteException::class) - fun lookupTracker_record( - lookupContainingFile: String, - lookupLine: Int?, - lookupColumn: Int?, - scopeFqName: String, - scopeKind: ScopeKind, - name: String - ) + fun lookupTracker_record(locationInfo: LocationInfo, scopeFqName: String, scopeKind: ScopeKind, name: String) @Throws(RemoteException::class) fun lookupTracker_isDoNothing(): Boolean diff --git a/compiler/rmi/rmi-server/src/org/jetbrains/kotlin/rmi/service/RemoteLookupTrackerClient.kt b/compiler/rmi/rmi-server/src/org/jetbrains/kotlin/rmi/service/RemoteLookupTrackerClient.kt index 11fa0eb64c5..6916fce62f3 100644 --- a/compiler/rmi/rmi-server/src/org/jetbrains/kotlin/rmi/service/RemoteLookupTrackerClient.kt +++ b/compiler/rmi/rmi-server/src/org/jetbrains/kotlin/rmi/service/RemoteLookupTrackerClient.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.rmi.service +import org.jetbrains.kotlin.incremental.components.LocationInfo import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.ScopeKind import org.jetbrains.kotlin.rmi.CompilerCallbackServicesFacade @@ -24,13 +25,12 @@ import org.jetbrains.kotlin.rmi.Profiler class RemoteLookupTrackerClient(val facade: CompilerCallbackServicesFacade, val profiler: Profiler = DummyProfiler()) : LookupTracker { - private val isDoNothing = profiler.withMeasure(this) { facade.lookupTracker_isDoNothing() } - override fun record(lookupContainingFile: String, lookupLine: Int?, lookupColumn: Int?, scopeFqName: String, scopeKind: ScopeKind, name: String) { + override fun record(locationInfo: LocationInfo, scopeFqName: String, scopeKind: ScopeKind, name: String) { if (!isDoNothing) { profiler.withMeasure(this) { - facade.lookupTracker_record(lookupContainingFile, lookupLine, lookupColumn, scopeFqName, scopeKind, name) + facade.lookupTracker_record(locationInfo, scopeFqName, scopeKind, name) } } } diff --git a/core/descriptors/src/org/jetbrains/kotlin/incremental/components/LookupLocation.kt b/core/descriptors/src/org/jetbrains/kotlin/incremental/components/LookupLocation.kt index 98e8755ee20..b0686e35a6f 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/incremental/components/LookupLocation.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/incremental/components/LookupLocation.kt @@ -17,6 +17,16 @@ package org.jetbrains.kotlin.incremental.components public interface LookupLocation { + val location: LocationInfo? +} + +interface LocationInfo { + val filePath: String + + // only for tests + val position: Position + + data class Position(val line: Int, val column: Int) } public enum class NoLookupLocation : LookupLocation { @@ -37,5 +47,7 @@ public enum class NoLookupLocation : LookupLocation { WHEN_TYPING, WHEN_GET_SUPER_MEMBERS, FOR_NON_TRACKED_SCOPE, - FROM_SYNTHETIC_SCOPE + FROM_SYNTHETIC_SCOPE; + + override val location: LocationInfo? = null } 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 9cbecaf88a8..7732abce720 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/incremental/components/LookupTracker.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/incremental/components/LookupTracker.kt @@ -17,14 +17,8 @@ package org.jetbrains.kotlin.incremental.components public interface LookupTracker { - // used in tests for more accurate checks - val requiresLookupLineAndColumn: Boolean - get() = false - fun record( - lookupContainingFile: String, - lookupLine: Int?, - lookupColumn: Int?, + locationInfo: LocationInfo, scopeFqName: String, scopeKind: ScopeKind, name: String @@ -32,14 +26,7 @@ public interface LookupTracker { companion object { val DO_NOTHING: LookupTracker = object : LookupTracker { - override fun record( - lookupContainingFile: String, - lookupLine: Int?, - lookupColumn: Int?, - scopeFqName: String, - scopeKind: ScopeKind, - name: String - ) { + override fun record(locationInfo: LocationInfo, scopeFqName: String, scopeKind: ScopeKind, name: String) { } } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/incremental/utils.kt b/core/descriptors/src/org/jetbrains/kotlin/incremental/utils.kt similarity index 71% rename from compiler/frontend/src/org/jetbrains/kotlin/incremental/utils.kt rename to core/descriptors/src/org/jetbrains/kotlin/incremental/utils.kt index 049b17bbc9d..4eaac2da2c8 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/incremental/utils.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/incremental/utils.kt @@ -18,27 +18,18 @@ 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.NoLookupLocation import org.jetbrains.kotlin.incremental.components.ScopeKind import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.psi.doNotAnalyze import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe import org.jetbrains.kotlin.resolve.scopes.KtScope public fun LookupTracker.record(from: LookupLocation, inScope: KtScope, name: Name) { if (this == LookupTracker.DO_NOTHING || from is NoLookupLocation) return - if (from !is KotlinLookupLocation) throw AssertionError("Unexpected location type: ${from.javaClass}") - - val containingJetFile = from.element.getContainingJetFile() - - if (containingJetFile.doNotAnalyze != null) return - - val containingFilePath = containingJetFile.virtualFile.path - val lineAndColumn = if (requiresLookupLineAndColumn) getLineAndColumnInPsiFile(containingJetFile, from.element.textRange) else null + val location = from.location ?: return val scopeContainingDeclaration = inScope.getContainingDeclaration() @@ -49,5 +40,5 @@ public fun LookupTracker.record(from: LookupLocation, inScope: KtScope, name: Na else -> throw AssertionError("Unexpected containing declaration type: ${scopeContainingDeclaration.javaClass}") } - record(containingFilePath, lineAndColumn?.line, lineAndColumn?.column, scopeContainingDeclaration.fqNameUnsafe.asString(), scopeKind, name.asString()) + record(location, scopeContainingDeclaration.fqNameUnsafe.asString(), scopeKind, name.asString()) } diff --git a/jps-plugin/test/org/jetbrains/kotlin/jps/build/AbstractLookupTrackerTest.kt b/jps-plugin/test/org/jetbrains/kotlin/jps/build/AbstractLookupTrackerTest.kt index 6b71c749f94..44646a79e42 100644 --- a/jps-plugin/test/org/jetbrains/kotlin/jps/build/AbstractLookupTrackerTest.kt +++ b/jps-plugin/test/org/jetbrains/kotlin/jps/build/AbstractLookupTrackerTest.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.jps.build import com.intellij.openapi.util.io.FileUtil +import org.jetbrains.kotlin.incremental.components.LocationInfo import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.ScopeKind import org.jetbrains.kotlin.test.JetTestUtils @@ -55,8 +56,8 @@ abstract class AbstractLookupTrackerTest : AbstractIncrementalJpsTest( val lines = text.lines().toArrayList() - for ((line, lookupsFromLine) in lookupsFromFile.groupBy { it.lookupLine!! }) { - val columnToLookups = lookupsFromLine.groupBy { it.lookupColumn!! }.toList().sortedBy { it.first } + for ((line, lookupsFromLine) in lookupsFromFile.groupBy { it.lookupLine }) { + val columnToLookups = lookupsFromLine.groupBy { it.lookupColumn }.toList().sortedBy { it.first } val lineContent = lines[line - 1] val parts = ArrayList(columnToLookups.size * 2) @@ -135,8 +136,8 @@ abstract class AbstractLookupTrackerTest : AbstractIncrementalJpsTest( private data class LookupInfo( val lookupContainingFile: String, - val lookupLine: Int?, - val lookupColumn: Int?, + val lookupLine: Int, + val lookupColumn: Int, val scopeFqName: String, val scopeKind: ScopeKind, val name: String @@ -145,14 +146,9 @@ private data class LookupInfo( private class TestLookupTracker : LookupTracker { val lookups = arrayListOf() - override val requiresLookupLineAndColumn: Boolean - get() = true - - override fun record( - lookupContainingFile: String, lookupLine: Int?, lookupColumn: Int?, - scopeFqName: String, scopeKind: ScopeKind, name: String - ) { - lookups.add(LookupInfo(lookupContainingFile, lookupLine, lookupColumn, scopeFqName, scopeKind, name)) + override fun record(locationInfo: LocationInfo, scopeFqName: String, scopeKind: ScopeKind, name: String) { + val (line, column) = locationInfo.position + lookups.add(LookupInfo(locationInfo.filePath, line, column, scopeFqName, scopeKind, name)) } }