diff --git a/python/src/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureUsageProcessor.java b/python/src/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureUsageProcessor.java index de4301cd8554..b3190a780ae7 100644 --- a/python/src/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureUsageProcessor.java +++ b/python/src/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureUsageProcessor.java @@ -110,8 +110,12 @@ public class PyChangeSignatureUsageProcessor implements ChangeSignatureUsageProc final PyElementGenerator elementGenerator = PyElementGenerator.getInstance(element.getProject()); StringBuilder builder = buildSignature((PyChangeInfo)changeInfo, call); - final PyExpression newCall = - elementGenerator.createExpressionFromText(LanguageLevel.forElement(element), builder.toString()); + final PyExpression newCall; + if (call instanceof PyDecorator) { + newCall = elementGenerator.createDecoratorList("@" + builder.toString()).getDecorators()[0]; + } + else + newCall = elementGenerator.createExpressionFromText(LanguageLevel.forElement(element), builder.toString()); call.replace(newCall); return true; diff --git a/python/testData/refactoring/changeSignature/decorator.after.py b/python/testData/refactoring/changeSignature/decorator.after.py new file mode 100644 index 000000000000..83350ab3d01c --- /dev/null +++ b/python/testData/refactoring/changeSignature/decorator.after.py @@ -0,0 +1,10 @@ + +def decorator(arg1): + print('Wrapped with', arg1, arg2) + def wraps(f): + return f + return wraps + +@decorator('arg1') +def do_things(): + print('Things done') \ No newline at end of file diff --git a/python/testData/refactoring/changeSignature/decorator.before.py b/python/testData/refactoring/changeSignature/decorator.before.py new file mode 100644 index 000000000000..dfdc89fbeb3f --- /dev/null +++ b/python/testData/refactoring/changeSignature/decorator.before.py @@ -0,0 +1,10 @@ + +def decorator(arg1, arg2): + print('Wrapped with', arg1, arg2) + def wraps(f): + return f + return wraps + +@decorator('arg1', 'arg2') +def do_things(): + print('Things done') \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureTest.java b/python/testSrc/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureTest.java index a9984f63c340..fd7bb1e6e5dd 100644 --- a/python/testSrc/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureTest.java +++ b/python/testSrc/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureTest.java @@ -31,7 +31,7 @@ import java.util.List; /** * User : ktisha */ -@TestDataPath("$CONTENT_ROOT/../testData/refactoring/changeSignature/") +@TestDataPath("$CONTENT_ROOT/../testData/") public class PyChangeSignatureTest extends PyTestCase { public void testChooseSuperMethod() { @@ -176,6 +176,10 @@ public class PyChangeSignatureTest extends PyTestCase { PyBundle.message("refactoring.change.signature.dialog.validation.parameter.name")); } + public void testDecorator() { + doChangeSignatureTest("decorator", Arrays.asList(new PyParameterInfo(0, "arg1", null, false))); + } + public void testNonDefaultAfterDefault() { doValidationTest(null, Arrays.asList(new PyParameterInfo(-1, "a", "2", false), new PyParameterInfo(1, "b", "2", false)), null); }