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