From b795a3c1dd44102a444c4aac9e5ee355ce87454d Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Mon, 16 Jul 2012 19:54:01 +0400 Subject: [PATCH] KT-2297 Auto-insert closing brace on typing '{' after '$' in string literal #KT-2297 fixed --- idea/src/META-INF/plugin.xml | 1 + .../jet/plugin/editor/KotlinTypedHandler.java | 53 +++++++++++++++++++ .../jet/editor/TypedHandlerTest.java | 32 +++++++++++ 3 files changed, 86 insertions(+) create mode 100644 idea/src/org/jetbrains/jet/plugin/editor/KotlinTypedHandler.java create mode 100644 idea/tests/org/jetbrains/jet/editor/TypedHandlerTest.java diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 884a9270bc5..97f4a191f09 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -159,6 +159,7 @@ + diff --git a/idea/src/org/jetbrains/jet/plugin/editor/KotlinTypedHandler.java b/idea/src/org/jetbrains/jet/plugin/editor/KotlinTypedHandler.java new file mode 100644 index 00000000000..07bbcf530c7 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/editor/KotlinTypedHandler.java @@ -0,0 +1,53 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.plugin.editor; + +import com.intellij.codeInsight.CodeInsightSettings; +import com.intellij.codeInsight.editorActions.TypedHandlerDelegate; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiDocumentManager; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.impl.source.tree.LeafPsiElement; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.lexer.JetTokens; + +/** + * @author Evgeny Gerashchenko + * @since 7/16/12 + */ +public class KotlinTypedHandler extends TypedHandlerDelegate { + @Override + public Result charTyped(char c, Project project, Editor editor, @NotNull PsiFile file) { + if (!(file instanceof JetFile) || !CodeInsightSettings.getInstance().AUTOINSERT_PAIR_BRACKET) { + return Result.CONTINUE; + } + if (c == '{') { + PsiDocumentManager.getInstance(project).commitAllDocuments(); + int offset = editor.getCaretModel().getOffset(); + PsiElement previousElement = file.findElementAt(offset - 1); + if (previousElement instanceof LeafPsiElement + && ((LeafPsiElement) previousElement).getElementType() == JetTokens.LONG_TEMPLATE_ENTRY_START) { + editor.getDocument().insertString(offset, "}"); + } + return Result.STOP; + } + return Result.CONTINUE; + } +} diff --git a/idea/tests/org/jetbrains/jet/editor/TypedHandlerTest.java b/idea/tests/org/jetbrains/jet/editor/TypedHandlerTest.java new file mode 100644 index 00000000000..3518dbcb599 --- /dev/null +++ b/idea/tests/org/jetbrains/jet/editor/TypedHandlerTest.java @@ -0,0 +1,32 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.editor; + +import com.intellij.testFramework.EditorTestUtil; +import com.intellij.testFramework.LightCodeInsightTestCase; + +/** + * @author Evgeny Gerashchenko + * @since 7/16/12 + */ +public class TypedHandlerTest extends LightCodeInsightTestCase { + public void testTypeStringTemplateStart() throws Exception { + configureFromFileText("a.kt", "val x = \"$\""); + EditorTestUtil.performTypingAction(getEditor(), '{'); + checkResultByText("val x = \"${}\""); + } +}