/*******************************************************************************
* Copyright (c) 2008, 2012 Institute for Software, HSR Hochschule fuer Technik
* Rapperswil, University of applied sciences and others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Institute for Software - initial API and implementation
* Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.refactoring.extractfunction;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTPointerOperator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator;
import org.eclipse.cdt.internal.ui.refactoring.MethodContext;
import org.eclipse.cdt.internal.ui.refactoring.NameInformation;
import org.eclipse.cdt.internal.ui.refactoring.utils.VisibilityEnum;
public class ExtractFunctionInformation {
private VisibilityEnum visibility = VisibilityEnum.v_private;
private String methodName;
private boolean replaceDuplicates;
private List<NameInformation> parameters;
private NameInformation mandatoryReturnVariable;
private ICPPASTFunctionDeclarator declarator;
private MethodContext context;
private boolean isExtractExpression;
private boolean virtual;
/**
* Returns the function declarator of the method or function from were the statements
* are extracted from.
* @return the function declarator or null
*/
public ICPPASTFunctionDeclarator getDeclarator() {
return declarator;
}
public void setDeclarator(ICPPASTFunctionDeclarator declarator) {
this.declarator = declarator;
}
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
public boolean isReplaceDuplicates() {
return replaceDuplicates;
}
public void setReplaceDuplicates(boolean replaceDuplicates) {
this.replaceDuplicates = replaceDuplicates;
}
public NameInformation getReturnVariable() {
if (mandatoryReturnVariable != null)
return mandatoryReturnVariable;
for (NameInformation param : parameters) {
if (param.isReturnValue())
return param;
}
return null;
}
public NameInformation getMandatoryReturnVariable() {
return mandatoryReturnVariable;
}
public void setMandatoryReturnVariable(NameInformation variable) {
this.mandatoryReturnVariable = variable;
}
public List<NameInformation> getParameters() {
return parameters;
}
public void setParameters(List<NameInformation> parameters) {
this.parameters = new ArrayList<NameInformation>(parameters);
}
public VisibilityEnum getVisibility() {
return visibility;
}
public void setVisibility(VisibilityEnum visibility) {
this.visibility = visibility;
}
public MethodContext getMethodContext() {
return context;
}
public void setMethodContext(MethodContext context) {
this.context = context;
}
public boolean isExtractExpression() {
return isExtractExpression;
}
public void setExtractExpression(boolean isExtractExpression) {
this.isExtractExpression = isExtractExpression;
}
public boolean isVirtual() {
return virtual;
}
public void setVirtual(boolean isVirtual) {
this.virtual = isVirtual;
}
public void sortParameters(final boolean outFirst) {
Collections.sort(parameters, new Comparator<NameInformation>() {
@Override
public int compare(NameInformation p1, NameInformation p2) {
boolean out1 = p1.isOutputParameter() || hasNonConstPointerOrReference(p1);
boolean out2 = p2.isOutputParameter() || hasNonConstPointerOrReference(p2);
return out1 == out2 ? 0 : out1 == outFirst ? -1 : 1;
}
});
}
public static boolean hasNonConstPointerOrReference(NameInformation param) {
IASTDeclarator declarator = param.getDeclarator();
IASTPointerOperator[] operators = declarator.getPointerOperators();
if (operators.length != 0) {
IASTDeclSpecifier declSpecifier = param.getDeclSpecifier();
return declSpecifier == null || !declSpecifier.isConst();
}
return false;
}
}