From 6ad860177351a7e6268b4290e3e8c5280a32324a Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 31 Jan 2012 20:58:25 +0400 Subject: [PATCH] Added if block template and generic template insertion handler --- .../JetKeywordCompletionContributor.java | 12 ++++++ .../handlers/JetTemplateInsertHandler.java | 42 +++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 idea/src/org/jetbrains/jet/plugin/completion/handlers/JetTemplateInsertHandler.java diff --git a/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java b/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java index 7a06187bc76..1af50f3569f 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java +++ b/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java @@ -21,6 +21,7 @@ import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lexer.JetToken; import org.jetbrains.jet.plugin.completion.handlers.JetFunctionInsertHandler; import org.jetbrains.jet.plugin.completion.handlers.JetKeywordInsertHandler; +import org.jetbrains.jet.plugin.completion.handlers.JetTemplateInsertHandler; import java.util.ArrayList; import java.util.Collection; @@ -146,6 +147,7 @@ public class JetKeywordCompletionContributor extends CompletionContributor { public static class KeywordsCompletionProvider extends CompletionProvider { + private static final JetTemplateInsertHandler TEMPLATE_INSERT_HANDLER = new JetTemplateInsertHandler(); private final Collection elements; public KeywordsCompletionProvider(String ...keywords) { @@ -155,6 +157,10 @@ public class JetKeywordCompletionContributor extends CompletionContributor { public LookupElement apply(String keyword) { final LookupElementBuilder lookupElementBuilder = LookupElementBuilder.create(keyword).setBold(); + if (keyword.contains("<#<")) { + return lookupElementBuilder.setInsertHandler(TEMPLATE_INSERT_HANDLER); + } + if (!FUNCTION_KEYWORDS.contains(keyword)) { return lookupElementBuilder.setInsertHandler(KEYWORDS_INSERT_HANDLER); } @@ -169,6 +175,7 @@ public class JetKeywordCompletionContributor extends CompletionContributor { @NotNull CompletionResultSet result) { result.addAllElements(elements); } + } public JetKeywordCompletionContributor() { @@ -211,6 +218,10 @@ public class JetKeywordCompletionContributor extends CompletionContributor { NULL_KEYWORD, THIS_KEYWORD, TRUE_KEYWORD); registerScopeKeywordsCompletion(new InParametersFilter(), OUT_KEYWORD); + + extend(CompletionType.BASIC, getPlacePattern(new InNonClassBlockFilter()), new KeywordsCompletionProvider( + "if (<##>) {\n\n}" + )); } private void registerScopeKeywordsCompletion(final ElementFilter placeFilter, JetToken... keywords) { @@ -231,4 +242,5 @@ public class JetKeywordCompletionContributor extends CompletionContributor { return PlatformPatterns.psiElement().and( new FilterPattern(new AndFilter(GENERAL_FILTER, placeFilter))); } + } diff --git a/idea/src/org/jetbrains/jet/plugin/completion/handlers/JetTemplateInsertHandler.java b/idea/src/org/jetbrains/jet/plugin/completion/handlers/JetTemplateInsertHandler.java new file mode 100644 index 00000000000..799e6f85bf4 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/completion/handlers/JetTemplateInsertHandler.java @@ -0,0 +1,42 @@ +package org.jetbrains.jet.plugin.completion.handlers; + +import com.intellij.codeInsight.completion.InsertHandler; +import com.intellij.codeInsight.completion.InsertionContext; +import com.intellij.codeInsight.folding.CodeFoldingManager; +import com.intellij.codeInsight.lookup.LookupElement; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.SelectionModel; +import com.intellij.psi.codeStyle.CodeStyleManager; + +/** + * @author Evgeny Gerashchenko + * @author max (originally from objc) + * @since 1/31/12 + */ +public class JetTemplateInsertHandler implements InsertHandler { + @Override + public void handleInsert(InsertionContext context, LookupElement item) { + Editor editor = context.getEditor(); + + final CodeFoldingManager foldManager = CodeFoldingManager.getInstance(context.getProject()); + foldManager.updateFoldRegions(editor); + + String text = context.getDocument().getText(); + int firstParamStart = text.indexOf("<#<", context.getStartOffset()); + int firstParamEnd = text.indexOf(">#>", firstParamStart); + + SelectionModel selectionModel = editor.getSelectionModel(); + if (firstParamStart >= 0 && firstParamEnd >= 0 && firstParamStart < context.getTailOffset()) { + selectionModel.setSelection(firstParamStart, firstParamEnd + 2); + } + + CodeStyleManager.getInstance(context.getProject()).reformatText(context.getFile(), context.getStartOffset(), context.getTailOffset()); + + if (firstParamStart >= 0 && firstParamEnd >= 0 && selectionModel.hasSelection()) { + editor.getCaretModel().moveToOffset(selectionModel.getSelectionStart()); + } + else { + editor.getCaretModel().moveToOffset(context.getTailOffset()); + } + } +}