Optimization of Basic Code Completion

Now we don't perform code formatting on temporary psi used
  in ShadowedDeclarationFilter
  #KT-16856
This commit is contained in:
Simon Ogorodnik
2017-03-03 19:48:46 +03:00
parent bbab0f11ca
commit 4906ddfc29
2 changed files with 34 additions and 32 deletions
@@ -30,17 +30,17 @@ import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.renderer.render import org.jetbrains.kotlin.renderer.render
import java.util.* import java.util.*
fun KtPsiFactory.createExpressionByPattern(pattern: String, vararg args: Any): KtExpression fun KtPsiFactory.createExpressionByPattern(pattern: String, vararg args: Any, reformat: Boolean = true): KtExpression
= createByPattern(pattern, *args) { createExpression(it) } = createByPattern(pattern, *args, reformat = reformat) { createExpression(it) }
fun KtPsiFactory.createValueArgumentListByPattern(pattern: String, vararg args: Any): KtValueArgumentList fun KtPsiFactory.createValueArgumentListByPattern(pattern: String, vararg args: Any, reformat: Boolean = true): KtValueArgumentList
= createByPattern(pattern, *args) { createCallArguments(it) } = createByPattern(pattern, *args, reformat = reformat) { createCallArguments(it) }
fun <TDeclaration : KtDeclaration> KtPsiFactory.createDeclarationByPattern(pattern: String, vararg args: Any): TDeclaration fun <TDeclaration : KtDeclaration> KtPsiFactory.createDeclarationByPattern(pattern: String, vararg args: Any, reformat: Boolean = true): TDeclaration
= createByPattern(pattern, *args) { createDeclaration<TDeclaration>(it) } = createByPattern(pattern, *args, reformat = reformat) { createDeclaration<TDeclaration>(it) }
fun KtPsiFactory.createDestructuringDeclarationByPattern(pattern: String, vararg args: Any): KtDestructuringDeclaration fun KtPsiFactory.createDestructuringDeclarationByPattern(pattern: String, vararg args: Any, reformat: Boolean = true): KtDestructuringDeclaration
= createByPattern(pattern, *args) { createDestructuringDeclaration(it) } = createByPattern(pattern, *args, reformat = reformat) { createDestructuringDeclaration(it) }
private abstract class ArgumentType<T : Any>(val klass: Class<T>) private abstract class ArgumentType<T : Any>(val klass: Class<T>)
@@ -94,7 +94,7 @@ private val SUPPORTED_ARGUMENT_TYPES = listOf(
PsiChildRangeArgumentType PsiChildRangeArgumentType
) )
fun <TElement : KtElement> createByPattern(pattern: String, vararg args: Any, factory: (String) -> TElement): TElement { fun <TElement : KtElement> createByPattern(pattern: String, vararg args: Any, reformat: Boolean = true, factory: (String) -> TElement): TElement {
val argumentTypes = args.map { arg -> val argumentTypes = args.map { arg ->
SUPPORTED_ARGUMENT_TYPES.firstOrNull { it.klass.isInstance(arg) } SUPPORTED_ARGUMENT_TYPES.firstOrNull { it.klass.isInstance(arg) }
?: throw IllegalArgumentException("Unsupported argument type: ${arg::class.java}, should be one of: ${SUPPORTED_ARGUMENT_TYPES.map { it.klass.simpleName }.joinToString()}") ?: throw IllegalArgumentException("Unsupported argument type: ${arg::class.java}, should be one of: ${SUPPORTED_ARGUMENT_TYPES.map { it.klass.simpleName }.joinToString()}")
@@ -146,6 +146,7 @@ fun <TElement : KtElement> createByPattern(pattern: String, vararg args: Any, fa
val codeStyleManager = CodeStyleManager.getInstance(project) val codeStyleManager = CodeStyleManager.getInstance(project)
if (reformat) {
val stringPlaceholderRanges = allPlaceholders val stringPlaceholderRanges = allPlaceholders
.filter { args[it.key] is String } .filter { args[it.key] is String }
.flatMap { it.value } .flatMap { it.value }
@@ -169,7 +170,7 @@ fun <TElement : KtElement> createByPattern(pattern: String, vararg args: Any, fa
// do not reformat the whole expression in PostprocessReformattingAspect // do not reformat the whole expression in PostprocessReformattingAspect
CodeEditUtil.setNodeGeneratedRecursively(resultElement.node, false) CodeEditUtil.setNodeGeneratedRecursively(resultElement.node, false)
}
for ((pointer, n) in pointers) { for ((pointer, n) in pointers) {
var element = pointer.element!! var element = pointer.element!!
if (element is KtFunctionLiteral) { if (element is KtFunctionLiteral) {
@@ -185,6 +186,7 @@ fun <TElement : KtElement> createByPattern(pattern: String, vararg args: Any, fa
} }
} }
if (reformat)
codeStyleManager.adjustLineIndent(resultElement.containingFile, resultElement.textRange) codeStyleManager.adjustLineIndent(resultElement.containingFile, resultElement.textRange)
return resultElement return resultElement
@@ -169,7 +169,7 @@ class ShadowedDeclarationsFilter(
val newCall = object : Call { val newCall = object : Call {
//TODO: compiler crash (KT-8011) //TODO: compiler crash (KT-8011)
//val arguments = parameters.indices.map { DummyArgument(it) } //val arguments = parameters.indices.map { DummyArgument(it) }
val callee = psiFactory.createExpressionByPattern("$0", name) val callee = psiFactory.createExpressionByPattern("$0", name, reformat = false)
override fun getCalleeExpression() = callee override fun getCalleeExpression() = callee