Fix tracking lookups when compile using daemon

This commit is contained in:
Zalim Bashorov
2015-11-13 20:14:05 +03:00
parent 49db4e93c0
commit 6305bbda5d
9 changed files with 50 additions and 27 deletions
@@ -18,8 +18,8 @@ package org.jetbrains.kotlin.incremental
import org.jetbrains.kotlin.diagnostics.DiagnosticUtils.getLineAndColumnInPsiFile import org.jetbrains.kotlin.diagnostics.DiagnosticUtils.getLineAndColumnInPsiFile
import org.jetbrains.kotlin.incremental.components.LocationInfo 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.incremental.components.LookupLocation
import org.jetbrains.kotlin.incremental.components.Position
import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.doNotAnalyze import org.jetbrains.kotlin.psi.doNotAnalyze
@@ -16,8 +16,8 @@
package org.jetbrains.kotlin.rmi.kotlinr 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.LookupTracker
import org.jetbrains.kotlin.incremental.components.Position
import org.jetbrains.kotlin.incremental.components.ScopeKind import org.jetbrains.kotlin.incremental.components.ScopeKind
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents
import org.jetbrains.kotlin.load.kotlin.incremental.components.JvmPackagePartProto import org.jetbrains.kotlin.load.kotlin.incremental.components.JvmPackagePartProto
@@ -65,8 +65,10 @@ public class CompilerCallbackServicesFacadeServer(
incrementalCompilationComponents!!.getIncrementalCache(target).close() incrementalCompilationComponents!!.getIncrementalCache(target).close()
} }
override fun lookupTracker_record(locationInfo: LocationInfo, scopeFqName: String, scopeKind: ScopeKind, name: String) { override fun lookupTracker_requiresPosition() = incrementalCompilationComponents!!.getLookupTracker().requiresPosition
incrementalCompilationComponents!!.getLookupTracker().record(locationInfo, scopeFqName, scopeKind, name)
override fun lookupTracker_record(filePath: String, position: Position, scopeFqName: String, scopeKind: ScopeKind, name: String) {
incrementalCompilationComponents!!.getLookupTracker().record(filePath, position, scopeFqName, scopeKind, name)
} }
private val lookupTracker_isDoNothing: Boolean = incrementalCompilationComponents != null && incrementalCompilationComponents.getLookupTracker() == LookupTracker.DO_NOTHING private val lookupTracker_isDoNothing: Boolean = incrementalCompilationComponents != null && incrementalCompilationComponents.getLookupTracker() == LookupTracker.DO_NOTHING
@@ -16,7 +16,7 @@
package org.jetbrains.kotlin.rmi package org.jetbrains.kotlin.rmi
import org.jetbrains.kotlin.incremental.components.LocationInfo import org.jetbrains.kotlin.incremental.components.Position
import org.jetbrains.kotlin.incremental.components.ScopeKind import org.jetbrains.kotlin.incremental.components.ScopeKind
import org.jetbrains.kotlin.load.kotlin.incremental.components.JvmPackagePartProto import org.jetbrains.kotlin.load.kotlin.incremental.components.JvmPackagePartProto
import org.jetbrains.kotlin.modules.TargetId import org.jetbrains.kotlin.modules.TargetId
@@ -72,7 +72,9 @@ public interface CompilerCallbackServicesFacade : Remote {
// ---------------------------------------------------- // ----------------------------------------------------
// LookupTracker // LookupTracker
@Throws(RemoteException::class) @Throws(RemoteException::class)
fun lookupTracker_record(locationInfo: LocationInfo, scopeFqName: String, scopeKind: ScopeKind, name: String) fun lookupTracker_requiresPosition(): Boolean
fun lookupTracker_record(filePath: String, position: Position, scopeFqName: String, scopeKind: ScopeKind, name: String)
@Throws(RemoteException::class) @Throws(RemoteException::class)
fun lookupTracker_isDoNothing(): Boolean fun lookupTracker_isDoNothing(): Boolean
@@ -16,8 +16,8 @@
package org.jetbrains.kotlin.rmi.service 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.LookupTracker
import org.jetbrains.kotlin.incremental.components.Position
import org.jetbrains.kotlin.incremental.components.ScopeKind import org.jetbrains.kotlin.incremental.components.ScopeKind
import org.jetbrains.kotlin.rmi.CompilerCallbackServicesFacade import org.jetbrains.kotlin.rmi.CompilerCallbackServicesFacade
import org.jetbrains.kotlin.rmi.DummyProfiler import org.jetbrains.kotlin.rmi.DummyProfiler
@@ -27,10 +27,12 @@ import org.jetbrains.kotlin.rmi.Profiler
class RemoteLookupTrackerClient(val facade: CompilerCallbackServicesFacade, val profiler: Profiler = DummyProfiler()) : LookupTracker { class RemoteLookupTrackerClient(val facade: CompilerCallbackServicesFacade, val profiler: Profiler = DummyProfiler()) : LookupTracker {
private val isDoNothing = profiler.withMeasure(this) { facade.lookupTracker_isDoNothing() } private val isDoNothing = profiler.withMeasure(this) { facade.lookupTracker_isDoNothing() }
override fun record(locationInfo: LocationInfo, scopeFqName: String, scopeKind: ScopeKind, name: String) { override val requiresPosition: Boolean = profiler.withMeasure(this) { facade.lookupTracker_requiresPosition() }
override fun record(filePath: String, position: Position, scopeFqName: String, scopeKind: ScopeKind, name: String) {
if (!isDoNothing) { if (!isDoNothing) {
profiler.withMeasure(this) { profiler.withMeasure(this) {
facade.lookupTracker_record(locationInfo, scopeFqName, scopeKind, name) facade.lookupTracker_record(filePath, position, scopeFqName, scopeKind, name)
} }
} }
} }
@@ -16,6 +16,8 @@
package org.jetbrains.kotlin.incremental.components package org.jetbrains.kotlin.incremental.components
import java.io.Serializable
public interface LookupLocation { public interface LookupLocation {
val location: LocationInfo? val location: LocationInfo?
} }
@@ -25,8 +27,12 @@ interface LocationInfo {
// only for tests // only for tests
val position: Position val position: Position
}
data class Position(val line: Int, val column: Int) data class Position(val line: Int, val column: Int) : Serializable {
companion object {
val NO_POSITION = Position(-1, -1)
}
} }
public enum class NoLookupLocation : LookupLocation { public enum class NoLookupLocation : LookupLocation {
@@ -17,8 +17,12 @@
package org.jetbrains.kotlin.incremental.components package org.jetbrains.kotlin.incremental.components
public interface LookupTracker { public interface LookupTracker {
// used in tests for more accurate checks
val requiresPosition: Boolean
fun record( fun record(
locationInfo: LocationInfo, filePath: String,
position: Position,
scopeFqName: String, scopeFqName: String,
scopeKind: ScopeKind, scopeKind: ScopeKind,
name: String name: String
@@ -26,7 +30,10 @@ public interface LookupTracker {
companion object { companion object {
val DO_NOTHING: LookupTracker = object : LookupTracker { val DO_NOTHING: LookupTracker = object : LookupTracker {
override fun record(locationInfo: LocationInfo, scopeFqName: String, scopeKind: ScopeKind, name: String) { override val requiresPosition: Boolean
get() = false
override fun record(filePath: String, position: Position, scopeFqName: String, scopeKind: ScopeKind, name: String) {
} }
} }
} }
@@ -19,10 +19,7 @@ package org.jetbrains.kotlin.incremental
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor import org.jetbrains.kotlin.descriptors.ClassifierDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.incremental.components.*
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.name.Name
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe
import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.resolve.scopes.MemberScope
@@ -39,5 +36,7 @@ public fun LookupTracker.record(from: LookupLocation, scopeOwner: DeclarationDes
else -> throw AssertionError("Unexpected containing declaration type: ${scopeOwner.javaClass}") else -> throw AssertionError("Unexpected containing declaration type: ${scopeOwner.javaClass}")
} }
record(location, scopeOwner.fqNameUnsafe.asString(), scopeKind, name.asString()) val position = if (requiresPosition) location.position else Position.NO_POSITION
record(location.filePath, position, scopeOwner.fqNameUnsafe.asString(), scopeKind, name.asString())
} }
@@ -19,8 +19,8 @@ package org.jetbrains.kotlin.jps.incremental
import com.intellij.util.containers.MultiMap import com.intellij.util.containers.MultiMap
import org.jetbrains.annotations.TestOnly import org.jetbrains.annotations.TestOnly
import org.jetbrains.jps.builders.storage.StorageProvider import org.jetbrains.jps.builders.storage.StorageProvider
import org.jetbrains.kotlin.incremental.components.LocationInfo
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.incremental.components.Position
import org.jetbrains.kotlin.incremental.components.ScopeKind import org.jetbrains.kotlin.incremental.components.ScopeKind
import org.jetbrains.kotlin.jps.incremental.storage.* import org.jetbrains.kotlin.jps.incremental.storage.*
import org.jetbrains.kotlin.utils.Printer import org.jetbrains.kotlin.utils.Printer
@@ -184,9 +184,12 @@ class LookupStorage(private val targetDataDir: File) : BasicMapsOwner() {
class LookupTrackerImpl(private val delegate: LookupTracker) : LookupTracker { class LookupTrackerImpl(private val delegate: LookupTracker) : LookupTracker {
val lookups = MultiMap<LookupSymbol, String>() val lookups = MultiMap<LookupSymbol, String>()
override fun record(locationInfo: LocationInfo, scopeFqName: String, scopeKind: ScopeKind, name: String) { override val requiresPosition: Boolean
lookups.putValue(LookupSymbol(name, scopeFqName), locationInfo.filePath) get() = delegate.requiresPosition
delegate.record(locationInfo, scopeFqName, scopeKind, name)
override fun record(filePath: String, position: Position, scopeFqName: String, scopeKind: ScopeKind, name: String) {
lookups.putValue(LookupSymbol(name, scopeFqName), filePath)
delegate.record(filePath, position, scopeFqName, scopeKind, name)
} }
} }
@@ -17,11 +17,10 @@
package org.jetbrains.kotlin.jps.build package org.jetbrains.kotlin.jps.build
import com.intellij.openapi.util.io.FileUtil 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.LookupTracker
import org.jetbrains.kotlin.incremental.components.Position
import org.jetbrains.kotlin.incremental.components.ScopeKind import org.jetbrains.kotlin.incremental.components.ScopeKind
import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.kotlin.test.KotlinTestUtils
import org.jetbrains.kotlin.utils.join
import java.io.File import java.io.File
import java.util.* import java.util.*
@@ -120,9 +119,12 @@ abstract class AbstractLookupTrackerTest : AbstractIncrementalJpsTest(
class TestLookupTracker : LookupTracker { class TestLookupTracker : LookupTracker {
val lookups = arrayListOf<LookupInfo>() val lookups = arrayListOf<LookupInfo>()
override fun record(locationInfo: LocationInfo, scopeFqName: String, scopeKind: ScopeKind, name: String) { override val requiresPosition: Boolean
val (line, column) = locationInfo.position get() = true
lookups.add(LookupInfo(locationInfo.filePath, line, column, scopeFqName, scopeKind, name))
override fun record(filePath: String, position: Position, scopeFqName: String, scopeKind: ScopeKind, name: String) {
val (line, column) = position
lookups.add(LookupInfo(filePath, line, column, scopeFqName, scopeKind, name))
} }
data class LookupInfo( data class LookupInfo(