diff --git a/idea/idea-completion/testData/handlers/basic/EA70229.kt b/idea/idea-completion/testData/handlers/basic/EA70229.kt index 2654d511dc4..70084ebeb11 100644 --- a/idea/idea-completion/testData/handlers/basic/EA70229.kt +++ b/idea/idea-completion/testData/handlers/basic/EA70229.kt @@ -1,3 +1,4 @@ +// FIR_COMPARISON // ELEMENT: foo // CHAR: '\t' diff --git a/idea/idea-completion/testData/handlers/basic/EA70229.kt.after b/idea/idea-completion/testData/handlers/basic/EA70229.kt.after index 21fbbc5d12c..a0e5bd1330c 100644 --- a/idea/idea-completion/testData/handlers/basic/EA70229.kt.after +++ b/idea/idea-completion/testData/handlers/basic/EA70229.kt.after @@ -1,3 +1,4 @@ +// FIR_COMPARISON // ELEMENT: foo // CHAR: '\t' diff --git a/idea/idea-completion/testData/handlers/basic/TypeInferedFromWrapperType.kt b/idea/idea-completion/testData/handlers/basic/TypeInferedFromWrapperType.kt index be1703aeee5..1b2a31db312 100644 --- a/idea/idea-completion/testData/handlers/basic/TypeInferedFromWrapperType.kt +++ b/idea/idea-completion/testData/handlers/basic/TypeInferedFromWrapperType.kt @@ -1,3 +1,4 @@ +// FIR_COMPARISON class Cn fun > C.some(arg: (T) -> Unit): C { diff --git a/idea/idea-completion/testData/handlers/basic/TypeInferedFromWrapperType.kt.after b/idea/idea-completion/testData/handlers/basic/TypeInferedFromWrapperType.kt.after index 7a28ebbad82..dfdebcdd0ea 100644 --- a/idea/idea-completion/testData/handlers/basic/TypeInferedFromWrapperType.kt.after +++ b/idea/idea-completion/testData/handlers/basic/TypeInferedFromWrapperType.kt.after @@ -1,3 +1,4 @@ +// FIR_COMPARISON class Cn fun > C.some(arg: (T) -> Unit): C { diff --git a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/FunctionLiteralInsertOnSpace.kt b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/FunctionLiteralInsertOnSpace.kt index 81db3d13f7c..4da2d0cb691 100644 --- a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/FunctionLiteralInsertOnSpace.kt +++ b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/FunctionLiteralInsertOnSpace.kt @@ -1,3 +1,4 @@ +// FIR_COMPARISON class Some fun Some.filter(predicate : (T) -> Boolean) = throw UnsupportedOperationException() diff --git a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/FunctionLiteralInsertOnSpace.kt.after b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/FunctionLiteralInsertOnSpace.kt.after index c50c669fc66..eca918842f9 100644 --- a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/FunctionLiteralInsertOnSpace.kt.after +++ b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/FunctionLiteralInsertOnSpace.kt.after @@ -1,3 +1,4 @@ +// FIR_COMPARISON class Some fun Some.filter(predicate : (T) -> Boolean) = throw UnsupportedOperationException() diff --git a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/FunctionLiteralInsertWhenNoSpacesForBraces.kt b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/FunctionLiteralInsertWhenNoSpacesForBraces.kt index 18447995318..7b6ee42f6f4 100644 --- a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/FunctionLiteralInsertWhenNoSpacesForBraces.kt +++ b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/FunctionLiteralInsertWhenNoSpacesForBraces.kt @@ -1,4 +1,3 @@ -// FIR_COMPARISON // CODE_STYLE_SETTING: INSERT_WHITESPACES_IN_SIMPLE_ONE_LINE_METHOD = false fun main(args: Array) { diff --git a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/FunctionLiteralInsertWhenNoSpacesForBraces.kt.after b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/FunctionLiteralInsertWhenNoSpacesForBraces.kt.after index c17ec99e2e0..c2441ce4a61 100644 --- a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/FunctionLiteralInsertWhenNoSpacesForBraces.kt.after +++ b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/FunctionLiteralInsertWhenNoSpacesForBraces.kt.after @@ -1,4 +1,3 @@ -// FIR_COMPARISON // CODE_STYLE_SETTING: INSERT_WHITESPACES_IN_SIMPLE_ONE_LINE_METHOD = false fun main(args: Array) { diff --git a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/HigherOrderFunction.kt b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/HigherOrderFunction.kt index 61dff845b2c..bc7b0726b68 100644 --- a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/HigherOrderFunction.kt +++ b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/HigherOrderFunction.kt @@ -1,3 +1,4 @@ +// FIR_COMPARISON fun Array.filter(predicate : (T) -> Boolean) : java.util.List = throw UnsupportedOperationException() fun main(args: Array) { diff --git a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/HigherOrderFunction.kt.after b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/HigherOrderFunction.kt.after index 8b7a93a5302..5420dffb436 100644 --- a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/HigherOrderFunction.kt.after +++ b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/HigherOrderFunction.kt.after @@ -1,3 +1,4 @@ +// FIR_COMPARISON fun Array.filter(predicate : (T) -> Boolean) : java.util.List = throw UnsupportedOperationException() fun main(args: Array) { diff --git a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/InsertFunctionLiteralForLocalFunction.kt.after b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/InsertFunctionLiteralForLocalFunction.kt.after index b30dbe55f1f..802785c8333 100644 --- a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/InsertFunctionLiteralForLocalFunction.kt.after +++ b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/InsertFunctionLiteralForLocalFunction.kt.after @@ -2,7 +2,7 @@ fun usage() { fun myLocalFun(action: () -> Unit) {} - myLocalFun {} + myLocalFun { } } // ELEMENT: myLocalFun \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/InsertFunctionWithSingleParameterWithBrace.kt b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/InsertFunctionWithSingleParameterWithBrace.kt index a1a8166d780..2be751f893c 100644 --- a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/InsertFunctionWithSingleParameterWithBrace.kt +++ b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/InsertFunctionWithSingleParameterWithBrace.kt @@ -1,3 +1,4 @@ +// FIR_COMPARISON fun some(f: () -> Unit) { f() } fun test() { diff --git a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/InsertFunctionWithSingleParameterWithBrace.kt.after b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/InsertFunctionWithSingleParameterWithBrace.kt.after index 357d8e93bdc..27c6963bbf4 100644 --- a/idea/idea-completion/testData/handlers/basic/highOrderFunctions/InsertFunctionWithSingleParameterWithBrace.kt.after +++ b/idea/idea-completion/testData/handlers/basic/highOrderFunctions/InsertFunctionWithSingleParameterWithBrace.kt.after @@ -1,3 +1,4 @@ +// FIR_COMPARISON fun some(f: () -> Unit) { f() } fun test() { diff --git a/idea/idea-completion/testData/handlers/basic/stringTemplate/GlobalVal.kt b/idea/idea-completion/testData/handlers/basic/stringTemplate/GlobalVal.kt index a53f9975bf9..22b0fbbba65 100644 --- a/idea/idea-completion/testData/handlers/basic/stringTemplate/GlobalVal.kt +++ b/idea/idea-completion/testData/handlers/basic/stringTemplate/GlobalVal.kt @@ -1,4 +1,3 @@ -// FIR_COMPARISON package p val vvv = 1 diff --git a/idea/idea-completion/testData/handlers/basic/stringTemplate/GlobalVal.kt.after b/idea/idea-completion/testData/handlers/basic/stringTemplate/GlobalVal.kt.after index c5af602c636..01f13022e12 100644 --- a/idea/idea-completion/testData/handlers/basic/stringTemplate/GlobalVal.kt.after +++ b/idea/idea-completion/testData/handlers/basic/stringTemplate/GlobalVal.kt.after @@ -1,4 +1,3 @@ -// FIR_COMPARISON package p val vvv = 1 diff --git a/idea/idea-completion/testData/handlers/basic/typeArgsForCall/FunctionTypeParameter2.kt b/idea/idea-completion/testData/handlers/basic/typeArgsForCall/FunctionTypeParameter2.kt index ee18858ffe3..63eba43eb33 100644 --- a/idea/idea-completion/testData/handlers/basic/typeArgsForCall/FunctionTypeParameter2.kt +++ b/idea/idea-completion/testData/handlers/basic/typeArgsForCall/FunctionTypeParameter2.kt @@ -1,3 +1,4 @@ +// FIR_COMPARISON fun f(list: List) { list. } diff --git a/idea/idea-completion/testData/handlers/basic/typeArgsForCall/FunctionTypeParameter2.kt.after b/idea/idea-completion/testData/handlers/basic/typeArgsForCall/FunctionTypeParameter2.kt.after index 186bae9f9d3..b3554bf3bbe 100644 --- a/idea/idea-completion/testData/handlers/basic/typeArgsForCall/FunctionTypeParameter2.kt.after +++ b/idea/idea-completion/testData/handlers/basic/typeArgsForCall/FunctionTypeParameter2.kt.after @@ -1,3 +1,4 @@ +// FIR_COMPARISON fun f(list: List) { list.map { } } diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirLookupElementFactory.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirLookupElementFactory.kt index c8cee5647f7..3ceba7d35c8 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirLookupElementFactory.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirLookupElementFactory.kt @@ -247,6 +247,7 @@ private object FunctionInsertionHandler : QuotedNamesAwareInsertionHandler() { var openingBracketOffset = chars.indexOfSkippingSpace(openingBracket, offset) var closeBracketOffset = openingBracketOffset?.let { chars.indexOfSkippingSpace(closingBracket, it + 1) } + var inBracketsShift = 0 if (openingBracketOffset == null) { if (lookupObject.insertEmptyLambda) { @@ -254,7 +255,12 @@ private object FunctionInsertionHandler : QuotedNamesAwareInsertionHandler() { context.setAddCompletionChar(false) } - document.insertString(offset, " {}") + if (isInsertSpacesInOneLineFunctionEnabled(context.file)) { + document.insertString(offset, " { }") + inBracketsShift = 1 + } else { + document.insertString(offset, " {}") + } } else { if (isSmartEnterCompletion) { document.insertString(offset, "(") @@ -269,7 +275,7 @@ private object FunctionInsertionHandler : QuotedNamesAwareInsertionHandler() { } if (shouldPlaceCaretInBrackets(completionChar, lookupObject) || closeBracketOffset == null) { - editor.caretModel.moveToOffset(openingBracketOffset + 1) + editor.caretModel.moveToOffset(openingBracketOffset + 1 + inBracketsShift) AutoPopupController.getInstance(project)?.autoPopupParameterInfo(editor, offsetElement) } else { editor.caretModel.moveToOffset(closeBracketOffset + 1) @@ -282,6 +288,9 @@ private object FunctionInsertionHandler : QuotedNamesAwareInsertionHandler() { return lookupObject.inputValueArguments || lookupObject.insertEmptyLambda } + // FIXME Should be fetched from language settings (INSERT_WHITESPACES_IN_SIMPLE_ONE_LINE_METHOD), but we do not have them right now + private fun isInsertSpacesInOneLineFunctionEnabled(file: PsiElement) = true + override fun handleInsert(context: InsertionContext, item: LookupElement) { val targetFile = context.file as? KtFile ?: return val lookupObject = item.`object` as FunctionLookupObject diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt index 4e8b148ec0e..ab1feebc84c 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -536,6 +536,14 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.WRONG_MODIFIER_TARGET) { firDiagnostic -> + WrongModifierTargetImpl( + firDiagnostic.a, + firDiagnostic.b, + firDiagnostic as FirPsiDiagnostic<*>, + token, + ) + } add(FirErrors.INLINE_CLASS_NOT_TOP_LEVEL) { firDiagnostic -> InlineClassNotTopLevelImpl( firDiagnostic as FirPsiDiagnostic<*>, @@ -628,14 +636,6 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } - add(FirErrors.WRONG_MODIFIER_TARGET) { firDiagnostic -> - WrongModifierTargetImpl( - firDiagnostic.a, - firDiagnostic.b, - firDiagnostic as FirPsiDiagnostic<*>, - token, - ) - } add(FirErrors.NONE_APPLICABLE) { firDiagnostic -> NoneApplicableImpl( firDiagnostic.a.map { abstractFirBasedSymbol -> diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt index 97aa8bf0812..2cd04548b8e 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt @@ -389,6 +389,12 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = RedundantOpenInInterface::class } + abstract class WrongModifierTarget : KtFirDiagnostic() { + override val diagnosticClass get() = WrongModifierTarget::class + abstract val modifier: KtModifierKeywordToken + abstract val target: String + } + abstract class InlineClassNotTopLevel : KtFirDiagnostic() { override val diagnosticClass get() = InlineClassNotTopLevel::class } @@ -451,12 +457,6 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = ValueClassCannotBeCloneable::class } - abstract class WrongModifierTarget : KtFirDiagnostic() { - override val diagnosticClass get() = WrongModifierTarget::class - abstract val modifier: KtModifierKeywordToken - abstract val target: String - } - abstract class NoneApplicable : KtFirDiagnostic() { override val diagnosticClass get() = NoneApplicable::class abstract val candidates: List diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index db92907416d..0afd391bf5b 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -618,6 +618,15 @@ internal class RedundantOpenInInterfaceImpl( override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) } +internal class WrongModifierTargetImpl( + override val modifier: KtModifierKeywordToken, + override val target: String, + firDiagnostic: FirPsiDiagnostic<*>, + override val token: ValidityToken, +) : KtFirDiagnostic.WrongModifierTarget(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) +} + internal class InlineClassNotTopLevelImpl( firDiagnostic: FirPsiDiagnostic<*>, override val token: ValidityToken, @@ -725,15 +734,6 @@ internal class ValueClassCannotBeCloneableImpl( override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) } -internal class WrongModifierTargetImpl( - override val modifier: KtModifierKeywordToken, - override val target: String, - firDiagnostic: FirPsiDiagnostic<*>, - override val token: ValidityToken, -) : KtFirDiagnostic.WrongModifierTarget(), KtAbstractFirDiagnostic { - override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) -} - internal class NoneApplicableImpl( override val candidates: List, firDiagnostic: FirPsiDiagnostic<*>,