Postfix cleanup
[idea/community.git] / platform / lang-impl / src / com / intellij / codeInsight / template / postfix / completion / PostfixTemplatesCompletionProvider.java
1 /*
2  * Copyright 2000-2014 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.codeInsight.template.postfix.completion;
17
18 import com.intellij.codeInsight.completion.CompletionParameters;
19 import com.intellij.codeInsight.completion.CompletionProvider;
20 import com.intellij.codeInsight.completion.CompletionResultSet;
21 import com.intellij.codeInsight.completion.PrefixMatcher;
22 import com.intellij.codeInsight.template.CustomTemplateCallback;
23 import com.intellij.codeInsight.template.impl.LiveTemplateCompletionContributor;
24 import com.intellij.codeInsight.template.postfix.settings.PostfixTemplatesSettings;
25 import com.intellij.codeInsight.template.postfix.templates.PostfixLiveTemplate;
26 import com.intellij.openapi.editor.Editor;
27 import com.intellij.patterns.StandardPatterns;
28 import com.intellij.psi.PsiFile;
29 import com.intellij.util.ProcessingContext;
30 import org.jetbrains.annotations.NotNull;
31
32 import static com.intellij.codeInsight.template.postfix.completion.PostfixTemplateCompletionContributor.getPostfixLiveTemplate;
33
34 class PostfixTemplatesCompletionProvider extends CompletionProvider<CompletionParameters> {
35   @Override
36   protected void addCompletions(@NotNull CompletionParameters parameters, ProcessingContext context, @NotNull CompletionResultSet result) {
37     Editor editor = parameters.getEditor();
38     if (!isCompletionEnabled(parameters) || LiveTemplateCompletionContributor.shouldShowAllTemplates() ||
39         editor.getCaretModel().getCaretCount() != 1) {
40       /**
41        * disabled or covered with {@link com.intellij.codeInsight.template.impl.LiveTemplateCompletionContributor}
42        */
43       return;
44     }
45
46     PsiFile originalFile = parameters.getOriginalFile();
47     PostfixLiveTemplate postfixLiveTemplate = getPostfixLiveTemplate(originalFile, editor);
48     if (postfixLiveTemplate != null) {
49       postfixLiveTemplate.addCompletions(parameters, result.withPrefixMatcher(new MyPrefixMatcher(result.getPrefixMatcher().getPrefix())));
50       String possibleKey = postfixLiveTemplate.computeTemplateKeyWithoutContextChecking(new CustomTemplateCallback(editor, originalFile));
51       if (possibleKey != null) {
52         result = result.withPrefixMatcher(possibleKey);
53         result.restartCompletionOnPrefixChange(
54           StandardPatterns.string().oneOf(postfixLiveTemplate.getAllTemplateKeys(originalFile, parameters.getOffset())));
55       }
56     }
57   }
58
59   private static boolean isCompletionEnabled(@NotNull CompletionParameters parameters) {
60     if (!parameters.isAutoPopup()) {
61       return false;
62     }
63
64     PostfixTemplatesSettings settings = PostfixTemplatesSettings.getInstance();
65     if (settings == null || !settings.isPostfixTemplatesEnabled() || !settings.isTemplatesCompletionEnabled()) {
66       return false;
67     }
68
69     return true;
70   }
71
72   private static class MyPrefixMatcher extends PrefixMatcher {
73     protected MyPrefixMatcher(String prefix) {
74       super(prefix);
75     }
76
77     @Override
78     public boolean prefixMatches(@NotNull String name) {
79       return name.equalsIgnoreCase(myPrefix);
80     }
81
82     @NotNull
83     @Override
84     public PrefixMatcher cloneWithPrefix(@NotNull String prefix) {
85       return new MyPrefixMatcher(prefix);
86     }
87   }
88 }