diff --git a/python/python-psi-impl/resources/META-INF/PythonPsiImpl.xml b/python/python-psi-impl/resources/META-INF/PythonPsiImpl.xml
index daf9528ba5b5..0743e9e1dace 100644
--- a/python/python-psi-impl/resources/META-INF/PythonPsiImpl.xml
+++ b/python/python-psi-impl/resources/META-INF/PythonPsiImpl.xml
@@ -126,7 +126,7 @@
-
+
diff --git a/python/python-psi-impl/resources/messages/PyPsiBundle.properties b/python/python-psi-impl/resources/messages/PyPsiBundle.properties
index c8d98f880966..c760ad7fa77f 100644
--- a/python/python-psi-impl/resources/messages/PyPsiBundle.properties
+++ b/python/python-psi-impl/resources/messages/PyPsiBundle.properties
@@ -415,6 +415,9 @@ QFIX.add.method.to.class=Add method to class
QFIX.install.and.import.package=Install and import package
QFIX.NAME.install.and.import.package=Install and import package ''{0}''
+# PyAsyncCallInspection
+QFIX.coroutine.is.not.awaited=Coroutine is not awaited
+
# Actions and associated commands
ACT.CMD.use.import=Use an imported module
@@ -439,7 +442,6 @@ INSP.pep8.naming=PEP 8 naming convention violation
INSP.pep8.naming.excluded.base.classes=Excluded base classes
INSP.pep8.naming.ignored.errors=Ignored errors
INSP.shadowing.builtins=Shadowing built-ins
-INSP.calling.non.callable=Trying to call a non-callable object
INSP.dataclass.definition.and.usages=Dataclass definition and usages
INSP.dunder.slots=Definition of __slots__ in a class
INSP.final.classes.methods.and.variables=Final classes, methods and variables
@@ -500,6 +502,12 @@ INSP.type.checker=Type checker
INSP.type.hints=Type hints definitions and usages
INSP.typed.dict=TypedDict definition and usages
+# PyCallingNonCallableInspection
+INSP.NAME.calling.non.callable=Trying to call a non-callable object
+INSP.class.object.is.not.callable=''{0}'' object is not callable
+INSP.symbol.is.not.callable=''{0}'' is not callable
+INSP.expression.is.not.callable=Expression is not callable
+
# PyArgumentListInspection
INSP.NAME.incorrect.call.arguments=Incorrect call arguments
INSP.cannot.appear.past.keyword.arg=Cannot appear past keyword arguments or *arg or **kwarg
@@ -703,18 +711,24 @@ INSP.unused.locals.ignore.variables.used.in.tuple.unpacking=Ignore variables use
# PyChainedComparsonsInspection
INSP.NAME.chained.comparisons=Chained comparisons can be simplified
+INSP.chained.comparisons.ignore.statements.with.constant.in.the.middle=Ignore statements with a constant in the middle
+INSP.simplify.chained.comparison=Simplify chained comparison
# PyAugmentAssignmentInspection
INSP.NAME.augment.assignment=Assignment can be replaced with augmented assignment
+INSP.assignment.can.be.replaced.with.augmented.assignment=Assignment can be replaced with augmented assignment
# PyBroadExceptionInspection
INSP.NAME.too.broad.exception.clauses=Too broad exception clauses
+INSP.too.broad.exception.clause=Too broad exception clause
# PyByteLiteralInspection
INSP.NAME.byte.literal=Byte literal contains characters > 255
+INSP.byte.literal.contains.illegal.characters=Byte literal contains characters > 255
# PyComparisonWithNoneInspection
INSP.NAME.comparison.with.none=Comparison with None performed with equality operators
+INSP.comparison.with.none.performed.with.equality.operators=Comparison with None performed with equality operators
# PyDictCreationInspection
INSP.NAME.dict.creation=Dictionary creation could be rewritten by dictionary literal
diff --git a/python/python-psi-impl/src/com/jetbrains/python/inspections/PyAsyncCallInspection.kt b/python/python-psi-impl/src/com/jetbrains/python/inspections/PyAsyncCallInspection.kt
index e6cea6ba3156..791a1f6fca7e 100644
--- a/python/python-psi-impl/src/com/jetbrains/python/inspections/PyAsyncCallInspection.kt
+++ b/python/python-psi-impl/src/com/jetbrains/python/inspections/PyAsyncCallInspection.kt
@@ -76,8 +76,6 @@ class PyAsyncCallInspection : PyInspection() {
"asyncio.tasks.ensure_future",
"asyncio.ensure_future")
- const val coroutineIsNotAwaited = "Coroutine is not awaited"
-
private fun getCalledCoroutineName(callExpression: PyCallExpression, resolveContext: PyResolveContext): String? {
val callee = callExpression.callee as? PyReferenceExpression ?: return null
val function = callExpression.multiResolveCalleeFunction(resolveContext).firstOrNull() as? PyFunction ?: return null
@@ -95,7 +93,7 @@ class PyAsyncCallInspection : PyInspection() {
}
private class PyAddAwaitCallForCoroutineFix(val type: AwaitableType) : LocalQuickFix {
- override fun getFamilyName() = coroutineIsNotAwaited
+ override fun getFamilyName() = PyPsiBundle.message("QFIX.coroutine.is.not.awaited")
override fun applyFix(project: Project, descriptor: ProblemDescriptor) {
val psiElement = descriptor.psiElement
diff --git a/python/python-psi-impl/src/com/jetbrains/python/inspections/PyAugmentAssignmentInspection.java b/python/python-psi-impl/src/com/jetbrains/python/inspections/PyAugmentAssignmentInspection.java
index 219400a34cf7..eec87dcc90f1 100644
--- a/python/python-psi-impl/src/com/jetbrains/python/inspections/PyAugmentAssignmentInspection.java
+++ b/python/python-psi-impl/src/com/jetbrains/python/inspections/PyAugmentAssignmentInspection.java
@@ -21,6 +21,7 @@ import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.tree.TokenSet;
import com.intellij.util.containers.ContainerUtil;
import com.jetbrains.python.PyNames;
+import com.jetbrains.python.PyPsiBundle;
import com.jetbrains.python.PyTokenTypes;
import com.jetbrains.python.inspections.quickfix.AugmentedAssignmentQuickFix;
import com.jetbrains.python.psi.*;
@@ -104,7 +105,7 @@ public class PyAugmentAssignmentInspection extends PyInspection {
final PyElementType operator = value.getOperator();
if (operator != null && assignmentCanBeReplaced(mainOperandExpression, otherOperandExpression, operator, changedParts)) {
- registerProblem(node, "Assignment can be replaced with augmented assignment", new AugmentedAssignmentQuickFix());
+ registerProblem(node, PyPsiBundle.message("INSP.assignment.can.be.replaced.with.augmented.assignment"), new AugmentedAssignmentQuickFix());
}
}
}
diff --git a/python/python-psi-impl/src/com/jetbrains/python/inspections/PyBroadExceptionInspection.java b/python/python-psi-impl/src/com/jetbrains/python/inspections/PyBroadExceptionInspection.java
index 1b04237c87d0..2e23d8fb9cd2 100644
--- a/python/python-psi-impl/src/com/jetbrains/python/inspections/PyBroadExceptionInspection.java
+++ b/python/python-psi-impl/src/com/jetbrains/python/inspections/PyBroadExceptionInspection.java
@@ -21,6 +21,7 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.PsiReference;
import com.intellij.util.containers.Stack;
+import com.jetbrains.python.PyPsiBundle;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.types.PyClassType;
import com.jetbrains.python.psi.types.PyType;
@@ -60,7 +61,7 @@ public class PyBroadExceptionInspection extends PyInspection {
if (reRaised(node))
return;
if (exceptClass == null) {
- registerProblem(node.getFirstChild(), "Too broad exception clause");
+ registerProblem(node.getFirstChild(), PyPsiBundle.message("INSP.too.broad.exception.clause"));
}
if (exceptClass != null) {
final PyType type = myTypeEvalContext.getType(exceptClass);
@@ -68,7 +69,7 @@ public class PyBroadExceptionInspection extends PyInspection {
final PyClass cls = ((PyClassType)type).getPyClass();
final PyExpression target = node.getTarget();
if (equalsException(cls, myTypeEvalContext) && (target == null || !isExceptionUsed(node, target.getText()))) {
- registerProblem(exceptClass, "Too broad exception clause");
+ registerProblem(exceptClass, PyPsiBundle.message("INSP.too.broad.exception.clause"));
}
}
}
diff --git a/python/python-psi-impl/src/com/jetbrains/python/inspections/PyByteLiteralInspection.java b/python/python-psi-impl/src/com/jetbrains/python/inspections/PyByteLiteralInspection.java
index 59db6dfaf525..5c871f3ba379 100644
--- a/python/python-psi-impl/src/com/jetbrains/python/inspections/PyByteLiteralInspection.java
+++ b/python/python-psi-impl/src/com/jetbrains/python/inspections/PyByteLiteralInspection.java
@@ -19,6 +19,7 @@ import com.intellij.codeInspection.LocalInspectionToolSession;
import com.intellij.codeInspection.ProblemsHolder;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.PsiFile;
+import com.jetbrains.python.PyPsiBundle;
import com.jetbrains.python.PythonFileType;
import com.jetbrains.python.psi.PyFile;
import com.jetbrains.python.psi.PyStringLiteralExpression;
@@ -85,7 +86,7 @@ public class PyByteLiteralInspection extends PyInspection {
boolean isByte = first_char == 'b' || (default_bytes && first_char != 'u');
if (hasNonAscii && isByte) {
- registerProblem(node, "Byte literal contains characters > 255");
+ registerProblem(node, PyPsiBundle.message("INSP.byte.literal.contains.illegal.characters"));
}
}
}
diff --git a/python/python-psi-impl/src/com/jetbrains/python/inspections/PyCallingNonCallableInspection.java b/python/python-psi-impl/src/com/jetbrains/python/inspections/PyCallingNonCallableInspection.java
index 6082c00fcfc3..a4444192b5d6 100644
--- a/python/python-psi-impl/src/com/jetbrains/python/inspections/PyCallingNonCallableInspection.java
+++ b/python/python-psi-impl/src/com/jetbrains/python/inspections/PyCallingNonCallableInspection.java
@@ -17,8 +17,10 @@ package com.jetbrains.python.inspections;
import com.intellij.codeInspection.LocalInspectionToolSession;
import com.intellij.codeInspection.ProblemsHolder;
+import com.intellij.codeInspection.util.InspectionMessage;
import com.intellij.psi.PsiElementVisitor;
import com.jetbrains.python.PyNames;
+import com.jetbrains.python.PyPsiBundle;
import com.jetbrains.python.inspections.quickfix.PyRemoveCallQuickFix;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.types.PyClassType;
@@ -67,14 +69,14 @@ public class PyCallingNonCallableInspection extends PyInspection {
if (callee != null && isCallable(callee, myTypeEvalContext) == Boolean.FALSE) {
final PyType calleeType = myTypeEvalContext.getType(callee);
- String message = "Expression is not callable";
+ @InspectionMessage String message = PyPsiBundle.message("INSP.expression.is.not.callable");
if (calleeType instanceof PyClassType) {
- message = String.format("'%s' object is not callable", calleeType.getName());
+ message = PyPsiBundle.message("INSP.class.object.is.not.callable", calleeType.getName());
}
else {
final String name = callee.getName();
if (name != null) {
- message = String.format("'%s' is not callable", name);
+ message = PyPsiBundle.message("INSP.symbol.is.not.callable", name);
}
}
registerProblem(node, message, new PyRemoveCallQuickFix());
diff --git a/python/python-psi-impl/src/com/jetbrains/python/inspections/PyChainedComparisonsInspection.java b/python/python-psi-impl/src/com/jetbrains/python/inspections/PyChainedComparisonsInspection.java
index d1878bdf3050..7357cc19fdd0 100644
--- a/python/python-psi-impl/src/com/jetbrains/python/inspections/PyChainedComparisonsInspection.java
+++ b/python/python-psi-impl/src/com/jetbrains/python/inspections/PyChainedComparisonsInspection.java
@@ -23,6 +23,7 @@ import com.intellij.codeInspection.ex.InspectionProfileModifiableModelKt;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.PsiFile;
+import com.jetbrains.python.PyPsiBundle;
import com.jetbrains.python.PyTokenTypes;
import com.jetbrains.python.PythonUiService;
import com.jetbrains.python.inspections.quickfix.ChainedComparisonsQuickFix;
@@ -47,14 +48,14 @@ import static com.jetbrains.python.psi.PyUtil.as;
*/
public class PyChainedComparisonsInspection extends PyInspection {
- protected static final String ourIgnoreConstantOptionText = "Ignore statements with a constant in the middle";
private static final String INSPECTION_SHORT_NAME = "PyChainedComparisonsInspection";
public boolean ignoreConstantInTheMiddle = false;
@Nullable
@Override
public JComponent createOptionsPanel() {
- JCheckBox checkBox = PythonUiService.getInstance().createInspectionCheckBox(ourIgnoreConstantOptionText, this, "ignoreConstantInTheMiddle");
+ JCheckBox checkBox = PythonUiService.getInstance().createInspectionCheckBox(
+ PyPsiBundle.message("INSP.chained.comparisons.ignore.statements.with.constant.in.the.middle"), this, "ignoreConstantInTheMiddle");
final JPanel rootPanel = new JPanel(new BorderLayout());
if (checkBox != null) {
rootPanel.add(checkBox,
@@ -118,12 +119,12 @@ public class PyChainedComparisonsInspection extends PyInspection {
if (applicable) {
if (isConstantInTheMiddle) {
if (!ignoreConstantInTheMiddle) {
- registerProblem(node, "Simplify chained comparison", new ChainedComparisonsQuickFix(myIsLeft, myIsRight, getInnerRight),
+ registerProblem(node, PyPsiBundle.message("INSP.simplify.chained.comparison"), new ChainedComparisonsQuickFix(myIsLeft, myIsRight, getInnerRight),
new DontSimplifyStatementsWithConstantInTheMiddleQuickFix());
}
}
else {
- registerProblem(node, "Simplify chained comparison", new ChainedComparisonsQuickFix(myIsLeft, myIsRight, getInnerRight));
+ registerProblem(node, PyPsiBundle.message("INSP.simplify.chained.comparison"), new ChainedComparisonsQuickFix(myIsLeft, myIsRight, getInnerRight));
}
}
}
@@ -240,7 +241,7 @@ public class PyChainedComparisonsInspection extends PyInspection {
@NotNull
@Override
public String getFamilyName() {
- return ourIgnoreConstantOptionText;
+ return PyPsiBundle.message("INSP.chained.comparisons.ignore.statements.with.constant.in.the.middle");
}
@Override
diff --git a/python/python-psi-impl/src/com/jetbrains/python/inspections/PyComparisonWithNoneInspection.java b/python/python-psi-impl/src/com/jetbrains/python/inspections/PyComparisonWithNoneInspection.java
index 46c2160b228e..4bfd40e5666f 100644
--- a/python/python-psi-impl/src/com/jetbrains/python/inspections/PyComparisonWithNoneInspection.java
+++ b/python/python-psi-impl/src/com/jetbrains/python/inspections/PyComparisonWithNoneInspection.java
@@ -21,6 +21,7 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.PsiReference;
import com.jetbrains.python.PyNames;
+import com.jetbrains.python.PyPsiBundle;
import com.jetbrains.python.PyTokenTypes;
import com.jetbrains.python.inspections.quickfix.ComparisonWithNoneQuickFix;
import com.jetbrains.python.psi.*;
@@ -57,7 +58,7 @@ public class PyComparisonWithNoneInspection extends PyInspection {
assert reference != null;
PsiElement result = reference.resolve();
if (result == null || PyBuiltinCache.getInstance(node).isBuiltin(result)) {
- registerProblem(node, "Comparison with None performed with equality operators", new ComparisonWithNoneQuickFix());
+ registerProblem(node, PyPsiBundle.message("INSP.comparison.with.none.performed.with.equality.operators"), new ComparisonWithNoneQuickFix());
}
}
}
diff --git a/python/testSrc/com/jetbrains/python/quickFixes/PyAsyncCallQuickFixTest.java b/python/testSrc/com/jetbrains/python/quickFixes/PyAsyncCallQuickFixTest.java
index 7068760130c4..f34771b7352a 100644
--- a/python/testSrc/com/jetbrains/python/quickFixes/PyAsyncCallQuickFixTest.java
+++ b/python/testSrc/com/jetbrains/python/quickFixes/PyAsyncCallQuickFixTest.java
@@ -2,6 +2,7 @@
package com.jetbrains.python.quickFixes;
import com.intellij.testFramework.LightProjectDescriptor;
+import com.jetbrains.python.PyPsiBundle;
import com.jetbrains.python.PyQuickFixTestCase;
import com.jetbrains.python.inspections.PyAsyncCallInspection;
import com.jetbrains.python.psi.LanguageLevel;
@@ -11,13 +12,13 @@ public class PyAsyncCallQuickFixTest extends PyQuickFixTestCase {
// PY-17292
public void testAddAwaitBeforeCall() {
- doQuickFixTest(PyAsyncCallInspection.class, PyAsyncCallInspection.coroutineIsNotAwaited, LanguageLevel.PYTHON35);
+ doQuickFixTest(PyAsyncCallInspection.class, PyPsiBundle.message("QFIX.coroutine.is.not.awaited"), LanguageLevel.PYTHON35);
}
// PY-17292
public void testAddYieldFromBeforeCall() {
runWithLanguageLevel(LanguageLevel.PYTHON35,
- () -> doMultifilesTest(PyAsyncCallInspection.class, PyAsyncCallInspection.coroutineIsNotAwaited,
+ () -> doMultifilesTest(PyAsyncCallInspection.class, PyPsiBundle.message("QFIX.coroutine.is.not.awaited"),
new String[]{"addYieldFromBeforeCall.py", "asyncio/__init__.py", "asyncio/coroutines.py"}));
}