Adds AdditionalExtractableAnalyser EP.

Adds annotations to ExtractableCodeDescriptor.
Adds functionality of adding annotations to KtPsiFactory.CallableBuilder
This commit is contained in:
kovalp
2020-02-26 11:58:01 +00:00
committed by Dmitry Gridin
parent b53cb5cb4c
commit 86f9cb6eef
5 changed files with 38 additions and 3 deletions
@@ -67,6 +67,9 @@
<extensionPoint qualifiedName="org.jetbrains.kotlin.scripting.idea.listener"
interface="org.jetbrains.kotlin.idea.core.script.configuration.listener.ScriptChangeListener"
area="IDEA_PROJECT"/>
<extensionPoint qualifiedName="org.jetbrains.kotlin.additionalExtractableAnalyser"
interface="org.jetbrains.kotlin.idea.refactoring.introduce.extractionEngine.AdditionalExtractableAnalyser"/>
</extensionPoints>
<extensions defaultExtensionNs="org.jetbrains.kotlin">
@@ -0,0 +1,20 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.refactoring.introduce.extractionEngine
import com.intellij.openapi.extensions.ExtensionPointName
/**
* Allows to modify ExtractableCodeDescriptor within [ExtractionData.performAnalysis].
*/
interface AdditionalExtractableAnalyser {
fun amendDescriptor(descriptor: ExtractableCodeDescriptor): ExtractableCodeDescriptor
companion object {
val EP_NAME = ExtensionPointName.create<AdditionalExtractableAnalyser>("org.jetbrains.kotlin.additionalExtractableAnalyser")
}
}
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.idea.core.replaced
import org.jetbrains.kotlin.idea.refactoring.KotlinRefactoringBundle
import org.jetbrains.kotlin.idea.refactoring.introduce.extractionEngine.OutputValue.*
@@ -357,7 +358,8 @@ data class ExtractableCodeDescriptor(
val replacementMap: MultiMap<KtSimpleNameExpression, Replacement>,
val controlFlow: ControlFlow,
val returnType: KotlinType,
val modifiers: List<KtKeywordToken> = emptyList()
val modifiers: List<KtKeywordToken> = emptyList(),
val annotations: List<AnnotationDescriptor> = emptyList()
) {
val name: String get() = suggestedNames.firstOrNull() ?: ""
val duplicates: List<DuplicateInfo> by lazy { findDuplicates() }
@@ -393,7 +395,8 @@ fun ExtractableCodeDescriptor.copy(
newReplacementMap,
controlFlow.copy(oldToNewParameters),
returnType ?: this.returnType,
modifiers
modifiers,
annotations
)
}
@@ -708,6 +708,9 @@ fun ExtractionData.performAnalysis(): AnalysisResult {
descriptor = descriptor.copy(modifiers = listOf(KtTokens.SUSPEND_KEYWORD))
}
for (analyser in AdditionalExtractableAnalyser.EP_NAME.extensions) {
descriptor = analyser.amendDescriptor(descriptor)
}
return AnalysisResult(
descriptor,
@@ -61,10 +61,16 @@ private fun buildSignature(config: ExtractionGeneratorConfiguration, renderer: D
fun TypeParameter.isReified() = originalDeclaration.hasModifier(KtTokens.REIFIED_KEYWORD)
val shouldBeInline = config.descriptor.typeParameters.any { it.isReified() }
val annotations = if (config.descriptor.annotations.isEmpty()) {
""
} else {
config.descriptor.annotations.joinToString(separator = "\n", postfix = "\n") { renderer.renderAnnotation(it) }
}
val extraModifiers = config.descriptor.modifiers.map { it.value } +
listOfNotNull(if (shouldBeInline) KtTokens.INLINE_KEYWORD.value else null)
val modifiers = if (visibility.isNotEmpty()) listOf(visibility) + extraModifiers else extraModifiers
modifier(modifiers.joinToString(separator = " "))
modifier(annotations + modifiers.joinToString(separator = " "))
typeParams(
config.descriptor.typeParameters.map {