X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/codemanipulation/StubUtility.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/codemanipulation/StubUtility.java index 4e0f8f8..10b0b08 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/codemanipulation/StubUtility.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/codemanipulation/StubUtility.java @@ -43,1027 +43,1262 @@ import org.eclipse.jface.text.templates.TemplateVariable; import org.eclipse.swt.SWT; public class StubUtility { - - + public static class GenStubSettings extends CodeGenerationSettings { - - public boolean callSuper; - public boolean methodOverwrites; - public boolean noBody; - public int methodModifiers; - - public GenStubSettings(CodeGenerationSettings settings) { - settings.setSettings(this); - methodModifiers= -1; - } - - } - - private static final String[] EMPTY= new String[0]; - - /** - * Generates a method stub including the method comment. Given a template - * method, a stub with the same signature will be constructed so it can be - * added to a type. The method body will be empty or contain a return or - * super call. - * @param destTypeName The name of the type to which the method will be - * added to - * @param method A method template (method belongs to different type than the parent) - * @param definingType The type that defines the method. - * @param settings Options as defined above (GenStubSettings) - * @param imports Imports required by the stub are added to the imports structure. If imports structure is null - * all type names are qualified. - * @throws JavaModelException - */ - public static String genStub(ICompilationUnit cu, String destTypeName, IMethod method, IType definingType, GenStubSettings settings) throws CoreException { - //IImportsStructure imports) throws CoreException { - String methName= method.getElementName(); - String[] paramNames= suggestArgumentNames(method.getJavaProject(), method.getParameterNames()); - String returnType= method.isConstructor() ? null : method.getReturnType(); - String lineDelimiter= String.valueOf('\n'); // reformatting required - - - StringBuffer buf= new StringBuffer(); - // add method comment - if (settings.createComments && cu != null) { - IMethod overridden= null; - if (settings.methodOverwrites && returnType != null) { - overridden= JavaModelUtil.findMethod(methName, method.getParameterTypes(), false, definingType.getMethods()); - } - String comment= getMethodComment(cu, destTypeName, methName, paramNames, method.getExceptionTypes(), returnType, overridden, lineDelimiter); - if (comment != null) { - buf.append(comment); - } else { - buf.append("/**").append(lineDelimiter); //$NON-NLS-1$ - buf.append(" *").append(lineDelimiter); //$NON-NLS-1$ - buf.append(" */").append(lineDelimiter); //$NON-NLS-1$ - } - buf.append(lineDelimiter); - } - // add method declaration - String bodyContent= null; - if (!settings.noBody) { - String bodyStatement= getDefaultMethodBodyStatement(methName, paramNames, returnType, settings.callSuper); - bodyContent= getMethodBodyContent(returnType == null, method.getJavaProject(), destTypeName, methName, bodyStatement, lineDelimiter); - if (bodyContent == null) { - bodyContent= ""; //$NON-NLS-1$ - } - } - int flags= settings.methodModifiers; - if (flags == -1) { - flags= method.getFlags(); - } - - genMethodDeclaration(destTypeName, method, flags, bodyContent, buf); // imports, buf); - return buf.toString(); - } - /** - * Generates a method stub not including the method comment. Given a - * template method and the body content, a stub with the same signature will - * be constructed so it can be added to a type. - * @param destTypeName The name of the type to which the method will be - * added to - * @param method A method template (method belongs to different type than the parent) - * @param bodyContent Content of the body - * @param imports Imports required by the stub are added to the imports - * structure. If imports structure is null all type names are - * qualified. - * @param buf The buffer to append the gerenated code. - * @throws JavaModelException - */ - public static void genMethodDeclaration(String destTypeName, IMethod method, String bodyContent, StringBuffer buf) throws CoreException { // IImportsStructure imports, StringBuffer buf) throws CoreException { - genMethodDeclaration(destTypeName, method, method.getFlags(), bodyContent, buf); + public boolean callSuper; + + public boolean methodOverwrites; + + public boolean noBody; + + public int methodModifiers; + + public GenStubSettings(CodeGenerationSettings settings) { + settings.setSettings(this); + methodModifiers = -1; } - - /** - * Generates a method stub not including the method comment. Given a - * template method and the body content, a stub with the same signature will - * be constructed so it can be added to a type. - * @param destTypeName The name of the type to which the method will be - * added to - * @param method A method template (method belongs to different type than the parent) - * @param bodyContent Content of the body - * @param imports Imports required by the stub are added to the imports - * structure. If imports structure is null all type names are - * qualified. - * @param buf The buffer to append the gerenated code. - * @throws JavaModelException - */ - public static void genMethodDeclaration(String destTypeName, IMethod method, int flags, String bodyContent, StringBuffer buf) throws CoreException { - //IImportsStructure imports, StringBuffer buf) throws CoreException { - IType parentType= method.getDeclaringType(); - String methodName= method.getElementName(); - String[] paramTypes= method.getParameterTypes(); - String[] paramNames= suggestArgumentNames(parentType.getJavaProject(), method.getParameterNames()); - - String[] excTypes= method.getExceptionTypes(); - - boolean isConstructor= method.isConstructor(); - String retTypeSig= isConstructor ? null : method.getReturnType(); - - int lastParam= paramTypes.length -1; - - if (Flags.isPublic(flags) || (parentType.isInterface() && bodyContent != null)) { - buf.append("public "); //$NON-NLS-1$ - } else if (Flags.isProtected(flags)) { - buf.append("protected "); //$NON-NLS-1$ - } else if (Flags.isPrivate(flags)) { - buf.append("private "); //$NON-NLS-1$ + + } + + private static final String[] EMPTY = new String[0]; + + /** + * Generates a method stub including the method comment. Given a template + * method, a stub with the same signature will be constructed so it can be + * added to a type. The method body will be empty or contain a return or + * super call. + * + * @param destTypeName + * The name of the type to which the method will be added to + * @param method + * A method template (method belongs to different type than the + * parent) + * @param definingType + * The type that defines the method. + * @param settings + * Options as defined above (GenStubSettings) + * @param imports + * Imports required by the stub are added to the imports + * structure. If imports structure is null all + * type names are qualified. + * @throws JavaModelException + */ + public static String genStub(ICompilationUnit cu, String destTypeName, + IMethod method, IType definingType, GenStubSettings settings) + throws CoreException { + // IImportsStructure imports) throws CoreException { + String methName = method.getElementName(); + String[] paramNames = suggestArgumentNames(method.getJavaProject(), + method.getParameterNames()); + String returnType = method.isConstructor() ? null : method + .getReturnType(); + String lineDelimiter = String.valueOf('\n'); // reformatting required + + StringBuffer buf = new StringBuffer(); + // add method comment + if (settings.createComments && cu != null) { + IMethod overridden = null; + if (settings.methodOverwrites && returnType != null) { + overridden = JavaModelUtil.findMethod(methName, method + .getParameterTypes(), false, definingType.getMethods()); } -// if (Flags.isSynchronized(flags)) { -// buf.append("synchronized "); //$NON-NLS-1$ -// } -// if (Flags.isVolatile(flags)) { -// buf.append("volatile "); //$NON-NLS-1$ -// } -// if (Flags.isStrictfp(flags)) { -// buf.append("strictfp "); //$NON-NLS-1$ -// } - if (Flags.isStatic(flags)) { - buf.append("static "); //$NON-NLS-1$ - } - - if (isConstructor) { - buf.append(destTypeName); + String comment = getMethodComment(cu, destTypeName, methName, + paramNames, method.getExceptionTypes(), returnType, + overridden, lineDelimiter); + if (comment != null) { + buf.append(comment); } else { - String retTypeFrm; - if (!isPrimitiveType(retTypeSig)) { - retTypeFrm= resolveAndAdd(retTypeSig, parentType); - } else { - retTypeFrm= Signature.toString(retTypeSig); - } - buf.append(retTypeFrm); - buf.append(' '); - buf.append(methodName); - } - buf.append('('); - for (int i= 0; i <= lastParam; i++) { - String paramTypeSig= paramTypes[i]; - String paramTypeFrm; - - if (!isPrimitiveType(paramTypeSig)) { - paramTypeFrm= resolveAndAdd(paramTypeSig, parentType); - } else { - paramTypeFrm= Signature.toString(paramTypeSig); - } - buf.append(paramTypeFrm); - buf.append(' '); - buf.append(paramNames[i]); - if (i < lastParam) { - buf.append(", "); //$NON-NLS-1$ - } - } - buf.append(')'); - - int lastExc= excTypes.length - 1; - if (lastExc >= 0) { - buf.append(" throws "); //$NON-NLS-1$ - for (int i= 0; i <= lastExc; i++) { - String excTypeSig= excTypes[i]; - String excTypeFrm= resolveAndAdd(excTypeSig, parentType); - buf.append(excTypeFrm); - if (i < lastExc) { - buf.append(", "); //$NON-NLS-1$ - } - } + buf.append("/**").append(lineDelimiter); //$NON-NLS-1$ + buf.append(" *").append(lineDelimiter); //$NON-NLS-1$ + buf.append(" */").append(lineDelimiter); //$NON-NLS-1$ } + buf.append(lineDelimiter); + } + // add method declaration + String bodyContent = null; + if (!settings.noBody) { + String bodyStatement = getDefaultMethodBodyStatement(methName, + paramNames, returnType, settings.callSuper); + bodyContent = getMethodBodyContent(returnType == null, method + .getJavaProject(), destTypeName, methName, bodyStatement, + lineDelimiter); if (bodyContent == null) { - buf.append(";\n\n"); //$NON-NLS-1$ - } else { - buf.append(" {\n\t"); //$NON-NLS-1$ - if ((bodyContent != null) && (bodyContent.length() > 0)) { - buf.append(bodyContent); - buf.append('\n'); - } - buf.append("}\n"); //$NON-NLS-1$ + bodyContent = ""; //$NON-NLS-1$ } } - - public static String getDefaultMethodBodyStatement(String methodName, String[] paramNames, String retTypeSig, boolean callSuper) { - StringBuffer buf= new StringBuffer(); - if (callSuper) { - if (retTypeSig != null) { - if (!Signature.SIG_VOID.equals(retTypeSig)) { - buf.append("return "); //$NON-NLS-1$ - } - buf.append("super."); //$NON-NLS-1$ - buf.append(methodName); - } else { - buf.append("super"); //$NON-NLS-1$ - } - buf.append('('); - for (int i= 0; i < paramNames.length; i++) { - if (i > 0) { - buf.append(", "); //$NON-NLS-1$ - } - buf.append(paramNames[i]); - } - buf.append(");"); //$NON-NLS-1$ - } else { - if (retTypeSig != null && !retTypeSig.equals(Signature.SIG_VOID)) { - if (!isPrimitiveType(retTypeSig) || Signature.getArrayCount(retTypeSig) > 0) { - buf.append("return null;"); //$NON-NLS-1$ - } else if (retTypeSig.equals(Signature.SIG_BOOLEAN)) { - buf.append("return false;"); //$NON-NLS-1$ - } else { - buf.append("return 0;"); //$NON-NLS-1$ - } - } - } - return buf.toString(); - } + int flags = settings.methodModifiers; + if (flags == -1) { + flags = method.getFlags(); + } - public static String getMethodBodyContent(boolean isConstructor, IJavaProject project, String destTypeName, String methodName, String bodyStatement, String lineDelimiter) throws CoreException { - String templateName= isConstructor ? CodeTemplateContextType.CONSTRUCTORSTUB : CodeTemplateContextType.METHODSTUB; - Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(templateName); - if (template == null) { - return bodyStatement; - } - CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), project, lineDelimiter); - context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, methodName); - context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, destTypeName); - context.setVariable(CodeTemplateContextType.BODY_STATEMENT, bodyStatement); - String str= evaluateTemplate(context, template); - if (str == null && !Strings.containsOnlyWhitespaces(bodyStatement)) { - return bodyStatement; - } - return str; + genMethodDeclaration(destTypeName, method, flags, bodyContent, buf); // imports, + // buf); + return buf.toString(); + } + + /** + * Generates a method stub not including the method comment. Given a + * template method and the body content, a stub with the same signature will + * be constructed so it can be added to a type. + * + * @param destTypeName + * The name of the type to which the method will be added to + * @param method + * A method template (method belongs to different type than the + * parent) + * @param bodyContent + * Content of the body + * @param imports + * Imports required by the stub are added to the imports + * structure. If imports structure is null all + * type names are qualified. + * @param buf + * The buffer to append the gerenated code. + * @throws JavaModelException + */ + public static void genMethodDeclaration(String destTypeName, + IMethod method, String bodyContent, StringBuffer buf) + throws CoreException { // IImportsStructure imports, StringBuffer + // buf) throws CoreException { + genMethodDeclaration(destTypeName, method, method.getFlags(), + bodyContent, buf); + } + + /** + * Generates a method stub not including the method comment. Given a + * template method and the body content, a stub with the same signature will + * be constructed so it can be added to a type. + * + * @param destTypeName + * The name of the type to which the method will be added to + * @param method + * A method template (method belongs to different type than the + * parent) + * @param bodyContent + * Content of the body + * @param imports + * Imports required by the stub are added to the imports + * structure. If imports structure is null all + * type names are qualified. + * @param buf + * The buffer to append the gerenated code. + * @throws JavaModelException + */ + public static void genMethodDeclaration(String destTypeName, + IMethod method, int flags, String bodyContent, StringBuffer buf) + throws CoreException { + // IImportsStructure imports, StringBuffer buf) throws CoreException { + IType parentType = method.getDeclaringType(); + String methodName = method.getElementName(); + String[] paramTypes = method.getParameterTypes(); + String[] paramNames = suggestArgumentNames(parentType.getJavaProject(), + method.getParameterNames()); + + String[] excTypes = method.getExceptionTypes(); + + boolean isConstructor = method.isConstructor(); + String retTypeSig = isConstructor ? null : method.getReturnType(); + + int lastParam = paramTypes.length - 1; + + if (Flags.isPublic(flags) + || (parentType.isInterface() && bodyContent != null)) { + buf.append("public "); //$NON-NLS-1$ + } else if (Flags.isProtected(flags)) { + buf.append("protected "); //$NON-NLS-1$ + } else if (Flags.isPrivate(flags)) { + buf.append("private "); //$NON-NLS-1$ } - - public static String getGetterMethodBodyContent(IJavaProject project, String destTypeName, String methodName, String fieldName, String lineDelimiter) throws CoreException { - String templateName= CodeTemplateContextType.GETTERSTUB; - Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(templateName); - if (template == null) { - return null; - } - CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), project, lineDelimiter); - context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, methodName); - context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, destTypeName); - context.setVariable(CodeTemplateContextType.FIELD, fieldName); - - return evaluateTemplate(context, template); + // if (Flags.isSynchronized(flags)) { + // buf.append("synchronized "); //$NON-NLS-1$ + // } + // if (Flags.isVolatile(flags)) { + // buf.append("volatile "); //$NON-NLS-1$ + // } + // if (Flags.isStrictfp(flags)) { + // buf.append("strictfp "); //$NON-NLS-1$ + // } + if (Flags.isStatic(flags)) { + buf.append("static "); //$NON-NLS-1$ } - - public static String getSetterMethodBodyContent(IJavaProject project, String destTypeName, String methodName, String fieldName, String paramName, String lineDelimiter) throws CoreException { - String templateName= CodeTemplateContextType.SETTERSTUB; - Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(templateName); - if (template == null) { - return null; + + if (isConstructor) { + buf.append(destTypeName); + } else { + String retTypeFrm; + if (!isPrimitiveType(retTypeSig)) { + retTypeFrm = resolveAndAdd(retTypeSig, parentType); + } else { + retTypeFrm = Signature.toString(retTypeSig); } - CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), project, lineDelimiter); - context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, methodName); - context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, destTypeName); - context.setVariable(CodeTemplateContextType.FIELD, fieldName); - context.setVariable(CodeTemplateContextType.FIELD_TYPE, fieldName); - context.setVariable(CodeTemplateContextType.PARAM, paramName); - - return evaluateTemplate(context, template); + buf.append(retTypeFrm); + buf.append(' '); + buf.append(methodName); } - - public static String getCatchBodyContent(ICompilationUnit cu, String exceptionType, String variableName, String lineDelimiter) throws CoreException { - Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(CodeTemplateContextType.CATCHBLOCK); - if (template == null) { - return null; - } + buf.append('('); + for (int i = 0; i <= lastParam; i++) { + String paramTypeSig = paramTypes[i]; + String paramTypeFrm; - CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), cu.getJavaProject(), lineDelimiter); - context.setVariable(CodeTemplateContextType.EXCEPTION_TYPE, exceptionType); - context.setVariable(CodeTemplateContextType.EXCEPTION_VAR, variableName); //$NON-NLS-1$ - return evaluateTemplate(context, template); - } - - /** - * @see net.sourceforge.phpdt.ui.CodeGeneration#getTypeComment(ICompilationUnit, String, String) - */ - public static String getCompilationUnitContent(ICompilationUnit cu, String typeComment, String typeContent, String lineDelimiter) throws CoreException { - IPackageFragment pack= (IPackageFragment) cu.getParent(); - String packDecl= pack.isDefaultPackage() ? "" : "package " + pack.getElementName() + ';'; //$NON-NLS-1$ //$NON-NLS-2$ - - Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(CodeTemplateContextType.NEWTYPE); - if (template == null) { - return null; + if (!isPrimitiveType(paramTypeSig)) { + paramTypeFrm = resolveAndAdd(paramTypeSig, parentType); + } else { + paramTypeFrm = Signature.toString(paramTypeSig); } - - IJavaProject project= cu.getJavaProject(); - CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), project, lineDelimiter); - context.setCompilationUnitVariables(cu); - context.setVariable(CodeTemplateContextType.PACKAGE_DECLARATION, packDecl); - context.setVariable(CodeTemplateContextType.TYPE_COMMENT, typeComment != null ? typeComment : ""); //$NON-NLS-1$ - context.setVariable(CodeTemplateContextType.TYPE_DECLARATION, typeContent); - context.setVariable(CodeTemplateContextType.TYPENAME, Signature.getQualifier(cu.getElementName())); - return evaluateTemplate(context, template); - } - - /* - * @see net.sourceforge.phpdt.ui.CodeGeneration#getTypeComment(ICompilationUnit, String, String) - */ - public static String getTypeComment(ICompilationUnit cu, String typeQualifiedName, String lineDelim) throws CoreException { - Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(CodeTemplateContextType.TYPECOMMENT); - if (template == null) { - return null; + buf.append(paramTypeFrm); + buf.append(' '); + buf.append(paramNames[i]); + if (i < lastParam) { + buf.append(", "); //$NON-NLS-1$ } - CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), cu.getJavaProject(), lineDelim); - context.setCompilationUnitVariables(cu); - context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, Signature.getQualifier(typeQualifiedName)); - context.setVariable(CodeTemplateContextType.TYPENAME, Signature.getSimpleName(typeQualifiedName)); - return evaluateTemplate(context, template); } + buf.append(')'); -// private static String[] getParameterTypesQualifiedNames(IMethodBinding binding) { -// ITypeBinding[] typeBindings= binding.getParameterTypes(); -// String[] result= new String[typeBindings.length]; -// for (int i= 0; i < result.length; i++) { -// result[i]= typeBindings[i].getQualifiedName(); -// } -// return result; -// } - - private static String getSeeTag(String declaringClassQualifiedName, String methodName, String[] parameterTypesQualifiedNames) { - StringBuffer buf= new StringBuffer(); - buf.append("@see "); //$NON-NLS-1$ - buf.append(declaringClassQualifiedName); - buf.append('#'); - buf.append(methodName); - buf.append('('); - for (int i= 0; i < parameterTypesQualifiedNames.length; i++) { - if (i > 0) { + int lastExc = excTypes.length - 1; + if (lastExc >= 0) { + buf.append(" throws "); //$NON-NLS-1$ + for (int i = 0; i <= lastExc; i++) { + String excTypeSig = excTypes[i]; + String excTypeFrm = resolveAndAdd(excTypeSig, parentType); + buf.append(excTypeFrm); + if (i < lastExc) { buf.append(", "); //$NON-NLS-1$ } - buf.append(parameterTypesQualifiedNames[i]); } - buf.append(')'); - return buf.toString(); } - - private static String getSeeTag(IMethod overridden) throws JavaModelException { - IType declaringType= overridden.getDeclaringType(); - StringBuffer buf= new StringBuffer(); - buf.append("@see "); //$NON-NLS-1$ - buf.append(declaringType.getFullyQualifiedName('.')); - buf.append('#'); - buf.append(overridden.getElementName()); + if (bodyContent == null) { + buf.append(";\n\n"); //$NON-NLS-1$ + } else { + buf.append(" {\n\t"); //$NON-NLS-1$ + if ((bodyContent != null) && (bodyContent.length() > 0)) { + buf.append(bodyContent); + buf.append('\n'); + } + buf.append("}\n"); //$NON-NLS-1$ + } + } + + public static String getDefaultMethodBodyStatement(String methodName, + String[] paramNames, String retTypeSig, boolean callSuper) { + StringBuffer buf = new StringBuffer(); + if (callSuper) { + if (retTypeSig != null) { + if (!Signature.SIG_VOID.equals(retTypeSig)) { + buf.append("return "); //$NON-NLS-1$ + } + buf.append("super."); //$NON-NLS-1$ + buf.append(methodName); + } else { + buf.append("super"); //$NON-NLS-1$ + } buf.append('('); - String[] paramTypes= overridden.getParameterTypes(); - for (int i= 0; i < paramTypes.length; i++) { + for (int i = 0; i < paramNames.length; i++) { if (i > 0) { buf.append(", "); //$NON-NLS-1$ } - String curr= paramTypes[i]; - buf.append(JavaModelUtil.getResolvedTypeName(curr, declaringType)); - int arrayCount= Signature.getArrayCount(curr); - while (arrayCount > 0) { - buf.append("[]"); //$NON-NLS-1$ - arrayCount--; + buf.append(paramNames[i]); + } + buf.append(");"); //$NON-NLS-1$ + } else { + if (retTypeSig != null && !retTypeSig.equals(Signature.SIG_VOID)) { + if (!isPrimitiveType(retTypeSig) + || Signature.getArrayCount(retTypeSig) > 0) { + buf.append("return null;"); //$NON-NLS-1$ + } else if (retTypeSig.equals(Signature.SIG_BOOLEAN)) { + buf.append("return false;"); //$NON-NLS-1$ + } else { + buf.append("return 0;"); //$NON-NLS-1$ } } - buf.append(')'); - return buf.toString(); } - - /** - * @see net.sourceforge.phpdt.ui.CodeGeneration#getMethodComment(IMethod,IMethod,String) - */ - public static String getMethodComment(IMethod method, IMethod overridden, String lineDelimiter) throws CoreException { - String retType= method.isConstructor() ? null : method.getReturnType(); - String[] paramNames= method.getParameterNames(); - - return getMethodComment(method.getCompilationUnit(), method.getDeclaringType().getElementName(), - method.getElementName(), paramNames, method.getExceptionTypes(), retType, overridden, lineDelimiter); + return buf.toString(); + } + + public static String getMethodBodyContent(boolean isConstructor, + IJavaProject project, String destTypeName, String methodName, + String bodyStatement, String lineDelimiter) throws CoreException { + String templateName = isConstructor ? CodeTemplateContextType.CONSTRUCTORSTUB + : CodeTemplateContextType.METHODSTUB; + Template template = PHPeclipsePlugin.getDefault() + .getCodeTemplateStore().findTemplate(templateName); + if (template == null) { + return bodyStatement; } + CodeTemplateContext context = new CodeTemplateContext(template + .getContextTypeId(), project, lineDelimiter); + context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, + methodName); + context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, + destTypeName); + context.setVariable(CodeTemplateContextType.BODY_STATEMENT, + bodyStatement); + String str = evaluateTemplate(context, template); + if (str == null && !Strings.containsOnlyWhitespaces(bodyStatement)) { + return bodyStatement; + } + return str; + } - /** - * @see net.sourceforge.phpdt.ui.CodeGeneration#getMethodComment(ICompilationUnit, String, String, String[], String[], String, IMethod, String) - */ - public static String getMethodComment(ICompilationUnit cu, String typeName, String methodName, String[] paramNames, String[] excTypeSig, String retTypeSig, IMethod overridden, String lineDelimiter) throws CoreException { - String templateName= CodeTemplateContextType.METHODCOMMENT; - if (retTypeSig == null) { - templateName= CodeTemplateContextType.CONSTRUCTORCOMMENT; - } else if (overridden != null) { - templateName= CodeTemplateContextType.OVERRIDECOMMENT; - } - Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(templateName); - if (template == null) { - return null; - } - CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), cu.getJavaProject(), lineDelimiter); - context.setCompilationUnitVariables(cu); - context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, typeName); - context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, methodName); - - if (retTypeSig != null) { - context.setVariable(CodeTemplateContextType.RETURN_TYPE, Signature.toString(retTypeSig)); - } - if (overridden != null) { - context.setVariable(CodeTemplateContextType.SEE_TAG, getSeeTag(overridden)); - } - TemplateBuffer buffer; - try { - buffer= context.evaluate(template); - } catch (BadLocationException e) { - throw new CoreException(Status.CANCEL_STATUS); - } catch (TemplateException e) { - throw new CoreException(Status.CANCEL_STATUS); - } - if (buffer == null) { - return null; - } - - String str= buffer.getString(); - if (Strings.containsOnlyWhitespaces(str)) { - return null; - } - TemplateVariable position= findTagVariable(buffer); // look if Javadoc tags have to be added - if (position == null) { - return str; - } - - IDocument textBuffer= new Document(str); - String[] exceptionNames= new String[excTypeSig.length]; - for (int i= 0; i < excTypeSig.length; i++) { - exceptionNames[i]= Signature.toString(excTypeSig[i]); - } - String returnType= retTypeSig != null ? Signature.toString(retTypeSig) : null; - int[] tagOffsets= position.getOffsets(); - for (int i= tagOffsets.length - 1; i >= 0; i--) { // from last to first - try { - insertTag(textBuffer, tagOffsets[i], position.getLength(), paramNames, exceptionNames, returnType, false, lineDelimiter); - } catch (BadLocationException e) { - throw new CoreException(PHPUIStatus.createError(IStatus.ERROR, e)); - } + public static String getGetterMethodBodyContent(IJavaProject project, + String destTypeName, String methodName, String fieldName, + String lineDelimiter) throws CoreException { + String templateName = CodeTemplateContextType.GETTERSTUB; + Template template = PHPeclipsePlugin.getDefault() + .getCodeTemplateStore().findTemplate(templateName); + if (template == null) { + return null; + } + CodeTemplateContext context = new CodeTemplateContext(template + .getContextTypeId(), project, lineDelimiter); + context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, + methodName); + context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, + destTypeName); + context.setVariable(CodeTemplateContextType.FIELD, fieldName); + + return evaluateTemplate(context, template); + } + + public static String getSetterMethodBodyContent(IJavaProject project, + String destTypeName, String methodName, String fieldName, + String paramName, String lineDelimiter) throws CoreException { + String templateName = CodeTemplateContextType.SETTERSTUB; + Template template = PHPeclipsePlugin.getDefault() + .getCodeTemplateStore().findTemplate(templateName); + if (template == null) { + return null; + } + CodeTemplateContext context = new CodeTemplateContext(template + .getContextTypeId(), project, lineDelimiter); + context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, + methodName); + context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, + destTypeName); + context.setVariable(CodeTemplateContextType.FIELD, fieldName); + context.setVariable(CodeTemplateContextType.FIELD_TYPE, fieldName); + context.setVariable(CodeTemplateContextType.PARAM, paramName); + + return evaluateTemplate(context, template); + } + + public static String getCatchBodyContent(ICompilationUnit cu, + String exceptionType, String variableName, String lineDelimiter) + throws CoreException { + Template template = PHPeclipsePlugin.getDefault() + .getCodeTemplateStore().findTemplate( + CodeTemplateContextType.CATCHBLOCK); + if (template == null) { + return null; + } + + CodeTemplateContext context = new CodeTemplateContext(template + .getContextTypeId(), cu.getJavaProject(), lineDelimiter); + context.setVariable(CodeTemplateContextType.EXCEPTION_TYPE, + exceptionType); + context + .setVariable(CodeTemplateContextType.EXCEPTION_VAR, + variableName); //$NON-NLS-1$ + return evaluateTemplate(context, template); + } + + /** + * @see net.sourceforge.phpdt.ui.CodeGeneration#getTypeComment(ICompilationUnit, + * String, String) + */ + public static String getCompilationUnitContent(ICompilationUnit cu, + String typeComment, String typeContent, String lineDelimiter) + throws CoreException { + IPackageFragment pack = (IPackageFragment) cu.getParent(); + String packDecl = pack.isDefaultPackage() ? "" : "package " + pack.getElementName() + ';'; //$NON-NLS-1$ //$NON-NLS-2$ + + Template template = PHPeclipsePlugin.getDefault() + .getCodeTemplateStore().findTemplate( + CodeTemplateContextType.NEWTYPE); + if (template == null) { + return null; + } + + IJavaProject project = cu.getJavaProject(); + CodeTemplateContext context = new CodeTemplateContext(template + .getContextTypeId(), project, lineDelimiter); + context.setCompilationUnitVariables(cu); + context.setVariable(CodeTemplateContextType.PACKAGE_DECLARATION, + packDecl); + context.setVariable(CodeTemplateContextType.TYPE_COMMENT, + typeComment != null ? typeComment : ""); //$NON-NLS-1$ + context.setVariable(CodeTemplateContextType.TYPE_DECLARATION, + typeContent); + context.setVariable(CodeTemplateContextType.TYPENAME, Signature + .getQualifier(cu.getElementName())); + return evaluateTemplate(context, template); + } + + /* + * @see net.sourceforge.phpdt.ui.CodeGeneration#getTypeComment(ICompilationUnit, + * String, String) + */ + public static String getTypeComment(ICompilationUnit cu, + String typeQualifiedName, String lineDelim) throws CoreException { + Template template = PHPeclipsePlugin.getDefault() + .getCodeTemplateStore().findTemplate( + CodeTemplateContextType.TYPECOMMENT); + if (template == null) { + return null; + } + CodeTemplateContext context = new CodeTemplateContext(template + .getContextTypeId(), cu.getJavaProject(), lineDelim); + context.setCompilationUnitVariables(cu); + context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, Signature + .getQualifier(typeQualifiedName)); + context.setVariable(CodeTemplateContextType.TYPENAME, Signature + .getSimpleName(typeQualifiedName)); + return evaluateTemplate(context, template); + } + + // private static String[] getParameterTypesQualifiedNames(IMethodBinding + // binding) { + // ITypeBinding[] typeBindings= binding.getParameterTypes(); + // String[] result= new String[typeBindings.length]; + // for (int i= 0; i < result.length; i++) { + // result[i]= typeBindings[i].getQualifiedName(); + // } + // return result; + // } + + private static String getSeeTag(String declaringClassQualifiedName, + String methodName, String[] parameterTypesQualifiedNames) { + StringBuffer buf = new StringBuffer(); + buf.append("@see "); //$NON-NLS-1$ + buf.append(declaringClassQualifiedName); + buf.append('#'); + buf.append(methodName); + buf.append('('); + for (int i = 0; i < parameterTypesQualifiedNames.length; i++) { + if (i > 0) { + buf.append(", "); //$NON-NLS-1$ } - return textBuffer.get(); + buf.append(parameterTypesQualifiedNames[i]); } + buf.append(')'); + return buf.toString(); + } - public static String getFieldComment(ICompilationUnit cu, String typeName, String fieldName, String lineDelimiter) throws CoreException { - Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(CodeTemplateContextType.FIELDCOMMENT); - if (template == null) { - return null; + private static String getSeeTag(IMethod overridden) + throws JavaModelException { + IType declaringType = overridden.getDeclaringType(); + StringBuffer buf = new StringBuffer(); + buf.append("@see "); //$NON-NLS-1$ + buf.append(declaringType.getFullyQualifiedName('.')); + buf.append('#'); + buf.append(overridden.getElementName()); + buf.append('('); + String[] paramTypes = overridden.getParameterTypes(); + for (int i = 0; i < paramTypes.length; i++) { + if (i > 0) { + buf.append(", "); //$NON-NLS-1$ } - CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), cu.getJavaProject(), lineDelimiter); - context.setCompilationUnitVariables(cu); - context.setVariable(CodeTemplateContextType.FIELD_TYPE, typeName); - context.setVariable(CodeTemplateContextType.FIELD, fieldName); - - return evaluateTemplate(context, template); - } - - - /** - * @see net.sourceforge.phpdt.ui.CodeGeneration#getSetterComment(ICompilationUnit, String, String, String, String, String, String, String) - */ - public static String getSetterComment(ICompilationUnit cu, String typeName, String methodName, String fieldName, String fieldType, String paramName, String bareFieldName, String lineDelimiter) throws CoreException { - String templateName= CodeTemplateContextType.SETTERCOMMENT; - Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(templateName); - if (template == null) { - return null; + String curr = paramTypes[i]; + buf.append(JavaModelUtil.getResolvedTypeName(curr, declaringType)); + int arrayCount = Signature.getArrayCount(curr); + while (arrayCount > 0) { + buf.append("[]"); //$NON-NLS-1$ + arrayCount--; } - - CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), cu.getJavaProject(), lineDelimiter); - context.setCompilationUnitVariables(cu); - context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, typeName); - context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, methodName); - context.setVariable(CodeTemplateContextType.FIELD, fieldName); - context.setVariable(CodeTemplateContextType.FIELD_TYPE, fieldType); - context.setVariable(CodeTemplateContextType.BARE_FIELD_NAME, bareFieldName); - context.setVariable(CodeTemplateContextType.PARAM, paramName); - - return evaluateTemplate(context, template); - } - - /** - * @see net.sourceforge.phpdt.ui.CodeGeneration#getGetterComment(ICompilationUnit, String, String, String, String, String, String) - */ - public static String getGetterComment(ICompilationUnit cu, String typeName, String methodName, String fieldName, String fieldType, String bareFieldName, String lineDelimiter) throws CoreException { - String templateName= CodeTemplateContextType.GETTERCOMMENT; - Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(templateName); - if (template == null) { - return null; - } - CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), cu.getJavaProject(), lineDelimiter); - context.setCompilationUnitVariables(cu); - context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, typeName); - context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, methodName); - context.setVariable(CodeTemplateContextType.FIELD, fieldName); - context.setVariable(CodeTemplateContextType.FIELD_TYPE, fieldType); - context.setVariable(CodeTemplateContextType.BARE_FIELD_NAME, bareFieldName); - - return evaluateTemplate(context, template); } - - public static String evaluateTemplate(CodeTemplateContext context, Template template) throws CoreException { - TemplateBuffer buffer; + buf.append(')'); + return buf.toString(); + } + + /** + * @see net.sourceforge.phpdt.ui.CodeGeneration#getMethodComment(IMethod,IMethod,String) + */ + public static String getMethodComment(IMethod method, IMethod overridden, + String lineDelimiter) throws CoreException { + String retType = method.isConstructor() ? null : method.getReturnType(); + String[] paramNames = method.getParameterNames(); + + return getMethodComment(method.getCompilationUnit(), method + .getDeclaringType().getElementName(), method.getElementName(), + paramNames, method.getExceptionTypes(), retType, overridden, + lineDelimiter); + } + + /** + * @see net.sourceforge.phpdt.ui.CodeGeneration#getMethodComment(ICompilationUnit, + * String, String, String[], String[], String, IMethod, String) + */ + public static String getMethodComment(ICompilationUnit cu, String typeName, + String methodName, String[] paramNames, String[] excTypeSig, + String retTypeSig, IMethod overridden, String lineDelimiter) + throws CoreException { + String templateName = CodeTemplateContextType.METHODCOMMENT; + if (retTypeSig == null) { + templateName = CodeTemplateContextType.CONSTRUCTORCOMMENT; + } else if (overridden != null) { + templateName = CodeTemplateContextType.OVERRIDECOMMENT; + } + Template template = PHPeclipsePlugin.getDefault() + .getCodeTemplateStore().findTemplate(templateName); + if (template == null) { + return null; + } + CodeTemplateContext context = new CodeTemplateContext(template + .getContextTypeId(), cu.getJavaProject(), lineDelimiter); + context.setCompilationUnitVariables(cu); + context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, typeName); + context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, + methodName); + + if (retTypeSig != null) { + context.setVariable(CodeTemplateContextType.RETURN_TYPE, Signature + .toString(retTypeSig)); + } + if (overridden != null) { + context.setVariable(CodeTemplateContextType.SEE_TAG, + getSeeTag(overridden)); + } + TemplateBuffer buffer; + try { + buffer = context.evaluate(template); + } catch (BadLocationException e) { + throw new CoreException(Status.CANCEL_STATUS); + } catch (TemplateException e) { + throw new CoreException(Status.CANCEL_STATUS); + } + if (buffer == null) { + return null; + } + + String str = buffer.getString(); + if (Strings.containsOnlyWhitespaces(str)) { + return null; + } + TemplateVariable position = findTagVariable(buffer); // look if + // Javadoc tags + // have to be + // added + if (position == null) { + return str; + } + + IDocument textBuffer = new Document(str); + String[] exceptionNames = new String[excTypeSig.length]; + for (int i = 0; i < excTypeSig.length; i++) { + exceptionNames[i] = Signature.toString(excTypeSig[i]); + } + String returnType = retTypeSig != null ? Signature.toString(retTypeSig) + : null; + int[] tagOffsets = position.getOffsets(); + for (int i = tagOffsets.length - 1; i >= 0; i--) { // from last to + // first try { - buffer= context.evaluate(template); + insertTag(textBuffer, tagOffsets[i], position.getLength(), + paramNames, exceptionNames, returnType, false, + lineDelimiter); } catch (BadLocationException e) { - throw new CoreException(Status.CANCEL_STATUS); - } catch (TemplateException e) { - throw new CoreException(Status.CANCEL_STATUS); + throw new CoreException(PHPUIStatus.createError(IStatus.ERROR, + e)); } - if (buffer == null) - return null; - String str= buffer.getString(); - if (Strings.containsOnlyWhitespaces(str)) { - return null; - } - return str; } + return textBuffer.get(); + } - /** - * @see net.sourceforge.phpdt.ui.CodeGeneration#getMethodComment(ICompilationUnit, String, MethodDeclaration, IMethodBinding, String) - */ -// public static String getMethodComment(ICompilationUnit cu, String typeName, IMethodBinding overridden, String lineDelimiter) throws CoreException { -// if (overridden != null) { -// String declaringClassQualifiedName= overridden.getDeclaringClass().getQualifiedName(); -// String[] parameterTypesQualifiedNames= getParameterTypesQualifiedNames(overridden); -// return getMethodComment(cu, typeName, decl, true, overridden.isDeprecated(), declaringClassQualifiedName, parameterTypesQualifiedNames, lineDelimiter); -// } else { -// return getMethodComment(cu, typeName, decl, false, false, null, null, lineDelimiter); -// } -// } - - /** - * Returns the comment for a method using the comment code templates. - * null is returned if the template is empty. - * @param cu The compilation unit to which the method belongs - * @param typeName Name of the type to which the method belongs. - * @param decl The AST MethodDeclaration node that will be added as new - * method. - * @param isOverridden true iff decl overrides another method - * @param isDeprecated true iff the method that decl overrides is deprecated. - * Note: it must not be true if isOverridden is false. - * @param declaringClassQualifiedName Fully qualified name of the type in which the overriddden - * method (if any exists) in declared. If isOverridden is false, this is ignored. - * @param parameterTypesQualifiedNames Fully qualified names of parameter types of the type in which the overriddden - * method (if any exists) in declared. If isOverridden is false, this is ignored. - * @return String Returns the method comment or null if the - * configured template is empty. - * (formatting required) - * @throws CoreException - */ -// public static String getMethodComment(ICompilationUnit cu, String typeName, MethodDeclaration decl, boolean isOverridden, boolean isDeprecated, String declaringClassQualifiedName, String[] parameterTypesQualifiedNames, String lineDelimiter) throws CoreException { -// String templateName= CodeTemplateContextType.METHODCOMMENT; -// if (decl.isConstructor()) { -// templateName= CodeTemplateContextType.CONSTRUCTORCOMMENT; -// } else if (isOverridden) { -// templateName= CodeTemplateContextType.OVERRIDECOMMENT; -// } -// Template template= PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(templateName); -// if (template == null) { -// return null; -// } -// CodeTemplateContext context= new CodeTemplateContext(template.getContextTypeId(), cu.getJavaProject(), lineDelimiter); -// context.setCompilationUnitVariables(cu); -// context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, typeName); -// context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, decl.getName().getIdentifier()); -// if (!decl.isConstructor()) { -// context.setVariable(CodeTemplateContextType.RETURN_TYPE, ASTNodes.asString(decl.getReturnType())); -// } -// if (isOverridden) { -// String methodName= decl.getName().getIdentifier(); -// context.setVariable(CodeTemplateContextType.SEE_TAG, getSeeTag(declaringClassQualifiedName, methodName, parameterTypesQualifiedNames)); -// } -// -// TemplateBuffer buffer; -// try { -// buffer= context.evaluate(template); -// } catch (BadLocationException e) { -// throw new CoreException(Status.CANCEL_STATUS); -// } catch (TemplateException e) { -// throw new CoreException(Status.CANCEL_STATUS); -// } -// if (buffer == null) -// return null; -// String str= buffer.getString(); -// if (Strings.containsOnlyWhitespaces(str)) { -// return null; -// } -// TemplateVariable position= findTagVariable(buffer); // look if Javadoc tags have to be added -// if (position == null) { -// return str; -// } -// -// IDocument textBuffer= new Document(str); -// List params= decl.parameters(); -// String[] paramNames= new String[params.size()]; -// for (int i= 0; i < params.size(); i++) { -// SingleVariableDeclaration elem= (SingleVariableDeclaration) params.get(i); -// paramNames[i]= elem.getName().getIdentifier(); -// } -// List exceptions= decl.thrownExceptions(); -// String[] exceptionNames= new String[exceptions.size()]; -// for (int i= 0; i < exceptions.size(); i++) { -// exceptionNames[i]= ASTNodes.getSimpleNameIdentifier((Name) exceptions.get(i)); -// } -// String returnType= !decl.isConstructor() ? ASTNodes.asString(decl.getReturnType()) : null; -// int[] tagOffsets= position.getOffsets(); -// for (int i= tagOffsets.length - 1; i >= 0; i--) { // from last to first -// try { -// insertTag(textBuffer, tagOffsets[i], position.getLength(), paramNames, exceptionNames, returnType, isDeprecated, lineDelimiter); -// } catch (BadLocationException e) { -// throw new CoreException(PHPUIStatus.createError(IStatus.ERROR, e)); -// } -// } -// return textBuffer.get(); -// } - - private static TemplateVariable findTagVariable(TemplateBuffer buffer) { - TemplateVariable[] positions= buffer.getVariables(); - for (int i= 0; i < positions.length; i++) { - TemplateVariable curr= positions[i]; - if (CodeTemplateContextType.TAGS.equals(curr.getType())) { - return curr; - } - } - return null; - } - - private static void insertTag(IDocument textBuffer, int offset, int length, String[] paramNames, String[] exceptionNames, String returnType, boolean isDeprecated, String lineDelimiter) throws BadLocationException { - IRegion region= textBuffer.getLineInformationOfOffset(offset); - if (region == null) { - return; + public static String getFieldComment(ICompilationUnit cu, String typeName, + String fieldName, String lineDelimiter) throws CoreException { + Template template = PHPeclipsePlugin.getDefault() + .getCodeTemplateStore().findTemplate( + CodeTemplateContextType.FIELDCOMMENT); + if (template == null) { + return null; + } + CodeTemplateContext context = new CodeTemplateContext(template + .getContextTypeId(), cu.getJavaProject(), lineDelimiter); + context.setCompilationUnitVariables(cu); + context.setVariable(CodeTemplateContextType.FIELD_TYPE, typeName); + context.setVariable(CodeTemplateContextType.FIELD, fieldName); + + return evaluateTemplate(context, template); + } + + /** + * @see net.sourceforge.phpdt.ui.CodeGeneration#getSetterComment(ICompilationUnit, + * String, String, String, String, String, String, String) + */ + public static String getSetterComment(ICompilationUnit cu, String typeName, + String methodName, String fieldName, String fieldType, + String paramName, String bareFieldName, String lineDelimiter) + throws CoreException { + String templateName = CodeTemplateContextType.SETTERCOMMENT; + Template template = PHPeclipsePlugin.getDefault() + .getCodeTemplateStore().findTemplate(templateName); + if (template == null) { + return null; + } + + CodeTemplateContext context = new CodeTemplateContext(template + .getContextTypeId(), cu.getJavaProject(), lineDelimiter); + context.setCompilationUnitVariables(cu); + context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, typeName); + context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, + methodName); + context.setVariable(CodeTemplateContextType.FIELD, fieldName); + context.setVariable(CodeTemplateContextType.FIELD_TYPE, fieldType); + context.setVariable(CodeTemplateContextType.BARE_FIELD_NAME, + bareFieldName); + context.setVariable(CodeTemplateContextType.PARAM, paramName); + + return evaluateTemplate(context, template); + } + + /** + * @see net.sourceforge.phpdt.ui.CodeGeneration#getGetterComment(ICompilationUnit, + * String, String, String, String, String, String) + */ + public static String getGetterComment(ICompilationUnit cu, String typeName, + String methodName, String fieldName, String fieldType, + String bareFieldName, String lineDelimiter) throws CoreException { + String templateName = CodeTemplateContextType.GETTERCOMMENT; + Template template = PHPeclipsePlugin.getDefault() + .getCodeTemplateStore().findTemplate(templateName); + if (template == null) { + return null; + } + CodeTemplateContext context = new CodeTemplateContext(template + .getContextTypeId(), cu.getJavaProject(), lineDelimiter); + context.setCompilationUnitVariables(cu); + context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, typeName); + context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, + methodName); + context.setVariable(CodeTemplateContextType.FIELD, fieldName); + context.setVariable(CodeTemplateContextType.FIELD_TYPE, fieldType); + context.setVariable(CodeTemplateContextType.BARE_FIELD_NAME, + bareFieldName); + + return evaluateTemplate(context, template); + } + + public static String evaluateTemplate(CodeTemplateContext context, + Template template) throws CoreException { + TemplateBuffer buffer; + try { + buffer = context.evaluate(template); + } catch (BadLocationException e) { + throw new CoreException(Status.CANCEL_STATUS); + } catch (TemplateException e) { + throw new CoreException(Status.CANCEL_STATUS); + } + if (buffer == null) + return null; + String str = buffer.getString(); + if (Strings.containsOnlyWhitespaces(str)) { + return null; + } + return str; + } + + /** + * @see net.sourceforge.phpdt.ui.CodeGeneration#getMethodComment(ICompilationUnit, + * String, MethodDeclaration, IMethodBinding, String) + */ + // public static String getMethodComment(ICompilationUnit cu, String + // typeName, IMethodBinding overridden, String lineDelimiter) throws + // CoreException { + // if (overridden != null) { + // String declaringClassQualifiedName= + // overridden.getDeclaringClass().getQualifiedName(); + // String[] parameterTypesQualifiedNames= + // getParameterTypesQualifiedNames(overridden); + // return getMethodComment(cu, typeName, decl, true, + // overridden.isDeprecated(), declaringClassQualifiedName, + // parameterTypesQualifiedNames, lineDelimiter); + // } else { + // return getMethodComment(cu, typeName, decl, false, false, null, null, + // lineDelimiter); + // } + // } + /** + * Returns the comment for a method using the comment code templates. + * null is returned if the template is empty. + * + * @param cu + * The compilation unit to which the method belongs + * @param typeName + * Name of the type to which the method belongs. + * @param decl + * The AST MethodDeclaration node that will be added as new + * method. + * @param isOverridden + * true iff decl overrides another method + * @param isDeprecated + * true iff the method that decl overrides is + * deprecated. Note: it must not be true if + * isOverridden is false. + * @param declaringClassQualifiedName + * Fully qualified name of the type in which the overriddden + * method (if any exists) in declared. If isOverridden is + * false, this is ignored. + * @param parameterTypesQualifiedNames + * Fully qualified names of parameter types of the type in which + * the overriddden method (if any exists) in declared. If + * isOverridden is false, this is ignored. + * @return String Returns the method comment or null if the + * configured template is empty. (formatting required) + * @throws CoreException + */ + // public static String getMethodComment(ICompilationUnit cu, String + // typeName, MethodDeclaration decl, boolean isOverridden, boolean + // isDeprecated, String declaringClassQualifiedName, String[] + // parameterTypesQualifiedNames, String lineDelimiter) throws CoreException + // { + // String templateName= CodeTemplateContextType.METHODCOMMENT; + // if (decl.isConstructor()) { + // templateName= CodeTemplateContextType.CONSTRUCTORCOMMENT; + // } else if (isOverridden) { + // templateName= CodeTemplateContextType.OVERRIDECOMMENT; + // } + // Template template= + // PHPeclipsePlugin.getDefault().getCodeTemplateStore().findTemplate(templateName); + // if (template == null) { + // return null; + // } + // CodeTemplateContext context= new + // CodeTemplateContext(template.getContextTypeId(), cu.getJavaProject(), + // lineDelimiter); + // context.setCompilationUnitVariables(cu); + // context.setVariable(CodeTemplateContextType.ENCLOSING_TYPE, typeName); + // context.setVariable(CodeTemplateContextType.ENCLOSING_METHOD, + // decl.getName().getIdentifier()); + // if (!decl.isConstructor()) { + // context.setVariable(CodeTemplateContextType.RETURN_TYPE, + // ASTNodes.asString(decl.getReturnType())); + // } + // if (isOverridden) { + // String methodName= decl.getName().getIdentifier(); + // context.setVariable(CodeTemplateContextType.SEE_TAG, + // getSeeTag(declaringClassQualifiedName, methodName, + // parameterTypesQualifiedNames)); + // } + // + // TemplateBuffer buffer; + // try { + // buffer= context.evaluate(template); + // } catch (BadLocationException e) { + // throw new CoreException(Status.CANCEL_STATUS); + // } catch (TemplateException e) { + // throw new CoreException(Status.CANCEL_STATUS); + // } + // if (buffer == null) + // return null; + // String str= buffer.getString(); + // if (Strings.containsOnlyWhitespaces(str)) { + // return null; + // } + // TemplateVariable position= findTagVariable(buffer); // look if Javadoc + // tags have to be added + // if (position == null) { + // return str; + // } + // + // IDocument textBuffer= new Document(str); + // List params= decl.parameters(); + // String[] paramNames= new String[params.size()]; + // for (int i= 0; i < params.size(); i++) { + // SingleVariableDeclaration elem= (SingleVariableDeclaration) + // params.get(i); + // paramNames[i]= elem.getName().getIdentifier(); + // } + // List exceptions= decl.thrownExceptions(); + // String[] exceptionNames= new String[exceptions.size()]; + // for (int i= 0; i < exceptions.size(); i++) { + // exceptionNames[i]= ASTNodes.getSimpleNameIdentifier((Name) + // exceptions.get(i)); + // } + // String returnType= !decl.isConstructor() ? + // ASTNodes.asString(decl.getReturnType()) : null; + // int[] tagOffsets= position.getOffsets(); + // for (int i= tagOffsets.length - 1; i >= 0; i--) { // from last to first + // try { + // insertTag(textBuffer, tagOffsets[i], position.getLength(), paramNames, + // exceptionNames, returnType, isDeprecated, lineDelimiter); + // } catch (BadLocationException e) { + // throw new CoreException(PHPUIStatus.createError(IStatus.ERROR, e)); + // } + // } + // return textBuffer.get(); + // } + private static TemplateVariable findTagVariable(TemplateBuffer buffer) { + TemplateVariable[] positions = buffer.getVariables(); + for (int i = 0; i < positions.length; i++) { + TemplateVariable curr = positions[i]; + if (CodeTemplateContextType.TAGS.equals(curr.getType())) { + return curr; } - String lineStart= textBuffer.get(region.getOffset(), offset - region.getOffset()); - - StringBuffer buf= new StringBuffer(); - for (int i= 0; i < paramNames.length; i++) { - if (buf.length() > 0) { - buf.append(lineDelimiter); buf.append(lineStart); - } - buf.append("@param "); buf.append(paramNames[i]); //$NON-NLS-1$ + } + return null; + } + + private static void insertTag(IDocument textBuffer, int offset, int length, + String[] paramNames, String[] exceptionNames, String returnType, + boolean isDeprecated, String lineDelimiter) + throws BadLocationException { + IRegion region = textBuffer.getLineInformationOfOffset(offset); + if (region == null) { + return; + } + String lineStart = textBuffer.get(region.getOffset(), offset + - region.getOffset()); + + StringBuffer buf = new StringBuffer(); + for (int i = 0; i < paramNames.length; i++) { + if (buf.length() > 0) { + buf.append(lineDelimiter); + buf.append(lineStart); } - if (returnType != null && !returnType.equals("void")) { //$NON-NLS-1$ - if (buf.length() > 0) { - buf.append(lineDelimiter); buf.append(lineStart); - } - buf.append("@return"); //$NON-NLS-1$ + buf.append("@param ");buf.append(paramNames[i]); //$NON-NLS-1$ + } + if (returnType != null && !returnType.equals("void")) { //$NON-NLS-1$ + if (buf.length() > 0) { + buf.append(lineDelimiter); + buf.append(lineStart); } - if (exceptionNames != null) { - for (int i= 0; i < exceptionNames.length; i++) { - if (buf.length() > 0) { - buf.append(lineDelimiter); buf.append(lineStart); - } - buf.append("@throws "); buf.append(exceptionNames[i]); //$NON-NLS-1$ - } - } - if (isDeprecated) { + buf.append("@return"); //$NON-NLS-1$ + } + if (exceptionNames != null) { + for (int i = 0; i < exceptionNames.length; i++) { if (buf.length() > 0) { - buf.append(lineDelimiter); buf.append(lineStart); + buf.append(lineDelimiter); + buf.append(lineStart); } - buf.append("@deprecated"); //$NON-NLS-1$ + buf.append("@throws ");buf.append(exceptionNames[i]); //$NON-NLS-1$ } - textBuffer.replace(offset, length, buf.toString()); } - - private static boolean isPrimitiveType(String typeName) { - char first= Signature.getElementType(typeName).charAt(0); - return (first != Signature.C_RESOLVED && first != Signature.C_UNRESOLVED); + if (isDeprecated) { + if (buf.length() > 0) { + buf.append(lineDelimiter); + buf.append(lineStart); + } + buf.append("@deprecated"); //$NON-NLS-1$ } + textBuffer.replace(offset, length, buf.toString()); + } - private static String resolveAndAdd(String refTypeSig, IType declaringType) throws JavaModelException {//, IImportsStructure imports) throws JavaModelException { - String resolvedTypeName= JavaModelUtil.getResolvedTypeName(refTypeSig, declaringType); - if (resolvedTypeName != null) { - StringBuffer buf= new StringBuffer(); -// if (imports != null) { -// buf.append(imports.addImport(resolvedTypeName)); -// } else { - buf.append(resolvedTypeName); -// } - int arrayCount= Signature.getArrayCount(refTypeSig); - for (int i= 0; i < arrayCount; i++) { - buf.append("[]"); //$NON-NLS-1$ - } - return buf.toString(); + private static boolean isPrimitiveType(String typeName) { + char first = Signature.getElementType(typeName).charAt(0); + return (first != Signature.C_RESOLVED && first != Signature.C_UNRESOLVED); + } + + private static String resolveAndAdd(String refTypeSig, IType declaringType) + throws JavaModelException {// , IImportsStructure imports) throws + // JavaModelException { + String resolvedTypeName = JavaModelUtil.getResolvedTypeName(refTypeSig, + declaringType); + if (resolvedTypeName != null) { + StringBuffer buf = new StringBuffer(); + // if (imports != null) { + // buf.append(imports.addImport(resolvedTypeName)); + // } else { + buf.append(resolvedTypeName); + // } + int arrayCount = Signature.getArrayCount(refTypeSig); + for (int i = 0; i < arrayCount; i++) { + buf.append("[]"); //$NON-NLS-1$ } - return Signature.toString(refTypeSig); + return buf.toString(); } - - /** - * Finds a method in a list of methods. - * @return The found method or null, if nothing found - */ - private static IMethod findMethod(IMethod method, List allMethods) throws JavaModelException { - String name= method.getElementName(); - String[] paramTypes= method.getParameterTypes(); - boolean isConstructor= method.isConstructor(); - - for (int i= allMethods.size() - 1; i >= 0; i--) { - IMethod curr= (IMethod) allMethods.get(i); - if (JavaModelUtil.isSameMethodSignature(name, paramTypes, isConstructor, curr)) { - return curr; - } + return Signature.toString(refTypeSig); + } + + /** + * Finds a method in a list of methods. + * + * @return The found method or null, if nothing found + */ + private static IMethod findMethod(IMethod method, List allMethods) + throws JavaModelException { + String name = method.getElementName(); + String[] paramTypes = method.getParameterTypes(); + boolean isConstructor = method.isConstructor(); + + for (int i = allMethods.size() - 1; i >= 0; i--) { + IMethod curr = (IMethod) allMethods.get(i); + if (JavaModelUtil.isSameMethodSignature(name, paramTypes, + isConstructor, curr)) { + return curr; } - return null; } + return null; + } - /** - * Creates needed constructors for a type. - * @param type The type to create constructors for - * @param supertype The type's super type - * @param settings Options for comment generation - * @param imports Required imports are added to the import structure. Structure can be null, types are qualified then. - * @return Returns the generated stubs or null if the creation has been canceled - */ -// public static String[] evalConstructors(IType type, IType supertype, IImportsStructure imports) throws CoreException { -// IMethod[] superMethods= supertype.getMethods(); -// String typeName= type.getElementName(); -// ICompilationUnit cu= type.getCompilationUnit(); -// IMethod[] methods= type.getMethods(); -// GenStubSettings genStubSettings= new GenStubSettings(settings); -// genStubSettings.callSuper= true; -// -// ArrayList newMethods= new ArrayList(superMethods.length); -// for (int i= 0; i < superMethods.length; i++) { -// IMethod curr= superMethods[i]; -// if (curr.isConstructor() && (JavaModelUtil.isVisibleInHierarchy(curr, type.getPackageFragment()))) { -// if (JavaModelUtil.findMethod(typeName, curr.getParameterTypes(), true, methods) == null) { -// genStubSettings.methodModifiers= Flags.AccPublic | JdtFlags.clearAccessModifiers(curr.getFlags()); -// String newStub= genStub(cu, typeName, curr, curr.getDeclaringType(), genStubSettings, imports); -// newMethods.add(newStub); -// } -// } -// } -// return (String[]) newMethods.toArray(new String[newMethods.size()]); -// } - - /** - * Returns all unimplemented constructors of a type including root type default - * constructors if there are no other superclass constructors unimplemented. - * @param type The type to create constructors for - * @return Returns the generated stubs or null if the creation has been canceled - */ -// public static IMethod[] getOverridableConstructors(IType type) throws CoreException { -// List constructorMethods= new ArrayList(); -// ITypeHierarchy hierarchy= type.newSupertypeHierarchy(null); -// IType supertype= hierarchy.getSuperclass(type); -// if (supertype == null) -// return (new IMethod[0]); -// -// IMethod[] superMethods= supertype.getMethods(); -// boolean constuctorFound= false; -// String typeName= type.getElementName(); -// IMethod[] methods= type.getMethods(); -// for (int i= 0; i < superMethods.length; i++) { -// IMethod curr= superMethods[i]; -// if (curr.isConstructor()) { -// constuctorFound= true; -// if (JavaModelUtil.isVisibleInHierarchy(curr, type.getPackageFragment())) -// if (JavaModelUtil.findMethod(typeName, curr.getParameterTypes(), true, methods) == null) -// constructorMethods.add(curr); -// -// } -// } -// -// // http://bugs.eclipse.org/bugs/show_bug.cgi?id=38487 -// if (!constuctorFound) { -// IType objectType= type.getJavaProject().findType("java.lang.Object"); //$NON-NLS-1$ -// IMethod curr= objectType.getMethod("Object", EMPTY); //$NON-NLS-1$ -// if (JavaModelUtil.findMethod(typeName, curr.getParameterTypes(), true, methods) == null) { -// constructorMethods.add(curr); -// } -// } -// return (IMethod[]) constructorMethods.toArray(new IMethod[constructorMethods.size()]); -// } - - /** - * Returns all overridable methods of a type - * @param type The type to search the overridable methods for - * @param hierarchy The type hierarchy of the type - * @param isSubType If set, the result can include methods of the passed type, if not only methods from super - * types are considered - * @return Returns the all methods that can be overridden - */ -// public static IMethod[] getOverridableMethods(IType type, ITypeHierarchy hierarchy, boolean isSubType) throws JavaModelException { -// List allMethods= new ArrayList(); -// -// IMethod[] typeMethods= type.getMethods(); -// for (int i= 0; i < typeMethods.length; i++) { -// IMethod curr= typeMethods[i]; -// if (!curr.isConstructor() && !Flags.isStatic(curr.getFlags()) && !Flags.isPrivate(curr.getFlags())) { -// allMethods.add(curr); -// } -// } -// -// IType[] superTypes= hierarchy.getAllSuperclasses(type); -// for (int i= 0; i < superTypes.length; i++) { -// IMethod[] methods= superTypes[i].getMethods(); -// for (int k= 0; k < methods.length; k++) { -// IMethod curr= methods[k]; -// if (!curr.isConstructor() && !Flags.isStatic(curr.getFlags()) && !Flags.isPrivate(curr.getFlags())) { -// if (findMethod(curr, allMethods) == null) { -// allMethods.add(curr); -// } -// } -// } -// } -// -// IType[] superInterfaces= hierarchy.getAllSuperInterfaces(type); -// for (int i= 0; i < superInterfaces.length; i++) { -// IMethod[] methods= superInterfaces[i].getMethods(); -// for (int k= 0; k < methods.length; k++) { -// IMethod curr= methods[k]; -// -// // binary interfaces can contain static initializers (variable intializations) -// // 1G4CKUS -// if (!Flags.isStatic(curr.getFlags())) { -// IMethod impl= findMethod(curr, allMethods); -// if (impl == null || !JavaModelUtil.isVisibleInHierarchy(impl, type.getPackageFragment()) || prefereInterfaceMethod(hierarchy, curr, impl)) { -// if (impl != null) { -// allMethods.remove(impl); -// } -// // implement an interface method when it does not exist in the hierarchy -// // or when it throws less exceptions that the implemented -// allMethods.add(curr); -// } -// } -// } -// } -// if (!isSubType) { -// allMethods.removeAll(Arrays.asList(typeMethods)); -// } -// // remove finals -// for (int i= allMethods.size() - 1; i >= 0; i--) { -// IMethod curr= (IMethod) allMethods.get(i); -// if (Flags.isFinal(curr.getFlags())) { -// allMethods.remove(i); -// } -// } -// return (IMethod[]) allMethods.toArray(new IMethod[allMethods.size()]); -// } - -// private static boolean prefereInterfaceMethod(ITypeHierarchy hierarchy, IMethod interfaceMethod, IMethod curr) throws JavaModelException { -// if (Flags.isFinal(curr.getFlags())) { -// return false; -// } -// IType interfaceType= interfaceMethod.getDeclaringType(); -// IType[] interfaces= hierarchy.getAllSuperInterfaces(curr.getDeclaringType()); -// for (int i= 0; i < interfaces.length; i++) { -// if (interfaces[i] == interfaceType) { -// return false; -// } -// } -// return curr.getExceptionTypes().length > interfaceMethod.getExceptionTypes().length; -// } - - /** - * Generate method stubs for methods to overrride - * @param type The type to search the overridable methods for - * @param hierarchy The type hierarchy of the type - * @param methodsToImplement Methods to override or implement - * @param settings Options for comment generation - * @param imports Required imports are added to the import structure. Structure can be null, types are qualified then. - * @return Returns the generated stubs - */ -// public static String[] genOverrideStubs(IMethod[] methodsToImplement, IType type, ITypeHierarchy hierarchy, CodeGenerationSettings settings, IImportsStructure imports) throws CoreException { -// GenStubSettings genStubSettings= new GenStubSettings(settings); -// genStubSettings.methodOverwrites= true; -// ICompilationUnit cu= type.getCompilationUnit(); -// String[] result= new String[methodsToImplement.length]; -// for (int i= 0; i < methodsToImplement.length; i++) { -// IMethod curr= methodsToImplement[i]; -// IMethod overrides= JavaModelUtil.findMethodImplementationInHierarchy(hierarchy, type, curr.getElementName(), curr.getParameterTypes(), curr.isConstructor()); -// if (overrides != null) { -// genStubSettings.callSuper= true; -// curr= overrides; -// } -// genStubSettings.methodModifiers= curr.getFlags(); -// IMethod desc= JavaModelUtil.findMethodDeclarationInHierarchy(hierarchy, type, curr.getElementName(), curr.getParameterTypes(), curr.isConstructor()); -// if (desc == null) { -// desc= curr; -// } -// result[i]= genStub(cu, type.getElementName(), curr, desc.getDeclaringType(), genStubSettings, imports); -// } -// return result; -// } - /** - * Searches for unimplemented methods of a type. - * @param isSubType If set, the evaluation is for a subtype of the given type. If not set, the - * evaluation is for the type itself. - * @param settings Options for comment generation - * @param imports Required imports are added to the import structure. Structure can be null, types are qualified then. - * @return Returns the generated stubs or null if the creation has been canceled - */ -// public static String[] evalUnimplementedMethods(IType type, ITypeHierarchy hierarchy, boolean isSubType, CodeGenerationSettings settings, -// IImportsStructure imports) throws CoreException { -// -// IMethod[] inheritedMethods= getOverridableMethods(type, hierarchy, isSubType); -// -// List toImplement= new ArrayList(); -// for (int i= 0; i < inheritedMethods.length; i++) { -// IMethod curr= inheritedMethods[i]; -// if (JdtFlags.isAbstract(curr)) { -// toImplement.add(curr); -// } -// } -// IMethod[] toImplementArray= (IMethod[]) toImplement.toArray(new IMethod[toImplement.size()]); -// return genOverrideStubs(toImplementArray, type, hierarchy, settings, imports); -// } - - /** - * Examines a string and returns the first line delimiter found. - */ - public static String getLineDelimiterUsed(IJavaElement elem) throws JavaModelException { - ICompilationUnit cu= (ICompilationUnit) elem.getAncestor(IJavaElement.COMPILATION_UNIT); - if (cu != null && cu.exists()) { - IBuffer buf= cu.getBuffer(); - int length= buf.getLength(); - for (int i= 0; i < length; i++) { - char ch= buf.getChar(i); - if (ch == SWT.CR) { - if (i + 1 < length) { - if (buf.getChar(i + 1) == SWT.LF) { - return "\r\n"; //$NON-NLS-1$ - } + /** + * Creates needed constructors for a type. + * + * @param type + * The type to create constructors for + * @param supertype + * The type's super type + * @param settings + * Options for comment generation + * @param imports + * Required imports are added to the import structure. Structure + * can be null, types are qualified then. + * @return Returns the generated stubs or null if the + * creation has been canceled + */ + // public static String[] evalConstructors(IType type, IType supertype, + // IImportsStructure imports) throws CoreException { + // IMethod[] superMethods= supertype.getMethods(); + // String typeName= type.getElementName(); + // ICompilationUnit cu= type.getCompilationUnit(); + // IMethod[] methods= type.getMethods(); + // GenStubSettings genStubSettings= new GenStubSettings(settings); + // genStubSettings.callSuper= true; + // + // ArrayList newMethods= new ArrayList(superMethods.length); + // for (int i= 0; i < superMethods.length; i++) { + // IMethod curr= superMethods[i]; + // if (curr.isConstructor() && (JavaModelUtil.isVisibleInHierarchy(curr, + // type.getPackageFragment()))) { + // if (JavaModelUtil.findMethod(typeName, curr.getParameterTypes(), true, + // methods) == null) { + // genStubSettings.methodModifiers= Flags.AccPublic | + // JdtFlags.clearAccessModifiers(curr.getFlags()); + // String newStub= genStub(cu, typeName, curr, curr.getDeclaringType(), + // genStubSettings, imports); + // newMethods.add(newStub); + // } + // } + // } + // return (String[]) newMethods.toArray(new String[newMethods.size()]); + // } + /** + * Returns all unimplemented constructors of a type including root type + * default constructors if there are no other superclass constructors + * unimplemented. + * + * @param type + * The type to create constructors for + * @return Returns the generated stubs or null if the + * creation has been canceled + */ + // public static IMethod[] getOverridableConstructors(IType type) throws + // CoreException { + // List constructorMethods= new ArrayList(); + // ITypeHierarchy hierarchy= type.newSupertypeHierarchy(null); + // IType supertype= hierarchy.getSuperclass(type); + // if (supertype == null) + // return (new IMethod[0]); + // + // IMethod[] superMethods= supertype.getMethods(); + // boolean constuctorFound= false; + // String typeName= type.getElementName(); + // IMethod[] methods= type.getMethods(); + // for (int i= 0; i < superMethods.length; i++) { + // IMethod curr= superMethods[i]; + // if (curr.isConstructor()) { + // constuctorFound= true; + // if (JavaModelUtil.isVisibleInHierarchy(curr, type.getPackageFragment())) + // if (JavaModelUtil.findMethod(typeName, curr.getParameterTypes(), true, + // methods) == null) + // constructorMethods.add(curr); + // + // } + // } + // + // // http://bugs.eclipse.org/bugs/show_bug.cgi?id=38487 + // if (!constuctorFound) { + // IType objectType= type.getJavaProject().findType("java.lang.Object"); + // //$NON-NLS-1$ + // IMethod curr= objectType.getMethod("Object", EMPTY); //$NON-NLS-1$ + // if (JavaModelUtil.findMethod(typeName, curr.getParameterTypes(), true, + // methods) == null) { + // constructorMethods.add(curr); + // } + // } + // return (IMethod[]) constructorMethods.toArray(new + // IMethod[constructorMethods.size()]); + // } + /** + * Returns all overridable methods of a type + * + * @param type + * The type to search the overridable methods for + * @param hierarchy + * The type hierarchy of the type + * @param isSubType + * If set, the result can include methods of the passed type, if + * not only methods from super types are considered + * @return Returns the all methods that can be overridden + */ + // public static IMethod[] getOverridableMethods(IType type, ITypeHierarchy + // hierarchy, boolean isSubType) throws JavaModelException { + // List allMethods= new ArrayList(); + // + // IMethod[] typeMethods= type.getMethods(); + // for (int i= 0; i < typeMethods.length; i++) { + // IMethod curr= typeMethods[i]; + // if (!curr.isConstructor() && !Flags.isStatic(curr.getFlags()) && + // !Flags.isPrivate(curr.getFlags())) { + // allMethods.add(curr); + // } + // } + // + // IType[] superTypes= hierarchy.getAllSuperclasses(type); + // for (int i= 0; i < superTypes.length; i++) { + // IMethod[] methods= superTypes[i].getMethods(); + // for (int k= 0; k < methods.length; k++) { + // IMethod curr= methods[k]; + // if (!curr.isConstructor() && !Flags.isStatic(curr.getFlags()) && + // !Flags.isPrivate(curr.getFlags())) { + // if (findMethod(curr, allMethods) == null) { + // allMethods.add(curr); + // } + // } + // } + // } + // + // IType[] superInterfaces= hierarchy.getAllSuperInterfaces(type); + // for (int i= 0; i < superInterfaces.length; i++) { + // IMethod[] methods= superInterfaces[i].getMethods(); + // for (int k= 0; k < methods.length; k++) { + // IMethod curr= methods[k]; + // + // // binary interfaces can contain static initializers (variable + // intializations) + // // 1G4CKUS + // if (!Flags.isStatic(curr.getFlags())) { + // IMethod impl= findMethod(curr, allMethods); + // if (impl == null || !JavaModelUtil.isVisibleInHierarchy(impl, + // type.getPackageFragment()) || prefereInterfaceMethod(hierarchy, curr, + // impl)) { + // if (impl != null) { + // allMethods.remove(impl); + // } + // // implement an interface method when it does not exist in the hierarchy + // // or when it throws less exceptions that the implemented + // allMethods.add(curr); + // } + // } + // } + // } + // if (!isSubType) { + // allMethods.removeAll(Arrays.asList(typeMethods)); + // } + // // remove finals + // for (int i= allMethods.size() - 1; i >= 0; i--) { + // IMethod curr= (IMethod) allMethods.get(i); + // if (Flags.isFinal(curr.getFlags())) { + // allMethods.remove(i); + // } + // } + // return (IMethod[]) allMethods.toArray(new IMethod[allMethods.size()]); + // } + // private static boolean prefereInterfaceMethod(ITypeHierarchy hierarchy, + // IMethod interfaceMethod, IMethod curr) throws JavaModelException { + // if (Flags.isFinal(curr.getFlags())) { + // return false; + // } + // IType interfaceType= interfaceMethod.getDeclaringType(); + // IType[] interfaces= + // hierarchy.getAllSuperInterfaces(curr.getDeclaringType()); + // for (int i= 0; i < interfaces.length; i++) { + // if (interfaces[i] == interfaceType) { + // return false; + // } + // } + // return curr.getExceptionTypes().length > + // interfaceMethod.getExceptionTypes().length; + // } + /** + * Generate method stubs for methods to overrride + * + * @param type + * The type to search the overridable methods for + * @param hierarchy + * The type hierarchy of the type + * @param methodsToImplement + * Methods to override or implement + * @param settings + * Options for comment generation + * @param imports + * Required imports are added to the import structure. Structure + * can be null, types are qualified then. + * @return Returns the generated stubs + */ + // public static String[] genOverrideStubs(IMethod[] methodsToImplement, + // IType type, ITypeHierarchy hierarchy, CodeGenerationSettings settings, + // IImportsStructure imports) throws CoreException { + // GenStubSettings genStubSettings= new GenStubSettings(settings); + // genStubSettings.methodOverwrites= true; + // ICompilationUnit cu= type.getCompilationUnit(); + // String[] result= new String[methodsToImplement.length]; + // for (int i= 0; i < methodsToImplement.length; i++) { + // IMethod curr= methodsToImplement[i]; + // IMethod overrides= + // JavaModelUtil.findMethodImplementationInHierarchy(hierarchy, type, + // curr.getElementName(), curr.getParameterTypes(), curr.isConstructor()); + // if (overrides != null) { + // genStubSettings.callSuper= true; + // curr= overrides; + // } + // genStubSettings.methodModifiers= curr.getFlags(); + // IMethod desc= JavaModelUtil.findMethodDeclarationInHierarchy(hierarchy, + // type, curr.getElementName(), curr.getParameterTypes(), + // curr.isConstructor()); + // if (desc == null) { + // desc= curr; + // } + // result[i]= genStub(cu, type.getElementName(), curr, + // desc.getDeclaringType(), genStubSettings, imports); + // } + // return result; + // } + /** + * Searches for unimplemented methods of a type. + * + * @param isSubType + * If set, the evaluation is for a subtype of the given type. If + * not set, the evaluation is for the type itself. + * @param settings + * Options for comment generation + * @param imports + * Required imports are added to the import structure. Structure + * can be null, types are qualified then. + * @return Returns the generated stubs or null if the + * creation has been canceled + */ + // public static String[] evalUnimplementedMethods(IType type, + // ITypeHierarchy hierarchy, boolean isSubType, CodeGenerationSettings + // settings, + // IImportsStructure imports) throws CoreException { + // + // IMethod[] inheritedMethods= getOverridableMethods(type, hierarchy, + // isSubType); + // + // List toImplement= new ArrayList(); + // for (int i= 0; i < inheritedMethods.length; i++) { + // IMethod curr= inheritedMethods[i]; + // if (JdtFlags.isAbstract(curr)) { + // toImplement.add(curr); + // } + // } + // IMethod[] toImplementArray= (IMethod[]) toImplement.toArray(new + // IMethod[toImplement.size()]); + // return genOverrideStubs(toImplementArray, type, hierarchy, settings, + // imports); + // } + /** + * Examines a string and returns the first line delimiter found. + */ + public static String getLineDelimiterUsed(IJavaElement elem) + throws JavaModelException { + ICompilationUnit cu = (ICompilationUnit) elem + .getAncestor(IJavaElement.COMPILATION_UNIT); + if (cu != null && cu.exists()) { + IBuffer buf = cu.getBuffer(); + int length = buf.getLength(); + for (int i = 0; i < length; i++) { + char ch = buf.getChar(i); + if (ch == SWT.CR) { + if (i + 1 < length) { + if (buf.getChar(i + 1) == SWT.LF) { + return "\r\n"; //$NON-NLS-1$ } - return "\r"; //$NON-NLS-1$ - } else if (ch == SWT.LF) { - return "\n"; //$NON-NLS-1$ } + return "\r"; //$NON-NLS-1$ + } else if (ch == SWT.LF) { + return "\n"; //$NON-NLS-1$ } } - return System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$ } - + return System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$ + } /** - * Embodies the policy which line delimiter to use when inserting into - * a document. - */ + * Embodies the policy which line delimiter to use when inserting into a + * document. + */ public static String getLineDelimiterFor(IDocument doc) { - // new for: 1GF5UU0: ITPJUI:WIN2000 - "Organize Imports" in php editor inserts lines in wrong format - String lineDelim= null; + // new for: 1GF5UU0: ITPJUI:WIN2000 - "Organize Imports" in php editor + // inserts lines in wrong format + String lineDelim = null; try { - lineDelim= doc.getLineDelimiter(0); + lineDelim = doc.getLineDelimiter(0); } catch (BadLocationException e) { } if (lineDelim == null) { - String systemDelimiter= System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$ - String[] lineDelims= doc.getLegalLineDelimiters(); - for (int i= 0; i < lineDelims.length; i++) { + String systemDelimiter = System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$ + String[] lineDelims = doc.getLegalLineDelimiters(); + for (int i = 0; i < lineDelims.length; i++) { if (lineDelims[i].equals(systemDelimiter)) { - lineDelim= systemDelimiter; + lineDelim = systemDelimiter; break; } } if (lineDelim == null) { - lineDelim= lineDelims.length > 0 ? lineDelims[0] : systemDelimiter; + lineDelim = lineDelims.length > 0 ? lineDelims[0] + : systemDelimiter; } } return lineDelim; } - /** * Evaluates the indention used by a Java element. (in tabulators) - */ -// public static int getIndentUsed(IJavaElement elem) throws JavaModelException { -// if (elem instanceof ISourceReference) { -// ICompilationUnit cu= (ICompilationUnit) elem.getAncestor(IJavaElement.COMPILATION_UNIT); -// if (cu != null) { -// IBuffer buf= cu.getBuffer(); -// int offset= ((ISourceReference)elem).getSourceRange().getOffset(); -// int i= offset; -// // find beginning of line -// while (i > 0 && !Strings.isLineDelimiterChar(buf.getChar(i - 1)) ){ -// i--; -// } -// return Strings.computeIndent(buf.getText(i, offset - i), CodeFormatterUtil.getTabWidth()); -// } -// } -// return 0; -// } - - public static String codeFormat(String sourceString, int initialIndentationLevel, String lineDelim) { - ICodeFormatter formatter= ToolFactory.createDefaultCodeFormatter(null); - return formatter.format(sourceString, initialIndentationLevel, null, lineDelim); + */ + // public static int getIndentUsed(IJavaElement elem) throws + // JavaModelException { + // if (elem instanceof ISourceReference) { + // ICompilationUnit cu= (ICompilationUnit) + // elem.getAncestor(IJavaElement.COMPILATION_UNIT); + // if (cu != null) { + // IBuffer buf= cu.getBuffer(); + // int offset= ((ISourceReference)elem).getSourceRange().getOffset(); + // int i= offset; + // // find beginning of line + // while (i > 0 && !Strings.isLineDelimiterChar(buf.getChar(i - 1)) ){ + // i--; + // } + // return Strings.computeIndent(buf.getText(i, offset - i), + // CodeFormatterUtil.getTabWidth()); + // } + // } + // return 0; + // } + public static String codeFormat(String sourceString, + int initialIndentationLevel, String lineDelim) { + ICodeFormatter formatter = ToolFactory.createDefaultCodeFormatter(null); + return formatter.format(sourceString, initialIndentationLevel, null, + lineDelim); } - + /** * Returns the element after the give element. */ -// public static IJavaElement findNextSibling(IJavaElement member) throws JavaModelException { -// IJavaElement parent= member.getParent(); -// if (parent instanceof IParent) { -// IJavaElement[] elements= ((IParent)parent).getChildren(); -// for (int i= elements.length - 2; i >= 0 ; i--) { -// if (member.equals(elements[i])) { -// return elements[i+1]; -// } -// } -// } -// return null; -// } -// + // public static IJavaElement findNextSibling(IJavaElement member) throws + // JavaModelException { + // IJavaElement parent= member.getParent(); + // if (parent instanceof IParent) { + // IJavaElement[] elements= ((IParent)parent).getChildren(); + // for (int i= elements.length - 2; i >= 0 ; i--) { + // if (member.equals(elements[i])) { + // return elements[i+1]; + // } + // } + // } + // return null; + // } + // public static String getTodoTaskTag(IJavaProject project) { - String markers= null; + String markers = null; if (project == null) { - markers= JavaCore.getOption(JavaCore.COMPILER_TASK_TAGS); + markers = JavaCore.getOption(JavaCore.COMPILER_TASK_TAGS); } else { - markers= project.getOption(JavaCore.COMPILER_TASK_TAGS, true); + markers = project.getOption(JavaCore.COMPILER_TASK_TAGS, true); } - + if (markers != null && markers.length() > 0) { - int idx= markers.indexOf(','); + int idx = markers.indexOf(','); if (idx == -1) { return markers; } else { @@ -1072,27 +1307,33 @@ public class StubUtility { } return null; } + /* * Workarounds for bug 38111 */ -// public static String[] getArgumentNameSuggestions(IJavaProject project, String baseName, int dimensions, String[] excluded) { -// String name= workaround38111(baseName); -// String[] res= NamingConventions.suggestArgumentNames(project, "", name, dimensions, excluded); //$NON-NLS-1$ -// return sortByLength(res); // longest first -// } -// -// public static String[] getFieldNameSuggestions(IJavaProject project, String baseName, int dimensions, int modifiers, String[] excluded) { -// String name= workaround38111(baseName); -// String[] res= NamingConventions.suggestFieldNames(project, "", name, dimensions, modifiers, excluded); //$NON-NLS-1$ -// return sortByLength(res); // longest first -// } -// -// public static String[] getLocalNameSuggestions(IJavaProject project, String baseName, int dimensions, String[] excluded) { -// String name= workaround38111(baseName); -// String[] res= NamingConventions.suggestLocalVariableNames(project, "", name, dimensions, excluded); //$NON-NLS-1$ -// return sortByLength(res); // longest first -// } - + // public static String[] getArgumentNameSuggestions(IJavaProject project, + // String baseName, int dimensions, String[] excluded) { + // String name= workaround38111(baseName); + // String[] res= NamingConventions.suggestArgumentNames(project, "", name, + // dimensions, excluded); //$NON-NLS-1$ + // return sortByLength(res); // longest first + // } + // + // public static String[] getFieldNameSuggestions(IJavaProject project, + // String baseName, int dimensions, int modifiers, String[] excluded) { + // String name= workaround38111(baseName); + // String[] res= NamingConventions.suggestFieldNames(project, "", name, + // dimensions, modifiers, excluded); //$NON-NLS-1$ + // return sortByLength(res); // longest first + // } + // + // public static String[] getLocalNameSuggestions(IJavaProject project, + // String baseName, int dimensions, String[] excluded) { + // String name= workaround38111(baseName); + // String[] res= NamingConventions.suggestLocalVariableNames(project, "", + // name, dimensions, excluded); //$NON-NLS-1$ + // return sortByLength(res); // longest first + // } private static String[] sortByLength(String[] proposals) { Arrays.sort(proposals, new Comparator() { public int compare(Object o1, Object o2) { @@ -1101,86 +1342,100 @@ public class StubUtility { }); return proposals; } - + private static String workaround38111(String baseName) { if (BASE_TYPES.contains(baseName)) return baseName; - return Character.toUpperCase(baseName.charAt(0)) + baseName.substring(1); + return Character.toUpperCase(baseName.charAt(0)) + + baseName.substring(1); } - - private static final List BASE_TYPES= Arrays.asList( - new String[] {"boolean", "byte", "char", "double", "float", "int", "long", "short"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ - - public static String suggestArgumentName(IJavaProject project, String baseName, String[] excluded) { -// String[] argnames= getArgumentNameSuggestions(project, baseName, 0, excluded); -// if (argnames.length > 0) { -// return argnames[0]; -// } + + private static final List BASE_TYPES = Arrays + .asList(new String[] { + "boolean", "byte", "char", "double", "float", "int", "long", "short" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ + + public static String suggestArgumentName(IJavaProject project, + String baseName, String[] excluded) { + // String[] argnames= getArgumentNameSuggestions(project, baseName, 0, + // excluded); + // if (argnames.length > 0) { + // return argnames[0]; + // } return baseName; } - - public static String[] suggestArgumentNames(IJavaProject project, String[] paramNames) { - String prefixes= project.getOption(JavaCore.CODEASSIST_ARGUMENT_PREFIXES, true); - String suffixes= project.getOption(JavaCore.CODEASSIST_ARGUMENT_SUFFIXES, true); + + public static String[] suggestArgumentNames(IJavaProject project, + String[] paramNames) { + String prefixes = project.getOption( + JavaCore.CODEASSIST_ARGUMENT_PREFIXES, true); + String suffixes = project.getOption( + JavaCore.CODEASSIST_ARGUMENT_SUFFIXES, true); if (prefixes.length() + suffixes.length() == 0) { return paramNames; } - - String[] newNames= new String[paramNames.length]; + + String[] newNames = new String[paramNames.length]; // Ensure that the codegeneration preferences are respected - for (int i= 0; i < paramNames.length; i++) { - String curr= paramNames[i]; + for (int i = 0; i < paramNames.length; i++) { + String curr = paramNames[i]; if (!hasPrefixOrSuffix(prefixes, suffixes, curr)) { - newNames[i]= suggestArgumentName(project, paramNames[i], null); + newNames[i] = suggestArgumentName(project, paramNames[i], null); } else { - newNames[i]= curr; + newNames[i] = curr; } } return newNames; } - + public static boolean hasFieldName(IJavaProject project, String name) { - String prefixes= project.getOption(JavaCore.CODEASSIST_FIELD_PREFIXES, true); - String suffixes= project.getOption(JavaCore.CODEASSIST_FIELD_SUFFIXES, true); - String staticPrefixes= project.getOption(JavaCore.CODEASSIST_STATIC_FIELD_PREFIXES, true); - String staticSuffixes= project.getOption(JavaCore.CODEASSIST_STATIC_FIELD_SUFFIXES, true); - - - return hasPrefixOrSuffix(prefixes, suffixes, name) - || hasPrefixOrSuffix(staticPrefixes, staticSuffixes, name); + String prefixes = project.getOption(JavaCore.CODEASSIST_FIELD_PREFIXES, + true); + String suffixes = project.getOption(JavaCore.CODEASSIST_FIELD_SUFFIXES, + true); + String staticPrefixes = project.getOption( + JavaCore.CODEASSIST_STATIC_FIELD_PREFIXES, true); + String staticSuffixes = project.getOption( + JavaCore.CODEASSIST_STATIC_FIELD_SUFFIXES, true); + + return hasPrefixOrSuffix(prefixes, suffixes, name) + || hasPrefixOrSuffix(staticPrefixes, staticSuffixes, name); } - + public static boolean hasParameterName(IJavaProject project, String name) { - String prefixes= project.getOption(JavaCore.CODEASSIST_ARGUMENT_PREFIXES, true); - String suffixes= project.getOption(JavaCore.CODEASSIST_ARGUMENT_SUFFIXES, true); + String prefixes = project.getOption( + JavaCore.CODEASSIST_ARGUMENT_PREFIXES, true); + String suffixes = project.getOption( + JavaCore.CODEASSIST_ARGUMENT_SUFFIXES, true); return hasPrefixOrSuffix(prefixes, suffixes, name); } - + public static boolean hasLocalVariableName(IJavaProject project, String name) { - String prefixes= project.getOption(JavaCore.CODEASSIST_LOCAL_PREFIXES, true); - String suffixes= project.getOption(JavaCore.CODEASSIST_LOCAL_SUFFIXES, true); + String prefixes = project.getOption(JavaCore.CODEASSIST_LOCAL_PREFIXES, + true); + String suffixes = project.getOption(JavaCore.CODEASSIST_LOCAL_SUFFIXES, + true); return hasPrefixOrSuffix(prefixes, suffixes, name); } - + public static boolean hasConstantName(String name) { return Character.isUpperCase(name.charAt(0)); } - - - private static boolean hasPrefixOrSuffix(String prefixes, String suffixes, String name) { - final String listSeparartor= ","; //$NON-NLS-1$ - StringTokenizer tok= new StringTokenizer(prefixes, listSeparartor); + private static boolean hasPrefixOrSuffix(String prefixes, String suffixes, + String name) { + final String listSeparartor = ","; //$NON-NLS-1$ + + StringTokenizer tok = new StringTokenizer(prefixes, listSeparartor); while (tok.hasMoreTokens()) { - String curr= tok.nextToken(); + String curr = tok.nextToken(); if (name.startsWith(curr)) { return true; } } - tok= new StringTokenizer(suffixes, listSeparartor); + tok = new StringTokenizer(suffixes, listSeparartor); while (tok.hasMoreTokens()) { - String curr= tok.nextToken(); + String curr = tok.nextToken(); if (name.endsWith(curr)) { return true; }