Improved "if" template, added "if-else" template, removed "if" keyword from completion.

This commit is contained in:
Evgeny Gerashchenko
2012-02-01 14:52:23 +04:00
parent 6ad8601773
commit ceccdeb6ef
2 changed files with 52 additions and 12 deletions
@@ -147,7 +147,6 @@ 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) {
@@ -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 (<#<condition>#>) {\n\n}"
));
// templates
registerScopeKeywordsCompletion(new InNonClassBlockFilter(), "if (<#<condition>#>) {\n \n}", "if (<#<condition>#>) {\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) {
@@ -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<LookupElement> {
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<LookupElement> {
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<LookupElement> {
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));
}
}