Added if block template and generic template insertion handler

This commit is contained in:
Evgeny Gerashchenko
2012-01-31 20:58:25 +04:00
parent 762e9af197
commit 6ad8601773
2 changed files with 54 additions and 0 deletions
@@ -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<CompletionParameters> {
private static final JetTemplateInsertHandler TEMPLATE_INSERT_HANDLER = new JetTemplateInsertHandler();
private final Collection<LookupElement> 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 (<#<condition>#>) {\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)));
}
}
@@ -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<LookupElement> {
@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());
}
}
}