blob: 59df3329a9f42d4dc9f9f4432afc8f2cced83dbb [file] [log] [blame]
/*
* Copyright 2006 Sascha Weinreuter
*
* 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.intellij.lang.xpath;
import com.intellij.codeInsight.CodeInsightBundle;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.lang.ASTNode;
import com.intellij.lang.parameterInfo.*;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.ArrayUtil;
import org.intellij.lang.xpath.context.functions.Function;
import org.intellij.lang.xpath.psi.XPathFunction;
import org.intellij.lang.xpath.psi.XPathFunctionCall;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class XPathParameterInfoHandler implements ParameterInfoHandler<XPathFunctionCall, XPathFunction> {
public boolean couldShowInLookup() {
return false;
}
public Object[] getParametersForLookup(LookupElement lookupElement, ParameterInfoContext parameterInfoContext) {
return ArrayUtil.EMPTY_OBJECT_ARRAY;
}
public Object[] getParametersForDocumentation(XPathFunction xPathFunction, ParameterInfoContext parameterInfoContext) {
return ArrayUtil.EMPTY_OBJECT_ARRAY;
}
public XPathFunctionCall findElementForParameterInfo(@NotNull CreateParameterInfoContext context) {
final XPathFunctionCall call = findFunctionCall(context.getFile(), context.getOffset());
if (call != null) {
final XPathFunction function = call.resolve();
if (function != null && function.getDeclaration() != null) {
context.setItemsToShow(new Object[]{ function });
}
}
return call;
}
@Nullable
private static XPathFunctionCall findFunctionCall(PsiFile psiFile, int offset) {
PsiElement e = psiFile.findElementAt(offset);
while (e != null) {
final XPathFunctionCall call = PsiTreeUtil.getParentOfType(e, XPathFunctionCall.class);
if (call == null) {
break;
}
final ASTNode lparen = call.getNode().findChildByType(XPathTokenTypes.LPAREN);
if (lparen != null && lparen.getTextRange().getStartOffset() < offset) {
return call;
}
e = PsiTreeUtil.getParentOfType(e, XPathFunctionCall.class, true);
}
return null;
}
public void showParameterInfo(@NotNull XPathFunctionCall call, @NotNull CreateParameterInfoContext context) {
context.showHint(call, call.getTextOffset() + 1, this);
}
public XPathFunctionCall findElementForUpdatingParameterInfo(@NotNull UpdateParameterInfoContext context) {
return findFunctionCall(context.getFile(), context.getOffset());
}
public void updateParameterInfo(@NotNull XPathFunctionCall call, @NotNull UpdateParameterInfoContext context) {
int currentParameterIndex = ParameterInfoUtils.getCurrentParameterIndex(call.getNode(), context.getOffset(), XPathTokenTypes.COMMA);
context.setCurrentParameter(currentParameterIndex);
}
public String getParameterCloseChars() {
return "(,)";
}
public boolean tracksParameterIndex() {
return true;
}
public void updateUI(XPathFunction function, @NotNull ParameterInfoUIContext context) {
final Function declaration = function.getDeclaration();
if (declaration != null) {
if (declaration.getParameters().length > 0) {
final String signature = declaration.buildSignature();
final int length = declaration.getName().length();
final String hint = signature.substring(length + 1, signature.length() - 1);
final int currentParameterIndex = context.getCurrentParameterIndex();
if (currentParameterIndex < 0 || currentParameterIndex >= declaration.getParameters().length) {
context.setupUIComponentPresentation(hint, -1, -1,
false, false, false, context.getDefaultParameterColor());
} else {
final String[] ps = hint.split(",");
final TextRange[] ts = new TextRange[ps.length];
int start = 0;
for (int i = 0; i < ps.length; i++) {
String p = ps[i];
ts[i] = TextRange.from(start, p.length());
start += p.length() + 1;
}
final TextRange range = ts[currentParameterIndex];
context.setupUIComponentPresentation(hint, range.getStartOffset(), range.getEndOffset(),
false, false, false, context.getDefaultParameterColor());
}
} else {
context.setupUIComponentPresentation(noParamsMessage(), -1, -1,
false, false, false, context.getDefaultParameterColor());
}
}
}
@SuppressWarnings({ "UnresolvedPropertyKey" })
private static String noParamsMessage() {
return CodeInsightBundle.message("parameter.info.no.parameters");
}
}