blob: 709bfd7e60eb386d8fd37215c59c58d368b6af15 [file] [log] [blame]
/*
* Copyright 2000-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.codeInsight.completion;
import com.intellij.codeInsight.lookup.LookupElementBuilder;
import com.intellij.ide.highlighter.custom.SyntaxTable;
import com.intellij.openapi.editor.ex.EditorEx;
import com.intellij.openapi.editor.highlighter.HighlighterIterator;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.impl.CustomSyntaxTableFileType;
import com.intellij.openapi.project.DumbAware;
import com.intellij.psi.CustomHighlighterTokenType;
import com.intellij.psi.PsiElement;
import com.intellij.psi.tree.IElementType;
import com.intellij.util.ProcessingContext;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.Set;
import static com.intellij.patterns.PlatformPatterns.psiElement;
import static com.intellij.patterns.PlatformPatterns.psiFile;
import static com.intellij.patterns.StandardPatterns.instanceOf;
/**
* @author yole
*/
public class CustomFileTypeCompletionContributor extends CompletionContributor implements DumbAware {
public CustomFileTypeCompletionContributor() {
extend(CompletionType.BASIC, psiElement().inFile(psiFile().withFileType(instanceOf(CustomSyntaxTableFileType.class))),
new CompletionProvider<CompletionParameters>() {
@Override
protected void addCompletions(@NotNull CompletionParameters parameters,
ProcessingContext context,
@NotNull CompletionResultSet result) {
if (inCommentOrLiteral(parameters)) {
return;
}
FileType fileType = parameters.getOriginalFile().getFileType();
if (!(fileType instanceof CustomSyntaxTableFileType)) {
return;
}
SyntaxTable syntaxTable = ((CustomSyntaxTableFileType)fileType).getSyntaxTable();
String prefix = findPrefix(parameters.getPosition(), parameters.getOffset());
CompletionResultSet resultSetWithPrefix = result.withPrefixMatcher(prefix);
addVariants(resultSetWithPrefix, syntaxTable.getKeywords1());
addVariants(resultSetWithPrefix, syntaxTable.getKeywords2());
addVariants(resultSetWithPrefix, syntaxTable.getKeywords3());
addVariants(resultSetWithPrefix, syntaxTable.getKeywords4());
WordCompletionContributor.addWordCompletionVariants(resultSetWithPrefix, parameters, Collections.<String>emptySet());
}
});
}
private static boolean inCommentOrLiteral(CompletionParameters parameters) {
HighlighterIterator iterator = ((EditorEx)parameters.getEditor()).getHighlighter().createIterator(parameters.getOffset());
IElementType elementType = iterator.getTokenType();
if (elementType == CustomHighlighterTokenType.WHITESPACE) {
iterator.retreat();
elementType = iterator.getTokenType();
}
return elementType == CustomHighlighterTokenType.LINE_COMMENT ||
elementType == CustomHighlighterTokenType.MULTI_LINE_COMMENT ||
elementType == CustomHighlighterTokenType.STRING ||
elementType == CustomHighlighterTokenType.SINGLE_QUOTED_STRING;
}
private static void addVariants(CompletionResultSet resultSet, Set<String> keywords) {
for (String keyword : keywords) {
resultSet.addElement(LookupElementBuilder.create(keyword).bold());
}
}
private static String findPrefix(PsiElement insertedElement, int offset) {
String text = insertedElement.getText();
int offsetInElement = offset - insertedElement.getTextOffset();
int start = offsetInElement - 1;
while(start >=0 ) {
if(!Character.isJavaIdentifierStart(text.charAt(start))) break;
--start;
}
return text.substring(start+1, offsetInElement).trim();
}
}