/* * Copyright 2013 Guidewire Software, Inc. */ package gw.plugin.ij.refactor.signature; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiType; import com.intellij.refactoring.changeSignature.MethodDescriptor; import com.intellij.refactoring.changeSignature.ParameterInfoImpl; import com.intellij.util.VisibilityUtil; import gw.plugin.ij.lang.psi.api.statements.params.IGosuParameter; import gw.plugin.ij.lang.psi.api.statements.typedef.IGosuMethod; import gw.plugin.ij.lang.psi.api.types.IGosuTypeElement; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; public class GosuMethodDescriptor implements MethodDescriptor<ParameterInfoImpl, String> { private final IGosuMethod myMethod; private final ChangeSignatureHandler changeSignatureHandler; public GosuMethodDescriptor(IGosuMethod method, ChangeSignatureHandler changeSignatureHandler) { myMethod = method; this.changeSignatureHandler = changeSignatureHandler; } @Override public String getName() { return myMethod.getName(); } @Override public List<ParameterInfoImpl> getParameters() { final ArrayList<ParameterInfoImpl> result = new ArrayList<ParameterInfoImpl>(); final IGosuParameter[] parameters = myMethod.getParameterList().getParameters(); for (int i = 0; i < parameters.length; i++) { IGosuParameter parameter = parameters[i]; ChangeSignatureHandler.ParamInfo paramInfo = new ChangeSignatureHandler.ParamInfo(parameter.getType(), parameter.getName()); paramInfo = changeSignatureHandler.replaceParameter(paramInfo); ParameterInfoImpl info = new ParameterInfoImpl(i, paramInfo.paramName, paramInfo.type); info.setDefaultValue(""); result.add(info); } return result; } @Override public String getVisibility() { return VisibilityUtil.getVisibilityModifier(myMethod.getModifierList()); } @Override public PsiMethod getMethod() { return myMethod; } @Override public int getParametersCount() { return myMethod.getParameterList().getParametersCount(); } @Nullable public String getReturnTypeText() { IGosuTypeElement typeElement = myMethod.getReturnTypeElementGosu(); if (typeElement == null) { return null; } PsiType type = typeElement.getType(); String qName = type.getCanonicalText(); String replacedType = changeSignatureHandler.replaceReturnType(qName); if (!replacedType.equals(qName)) { return replacedType; } else { return typeElement.getText(); } } @Override public boolean canChangeVisibility() { PsiClass containingClass = myMethod.getContainingClass(); return containingClass != null && !containingClass.isInterface(); } @Override public boolean canChangeParameters() { return true; } @Override public ReadWriteOption canChangeReturnType() { return myMethod.isConstructor() ? ReadWriteOption.None : ReadWriteOption.ReadWrite; } @Override public boolean canChangeName() { return !myMethod.isConstructor(); } }