diff --git a/python/src/com/jetbrains/python/inspections/PyPackageRequirementsInspection.java b/python/src/com/jetbrains/python/inspections/PyPackageRequirementsInspection.java index cf6cf91e5fad..25a1b836c256 100644 --- a/python/src/com/jetbrains/python/inspections/PyPackageRequirementsInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyPackageRequirementsInspection.java @@ -164,7 +164,12 @@ public class PyPackageRequirementsInspection extends PyInspection { final Module module = ModuleUtilCore.findModuleForPsiElement(packageReferenceExpression); if (module == null) return; - final Collection requirements = getRequirementsInclTransitive(module); + final Sdk sdk = PythonSdkType.findPythonSdk(module); + if (sdk == null) return; + + final PyPackageManager packageManager = PyPackageManager.getInstance(sdk); + + final Collection requirements = getRequirementsInclTransitive(packageManager, module); if (requirements == null) return; for (PyRequirement req : requirements) { @@ -209,7 +214,7 @@ public class PyPackageRequirementsInspection extends PyInspection { .of(packageName) .append(possiblePyPIPackageNames) .filter(PyPIPackageUtil.INSTANCE::isInPyPI) - .map(name -> new AddToRequirementsFix(module, name, LanguageLevel.forElement(importedExpression))) + .map(name -> new AddToRequirementsFix(packageManager, module, name, LanguageLevel.forElement(importedExpression))) .forEach(quickFixes::add); quickFixes.add(new IgnoreRequirementFix(Collections.singleton(packageName))); @@ -224,13 +229,8 @@ public class PyPackageRequirementsInspection extends PyInspection { } @Nullable - private static Set getRequirementsInclTransitive(@NotNull Module module) { - final Sdk sdk = PythonSdkType.findPythonSdk(module); - if (sdk == null) return null; - - final PyPackageManager packageManager = PyPackageManager.getInstance(sdk); - - final List requirements = getListedRequirements(module, packageManager); + private static Set getRequirementsInclTransitive(@NotNull PyPackageManager packageManager, @NotNull Module module) { + final List requirements = getListedRequirements(packageManager, module); if (requirements == null) return null; if (requirements.isEmpty()) return Collections.emptySet(); @@ -243,7 +243,7 @@ public class PyPackageRequirementsInspection extends PyInspection { } @Nullable - private static List getListedRequirements(@NotNull Module module, @NotNull PyPackageManager packageManager) { + private static List getListedRequirements(@NotNull PyPackageManager packageManager, @NotNull Module module) { final List requirements = packageManager.getRequirements(module); final List extrasRequirements = getExtrasRequirements(module); if (requirements == null) return extrasRequirements; @@ -549,11 +549,24 @@ public class PyPackageRequirementsInspection extends PyInspection { } private static class AddToRequirementsFix implements LocalQuickFix { - @NotNull private final Module myModule; - @NotNull private final String myPackageName; - @NotNull private final LanguageLevel myLanguageLevel; - private AddToRequirementsFix(@NotNull Module module, @NotNull String packageName, @NotNull LanguageLevel languageLevel) { + @NotNull + private final PyPackageManager myPackageManager; + + @NotNull + private final Module myModule; + + @NotNull + private final String myPackageName; + + @NotNull + private final LanguageLevel myLanguageLevel; + + private AddToRequirementsFix(@NotNull PyPackageManager packageManager, + @NotNull Module module, + @NotNull String packageName, + @NotNull LanguageLevel languageLevel) { + myPackageManager = packageManager; myModule = module; myPackageName = packageName; myLanguageLevel = languageLevel; @@ -571,8 +584,18 @@ public class PyPackageRequirementsInspection extends PyInspection { } @Override - public void applyFix(@NotNull final Project project, @NotNull ProblemDescriptor descriptor) { - CommandProcessor.getInstance().executeCommand(project, () -> ApplicationManager.getApplication().runWriteAction(() -> PyPackageUtil.addRequirementToTxtOrSetupPy(myModule, myPackageName, myLanguageLevel)), getName(), null); + public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { + final List requirements = myPackageManager.getRequirements(myModule); + if (requirements != null && ContainerUtil.exists(requirements, r -> r.getName().equals(myPackageName))) return; + + CommandProcessor.getInstance().executeCommand( + project, + () -> ApplicationManager.getApplication().runWriteAction( + () -> PyPackageUtil.addRequirementToTxtOrSetupPy(myModule, myPackageName, myLanguageLevel) + ), + getName(), + null + ); } @NotNull diff --git a/python/src/com/jetbrains/python/psi/impl/PyListLiteralExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyListLiteralExpressionImpl.java index 685f3b229327..06340e1934dc 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyListLiteralExpressionImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyListLiteralExpressionImpl.java @@ -41,7 +41,7 @@ public class PyListLiteralExpressionImpl extends PySequenceExpressionImpl implem PyExpression element = (PyExpression)psiElement; PyExpression[] els = getElements(); PyExpression lastArg = els.length == 0 ? null : els[els.length - 1]; - return PyElementGenerator.getInstance(getProject()).insertItemIntoList(this, lastArg, element); + return PyElementGenerator.getInstance(getProject()).insertItemIntoListRemoveRedundantCommas(this, lastArg, element); } private static void checkPyExpression(PsiElement psiElement) throws IncorrectOperationException {