Allow to turn the first parameter of a SAM-converted lambda into the receiver (KT-12848)

This commit is contained in:
Yan Zhulanow
2016-12-06 20:03:27 +03:00
parent fc8cc217dc
commit cbef0250aa
57 changed files with 935 additions and 148 deletions
@@ -76,15 +76,16 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService {
}
private val facadesForScriptDependencies: SLRUCache<KotlinScriptExternalDependencies, ProjectResolutionFacade> =
object : SLRUCache<KotlinScriptExternalDependencies, ProjectResolutionFacade>(2, 3) {
override fun createValue(key: KotlinScriptExternalDependencies?): ProjectResolutionFacade {
return createFacadeForScriptDependencies(ScriptDependenciesModuleInfo(project, key))
private val facadesForScriptDependencies: SLRUCache<ScriptModuleInfo, ProjectResolutionFacade> =
object : SLRUCache<ScriptModuleInfo, ProjectResolutionFacade>(2, 3) {
override fun createValue(scriptModuleInfo: ScriptModuleInfo?): ProjectResolutionFacade {
val dependencies = scriptModuleInfo?.externalDependencies
return createFacadeForScriptDependencies(ScriptDependenciesModuleInfo(project, dependencies, scriptModuleInfo))
}
}
private fun getFacadeForScriptDependencies(dependencies: KotlinScriptExternalDependencies?) = synchronized(facadesForScriptDependencies) {
facadesForScriptDependencies.get(dependencies)
private fun getFacadeForScriptDependencies(scriptModuleInfo: ScriptModuleInfo) = synchronized(facadesForScriptDependencies) {
facadesForScriptDependencies.get(scriptModuleInfo)
}
private fun createFacadeForScriptDependencies(
@@ -230,7 +231,7 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService {
createFacadeForScriptDependencies(syntheticFileModule, files)
}
syntheticFileModule is ScriptModuleInfo -> {
val facadeForScriptDependencies = getFacadeForScriptDependencies(syntheticFileModule.externalDependencies)
val facadeForScriptDependencies = getFacadeForScriptDependencies(syntheticFileModule)
val globalContext = facadeForScriptDependencies.globalContext.contextWithNewLockAndCompositeExceptionTracker()
ProjectResolutionFacade(
"facadeForSynthetic in ScriptModuleInfo",
@@ -55,7 +55,7 @@ data class ScriptModuleInfo(val project: Project, val scriptFile: VirtualFile,
override fun dependencies(): List<IdeaModuleInfo> {
return listOf(
this,
ScriptDependenciesModuleInfo(project, externalDependencies)
ScriptDependenciesModuleInfo(project, externalDependencies, this)
) + sdkDependencies(externalDependencies, project)
}
}
@@ -73,7 +73,11 @@ fun findJdk(dependencies: KotlinScriptExternalDependencies?, project: Project):
allJdks.firstOrNull()
}
class ScriptDependenciesModuleInfo(val project: Project, val dependencies: KotlinScriptExternalDependencies?): IdeaModuleInfo {
class ScriptDependenciesModuleInfo(
val project: Project,
val dependencies: KotlinScriptExternalDependencies?,
val scriptModuleInfo: ScriptModuleInfo?
): IdeaModuleInfo {
override fun dependencies() = (listOf(this) + sdkDependencies(dependencies, project))
override val name = Name.special("<Script dependencies>")
@@ -129,7 +129,7 @@ private fun getModuleInfoByVirtualFile(project: Project, virtualFile: VirtualFil
}
if (KotlinScriptConfigurationManager.getInstance(project).getAllScriptsClasspathScope().contains(virtualFile)) {
return ScriptDependenciesModuleInfo(project, null)
return ScriptDependenciesModuleInfo(project, null, null)
}
return NotUnderContentRootModuleInfo
+1
View File
@@ -56,6 +56,7 @@
<orderEntry type="library" scope="TEST" name="native-platform-uberjar" level="project" />
<orderEntry type="module" module-name="allopen-ide" scope="TEST" />
<orderEntry type="module" module-name="noarg-ide" scope="TEST" />
<orderEntry type="module" module-name="sam-with-receiver-ide" scope="TEST" />
<orderEntry type="module" module-name="descriptors" />
</component>
</module>
+2
View File
@@ -2017,6 +2017,8 @@
<declarationAttributeAltererExtension implementation="org.jetbrains.kotlin.allopen.ide.IdeAllOpenDeclarationAttributeAltererExtension"/>
<storageComponentContainerContributor implementation="org.jetbrains.kotlin.samWithReceiver.ide.IdeSamWithReceiverComponentContributor"/>
<classBuilderFactoryInterceptorExtension implementation="org.jetbrains.kotlin.noarg.NoArgClassBuilderInterceptorExtension"/>
<storageComponentContainerContributor implementation="org.jetbrains.kotlin.noarg.ide.IdeNoArgComponentContainerContributor"/>
<defaultErrorMessages implementation="org.jetbrains.kotlin.noarg.diagnostic.DefaultErrorMessagesNoArg"/>