use of com.jetbrains.python.psi.PyClass in project intellij-community by JetBrains.
the class PyPushDownTest method testMultiFileImports.
// Tests that pushing down methods moves imports as well (PY-10963)
public void testMultiFileImports() {
final String[] modules = { "child_module", "parent_module" };
configureMultiFile(ArrayUtil.mergeArrays(modules, "shared_module"));
final PyClass parentClass = findClass("Parent");
final PyMemberInfo<PyElement> methodToMove = MembersManager.findMember(parentClass, findMember("Parent", ".should_be_pushed"));
moveViaProcessor(myFixture.getProject(), new PyPushDownProcessor(myFixture.getProject(), Collections.singletonList(methodToMove), parentClass));
checkMultiFile(modules);
}
use of com.jetbrains.python.psi.PyClass in project intellij-community by JetBrains.
the class CreateTestAction method invoke.
@Override
public void invoke(@NotNull final Project project, Editor editor, @NotNull PsiElement element) throws IncorrectOperationException {
final PyFunction srcFunction = PsiTreeUtil.getParentOfType(element, PyFunction.class);
final PyClass srcClass = PsiTreeUtil.getParentOfType(element, PyClass.class);
if (srcClass == null && srcFunction == null)
return;
final PsiDirectory dir = element.getContainingFile().getContainingDirectory();
final CreateTestDialog d = new CreateTestDialog(project);
if (srcClass != null) {
d.setClassName("Test" + StringUtil.capitalize(srcClass.getName()));
d.setFileName("test_" + StringUtil.decapitalize(srcClass.getName()) + ".py");
if (dir != null)
d.setTargetDir(dir.getVirtualFile().getPath());
if (srcFunction != null) {
d.methodsSize(1);
d.addMethod("test_" + srcFunction.getName(), 0);
} else {
final List<PyFunction> methods = Lists.newArrayList();
srcClass.visitMethods(pyFunction -> {
if (pyFunction.getName() != null && !pyFunction.getName().startsWith("__"))
methods.add(pyFunction);
return true;
}, false, null);
d.methodsSize(methods.size());
int i = 0;
for (PyFunction f : methods) {
d.addMethod("test_" + f.getName(), i);
++i;
}
}
} else {
d.setClassName("Test" + StringUtil.capitalize(srcFunction.getName()));
d.setFileName("test_" + StringUtil.decapitalize(srcFunction.getName()) + ".py");
if (dir != null)
d.setTargetDir(dir.getVirtualFile().getPath());
d.methodsSize(1);
d.addMethod("test_" + srcFunction.getName(), 0);
}
if (!d.showAndGet()) {
return;
}
CommandProcessor.getInstance().executeCommand(project, () -> {
PsiFile e = PyTestCreator.generateTestAndNavigate(project, d);
final PsiDocumentManager documentManager = PsiDocumentManager.getInstance(project);
documentManager.commitAllDocuments();
}, CodeInsightBundle.message("intention.create.test"), this);
}
use of com.jetbrains.python.psi.PyClass in project intellij-community by JetBrains.
the class PyJavaSuperMethodsSearchExecutor method execute.
public boolean execute(@NotNull final PySuperMethodsSearch.SearchParameters queryParameters, @NotNull final Processor<PsiElement> consumer) {
PyFunction func = queryParameters.getDerivedMethod();
PyClass containingClass = func.getContainingClass();
if (containingClass != null) {
for (PyClassLikeType type : containingClass.getSuperClassTypes(TypeEvalContext.codeInsightFallback(containingClass.getProject()))) {
if (type instanceof PyJavaClassType) {
final PsiClass psiClass = ((PyJavaClassType) type).getPsiClass();
PsiMethod[] methods = psiClass.findMethodsByName(func.getName(), true);
// the Python method actually does override/implement all of Java super methods with the same name
if (!ContainerUtil.process(methods, consumer))
return false;
}
}
}
return true;
}
use of com.jetbrains.python.psi.PyClass in project intellij-community by JetBrains.
the class PyCustomMember method resolve.
@Nullable
public PsiElement resolve(@NotNull final PsiElement context) {
if (myTarget != null) {
return myTarget;
}
PyClass targetClass = null;
if (myTypeName != null) {
final ParameterizedCachedValueProvider<PyClass, PsiElement> provider = new ParameterizedCachedValueProvider<PyClass, PsiElement>() {
@Nullable
@Override
public CachedValueProvider.Result<PyClass> compute(final PsiElement param) {
final PyClass result = PyPsiFacade.getInstance(param.getProject()).createClassByQName(myTypeName, param);
return CachedValueProvider.Result.create(result, PsiModificationTracker.MODIFICATION_COUNT);
}
};
targetClass = CachedValuesManager.getManager(context.getProject()).getParameterizedCachedValue(this, RESOLVE, provider, false, context);
}
final PsiElement resolveTarget = findResolveTarget(context);
if (resolveTarget instanceof PyFunction && !myAlwaysResolveToCustomElement) {
return resolveTarget;
}
if (resolveTarget != null || targetClass != null) {
return new MyInstanceElement(targetClass, context, resolveTarget);
}
return null;
}
use of com.jetbrains.python.psi.PyClass in project intellij-community by JetBrains.
the class PyChangeSignatureQuickFix method applyFix.
public void applyFix(@NotNull final Project project, @NotNull final ProblemDescriptor descriptor) {
final PyFunction function = PsiTreeUtil.getParentOfType(descriptor.getPsiElement(), PyFunction.class);
if (function == null)
return;
final PyClass cls = function.getContainingClass();
assert cls != null;
final String functionName = function.getName();
final String complementaryName = PyNames.NEW.equals(functionName) ? PyNames.INIT : PyNames.NEW;
final TypeEvalContext context = TypeEvalContext.userInitiated(project, descriptor.getEndElement().getContainingFile());
final PyFunction complementaryMethod = myOverridenMethod ? (PyFunction) PySuperMethodsSearch.search(function, context).findFirst() : cls.findMethodByName(complementaryName, true, null);
assert complementaryMethod != null;
final PyMethodDescriptor methodDescriptor = new PyMethodDescriptor(function) {
@Override
public List<PyParameterInfo> getParameters() {
final List<PyParameterInfo> parameterInfos = super.getParameters();
final int paramLength = function.getParameterList().getParameters().length;
final int complementaryParamLength = complementaryMethod.getParameterList().getParameters().length;
if (complementaryParamLength > paramLength)
parameterInfos.add(new PyParameterInfo(-1, "**kwargs", "", false));
return parameterInfos;
}
};
final PyChangeSignatureDialog dialog = new PyChangeSignatureDialog(project, methodDescriptor);
dialog.show();
}
Aggregations