Minor. Reformat org.jetbrains.kotlin.idea.codeInsight.postfix
This commit is contained in:
+51
-51
@@ -42,23 +42,23 @@ import org.jetbrains.kotlin.types.typeUtil.isBoolean
|
||||
|
||||
class KtPostfixTemplateProvider : PostfixTemplateProvider {
|
||||
override fun getTemplates() = setOf(
|
||||
KtNotPostfixTemplate,
|
||||
KtIfExpressionPostfixTemplate,
|
||||
KtElseExpressionPostfixTemplate,
|
||||
KtNotNullPostfixTemplate("notnull"),
|
||||
KtNotNullPostfixTemplate("nn"),
|
||||
KtIsNullPostfixTemplate,
|
||||
KtWhenExpressionPostfixTemplate,
|
||||
KtTryPostfixTemplate,
|
||||
KtIntroduceVariablePostfixTemplate("val"),
|
||||
KtIntroduceVariablePostfixTemplate("var"),
|
||||
KtForEachPostfixTemplate("for"),
|
||||
KtForEachPostfixTemplate("iter"),
|
||||
KtAssertPostfixTemplate,
|
||||
KtParenthesizedPostfixTemplate,
|
||||
KtSoutPostfixTemplate,
|
||||
KtReturnPostfixTemplate,
|
||||
KtWhilePostfixTemplate
|
||||
KtNotPostfixTemplate,
|
||||
KtIfExpressionPostfixTemplate,
|
||||
KtElseExpressionPostfixTemplate,
|
||||
KtNotNullPostfixTemplate("notnull"),
|
||||
KtNotNullPostfixTemplate("nn"),
|
||||
KtIsNullPostfixTemplate,
|
||||
KtWhenExpressionPostfixTemplate,
|
||||
KtTryPostfixTemplate,
|
||||
KtIntroduceVariablePostfixTemplate("val"),
|
||||
KtIntroduceVariablePostfixTemplate("var"),
|
||||
KtForEachPostfixTemplate("for"),
|
||||
KtForEachPostfixTemplate("iter"),
|
||||
KtAssertPostfixTemplate,
|
||||
KtParenthesizedPostfixTemplate,
|
||||
KtSoutPostfixTemplate,
|
||||
KtReturnPostfixTemplate,
|
||||
KtWhilePostfixTemplate
|
||||
)
|
||||
|
||||
override fun isTerminalSymbol(currentChar: Char) = currentChar == '.' || currentChar == '!'
|
||||
@@ -82,54 +82,54 @@ class KtPostfixTemplateProvider : PostfixTemplateProvider {
|
||||
}
|
||||
|
||||
private object KtNotPostfixTemplate : NotPostfixTemplate(
|
||||
KtPostfixTemplatePsiInfo,
|
||||
createExpressionSelector { it.isBoolean() }
|
||||
KtPostfixTemplatePsiInfo,
|
||||
createExpressionSelector { it.isBoolean() }
|
||||
)
|
||||
|
||||
private class KtIntroduceVariablePostfixTemplate(
|
||||
val kind: String
|
||||
val kind: String
|
||||
) : PostfixTemplateWithExpressionSelector(kind, "$kind name = expression", createExpressionSelector()) {
|
||||
override fun expandForChooseExpression(expression: PsiElement, editor: Editor) {
|
||||
KotlinIntroduceVariableHandler.doRefactoring(
|
||||
expression.project, editor, expression as KtExpression,
|
||||
isVar = kind == "var",
|
||||
occurrencesToReplace = null,
|
||||
onNonInteractiveFinish = null
|
||||
expression.project, editor, expression as KtExpression,
|
||||
isVar = kind == "var",
|
||||
occurrencesToReplace = null,
|
||||
onNonInteractiveFinish = null
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
internal object KtPostfixTemplatePsiInfo : PostfixTemplatePsiInfo() {
|
||||
override fun createExpression(context: PsiElement, prefix: String, suffix: String) =
|
||||
KtPsiFactory(context.project).createExpression(prefix + context.text + suffix)
|
||||
KtPsiFactory(context.project).createExpression(prefix + context.text + suffix)
|
||||
|
||||
override fun getNegatedExpression(element: PsiElement) = (element as KtExpression).negate()
|
||||
}
|
||||
|
||||
internal fun createExpressionSelector(
|
||||
checkCanBeUsedAsValue: Boolean = true,
|
||||
statementsOnly: Boolean = false,
|
||||
typePredicate: ((KotlinType) -> Boolean)? = null
|
||||
checkCanBeUsedAsValue: Boolean = true,
|
||||
statementsOnly: Boolean = false,
|
||||
typePredicate: ((KotlinType) -> Boolean)? = null
|
||||
): PostfixTemplateExpressionSelector {
|
||||
val predicate: ((KtExpression, BindingContext) -> Boolean)? =
|
||||
if (typePredicate != null) { expression, bindingContext ->
|
||||
expression.getType(bindingContext)?.let(typePredicate) ?: false
|
||||
}
|
||||
else null
|
||||
if (typePredicate != null) { expression, bindingContext ->
|
||||
expression.getType(bindingContext)?.let(typePredicate) ?: false
|
||||
}
|
||||
else null
|
||||
return createExpressionSelectorWithComplexFilter(checkCanBeUsedAsValue, statementsOnly, predicate)
|
||||
}
|
||||
|
||||
internal fun createExpressionSelectorWithComplexFilter(
|
||||
// Do not suggest expressions like 'val a = 1'/'for ...'
|
||||
checkCanBeUsedAsValue: Boolean = true,
|
||||
statementsOnly: Boolean = false,
|
||||
predicate: ((KtExpression, BindingContext) -> Boolean)? = null
|
||||
// Do not suggest expressions like 'val a = 1'/'for ...'
|
||||
checkCanBeUsedAsValue: Boolean = true,
|
||||
statementsOnly: Boolean = false,
|
||||
predicate: ((KtExpression, BindingContext) -> Boolean)? = null
|
||||
): PostfixTemplateExpressionSelector = KtExpressionPostfixTemplateSelector(checkCanBeUsedAsValue, statementsOnly, predicate)
|
||||
|
||||
private class KtExpressionPostfixTemplateSelector(
|
||||
private val checkCanBeUsedAsValue: Boolean,
|
||||
private val statementsOnly: Boolean,
|
||||
private val predicate: ((KtExpression, BindingContext) -> Boolean)?
|
||||
private val checkCanBeUsedAsValue: Boolean,
|
||||
private val statementsOnly: Boolean,
|
||||
private val predicate: ((KtExpression, BindingContext) -> Boolean)?
|
||||
) : PostfixTemplateExpressionSelector {
|
||||
|
||||
private fun filterElement(element: PsiElement): Boolean {
|
||||
@@ -156,11 +156,11 @@ private class KtExpressionPostfixTemplateSelector(
|
||||
}
|
||||
|
||||
private fun KtExpression.canBeUsedAsValue() =
|
||||
!KtPsiUtil.isAssignment(this) &&
|
||||
!this.isNamedDeclaration &&
|
||||
this !is KtLoopExpression &&
|
||||
// if's only with else may be treated as expressions
|
||||
!isIfWithoutElse
|
||||
!KtPsiUtil.isAssignment(this) &&
|
||||
!this.isNamedDeclaration &&
|
||||
this !is KtLoopExpression &&
|
||||
// if's only with else may be treated as expressions
|
||||
!isIfWithoutElse
|
||||
|
||||
private val KtExpression.isIfWithoutElse: Boolean
|
||||
get() = (this is KtIfExpression && this.elseKeyword == null)
|
||||
@@ -169,11 +169,11 @@ private class KtExpressionPostfixTemplateSelector(
|
||||
val originalFile = context.containingFile.originalFile
|
||||
val textRange = context.textRange
|
||||
val originalElement = findElementOfClassAtRange(originalFile, textRange.startOffset, textRange.endOffset, context::class.java)
|
||||
?: return emptyList()
|
||||
?: return emptyList()
|
||||
|
||||
val expressions = originalElement.parentsWithSelf
|
||||
.filterIsInstance<KtExpression>()
|
||||
.takeWhile { !it.isBlockBodyInDeclaration }
|
||||
.filterIsInstance<KtExpression>()
|
||||
.takeWhile { !it.isBlockBodyInDeclaration }
|
||||
|
||||
val boundExpression = expressions.firstOrNull { it.parent.endOffset > offset }
|
||||
val boundElementParent = boundExpression?.parent
|
||||
@@ -181,10 +181,10 @@ private class KtExpressionPostfixTemplateSelector(
|
||||
if (boundElementParent is KtDotQualifiedExpression && boundExpression == boundElementParent.receiverExpression) {
|
||||
val qualifiedExpressionEnd = boundElementParent.endOffset
|
||||
expressions
|
||||
.dropWhile { it != boundElementParent }
|
||||
.drop(1)
|
||||
.takeWhile { it.endOffset == qualifiedExpressionEnd }
|
||||
.toCollection(filteredByOffset)
|
||||
.dropWhile { it != boundElementParent }
|
||||
.drop(1)
|
||||
.takeWhile { it.endOffset == qualifiedExpressionEnd }
|
||||
.toCollection(filteredByOffset)
|
||||
}
|
||||
|
||||
val result = filteredByOffset.filter(this::filterElement)
|
||||
|
||||
+29
-29
@@ -34,23 +34,23 @@ import org.jetbrains.kotlin.types.KotlinType
|
||||
import org.jetbrains.kotlin.types.typeUtil.isBoolean
|
||||
|
||||
internal abstract class ConstantStringBasedPostfixTemplate(
|
||||
name: String,
|
||||
desc: String,
|
||||
private val template: String,
|
||||
selector: PostfixTemplateExpressionSelector
|
||||
) : StringBasedPostfixTemplate(name, desc, selector) {
|
||||
name: String,
|
||||
desc: String,
|
||||
private val template: String,
|
||||
selector: PostfixTemplateExpressionSelector
|
||||
) : StringBasedPostfixTemplate(name, desc, selector) {
|
||||
override fun getTemplateString(element: PsiElement) = template
|
||||
|
||||
override fun getElementToRemove(expr: PsiElement?) = expr
|
||||
}
|
||||
|
||||
internal class KtForEachPostfixTemplate(
|
||||
name: String
|
||||
name: String
|
||||
) : ConstantStringBasedPostfixTemplate(
|
||||
name,
|
||||
"for (item in expr)",
|
||||
"for (\$name$ in \$expr$) {\n \$END$\n}",
|
||||
createExpressionSelectorWithComplexFilter(statementsOnly = true, predicate = KtExpression::hasIterableType)
|
||||
name,
|
||||
"for (item in expr)",
|
||||
"for (\$name$ in \$expr$) {\n \$END$\n}",
|
||||
createExpressionSelectorWithComplexFilter(statementsOnly = true, predicate = KtExpression::hasIterableType)
|
||||
) {
|
||||
override fun setVariables(template: Template, element: PsiElement) {
|
||||
val name = MacroCallNode(SuggestVariableNameMacro())
|
||||
@@ -67,35 +67,35 @@ private fun KtExpression.hasIterableType(bindingContext: BindingContext): Boolea
|
||||
}
|
||||
|
||||
internal object KtAssertPostfixTemplate : ConstantStringBasedPostfixTemplate(
|
||||
"assert",
|
||||
"assert(expr) { \"\" }",
|
||||
"assert(\$expr$) { \"\$END$\" }",
|
||||
createExpressionSelector(statementsOnly = true, typePredicate = KotlinType::isBoolean)
|
||||
"assert",
|
||||
"assert(expr) { \"\" }",
|
||||
"assert(\$expr$) { \"\$END$\" }",
|
||||
createExpressionSelector(statementsOnly = true, typePredicate = KotlinType::isBoolean)
|
||||
)
|
||||
|
||||
internal object KtParenthesizedPostfixTemplate : ConstantStringBasedPostfixTemplate(
|
||||
"par", "(expr)",
|
||||
"(\$expr$)\$END$",
|
||||
createExpressionSelector()
|
||||
"par", "(expr)",
|
||||
"(\$expr$)\$END$",
|
||||
createExpressionSelector()
|
||||
)
|
||||
|
||||
internal object KtSoutPostfixTemplate : ConstantStringBasedPostfixTemplate(
|
||||
"sout",
|
||||
"println(expr)",
|
||||
"println(\$expr$)\$END$",
|
||||
createExpressionSelector(statementsOnly = true)
|
||||
"sout",
|
||||
"println(expr)",
|
||||
"println(\$expr$)\$END$",
|
||||
createExpressionSelector(statementsOnly = true)
|
||||
)
|
||||
|
||||
internal object KtReturnPostfixTemplate : ConstantStringBasedPostfixTemplate(
|
||||
"return",
|
||||
"return expr",
|
||||
"return \$expr$\$END$",
|
||||
createExpressionSelector(statementsOnly = true)
|
||||
"return",
|
||||
"return expr",
|
||||
"return \$expr$\$END$",
|
||||
createExpressionSelector(statementsOnly = true)
|
||||
)
|
||||
|
||||
internal object KtWhilePostfixTemplate : ConstantStringBasedPostfixTemplate(
|
||||
"while",
|
||||
"while (expr) {}",
|
||||
"while (\$expr$) {\n\$END$\n}",
|
||||
createExpressionSelector(statementsOnly = true, typePredicate = KotlinType::isBoolean)
|
||||
"while",
|
||||
"while (expr) {}",
|
||||
"while (\$expr$) {\n\$END$\n}",
|
||||
createExpressionSelector(statementsOnly = true, typePredicate = KotlinType::isBoolean)
|
||||
)
|
||||
|
||||
+17
-17
@@ -28,51 +28,51 @@ import org.jetbrains.kotlin.types.typeUtil.isBoolean
|
||||
|
||||
|
||||
internal object KtIfExpressionPostfixTemplate : SurroundPostfixTemplateBase(
|
||||
"if", "if (expr)",
|
||||
KtPostfixTemplatePsiInfo, createExpressionSelector { it.isBoolean() }
|
||||
"if", "if (expr)",
|
||||
KtPostfixTemplatePsiInfo, createExpressionSelector { it.isBoolean() }
|
||||
) {
|
||||
override fun getSurrounder() = KotlinWithIfExpressionSurrounder(withElse = false)
|
||||
}
|
||||
|
||||
internal object KtElseExpressionPostfixTemplate : SurroundPostfixTemplateBase(
|
||||
"else", "if (!expr)",
|
||||
KtPostfixTemplatePsiInfo, createExpressionSelector { it.isBoolean() }
|
||||
"else", "if (!expr)",
|
||||
KtPostfixTemplatePsiInfo, createExpressionSelector { it.isBoolean() }
|
||||
) {
|
||||
override fun getSurrounder() = KotlinWithIfExpressionSurrounder(withElse = false)
|
||||
override fun getWrappedExpression(expression: PsiElement?) = (expression as KtExpression).negate()
|
||||
}
|
||||
|
||||
internal class KtNotNullPostfixTemplate(val name: String) : SurroundPostfixTemplateBase(
|
||||
name, "if (expr != null)",
|
||||
KtPostfixTemplatePsiInfo, createExpressionSelector(typePredicate = TypeUtils::isNullableType)
|
||||
name, "if (expr != null)",
|
||||
KtPostfixTemplatePsiInfo, createExpressionSelector(typePredicate = TypeUtils::isNullableType)
|
||||
) {
|
||||
override fun getSurrounder() = KotlinWithIfExpressionSurrounder(withElse = false)
|
||||
override fun getTail() = "!= null"
|
||||
}
|
||||
|
||||
internal object KtIsNullPostfixTemplate : SurroundPostfixTemplateBase(
|
||||
"null", "if (expr == null)",
|
||||
KtPostfixTemplatePsiInfo, createExpressionSelector(typePredicate = TypeUtils::isNullableType)
|
||||
"null", "if (expr == null)",
|
||||
KtPostfixTemplatePsiInfo, createExpressionSelector(typePredicate = TypeUtils::isNullableType)
|
||||
) {
|
||||
override fun getSurrounder() = KotlinWithIfExpressionSurrounder(withElse = false)
|
||||
override fun getTail() = "== null"
|
||||
}
|
||||
|
||||
internal object KtWhenExpressionPostfixTemplate : SurroundPostfixTemplateBase(
|
||||
"when", "when (expr)",
|
||||
KtPostfixTemplatePsiInfo, createExpressionSelector()
|
||||
"when", "when (expr)",
|
||||
KtPostfixTemplatePsiInfo, createExpressionSelector()
|
||||
) {
|
||||
override fun getSurrounder() = KotlinWhenSurrounder()
|
||||
}
|
||||
|
||||
internal object KtTryPostfixTemplate : SurroundPostfixTemplateBase(
|
||||
"try", "try { code } catch (e: Exception) { }",
|
||||
KtPostfixTemplatePsiInfo,
|
||||
createExpressionSelector(
|
||||
checkCanBeUsedAsValue = false,
|
||||
// Do not suggest 'val x = try { init } catch (e: Exception) { }'
|
||||
statementsOnly = true
|
||||
)
|
||||
"try", "try { code } catch (e: Exception) { }",
|
||||
KtPostfixTemplatePsiInfo,
|
||||
createExpressionSelector(
|
||||
checkCanBeUsedAsValue = false,
|
||||
// Do not suggest 'val x = try { init } catch (e: Exception) { }'
|
||||
statementsOnly = true
|
||||
)
|
||||
) {
|
||||
override fun getSurrounder() = KotlinTryCatchSurrounder()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user