blob: 70d48aad1b06dda97814b94c0b41484bb92c59f5 [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.jetbrains.python.psi.impl;
import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil;
import com.jetbrains.python.FunctionParameter;
import com.jetbrains.python.nameResolver.FQNamesProvider;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.resolve.PyResolveContext;
import com.jetbrains.python.psi.types.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author yole
*/
public class PyCallExpressionImpl extends PyElementImpl implements PyCallExpression {
public PyCallExpressionImpl(ASTNode astNode) {
super(astNode);
}
@Override
protected void acceptPyVisitor(PyElementVisitor pyVisitor) {
pyVisitor.visitPyCallExpression(this);
}
@Nullable
public PyExpression getCallee() {
// peel off any parens, because we may have smth like (lambda x: x+1)(2)
PsiElement seeker = getFirstChild();
while (seeker instanceof PyParenthesizedExpression) seeker = ((PyParenthesizedExpression)seeker).getContainedExpression();
return seeker instanceof PyExpression ? (PyExpression) seeker : null;
}
public PyArgumentList getArgumentList() {
return PsiTreeUtil.getChildOfType(this, PyArgumentList.class);
}
@NotNull
public PyExpression[] getArguments() {
final PyArgumentList argList = getArgumentList();
return argList != null ? argList.getArguments() : PyExpression.EMPTY_ARRAY;
}
@Override
public <T extends PsiElement> T getArgument(int index, Class<T> argClass) {
PyExpression[] args = getArguments();
return args.length > index && argClass.isInstance(args[index]) ? argClass.cast(args[index]) : null;
}
@Override
public <T extends PsiElement> T getArgument(int index, String keyword, Class<T> argClass) {
final PyExpression argument = getKeywordArgument(keyword);
if (argument != null) {
return argClass.isInstance(argument) ? argClass.cast(argument) : null;
}
return getArgument(index, argClass);
}
@Nullable
@Override
public <T extends PsiElement> T getArgument(@NotNull final FunctionParameter parameter, @NotNull final Class<T> argClass) {
return PyCallExpressionHelper.getArgument(parameter, argClass, this);
}
@Override
public PyExpression getKeywordArgument(String keyword) {
return PyCallExpressionHelper.getKeywordArgument(this, keyword);
}
public void addArgument(PyExpression expression) {
PyCallExpressionHelper.addArgument(this, expression);
}
public PyMarkedCallee resolveCallee(PyResolveContext resolveContext) {
return PyCallExpressionHelper.resolveCallee(this, resolveContext);
}
@Override
public Callable resolveCalleeFunction(PyResolveContext resolveContext) {
return PyCallExpressionHelper.resolveCalleeFunction(this, resolveContext);
}
public PyMarkedCallee resolveCallee(PyResolveContext resolveContext, int offset) {
return PyCallExpressionHelper.resolveCallee(this, resolveContext, offset);
}
@Override
public boolean isCalleeText(@NotNull String... nameCandidates) {
return PyCallExpressionHelper.isCalleeText(this, nameCandidates);
}
@Override
public boolean isCallee(@NotNull final FQNamesProvider... name) {
return PyCallExpressionHelper.isCallee(this, name);
}
@Override
public String toString() {
return "PyCallExpression: " + PyUtil.getReadableRepr(getCallee(), true); //or: getCalledFunctionReference().getReferencedName();
}
public PyType getType(@NotNull TypeEvalContext context, @NotNull TypeEvalContext.Key key) {
return PyCallExpressionHelper.getCallType(this, context);
}
}