blob: b1a3a00418fd82c9824531a0b18ba934dd645a4f [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 org.jetbrains.plugins.groovy.console;
import com.intellij.codeInsight.completion.CompletionContributor;
import com.intellij.codeInsight.completion.CompletionParameters;
import com.intellij.codeInsight.completion.CompletionResultSet;
import com.intellij.codeInsight.lookup.LookupElementBuilder;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrCommandArgumentList;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrMethodCall;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression;
import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil;
/**
* Created by Max Medvedev on 9/8/13
*/
public class GroovyShellCompletionContributor extends CompletionContributor {
@Override
public void fillCompletionVariants(@NotNull CompletionParameters parameters, @NotNull CompletionResultSet result) {
PsiFile file = parameters.getOriginalFile();
if (!(file instanceof GroovyShellCodeFragment)) return;
PsiElement position = parameters.getPosition();
PsiElement parent = position.getParent();
if (!(parent instanceof GrReferenceExpression && !((GrReferenceExpression)parent).isQualified())) return;
if (PsiUtil.isExpressionStatement(parent)) {
addAllCommands(result);
}
else if (parent.getParent() instanceof GrCommandArgumentList) {
PsiElement ppparent = parent.getParent().getParent();
if (ppparent instanceof GrMethodCall && isFirstArg((GrMethodCall)ppparent, parent)) {
GrExpression invokedExpression = ((GrMethodCall)ppparent).getInvokedExpression();
if (invokedExpression instanceof GrReferenceExpression && !((GrReferenceExpression)invokedExpression).isQualified()) {
String name = ((GrReferenceExpression)invokedExpression).getReferenceName();
if ("help".equals(name)) {
addAllCommands(result);
}
else if ("show".equals(name)) {
add(result, "classes");
add(result, "imports");
add(result, "preferences");
add(result, "all");
}
else if ("purge".equals(name)) {
add(result, "variables");
add(result, "classes");
add(result, "imports");
add(result, "preferences");
add(result, "all");
}
else if ("record".equals(name)) {
add(result, "start");
add(result, "stop");
add(result, "status");
}
else if ("history".equals(name)) {
add(result, "show");
add(result, "recall");
add(result, "flush");
add(result, "clear");
}
}
}
}
}
private static void add(@NotNull CompletionResultSet result, @NotNull String name) {
result.addElement(LookupElementBuilder.create(name));
}
private static void addAllCommands(@NotNull CompletionResultSet result) {
add(result, "help");
add(result, "exit");
add(result, "quit");
add(result, "display");
add(result, "clear");
add(result, "show");
add(result, "inspect");
add(result, "purge");
add(result, "edit");
add(result, "load");
add(result, "save");
add(result, "record");
add(result, "history");
add(result, "alias");
add(result, "set");
}
private static boolean isFirstArg(@NotNull GrMethodCall ppparent, @NotNull PsiElement parent) {
GroovyPsiElement[] arguments = ppparent.getArgumentList().getAllArguments();
return arguments.length > 0 && arguments[0] == parent;
}
}