From 66a90916fe56a17076d83c8037583e18806ede45 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 6 May 2015 12:00:30 +0300 Subject: [PATCH] JetPsiFactory.createExpressionByPattern supports JetTypeReference's as arguments --- .../jetbrains/kotlin/psi/createByPattern.kt | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/createByPattern.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/createByPattern.kt index ff4d26dc177..7de9d240438 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/createByPattern.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/createByPattern.kt @@ -38,23 +38,29 @@ public fun JetPsiFactory.createExpressionByPattern(pattern: String, vararg args: val pointerManager = SmartPointerManager.getInstance(project) - val pointers = HashMap, Int>() + val pointers = HashMap, Int>() + + PlaceholdersLoop@ for ((n, placeholders) in allPlaceholders) { - if (args[n] is String) continue // already in the text + val expectedElementType = when (args[n]) { + is String -> continue@PlaceholdersLoop // already in the text + is JetExpression -> javaClass() + is JetTypeReference -> javaClass() + else -> throw IllegalArgumentException("Unknown argument ${args[n]} - should be JetExpression, JetTypeReference or String") + } for ((range, text) in placeholders) { val token = expression.findElementAt(range.getStartOffset())!! for (element in token.parents()) { val elementRange = element.getTextRange().shiftRight(-start) - if (elementRange == range) { - val elementToUse = element.parents(withItself = false).firstIsInstanceOrNull() - ?: error("Invalid pattern '$pattern' - no JetExpression found for $n text = " + processedText) - val pointer = pointerManager.createSmartPsiElementPointer(elementToUse) + if (elementRange == range && expectedElementType.isInstance(element)) { + val pointer = pointerManager.createSmartPsiElementPointer(element) pointers.put(pointer, n) break } - else if (!range.contains(elementRange)) { - throw IllegalArgumentException("Invalid pattern '$pattern' - no PsiElement found for $$n text = " + processedText) + + if (!range.contains(elementRange)) { + throw IllegalArgumentException("Invalid pattern '$pattern' - no ${expectedElementType.getSimpleName()} found for $$n, text = '$processedText'") } } } @@ -87,11 +93,7 @@ public fun JetPsiFactory.createExpressionByPattern(pattern: String, vararg args: for ((pointer, n) in pointers) { val element = pointer.getElement()!! - val arg = args[n] - if (arg !is JetExpression) { - throw IllegalArgumentException("Unknown argument $arg - should be JetExpression or String") - } - element.replace(arg) + element.replace(args[n] as PsiElement) } codeStyleManager.adjustLineIndent(expression.getContainingFile(), expression.getTextRange())