LightClassDataProvider: refactor, extract class filters to separate classes
This commit is contained in:
@@ -69,7 +69,7 @@ class GenerationState @JvmOverloads constructor(
|
|||||||
abstract class GenerateClassFilter {
|
abstract class GenerateClassFilter {
|
||||||
abstract fun shouldAnnotateClass(processingClassOrObject: KtClassOrObject): Boolean
|
abstract fun shouldAnnotateClass(processingClassOrObject: KtClassOrObject): Boolean
|
||||||
abstract fun shouldGenerateClass(processingClassOrObject: KtClassOrObject): Boolean
|
abstract fun shouldGenerateClass(processingClassOrObject: KtClassOrObject): Boolean
|
||||||
abstract fun shouldGeneratePackagePart(jetFile: KtFile): Boolean
|
abstract fun shouldGeneratePackagePart(ktFile: KtFile): Boolean
|
||||||
abstract fun shouldGenerateScript(script: KtScript): Boolean
|
abstract fun shouldGenerateScript(script: KtScript): Boolean
|
||||||
open fun shouldGenerateClassMembers(processingClassOrObject: KtClassOrObject) = shouldGenerateClass(processingClassOrObject)
|
open fun shouldGenerateClassMembers(processingClassOrObject: KtClassOrObject) = shouldGenerateClass(processingClassOrObject)
|
||||||
|
|
||||||
@@ -81,7 +81,7 @@ class GenerationState @JvmOverloads constructor(
|
|||||||
|
|
||||||
override fun shouldGenerateScript(script: KtScript): Boolean = true
|
override fun shouldGenerateScript(script: KtScript): Boolean = true
|
||||||
|
|
||||||
override fun shouldGeneratePackagePart(jetFile: KtFile): Boolean = true
|
override fun shouldGeneratePackagePart(ktFile: KtFile): Boolean = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+52
-73
@@ -63,61 +63,10 @@ class LightClassDataProviderForClassOrObject(private val classOrObject: KtClassO
|
|||||||
|
|
||||||
override fun computeLightClassData(): LightClassDataHolder {
|
override fun computeLightClassData(): LightClassDataHolder {
|
||||||
val file = classOrObject.containingKtFile
|
val file = classOrObject.containingKtFile
|
||||||
|
|
||||||
val packageFqName = file.packageFqName
|
val packageFqName = file.packageFqName
|
||||||
val generateClassFilter = object : GenerationState.GenerateClassFilter() {
|
|
||||||
|
|
||||||
override fun shouldGeneratePackagePart(jetFile: KtFile): Boolean {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun shouldAnnotateClass(processingClassOrObject: KtClassOrObject): Boolean {
|
|
||||||
return shouldGenerateClass(processingClassOrObject)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun shouldGenerateClassMembers(processingClassOrObject: KtClassOrObject): Boolean {
|
|
||||||
if (classOrObject === processingClassOrObject) return true
|
|
||||||
|
|
||||||
// process all children
|
|
||||||
if (classOrObject.isAncestor(processingClassOrObject, true)) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Local classes should be process by CodegenAnnotatingVisitor to
|
|
||||||
// decide what class they should be placed in.
|
|
||||||
//
|
|
||||||
// Example:
|
|
||||||
// class A
|
|
||||||
// fun foo() {
|
|
||||||
// trait Z: A {}
|
|
||||||
// fun bar() {
|
|
||||||
// class <caret>O2: Z {}
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// TODO: current method will process local classes in irrelevant declarations, it should be fixed.
|
|
||||||
// We generate all enclosing classes
|
|
||||||
|
|
||||||
if (classOrObject.isLocal && processingClassOrObject.isLocal) {
|
|
||||||
val commonParent = PsiTreeUtil.findCommonParent(classOrObject, processingClassOrObject)
|
|
||||||
return commonParent != null && commonParent !is PsiFile
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun shouldGenerateClass(processingClassOrObject: KtClassOrObject): Boolean {
|
|
||||||
// generate outer classes but not their members
|
|
||||||
return shouldGenerateClassMembers(processingClassOrObject) || processingClassOrObject.isAncestor(classOrObject, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun shouldGenerateScript(script: KtScript): Boolean {
|
|
||||||
return PsiTreeUtil.isAncestor(script, classOrObject, false)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return LightClassGenerationSupport.getInstance(classOrObject.project).createLightClassDataHolderForClassOrObject(classOrObject) {
|
return LightClassGenerationSupport.getInstance(classOrObject.project).createLightClassDataHolderForClassOrObject(classOrObject) {
|
||||||
constructionContext ->
|
constructionContext ->
|
||||||
buildLightClass(classOrObject.project, packageFqName, listOf(file), generateClassFilter, constructionContext) {
|
buildLightClass(classOrObject.project, packageFqName, listOf(file), ClassFilterForClassOrObject(classOrObject), constructionContext) {
|
||||||
state, files ->
|
state, files ->
|
||||||
val packageCodegen = state.factory.forPackage(packageFqName, files)
|
val packageCodegen = state.factory.forPackage(packageFqName, files)
|
||||||
val packagePartType = state.fileClassesProvider.getFileClassType(file)
|
val packagePartType = state.fileClassesProvider.getFileClassType(file)
|
||||||
@@ -143,29 +92,9 @@ sealed class LightClassDataProviderForFileFacade constructor(
|
|||||||
get() = files.isEmpty()
|
get() = files.isEmpty()
|
||||||
|
|
||||||
override fun computeLightClassData(): LightClassDataHolder {
|
override fun computeLightClassData(): LightClassDataHolder {
|
||||||
val generateClassFilter = object : GenerationState.GenerateClassFilter() {
|
|
||||||
override fun shouldAnnotateClass(processingClassOrObject: KtClassOrObject): Boolean {
|
|
||||||
return shouldGenerateClass(processingClassOrObject)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun shouldGenerateClass(processingClassOrObject: KtClassOrObject): Boolean {
|
|
||||||
return KtPsiUtil.isLocal(processingClassOrObject)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun shouldGeneratePackagePart(jetFile: KtFile): Boolean {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun shouldGenerateScript(script: KtScript): Boolean {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val packageFqName = facadeFqName.parent()
|
|
||||||
|
|
||||||
return LightClassGenerationSupport.getInstance(project).createLightClassDataHolderForFacade(files) {
|
return LightClassGenerationSupport.getInstance(project).createLightClassDataHolderForFacade(files) {
|
||||||
constructionContext ->
|
constructionContext ->
|
||||||
buildLightClass(project, packageFqName, files, generateClassFilter, constructionContext) generate@ {
|
buildLightClass(project, facadeFqName.parent(), files, ClassFilterForFacade, constructionContext) generate@ {
|
||||||
state, files ->
|
state, files ->
|
||||||
if (!files.isEmpty()) {
|
if (!files.isEmpty()) {
|
||||||
val representativeFile = files.iterator().next()
|
val representativeFile = files.iterator().next()
|
||||||
@@ -214,3 +143,53 @@ sealed class LightClassDataProviderForFileFacade constructor(
|
|||||||
interface StubComputationTracker {
|
interface StubComputationTracker {
|
||||||
fun onStubComputed(javaFileStub: PsiJavaFileStub, context: LightClassConstructionContext)
|
fun onStubComputed(javaFileStub: PsiJavaFileStub, context: LightClassConstructionContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private class ClassFilterForClassOrObject(private val classOrObject: KtClassOrObject) : GenerationState.GenerateClassFilter() {
|
||||||
|
|
||||||
|
override fun shouldGeneratePackagePart(ktFile: KtFile) = true
|
||||||
|
override fun shouldAnnotateClass(processingClassOrObject: KtClassOrObject) = shouldGenerateClass(processingClassOrObject)
|
||||||
|
|
||||||
|
override fun shouldGenerateClassMembers(processingClassOrObject: KtClassOrObject): Boolean {
|
||||||
|
if (classOrObject === processingClassOrObject) return true
|
||||||
|
|
||||||
|
// process all children
|
||||||
|
if (classOrObject.isAncestor(processingClassOrObject, true)) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Local classes should be process by CodegenAnnotatingVisitor to
|
||||||
|
// decide what class they should be placed in.
|
||||||
|
//
|
||||||
|
// Example:
|
||||||
|
// class A
|
||||||
|
// fun foo() {
|
||||||
|
// trait Z: A {}
|
||||||
|
// fun bar() {
|
||||||
|
// class <caret>O2: Z {}
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// TODO: current method will process local classes in irrelevant declarations, it should be fixed.
|
||||||
|
// We generate all enclosing classes
|
||||||
|
|
||||||
|
if (classOrObject.isLocal && processingClassOrObject.isLocal) {
|
||||||
|
val commonParent = PsiTreeUtil.findCommonParent(classOrObject, processingClassOrObject)
|
||||||
|
return commonParent != null && commonParent !is PsiFile
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun shouldGenerateClass(processingClassOrObject: KtClassOrObject)
|
||||||
|
// generate outer classes but not their members
|
||||||
|
= shouldGenerateClassMembers(processingClassOrObject) || processingClassOrObject.isAncestor(classOrObject, true)
|
||||||
|
|
||||||
|
override fun shouldGenerateScript(script: KtScript) = PsiTreeUtil.isAncestor(script, classOrObject, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
object ClassFilterForFacade : GenerationState.GenerateClassFilter() {
|
||||||
|
override fun shouldAnnotateClass(processingClassOrObject: KtClassOrObject) = shouldGenerateClass(processingClassOrObject)
|
||||||
|
override fun shouldGenerateClass(processingClassOrObject: KtClassOrObject) = KtPsiUtil.isLocal(processingClassOrObject)
|
||||||
|
override fun shouldGeneratePackagePart(ktFile: KtFile) = true
|
||||||
|
override fun shouldGenerateScript(script: KtScript) = false
|
||||||
|
}
|
||||||
|
|||||||
@@ -384,7 +384,7 @@ class KotlinEvaluator(val codeFragment: KtCodeFragment, val sourcePosition: Sour
|
|||||||
val (bindingContext, moduleDescriptor, files) = fileForDebugger.checkForErrors(true, codeFragment.getContextContainingFile())
|
val (bindingContext, moduleDescriptor, files) = fileForDebugger.checkForErrors(true, codeFragment.getContextContainingFile())
|
||||||
|
|
||||||
val generateClassFilter = object : GenerationState.GenerateClassFilter() {
|
val generateClassFilter = object : GenerationState.GenerateClassFilter() {
|
||||||
override fun shouldGeneratePackagePart(jetFile: KtFile) = jetFile == fileForDebugger
|
override fun shouldGeneratePackagePart(ktFile: KtFile) = ktFile == fileForDebugger
|
||||||
override fun shouldAnnotateClass(processingClassOrObject: KtClassOrObject) = true
|
override fun shouldAnnotateClass(processingClassOrObject: KtClassOrObject) = true
|
||||||
override fun shouldGenerateClass(processingClassOrObject: KtClassOrObject) = processingClassOrObject.containingKtFile == fileForDebugger
|
override fun shouldGenerateClass(processingClassOrObject: KtClassOrObject) = processingClassOrObject.containingKtFile == fileForDebugger
|
||||||
override fun shouldGenerateScript(script: KtScript) = false
|
override fun shouldGenerateScript(script: KtScript) = false
|
||||||
|
|||||||
Reference in New Issue
Block a user