/******************************************************************************* * Copyright (c) 2011, 2013 Google, Inc 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: * Sergey Prigogin (Google) - initial API and implementation * Marc-Andre Laperle (Ericsson) *******************************************************************************/ package org.eclipse.cdt.internal.ui.refactoring.gettersandsetters; import com.ibm.icu.text.Collator; import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; public class AccessorDescriptor implements Comparable<AccessorDescriptor> { public enum AccessorKind { GETTER, SETTER; } private static final Collator collator = Collator.getInstance(); private final AccessorKind kind; private final String accessorName; private final IASTName fieldName; private AccessorFactory accessorFactory; private IASTSimpleDeclaration accessorDeclaration; private IASTSimpleDeclaration existingAccessorDeclaration; private IASTFunctionDefinition existingAccessorDefinition; public AccessorDescriptor(AccessorKind kind, String accessorName, FieldDescriptor fieldDescriptor) { GetterSetterContext context = fieldDescriptor.getContext(); this.kind = kind; this.accessorName = accessorName; this.fieldName = fieldDescriptor.getFieldName(); if (accessorName != null) { this.accessorFactory = AccessorFactory.createFactory(kind, fieldName, fieldDescriptor.getFieldDeclarator(), accessorName); this.accessorDeclaration = accessorFactory.createDeclaration(); for (IASTFunctionDefinition currentDefinition : context.existingFunctionDefinitions) { if (currentDefinition.getDeclarator().getName().toString().equals(accessorName)) { existingAccessorDefinition = currentDefinition; } } for (IASTSimpleDeclaration currentDeclaration : context.existingFunctionDeclarations) { if (GetterSetterContext.getDeclarationName(currentDeclaration).toString().equals(accessorName)) { existingAccessorDeclaration = currentDeclaration; } } } } boolean canBeGenerated() { return accessorName != null && existingAccessorDeclaration == null && existingAccessorDefinition == null; } public AccessorKind getKind() { return kind; } public IASTName getFieldName() { return fieldName; } @Override public int compareTo(AccessorDescriptor other) { int c = collator.compare(fieldName.toString(), other.fieldName.toString()); if (c != 0) return c; return kind.ordinal() - other.kind.ordinal(); } @Override public boolean equals(Object obj) { if (!(obj instanceof AccessorDescriptor)) return false; AccessorDescriptor other = (AccessorDescriptor) obj; return fieldName == other.fieldName && kind == other.kind; } @Override public String toString() { return accessorName; } public IASTSimpleDeclaration getAccessorDeclaration() { return accessorDeclaration; } public IASTFunctionDefinition getAccessorDefinition(IASTName declaratorName) { return accessorFactory.createDefinition(declaratorName); } }