/*******************************************************************************
* Copyright (c) 2008, 2011 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.gettersandsetters;
import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTNode.CopyStyle;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTQualifiedName;
public class GetterSetterInsertEditProvider implements Comparable<GetterSetterInsertEditProvider> {
public enum AccessorKind {
GETTER,
SETTER;
}
private IASTSimpleDeclaration functionDeclaration;
private AccessorKind kind;
private IASTName fieldName;
private IASTSimpleDeclaration fieldDeclaration;
public GetterSetterInsertEditProvider(IASTName fieldName, IASTSimpleDeclaration fieldDeclaration,
AccessorKind kind) {
this.kind = kind;
this.fieldName = fieldName;
this.fieldDeclaration = fieldDeclaration;
createFunctionDeclaration();
}
public void createFunctionDeclaration() {
switch (this.kind) {
case GETTER:
this.functionDeclaration = FunctionFactory.createGetterDeclaration(fieldName, fieldDeclaration);
break;
case SETTER:
this.functionDeclaration = FunctionFactory.createSetterDeclaration(fieldName, fieldDeclaration);
break;
}
}
@Override
public String toString() {
IASTDeclarator declarator = functionDeclaration.getDeclarators()[0];
while (declarator.getNestedDeclarator() != null) {
declarator = declarator.getNestedDeclarator();
}
return declarator.getName().toString();
}
public IASTFunctionDefinition getFunctionDefinition(boolean qualifedName) {
IASTFunctionDefinition definition = null;
ICPPASTQualifiedName qname;
if (qualifedName) {
qname = getClassname();
} else {
qname = null;
}
switch (kind) {
case GETTER:
definition = FunctionFactory.createGetterDefinition(fieldName, fieldDeclaration, qname);
break;
case SETTER:
definition = FunctionFactory.createSetterDefinition(fieldName, fieldDeclaration, qname);
break;
}
return definition;
}
private ICPPASTQualifiedName getClassname() {
IASTNode n = fieldDeclaration.getParent();
while (!(n instanceof IASTCompositeTypeSpecifier)) {
n = n.getParent();
}
IASTCompositeTypeSpecifier comp = (IASTCompositeTypeSpecifier) n;
CPPASTQualifiedName qname = new CPPASTQualifiedName();
qname.addName(comp.getName().copy(CopyStyle.withLocations));
return qname;
}
public IASTSimpleDeclaration getFunctionDeclaration() {
return functionDeclaration;
}
public AccessorKind getType() {
return kind;
}
public int compareTo(GetterSetterInsertEditProvider o) {
return toString().compareTo(o.toString());
}
}