/* * Copyright (C) 2006, 2007 Dennis Hunziker, Ueli Kistler * Copyright (C) 2007 Reto Schuettel, Robin Stocker * * IFS Institute for Software, HSR Rapperswil, Switzerland * */ package org.python.pydev.refactoring.codegenerator.overridemethods.edit; import org.python.pydev.parser.jython.SimpleNode; import org.python.pydev.parser.jython.ast.Attribute; import org.python.pydev.parser.jython.ast.Call; import org.python.pydev.parser.jython.ast.FunctionDef; import org.python.pydev.parser.jython.ast.Name; import org.python.pydev.parser.jython.ast.NameTok; import org.python.pydev.parser.jython.ast.Return; import org.python.pydev.parser.jython.ast.argumentsType; import org.python.pydev.parser.jython.ast.exprType; import org.python.pydev.parser.jython.ast.stmtType; import org.python.pydev.refactoring.ast.adapters.FunctionDefAdapter; import org.python.pydev.refactoring.codegenerator.overridemethods.request.OverrideMethodsRequest; import org.python.pydev.refactoring.core.edit.AbstractInsertEdit; public class MethodEdit extends AbstractInsertEdit { private int offsetStrategy; private FunctionDefAdapter method; private String baseClassName; public MethodEdit(OverrideMethodsRequest req) { super(req); this.method = req.method; this.baseClassName = req.getBaseClassName(); this.offsetStrategy = req.offsetStrategy; } @Override protected SimpleNode getEditNode() { FunctionDef origin = method.getASTNode(); stmtType[] body = initBody(origin); return new FunctionDef(origin.name, origin.args, body, null, null); } private stmtType[] initBody(FunctionDef origin) { stmtType[] body = new stmtType[1]; body[0] = new Return(createBaseClassCall(origin)); return body; } private Call createBaseClassCall(FunctionDef origin) { exprType[] args = null; exprType starargs = null; exprType kwargs = null; if (origin.args != null) { args = extractArgs(origin.args); starargs = extractStarargs(origin.args); kwargs = extractKwargs(origin.args); } Call funCall = new Call(createAttribute(), args, null, starargs, kwargs); return funCall; } private exprType extractKwargs(argumentsType argType) { NameTok kwarg = (NameTok) argType.kwarg; if (kwarg != null) { return new Name(kwarg.id, Name.Load, false); } else { return null; } } private exprType extractStarargs(argumentsType argType) { NameTok vararg = (NameTok) argType.vararg; if (vararg != null) { return new Name(vararg.id, Name.Load, false); } else { return null; } } private exprType[] extractArgs(argumentsType argType) { exprType[] ret = new exprType[argType.args.length]; for (int i = 0; i < ret.length; i++) { ret[i] = (exprType) argType.args[i].createCopy(); } return ret; } private Attribute createAttribute() { return new Attribute(new Name(baseClassName, Name.Load, false), new NameTok(method.getName(), NameTok.Attrib), Attribute.Load); } @Override public int getOffsetStrategy() { return offsetStrategy; } }