update copyrights
[fedora-idea.git] / platform / lang-impl / src / com / intellij / codeInsight / completion / WordCompletionContributor.java
blob6766998546115183fb34c82aeeeaeeb6dc56a931
1 /*
2 * Copyright 2000-2009 JetBrains s.r.o.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package com.intellij.codeInsight.completion;
18 import com.intellij.codeInsight.lookup.LookupElement;
19 import com.intellij.codeInsight.lookup.TailTypeDecorator;
20 import com.intellij.codeInsight.lookup.LookupElementBuilder;
21 import com.intellij.codeInsight.TailType;
22 import com.intellij.lang.ASTNode;
23 import com.intellij.lang.LanguageWordCompletion;
24 import com.intellij.openapi.application.ApplicationManager;
25 import com.intellij.openapi.project.DumbAware;
26 import com.intellij.openapi.project.DumbService;
27 import com.intellij.openapi.util.Computable;
28 import static com.intellij.patterns.StandardPatterns.character;
29 import com.intellij.psi.PlainTextTokenTypes;
30 import com.intellij.psi.PsiElement;
31 import com.intellij.psi.PsiFile;
32 import com.intellij.psi.PsiReference;
33 import com.intellij.psi.filters.getters.AllWordsGetter;
34 import com.intellij.psi.tree.IElementType;
36 import java.util.HashSet;
37 import java.util.Set;
39 /**
40 * @author peter
42 public class WordCompletionContributor extends CompletionContributor implements DumbAware {
44 @Override
45 public void fillCompletionVariants(final CompletionParameters parameters, final CompletionResultSet result) {
46 if (parameters.getCompletionType() == CompletionType.BASIC && shouldPerformWordCompletion(parameters)) {
47 addWordCompletionWariants(result, parameters);
51 public static void addWordCompletionWariants(CompletionResultSet result, CompletionParameters parameters) {
52 int startOffset = parameters.getOffset();
53 PsiElement insertedElement = parameters.getPosition();
54 final CompletionResultSet javaResultSet = result.withPrefixMatcher(CompletionUtil.findJavaIdentifierPrefix(insertedElement, startOffset));
55 final CompletionResultSet plainResultSet = result.withPrefixMatcher(CompletionUtil.findIdentifierPrefix(insertedElement,
56 startOffset,
57 character().javaIdentifierPart().andNot(character().equalTo('$')),
58 character().javaIdentifierStart()));
59 for (final String word : AllWordsGetter.getAllWords(insertedElement, startOffset)) {
60 final LookupElement item = TailTypeDecorator.withTail(LookupElementBuilder.create(word), TailType.SPACE);
61 javaResultSet.addElement(item);
62 plainResultSet.addElement(item);
66 private static boolean shouldPerformWordCompletion(CompletionParameters parameters) {
67 final PsiElement insertedElement = parameters.getPosition();
68 final boolean dumb = DumbService.getInstance(insertedElement.getProject()).isDumb();
69 if (dumb) {
70 return true;
73 final PsiFile file = insertedElement.getContainingFile();
74 final CompletionData data = CompletionUtil.getCompletionDataByElement(file);
75 if (!(data instanceof SyntaxTableCompletionData)) {
76 Set<CompletionVariant> toAdd = new HashSet<CompletionVariant>();
77 data.addKeywordVariants(toAdd, insertedElement, file);
78 for (CompletionVariant completionVariant : toAdd) {
79 if (completionVariant.hasKeywordCompletions()) {
80 return false;
85 final int startOffset = parameters.getOffset();
87 final PsiReference reference = ApplicationManager.getApplication().runReadAction(new Computable<PsiReference>() {
88 public PsiReference compute() {
89 return file.findReferenceAt(startOffset);
91 });
92 if (reference != null) {
93 return false;
96 final PsiElement element = ApplicationManager.getApplication().runReadAction(new Computable<PsiElement>() {
97 public PsiElement compute() {
98 return file.findElementAt(startOffset - 1);
102 ASTNode textContainer = element != null ? element.getNode() : null;
103 while (textContainer != null) {
104 final IElementType elementType = textContainer.getElementType();
105 if (LanguageWordCompletion.INSTANCE.isEnabledIn(elementType) || elementType == PlainTextTokenTypes.PLAIN_TEXT) {
106 return true;
108 textContainer = textContainer.getTreeParent();
110 return false;