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
;
42 public class WordCompletionContributor
extends CompletionContributor
implements DumbAware
{
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
,
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();
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()) {
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
);
92 if (reference
!= null) {
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
) {
108 textContainer
= textContainer
.getTreeParent();