From 4246c7f326eef6104bf9318dbf4d121b14a3f47e Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Thu, 3 Mar 2016 16:20:07 +0300 Subject: [PATCH] Refactor: Provide API to create KtLightClassForFacade by synthetic file --- .../kotlin/asJava/KtLightClassForFacade.kt | 15 +++++++++- .../kotlin/asJava/LightClassDataProvider.kt | 29 +++++++++++++++---- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForFacade.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForFacade.kt index 081fe0decd9..5b378d159ce 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForFacade.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForFacade.kt @@ -49,7 +49,7 @@ class KtLightClassForFacade private constructor( private inner class FacadeCacheData { val cache = object : SLRUCache>(20, 30) { override fun createValue(key: StubCacheKey): CachedValue { - val stubProvider = LightClassDataProviderForFileFacade(project, key.fqName, key.searchScope) + val stubProvider = LightClassDataProviderForFileFacade.ByProjectSource(project, key.fqName, key.searchScope) return CachedValuesManager.getManager(project).createCachedValue(stubProvider, /*trackValue = */false) } } @@ -199,5 +199,18 @@ class KtLightClassForFacade private constructor( val lightClassDataCache = FacadeStubCache.getInstance(manager.project).get(facadeClassFqName, searchScope) return KtLightClassForFacade(manager, facadeClassFqName, lightClassDataCache, files) } + + fun createForSyntheticFile( + manager: PsiManager, + facadeClassFqName: FqName, + file: KtFile + ): KtLightClassForFacade { + // TODO: refactor, using cached value doesn't make sense for this case + val cachedValue = CachedValuesManager.getManager(manager.project). + createCachedValue( + LightClassDataProviderForFileFacade.ByFile(manager.project, facadeClassFqName, file), /*trackValue = */false + ) + return KtLightClassForFacade(manager, facadeClassFqName, cachedValue, listOf(file)) + } } } diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassDataProvider.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassDataProvider.kt index 9f9fe45025d..09f673f1101 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassDataProvider.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassDataProvider.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2016 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. @@ -281,12 +281,9 @@ class LightClassDataProviderForClassOrObject(private val classOrObject: KtClassO } } -class LightClassDataProviderForFileFacade( - private val project: Project, private val facadeFqName: FqName, private val searchScope: GlobalSearchScope +sealed class LightClassDataProviderForFileFacade private constructor( + protected val project: Project, protected val facadeFqName: FqName ) : LightClassDataProvider(project) { - override val files: Collection - get() = LightClassGenerationSupport.getInstance(project).findFilesForFacade(facadeFqName, searchScope) - override val packageFqName: FqName get() = facadeFqName.parent() @@ -342,6 +339,26 @@ class LightClassDataProviderForFileFacade( override fun toString(): String { return this.javaClass.name + " for $facadeFqName" } + + // create delegate by relevant files in project source using LightClassGenerationSupport + class ByProjectSource( + project: Project, + facadeFqName: FqName, + private val searchScope: GlobalSearchScope + ) : LightClassDataProviderForFileFacade(project, facadeFqName) { + override val files: Collection + get() = LightClassGenerationSupport.getInstance(project).findFilesForFacade(facadeFqName, searchScope) + } + + // create delegate by single file + class ByFile( + project: Project, + facadeFqName: FqName, + private val file: KtFile + ) : LightClassDataProviderForFileFacade(project, facadeFqName) { + override val files: Collection + get() = listOf(file) + } }