diff --git a/python/python-psi-impl/src/com/jetbrains/python/psi/types/PyParamSpecType.java b/python/python-psi-impl/src/com/jetbrains/python/psi/types/PyParamSpecType.java
index b6e377df9b7a..2098b910b703 100644
--- a/python/python-psi-impl/src/com/jetbrains/python/psi/types/PyParamSpecType.java
+++ b/python/python-psi-impl/src/com/jetbrains/python/psi/types/PyParamSpecType.java
@@ -59,7 +59,7 @@ public final class PyParamSpecType implements PyTypeParameterType, PyCallablePar
@NotNull
@Override
public String getName() {
- return "ParamSpec(\"" + myName + "\")";
+ return "**" + myName;
}
@Override
diff --git a/python/testData/quickdoc/ConcatenateInGeneric.html b/python/testData/quickdoc/ConcatenateInGeneric.html
index 5deb5076043b..e368c1d52239 100644
--- a/python/testData/quickdoc/ConcatenateInGeneric.html
+++ b/python/testData/quickdoc/ConcatenateInGeneric.html
@@ -1,3 +1,3 @@
def __init__(self,
- f: (Concatenate(int, ParamSpec("P"))) -> U,
+ f: (Concatenate(int, **P)) -> U,
attr: U) -> None
\ No newline at end of file
diff --git a/python/testData/quickdoc/ConcatenateInParam.html b/python/testData/quickdoc/ConcatenateInParam.html
index 0534ab7f6ebe..2d7ee833f62f 100644
--- a/python/testData/quickdoc/ConcatenateInParam.html
+++ b/python/testData/quickdoc/ConcatenateInParam.html
@@ -1 +1 @@
-def remove(x: (Concatenate(int, ParamSpec("P"))) -> int) -> (ParamSpec("P")) -> bool
\ No newline at end of file
+def remove(x: (Concatenate(int, **P)) -> int) -> (**P) -> bool
\ No newline at end of file
diff --git a/python/testData/quickdoc/ConcatenateInReturn.html b/python/testData/quickdoc/ConcatenateInReturn.html
index cf1d05ce8280..9193ad7d5409 100644
--- a/python/testData/quickdoc/ConcatenateInReturn.html
+++ b/python/testData/quickdoc/ConcatenateInReturn.html
@@ -1 +1 @@
-def add(x: (ParamSpec("P")) -> int) -> (Concatenate(str, ParamSpec("P"))) -> bool
\ No newline at end of file
+def add(x: (**P) -> int) -> (Concatenate(str, **P)) -> bool
\ No newline at end of file
diff --git a/python/testData/quickdoc/ConcatenateSeveralFirstParamInParam.html b/python/testData/quickdoc/ConcatenateSeveralFirstParamInParam.html
index 8871e45eda3d..47d46555a4ea 100644
--- a/python/testData/quickdoc/ConcatenateSeveralFirstParamInParam.html
+++ b/python/testData/quickdoc/ConcatenateSeveralFirstParamInParam.html
@@ -1,2 +1 @@
-def remove(x: (Concatenate(int, bool, list, ParamSpec("P"))) -> int)
- -> (ParamSpec("P")) -> bool
\ No newline at end of file
+def remove(x: (Concatenate(int, bool, list, **P)) -> int) -> (**P) -> bool
\ No newline at end of file
diff --git a/python/testData/quickdoc/SeveralParamSpecs.html b/python/testData/quickdoc/SeveralParamSpecs.html
index f857d44f8e82..da11678d1ac5 100644
--- a/python/testData/quickdoc/SeveralParamSpecs.html
+++ b/python/testData/quickdoc/SeveralParamSpecs.html
@@ -1,2 +1,2 @@
-def foo(x: (ParamSpec("P")) -> int,
- y: (ParamSpec("P")) -> int) -> (ParamSpec("P")) -> bool
\ No newline at end of file
+def foo(x: (**P) -> int,
+ y: (**P) -> int) -> (**P) -> bool
\ No newline at end of file
diff --git a/python/testSrc/com/jetbrains/python/Py3TypeTest.java b/python/testSrc/com/jetbrains/python/Py3TypeTest.java
index e999273d8836..8b135dee2803 100644
--- a/python/testSrc/com/jetbrains/python/Py3TypeTest.java
+++ b/python/testSrc/com/jetbrains/python/Py3TypeTest.java
@@ -1276,7 +1276,7 @@ public class Py3TypeTest extends PyTestCase {
}
public void testParamSpecArgsKwargsInAnnotations() {
- doTest("(c: (ParamSpec(\"P\")) -> int, ParamSpec(\"P\"), ParamSpec(\"P\")) -> None", """
+ doTest("(c: (**P) -> int, **P, **P) -> None", """
from typing import Callable, ParamSpec
P = ParamSpec('P')
@@ -1289,7 +1289,7 @@ public class Py3TypeTest extends PyTestCase {
}
public void testParamSpecArgsKwargsInTypeComments() {
- doTest("(c: (ParamSpec(\"P\")) -> int, ParamSpec(\"P\"), ParamSpec(\"P\")) -> None", """
+ doTest("(c: (**P) -> int, **P, **P) -> None", """
from typing import Callable, ParamSpec
P = ParamSpec('P')
@@ -1306,7 +1306,7 @@ public class Py3TypeTest extends PyTestCase {
}
public void testParamSpecArgsKwargsInFunctionTypeComment() {
- doTest("(c: (ParamSpec(\"P\")) -> int, ParamSpec(\"P\"), ParamSpec(\"P\")) -> None", """
+ doTest("(c: (**P) -> int, **P, **P) -> None", """
from typing import Callable, ParamSpec
P = ParamSpec('P')
@@ -1320,7 +1320,7 @@ public class Py3TypeTest extends PyTestCase {
}
public void testParamSpecArgsKwargsInImportedFile() {
- doMultiFileTest("(c: (ParamSpec(\"P\")) -> int, ParamSpec(\"P\"), ParamSpec(\"P\")) -> None", """
+ doMultiFileTest("(c: (**P) -> int, **P, **P) -> None", """
from mod import func
expr = func
diff --git a/python/testSrc/com/jetbrains/python/PyTypingTest.java b/python/testSrc/com/jetbrains/python/PyTypingTest.java
index 84c4482fa77e..b7350d777f7d 100644
--- a/python/testSrc/com/jetbrains/python/PyTypingTest.java
+++ b/python/testSrc/com/jetbrains/python/PyTypingTest.java
@@ -4523,7 +4523,7 @@ public class PyTypingTest extends PyTestCase {
// PY-70484
public void testUnboundParamSpecThatCannotBeBoundThroughParametersLeftIntact() {
- doTest("((ParamSpec(\"P\")) -> Any) -> (ParamSpec(\"P\")) -> int",
+ doTest("((**P) -> Any) -> (**P) -> int",
"""
from typing import Callable, Any, ParamSpec
@@ -4556,7 +4556,7 @@ public class PyTypingTest extends PyTestCase {
}
public void testParamSpecInConcatenateMappedToAnotherParamSpec() {
- doTest("(int, ParamSpec(\"P1\")) -> Any",
+ doTest("(int, **P1) -> Any",
"""
from typing import Callable, Any, ParamSpec, Concatenate
@@ -6165,7 +6165,7 @@ public class PyTypingTest extends PyTestCase {
// PY-77541
public void testParamSpecBoundToAnotherParamSpecInCustomGeneric() {
- doTest("MyCallable[ParamSpec(\"P2\"), R2]", """
+ doTest("MyCallable[**P2, R2]", """
class MyCallable[**P, R]:
def __call__(self, *args: P.args, **kwargs: P.kwargs):
...
@@ -6180,7 +6180,7 @@ public class PyTypingTest extends PyTestCase {
// PY-77541
public void testParamSpecBoundToConcatenateInCustomGeneric() {
- doTest("MyCallable[Concatenate(int, ParamSpec(\"P2\")), R2]", """
+ doTest("MyCallable[Concatenate(int, **P2), R2]", """
from typing import Concatenate
class MyCallable[**P, R]: