DS-4558 Quick fix to split a cell for statement has no effect inspection

Added a new Extension Point for corresponding quick fixes for "Statement without effect inspection." Added QF for Jupyter notebook case and Python file with cells. This QF splits cell just right after the statement without effect

^DS-4558 Fixed

Merge-request: IJ-MR-104455
Merged-by: Natalia Murycheva <natalia.murycheva@jetbrains.com>

GitOrigin-RevId: 7773895cf1ebd6d4e8d56b41e335ec8b97ca5d78
This commit is contained in:
Natalia.Murycheva
2023-05-03 15:03:06 +00:00
committed by intellij-monorepo-bot
parent adffe9f185
commit 10f22bb2e2
4 changed files with 37 additions and 7 deletions

View File

@@ -36,6 +36,9 @@
<extensionPoint qualifiedName="Pythonid.inspectionExtension"
interface="com.jetbrains.python.inspections.PyInspectionExtension"
dynamic="true"/>
<extensionPoint qualifiedName="Pythonid.statementEffectQuickFixProvider"
interface="com.jetbrains.python.inspections.PyStatementEffectQuickFixProvider"
dynamic="true"/>
<extensionPoint qualifiedName="Pythonid.pyClassInheritorsSearch" interface="com.intellij.util.QueryExecutor" dynamic="true"/>
<extensionPoint qualifiedName="Pythonid.pyOverridingMethodsSearch" interface="com.intellij.util.QueryExecutor" dynamic="true"/>
<extensionPoint qualifiedName="Pythonid.pythonDocumentationQuickInfoProvider"

View File

@@ -0,0 +1,17 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.jetbrains.python.inspections;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.jetbrains.python.psi.PyExpressionStatement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public interface PyStatementEffectQuickFixProvider {
ExtensionPointName<PyStatementEffectQuickFixProvider> EP_NAME = ExtensionPointName.create("Pythonid.statementEffectQuickFixProvider");
@Nullable
LocalQuickFix getQuickFix(@NotNull PyExpressionStatement expressionStatement);
}

View File

@@ -1147,7 +1147,7 @@ INSP.typeddict.required.notrequired.must.have.exactly.one.type.argument=''{0}''
# PyTypeHintsInspection
INSP.NAME.type.hints=Invalid type hints definitions and usages
INSP.type.hints.builtin.cannot.be.parameterized.directly=Builtin ''{0}'' cannot be parameterized directly
INSP.type.hints.typing.self.cannot.be.parameterized='Self' cannot be parameterized
INSP.type.hints.typing.self.cannot.be.parameterized='Self' cannot be parameterized
INSP.type.hints.invalid.type.self=Invalid type 'self'
INSP.type.hints.literal.must.have.at.least.one.parameter='Literal' must have at least one parameter
INSP.type.hints.annotated.must.be.called.with.at.least.two.arguments='Annotated' must be called with at least two arguments

View File

@@ -16,10 +16,12 @@
package com.jetbrains.python.inspections;
import com.intellij.codeInspection.LocalInspectionToolSession;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.ProblemsHolder;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.ResolveResult;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.SmartList;
import com.intellij.util.containers.ContainerUtil;
import com.jetbrains.python.PyPsiBundle;
import com.jetbrains.python.PyTokenTypes;
@@ -31,6 +33,8 @@ import com.jetbrains.python.psi.types.TypeEvalContext;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
public class PyStatementEffectInspection extends PyInspection {
@NotNull
@@ -73,13 +77,13 @@ public class PyStatementEffectInspection extends PyInspection {
return;
}
}
if (expression instanceof PyReferenceExpression && !((PyReferenceExpression)expression).isQualified()) {
registerProblem(expression, PyPsiBundle.message("INSP.statement.effect.statement.seems.to.have.no.effect"));
}
else {
registerProblem(expression, PyPsiBundle.message("INSP.statement.effect.statement.seems.to.have.no.effect"),
new StatementEffectIntroduceVariableQuickFix());
List<LocalQuickFix> quickFixes = new SmartList<>(getQuickFixesFromExtensions(node));
if (!(expression instanceof PyReferenceExpression reference) || reference.isQualified()) {
quickFixes.add(new StatementEffectIntroduceVariableQuickFix());
}
registerProblem(expression,
PyPsiBundle.message("INSP.statement.effect.statement.seems.to.have.no.effect"),
quickFixes.toArray(LocalQuickFix.EMPTY_ARRAY));
}
private boolean hasEffect(@Nullable PyExpression expression) {
@@ -157,4 +161,10 @@ public class PyStatementEffectInspection extends PyInspection {
return false;
}
}
@NotNull
private static List<LocalQuickFix> getQuickFixesFromExtensions(@NotNull PyExpressionStatement expressionStatement) {
return ContainerUtil.mapNotNull(PyStatementEffectQuickFixProvider.EP_NAME.getExtensionList(),
extension -> extension.getQuickFix(expressionStatement));
}
}