diff --git a/python/psi-api/src/com/jetbrains/python/PyNames.java b/python/psi-api/src/com/jetbrains/python/PyNames.java index 7f543920beb9..ac40c1dc90bd 100644 --- a/python/psi-api/src/com/jetbrains/python/PyNames.java +++ b/python/psi-api/src/com/jetbrains/python/PyNames.java @@ -69,6 +69,7 @@ public class PyNames { public static final String DIRNAME = "dirname"; public static final String ABSPATH = "abspath"; + public static final String NORMPATH = "normpath"; public static final String JOIN = "join"; public static final String REPLACE = "replace"; public static final String FILE = "__file__"; diff --git a/python/src/com/jetbrains/python/psi/impl/PyPathEvaluator.java b/python/src/com/jetbrains/python/psi/impl/PyPathEvaluator.java index 9d5b24bf40cd..8229193280c8 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyPathEvaluator.java +++ b/python/src/com/jetbrains/python/psi/impl/PyPathEvaluator.java @@ -41,6 +41,9 @@ public class PyPathEvaluator extends PyEvaluator { else if (call.isCalleeText(PyNames.JOIN) && args.length >= 1) { return evaluatePathInJoin(args, args.length); } + else if (call.isCalleeText(PyNames.NORMPATH) && args.length == 1) { + return evaluate(args[0]); + } else if (call.isCalleeText(PyNames.ABSPATH) && args.length == 1) { Object argValue = evaluate(args[0]); // relative to directory of 'containingFilePath', not file diff --git a/python/testSrc/com/jetbrains/python/PyPathEvaluatorTest.java b/python/testSrc/com/jetbrains/python/PyPathEvaluatorTest.java index c321d50ba2b3..8f7b20d57202 100644 --- a/python/testSrc/com/jetbrains/python/PyPathEvaluatorTest.java +++ b/python/testSrc/com/jetbrains/python/PyPathEvaluatorTest.java @@ -24,6 +24,10 @@ public class PyPathEvaluatorTest extends PyTestCase { assertEquals("/foo/bar/db.sqlite3", doEvaluate("os.path.join(__file__, 'db.sqlite3'", "/foo/bar")); } + public void testNormPath() { // PY-10194 + assertEquals("/foo/bar/baz.py", doEvaluate("os.path.normpath(__file__)", "/foo/bar/baz.py")); + } + public void testReplace() { assertEquals("/foo/Bar/Baz.py", doEvaluate("__file__.replace('b', 'B')", "/foo/bar/baz.py")); }