/******************************************************************************* * Copyright (c) 2000, 2004 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package net.sourceforge.phpdt.internal.corext.codemanipulation; import net.sourceforge.phpdt.core.Flags; import net.sourceforge.phpdt.core.IField; import net.sourceforge.phpdt.core.IJavaProject; import net.sourceforge.phpdt.core.IMethod; import net.sourceforge.phpdt.core.IType; import net.sourceforge.phpdt.core.JavaModelException; import net.sourceforge.phpdt.core.NamingConventions; import net.sourceforge.phpdt.core.Signature; import net.sourceforge.phpdt.internal.corext.util.JavaModelUtil; import net.sourceforge.phpdt.internal.corext.util.JdtFlags; import net.sourceforge.phpdt.ui.CodeGeneration; import net.sourceforge.phpdt.ui.PreferenceConstants; import org.eclipse.core.runtime.CoreException; public class GetterSetterUtil { private static final String[] EMPTY = new String[0]; // no instances private GetterSetterUtil() { } public static String getGetterName(IField field, String[] excludedNames) throws JavaModelException { boolean useIs = PreferenceConstants.getPreferenceStore().getBoolean( PreferenceConstants.CODEGEN_IS_FOR_GETTERS); return getGetterName(field, excludedNames, useIs); } private static String getGetterName(IField field, String[] excludedNames, boolean useIsForBoolGetters) throws JavaModelException { if (excludedNames == null) { excludedNames = EMPTY; } return getGetterName(field.getJavaProject(), field.getElementName(), field.getFlags(), useIsForBoolGetters && JavaModelUtil.isBoolean(field), excludedNames); } public static String getGetterName(IJavaProject project, String fieldName, int flags, boolean isBoolean, String[] excludedNames) { return NamingConventions.suggestGetterName(project, fieldName, flags, isBoolean, excludedNames); } public static String getSetterName(IJavaProject project, String fieldName, int flags, boolean isBoolean, String[] excludedNames) { return NamingConventions.suggestSetterName(project, fieldName, flags, isBoolean, excludedNames); } public static String getSetterName(IField field, String[] excludedNames) throws JavaModelException { if (excludedNames == null) { excludedNames = EMPTY; } return NamingConventions.suggestSetterName(field.getJavaProject(), field.getElementName(), field.getFlags(), JavaModelUtil .isBoolean(field), excludedNames); } public static IMethod getGetter(IField field) throws JavaModelException { IMethod primaryCandidate = JavaModelUtil.findMethod(getGetterName( field, EMPTY, true), new String[0], false, field .getDeclaringType()); if (!JavaModelUtil.isBoolean(field) || (primaryCandidate != null && primaryCandidate.exists())) return primaryCandidate; // bug 30906 describes why we need to look for other alternatives here String secondCandidateName = getGetterName(field, EMPTY, false); return JavaModelUtil.findMethod(secondCandidateName, new String[0], false, field.getDeclaringType()); } public static IMethod getSetter(IField field) throws JavaModelException { String[] args = new String[] { field.getTypeSignature() }; return JavaModelUtil.findMethod(getSetterName(field, EMPTY), args, false, field.getDeclaringType()); } /** * Create a stub for a getter of the given field using getter/setter * templates. The resulting code has to be formatted and indented. * * @param field * The field to create a getter for * @param setterName * The chosen name for the setter * @param addComments * If true, comments will be added. * @param flags * The flags signaling visibility, if static, synchronized or * final * @return Returns the generated stub. * @throws CoreException */ public static String getSetterStub(IField field, String setterName, boolean addComments, int flags) throws CoreException { String fieldName = field.getElementName(); IType parentType = field.getDeclaringType(); String returnSig = field.getTypeSignature(); String typeName = Signature.toString(returnSig); IJavaProject project = field.getJavaProject(); String accessorName = NamingConventions .removePrefixAndSuffixForFieldName(project, fieldName, field .getFlags()); String argname = StubUtility.suggestArgumentName(project, accessorName, EMPTY); boolean isStatic = Flags.isStatic(flags); // boolean isSync= Flags.isSynchronized(flags); boolean isFinal = Flags.isFinal(flags); // create the setter stub StringBuffer buf = new StringBuffer(); if (addComments) { String comment = CodeGeneration.getSetterComment(field .getCompilationUnit(), parentType.getTypeQualifiedName('.'), setterName, field .getElementName(), typeName, argname, accessorName, String.valueOf('\n')); if (comment != null) { buf.append(comment); buf.append('\n'); } } buf.append(JdtFlags.getVisibilityString(flags)); buf.append(' '); if (isStatic) buf.append("static "); //$NON-NLS-1$ // if (isSync) // buf.append("synchronized "); //$NON-NLS-1$ if (isFinal) buf.append("final "); //$NON-NLS-1$ buf.append("void "); //$NON-NLS-1$ buf.append(setterName); buf.append('('); buf.append(typeName); buf.append(' '); buf.append(argname); buf.append(") {\n"); //$NON-NLS-1$ boolean useThis = PreferenceConstants.getPreferenceStore().getBoolean( PreferenceConstants.CODEGEN_KEYWORD_THIS); if (argname.equals(fieldName) || (useThis && !isStatic)) { if (isStatic) fieldName = parentType.getElementName() + '.' + fieldName; else fieldName = "this." + fieldName; //$NON-NLS-1$ } String body = CodeGeneration.getSetterMethodBodyContent(field .getCompilationUnit(), parentType.getTypeQualifiedName('.'), setterName, fieldName, argname, String.valueOf('\n')); if (body != null) { buf.append(body); } buf.append("}\n"); //$NON-NLS-1$ return buf.toString(); } /** * Create a stub for a getter of the given field using getter/setter * templates. The resulting code has to be formatted and indented. * * @param field * The field to create a getter for * @param getterName * The chosen name for the getter * @param addComments * If true, comments will be added. * @param flags * The flags signaling visibility, if static, synchronized or * final * @return Returns the generated stub. * @throws CoreException */ public static String getGetterStub(IField field, String getterName, boolean addComments, int flags) throws CoreException { String fieldName = field.getElementName(); IType parentType = field.getDeclaringType(); boolean isStatic = Flags.isStatic(flags); // boolean isSync= Flags.isSynchronized(flags); boolean isFinal = Flags.isFinal(flags); String typeName = Signature.toString(field.getTypeSignature()); String accessorName = NamingConventions .removePrefixAndSuffixForFieldName(field.getJavaProject(), fieldName, field.getFlags()); // create the getter stub StringBuffer buf = new StringBuffer(); if (addComments) { String comment = CodeGeneration.getGetterComment(field .getCompilationUnit(), parentType.getTypeQualifiedName('.'), getterName, field .getElementName(), typeName, accessorName, String .valueOf('\n')); if (comment != null) { buf.append(comment); buf.append('\n'); } } buf.append(JdtFlags.getVisibilityString(flags)); buf.append(' '); if (isStatic) buf.append("static "); //$NON-NLS-1$ // if (isSync) // buf.append("synchronized "); //$NON-NLS-1$ if (isFinal) buf.append("final "); //$NON-NLS-1$ buf.append(typeName); buf.append(' '); buf.append(getterName); buf.append("() {\n"); //$NON-NLS-1$ boolean useThis = PreferenceConstants.getPreferenceStore().getBoolean( PreferenceConstants.CODEGEN_KEYWORD_THIS); if (useThis && !isStatic) { fieldName = "this." + fieldName; //$NON-NLS-1$ } String body = CodeGeneration.getGetterMethodBodyContent(field .getCompilationUnit(), parentType.getTypeQualifiedName('.'), getterName, fieldName, String.valueOf('\n')); if (body != null) { buf.append(body); } buf.append("}\n"); //$NON-NLS-1$ return buf.toString(); } }