Introduce Variable: Support extraction of string template fragments

#KT-2089 Fixed
This commit is contained in:
Alexey Sedunov
2015-11-16 16:06:01 +03:00
parent 7dbcceee79
commit f4b4b023a3
40 changed files with 592 additions and 48 deletions
@@ -55,15 +55,25 @@ public class KtPsiFactory(private val project: Project) {
return (createExpression("a?.b") as KtSafeQualifiedExpression).getOperationTokenNode()
}
public fun createExpression(text: String): KtExpression {
private fun doCreateExpression(text: String): KtExpression {
//TODO: '\n' below if important - some strange code indenting problems appear without it
val expression = createProperty("val x =\n$text").getInitializer() ?: error("Failed to create expression from text: '$text'")
return expression
}
public fun createExpression(text: String): KtExpression {
val expression = doCreateExpression(text)
assert(expression.getText() == text) {
"Failed to create expression from text: '$text', resulting expression's text was: '${expression.getText()}'"
}
return expression
}
public fun createExpressionIfPossible(text: String): KtExpression? {
val expression = doCreateExpression(text)
return if (expression.getText() == text) expression else null
}
public fun createClassLiteral(className: String): KtClassLiteralExpression =
createExpression("$className::class") as KtClassLiteralExpression
@@ -291,6 +301,8 @@ public class KtPsiFactory(private val project: Project) {
return stringTemplateExpression.getEntries()[0] as KtStringTemplateEntryWithExpression
}
public fun createStringTemplate(content: String) = createExpression("\"$content\"") as KtStringTemplateExpression
public fun createPackageDirective(fqName: FqName): KtPackageDirective {
return createFile("package ${fqName.asString()}").getPackageDirective()!!
}
@@ -138,6 +138,8 @@ public fun PsiElement.getNextSiblingIgnoringWhitespaceAndComments(): PsiElement?
return siblings(withItself = false).filter { it !is PsiWhiteSpace && it !is PsiComment }.firstOrNull()
}
inline public fun <reified T : PsiElement> T.nextSiblingOfSameType() = PsiTreeUtil.getNextSiblingOfType(this, T::class.java)
public fun PsiElement?.isAncestor(element: PsiElement, strict: Boolean = false): Boolean {
return PsiTreeUtil.isAncestor(this, element, strict)
}