Improved "if" template, added "if-else" template, removed "if" keyword from completion.
This commit is contained in:
@@ -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) {
|
||||
|
||||
+41
-3
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user