diff --git a/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java b/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java index 1af50f3569f..17ca6d0e03c 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java +++ b/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java @@ -147,7 +147,6 @@ 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) { @@ -158,7 +157,7 @@ public class JetKeywordCompletionContributor extends CompletionContributor { final LookupElementBuilder lookupElementBuilder = LookupElementBuilder.create(keyword).setBold(); if (keyword.contains("<#<")) { - return lookupElementBuilder.setInsertHandler(TEMPLATE_INSERT_HANDLER); + return JetTemplateInsertHandler.lookup(keyword); } if (!FUNCTION_KEYWORDS.contains(keyword)) { @@ -202,7 +201,7 @@ public class JetKeywordCompletionContributor extends CompletionContributor { CATCH_KEYWORD, CLASS_KEYWORD, CONTINUE_KEYWORD, DO_KEYWORD, ELSE_KEYWORD, ENUM_KEYWORD, FALSE_KEYWORD, FINALLY_KEYWORD, FOR_KEYWORD, - FUN_KEYWORD, GET_KEYWORD, IF_KEYWORD, + FUN_KEYWORD, GET_KEYWORD, IN_KEYWORD, INLINE_KEYWORD, INTERNAL_KEYWORD, IS_KEYWORD, NULL_KEYWORD, OBJECT_KEYWORD, PRIVATE_KEYWORD, PROTECTED_KEYWORD, PUBLIC_KEYWORD, @@ -214,19 +213,22 @@ public class JetKeywordCompletionContributor extends CompletionContributor { WHILE_KEYWORD); registerScopeKeywordsCompletion(new InPropertyFilter(), - ELSE_KEYWORD, FALSE_KEYWORD, IF_KEYWORD, + ELSE_KEYWORD, FALSE_KEYWORD, NULL_KEYWORD, THIS_KEYWORD, TRUE_KEYWORD); registerScopeKeywordsCompletion(new InParametersFilter(), OUT_KEYWORD); - extend(CompletionType.BASIC, getPlacePattern(new InNonClassBlockFilter()), new KeywordsCompletionProvider( - "if (<##>) {\n\n}" - )); + // templates + registerScopeKeywordsCompletion(new InNonClassBlockFilter(), "if (<##>) {\n \n}", "if (<##>) {\n \n} else {\n \n}"); + } + + private void registerScopeKeywordsCompletion(final ElementFilter placeFilter, String... keywords) { + extend(CompletionType.BASIC, getPlacePattern(placeFilter), + new KeywordsCompletionProvider(keywords)); } private void registerScopeKeywordsCompletion(final ElementFilter placeFilter, JetToken... keywords) { - extend(CompletionType.BASIC, getPlacePattern(placeFilter), - new KeywordsCompletionProvider(convertTokensToStrings(keywords))); + registerScopeKeywordsCompletion(placeFilter, convertTokensToStrings(keywords)); } private static String[] convertTokensToStrings(JetToken... keywords) { diff --git a/idea/src/org/jetbrains/jet/plugin/completion/handlers/JetTemplateInsertHandler.java b/idea/src/org/jetbrains/jet/plugin/completion/handlers/JetTemplateInsertHandler.java index 799e6f85bf4..005bbadad58 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/handlers/JetTemplateInsertHandler.java +++ b/idea/src/org/jetbrains/jet/plugin/completion/handlers/JetTemplateInsertHandler.java @@ -4,24 +4,50 @@ 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.codeInsight.lookup.LookupElementBuilder; +import com.intellij.openapi.editor.Document; 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) + * @author Evgeny Gerashchenko * @since 1/31/12 */ public class JetTemplateInsertHandler implements InsertHandler { + private String myInsertion; + + public JetTemplateInsertHandler(String insertion) { + myInsertion = insertion; + } + @Override public void handleInsert(InsertionContext context, LookupElement item) { + Document document = context.getDocument(); Editor editor = context.getEditor(); + String insertion = myInsertion; + final char currentChar = context.getTailOffset() < document.getTextLength() ? document.getCharsSequence().charAt(context.getTailOffset()) : 0; + if (insertion.endsWith(" ") && context.getCompletionChar() != ' ' && (currentChar == ')' || currentChar == ' ' || currentChar == '\t')) { + insertion = insertion.trim(); + } + + int tailOffset = context.getStartOffset() + insertion.length(); + int caretOffset = insertion.indexOf('|'); + if (caretOffset != -1) { + insertion = insertion.replace("|", ""); + tailOffset = context.getStartOffset() + caretOffset; + } + + document.replaceString(context.getStartOffset(), context.getTailOffset(), insertion); + + context.setTailOffset(tailOffset); + final CodeFoldingManager foldManager = CodeFoldingManager.getInstance(context.getProject()); foldManager.updateFoldRegions(editor); - String text = context.getDocument().getText(); + String text = document.getText(); int firstParamStart = text.indexOf("<#<", context.getStartOffset()); int firstParamEnd = text.indexOf(">#>", firstParamStart); @@ -30,7 +56,9 @@ public class JetTemplateInsertHandler implements InsertHandler { selectionModel.setSelection(firstParamStart, firstParamEnd + 2); } - CodeStyleManager.getInstance(context.getProject()).reformatText(context.getFile(), context.getStartOffset(), context.getTailOffset()); + if (!insertion.endsWith(" ")) { + CodeStyleManager.getInstance(context.getProject()).reformatText(context.getFile(), context.getStartOffset(), context.getTailOffset()); + } if (firstParamStart >= 0 && firstParamEnd >= 0 && selectionModel.hasSelection()) { editor.getCaretModel().moveToOffset(selectionModel.getSelectionStart()); @@ -38,5 +66,15 @@ public class JetTemplateInsertHandler implements InsertHandler { else { editor.getCaretModel().moveToOffset(context.getTailOffset()); } + + if (context.getCompletionChar() == ' ') { + context.setAddCompletionChar(false); + } + } + + public static LookupElementBuilder lookup(String template) { + String presentation = template.replaceAll("<#<(\\w+)>#>", "..."); + LookupElementBuilder builder = LookupElementBuilder.create(presentation).setBold(); + return builder.setInsertHandler(new JetTemplateInsertHandler(template)); } }