void (PyChangeInfo changeInfo, PyFunction baseMethod) { final PsiElement parameterList = baseMethod.getParameterList(); final PyParameterInfo[] parameters = changeInfo.getNewParameters(); final StringBuilder builder = new StringBuilder("def foo("); final PyStringLiteralExpression docstring = baseMethod.getDocStringExpression(); final PyParameter[] oldParameters = baseMethod.getParameterList().getParameters(); final PyElementGenerator generator = PyElementGenerator.getInstance(baseMethod.getProject()); final PyDocstringGenerator docStringGenerator = PyDocstringGenerator.forDocStringOwner(baseMethod); boolean newParameterInDocString = false; for (int i = 0; i < parameters.length; ++i) { final PyParameterInfo info = parameters[i]; final int oldIndex = info.getOldIndex(); if (i != 0 && oldIndex < oldParameters.length) { builder.append(", "); } if (docstring != null && oldIndex < 0) { newParameterInDocString = true; docStringGenerator.withParam(info.getName()); } if (oldIndex < oldParameters.length) { builder.append(info.getName()); } if (oldIndex >= 0 && oldIndex < oldParameters.length) { final PyParameter parameter = oldParameters[oldIndex]; if (parameter instanceof PyNamedParameter) { final PyAnnotation annotation = ((PyNamedParameter)parameter).getAnnotation(); if (annotation != null) { builder.append(annotation.getText()); } } } final String defaultValue = info.getDefaultValue(); if (defaultValue != null && info.getDefaultInSignature() && StringUtil.isNotEmpty(defaultValue)) { builder.append(" = ").append(defaultValue); } } builder.append("): pass"); if (newParameterInDocString) { docStringGenerator.buildAndInsert(); } final PyParameterList newParameterList = generator.createFromText(LanguageLevel.forElement(baseMethod), PyFunction.class, builder.toString()).getParameterList(); parameterList.replace(newParameterList); }