diff --git a/org.eclipse.jdt.core.manipulation/META-INF/MANIFEST.MF b/org.eclipse.jdt.core.manipulation/META-INF/MANIFEST.MF index ec10aa3c980..10332e7da1b 100644 --- a/org.eclipse.jdt.core.manipulation/META-INF/MANIFEST.MF +++ b/org.eclipse.jdt.core.manipulation/META-INF/MANIFEST.MF @@ -3,7 +3,7 @@ Automatic-Module-Name: org.eclipse.jdt.core.manipulation Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.jdt.core.manipulation; singleton:=true -Bundle-Version: 1.24.200.qualifier +Bundle-Version: 1.25.0.qualifier Bundle-Vendor: %providerName Bundle-Activator: org.eclipse.jdt.internal.core.manipulation.JavaManipulationPlugin Bundle-Localization: plugin diff --git a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/core/manipulation/CodeGeneration.java b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/core/manipulation/CodeGeneration.java index 6190c767f85..3b1a50f7d0d 100644 --- a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/core/manipulation/CodeGeneration.java +++ b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/core/manipulation/CodeGeneration.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2020 IBM Corporation and others. + * Copyright (c) 2000, 2026 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -152,6 +152,21 @@ public static String getTypeComment(ICompilationUnit cu, String typeQualifiedNam return StubUtility.getTypeComment(cu, typeQualifiedName, typeParameterNames, EMPTY, lineDelimiter); } + /** + * Returns the content for a new type comment using the 'type comment' code template. The returned content is unformatted and is not indented. + * @param cu The compilation unit where the type is contained. The compilation unit does not need to exist. + * @param typeQualifiedName The name of the type to which the comment is added. For inner types the name must be qualified and include the outer + * types names (dot separated). See {@link org.eclipse.jdt.core.IType#getTypeQualifiedName(char)}. + * @param typeParameterNames The type parameter names + * @param lineDelimiter The line delimiter to be used. + * @return Returns the new content or null if the code template is undefined or empty. The returned content is unformatted and is not indented. + * @throws CoreException Thrown when the evaluation of the code template fails. + * @since 1.25 + */ + public static String getTypeComment(ICompilationUnit cu, String typeQualifiedName, String[] typeParameterNames, String lineDelimiter, boolean useMarkdown) throws CoreException { + return StubUtility.getTypeComment(cu, typeQualifiedName, typeParameterNames, EMPTY, lineDelimiter, useMarkdown); + } + /** * Returns the content for a new type comment using the 'type comment' code template. The returned content is unformatted and is not indented. * @param cu The compilation unit where the type is contained. The compilation unit does not need to exist. @@ -301,6 +316,30 @@ public static String getMethodComment(IMethod method, IMethod overridden, String method.getElementName(), paramNames, method.getExceptionTypes(), retType, typeParameterNames, overridden, false, lineDelimiter); } + /** + * Returns the comment for a method or constructor using the comment code templates (constructor / method / overriding method). + * null is returned if the template is empty. + *

The returned string is unformatted and not indented. + * + * @param method The method to be documented. The method must exist. + * @param overridden The method that will be overridden by the created method or + * null for non-overriding methods. If not null, the method must exist. + * @param lineDelimiter The line delimiter to be used. + * @param useMarkdown True if markdown templates should be used, false if regular javadoc templates + * @return Returns the constructed comment or null if + * the comment code template is empty. The returned string is unformatted and and has no indent (formatting required). + * @throws CoreException Thrown when the evaluation of the code template fails. + * @since 1.25 + */ + public static String getMethodComment(IMethod method, IMethod overridden, String lineDelimiter, boolean useMarkdown) throws CoreException { + String retType= method.isConstructor() ? null : method.getReturnType(); + String[] paramNames= method.getParameterNames(); + String[] typeParameterNames= StubUtility.getTypeParameterNames(method.getTypeParameters()); + + return StubUtility.getMethodComment(method.getCompilationUnit(), method.getDeclaringType().getElementName(), + method.getElementName(), paramNames, method.getExceptionTypes(), retType, typeParameterNames, overridden, false, lineDelimiter, useMarkdown); + } + /** * Returns the comment for a method or constructor using the comment code templates (constructor / method / overriding method). * null is returned if the template is empty. @@ -360,6 +399,20 @@ public static String getModuleComment(ICompilationUnit cu, IModuleDescription de return StubUtility.getModuleComment(cu, desc.getElementName(), desc.getProvidedServiceNames(), desc.getUsedServiceNames(), lineDelimiter); } + /** + * Returns the comment for a module based on code templates + * + * @param cu The compilation unit for the module + * @param desc The module description + * @param lineDelimiter The line delimiter to use + * @return Module comment + * @throws CoreException Thrown when the evaluation of the code template fails + * @since 1.25 + */ + public static String getModuleComment(ICompilationUnit cu, IModuleDescription desc, String lineDelimiter, boolean useMarkdown) throws CoreException { + return StubUtility.getModuleComment(cu, desc.getElementName(), desc.getProvidedServiceNames(), desc.getUsedServiceNames(), lineDelimiter, useMarkdown); + } + /** * Returns the content of the body for a method or constructor using the method body templates. * null is returned if the template is empty. diff --git a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/core/manipulation/StubUtility.java b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/core/manipulation/StubUtility.java index 19bb56dd895..e5d3d1ce1fa 100644 --- a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/core/manipulation/StubUtility.java +++ b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/core/manipulation/StubUtility.java @@ -288,10 +288,19 @@ public static String getFileComment(ICompilationUnit cu, String lineDelimiter) t /* * Don't use this method directly, use CodeGeneration. - * @see CodeGeneration#getTypeComment(ICompilationUnit, String, String[], String) + * @see CodeGeneration#getTypeComment(ICompilationUnit, String, String[], String, boolean) */ public static String getTypeComment(ICompilationUnit cu, String typeQualifiedName, String[] typeParameterNames, String[] params, String lineDelim) throws CoreException { boolean useMarkdown= useMarkdown(cu.getJavaProject()); + return getTypeComment(cu, typeQualifiedName, typeParameterNames, params, lineDelim, useMarkdown); + } + + /* + * Don't use this method directly, use CodeGeneration. + * @see CodeGeneration#getTypeComment(ICompilationUnit, String, String[], String) + */ + public static String getTypeComment(ICompilationUnit cu, String typeQualifiedName, String[] typeParameterNames, String[] params, + String lineDelim, boolean useMarkdown) throws CoreException { Template template= getCodeTemplate(useMarkdown ? CodeTemplateContextType.MARKDOWNTYPECOMMENT_ID : CodeTemplateContextType.TYPECOMMENT_ID, cu.getJavaProject()); if (template == null) { return null; @@ -442,6 +451,15 @@ public static String getTypeBody(String templateID, ICompilationUnit cu, String public static String getMethodComment(ICompilationUnit cu, String typeName, String methodName, String[] paramNames, String[] excTypeSig, String retTypeSig, String[] typeParameterNames, IMethod target, boolean delegate, String lineDelimiter) throws CoreException { boolean useMarkdown= useMarkdown(cu.getJavaProject()); + return getMethodComment(cu, typeName, methodName, paramNames, excTypeSig, retTypeSig, typeParameterNames, target, delegate, lineDelimiter, useMarkdown); + } + + /* + * Don't use this method directly, use CodeGeneration. + * @see CodeGeneration#getMethodComment(ICompilationUnit, String, String, String[], String[], String, String[], IMethod, String) + */ + public static String getMethodComment(ICompilationUnit cu, String typeName, String methodName, String[] paramNames, String[] excTypeSig, String retTypeSig, String[] typeParameterNames, + IMethod target, boolean delegate, String lineDelimiter, boolean useMarkdown) throws CoreException { String templateName= useMarkdown ? CodeTemplateContextType.MARKDOWNMETHODCOMMENT_ID : CodeTemplateContextType.METHODCOMMENT_ID; if (retTypeSig == null) { templateName= useMarkdown ? CodeTemplateContextType.MARKDOWNCONSTRUCTORCOMMENT_ID : CodeTemplateContextType.CONSTRUCTORCOMMENT_ID; @@ -540,6 +558,15 @@ private static String fixEmptyVariables(TemplateBuffer buffer, String[] variable public static String getModuleComment(ICompilationUnit cu, String moduleName, String[] providesNames, String[] usesNames, String lineDelimiter) throws CoreException { boolean useMarkdown= useMarkdown(cu.getJavaProject()); + return getModuleComment(cu, moduleName, providesNames, usesNames, lineDelimiter, useMarkdown); + } + + /* + * Don't use this method directly, use CodeGeneration. + * @see CodeGeneration#getModuleComment(IJavaProject, String, String, String[], String[], String[], String[], String[], String) + */ + public static String getModuleComment(ICompilationUnit cu, String moduleName, String[] providesNames, + String[] usesNames, String lineDelimiter, boolean useMarkdown) throws CoreException { String templateName= useMarkdown ? CodeTemplateContextType.MARKDOWNMODULECOMMENT_ID : CodeTemplateContextType.MODULECOMMENT_ID; Template template= getCodeTemplate(templateName, cu.getJavaProject()); if (template == null) { diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/javadoc/JavaDocAutoIndentStrategy.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/javadoc/JavaDocAutoIndentStrategy.java index 278645c2a22..bfaae18e861 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/javadoc/JavaDocAutoIndentStrategy.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/javadoc/JavaDocAutoIndentStrategy.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2025 IBM Corporation and others. + * Copyright (c) 2000, 2026 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -103,10 +103,12 @@ private void indentAfterNewLine(IDocument d, DocumentCommand c) { buf.append(indentation.substring(0, lengthToAdd)); if (firstNonWS < offset) { + boolean useMarkdown= false; if (d.getChar(firstNonWS) == '/') { // Javadoc/markdown started on this line if (d.getChar(firstNonWS+1) == '/') { buf.append("/// "); //$NON-NLS-1$ + useMarkdown= true; if (handleMarkdownCodeFence(d, c, lineOffset, offset, indentation, buf)) return; } else { @@ -134,7 +136,7 @@ private void indentAfterNewLine(IDocument d, DocumentCommand c) { if (unit != null) { try { JavaModelUtil.reconcile(unit); - String string= createJavaDocTags(d, c, indentation, lineDelimiter, unit); + String string= createJavaDocTags(d, c, indentation, lineDelimiter, unit, useMarkdown); buf.append(restOfLine); // only add tags if they are non-empty - the empty line has already been added above. if (string != null && !"*".equals(string.trim())) //$NON-NLS-1$ @@ -251,7 +253,8 @@ private IRegion findPrefixRange(IDocument document, IRegion line) throws BadLoca * @throws CoreException if accessing the Java model fails * @throws BadLocationException if accessing the document fails */ - private String createJavaDocTags(IDocument document, DocumentCommand command, String indentation, String lineDelimiter, ICompilationUnit unit) + private String createJavaDocTags(IDocument document, DocumentCommand command, String indentation, + String lineDelimiter, ICompilationUnit unit, boolean useMarkdown) throws CoreException, BadLocationException { IJavaElement element= unit.getElementAt(command.offset); @@ -260,13 +263,13 @@ private String createJavaDocTags(IDocument document, DocumentCommand command, St switch (element.getElementType()) { case IJavaElement.TYPE: - return createTypeTags(document, command, indentation, lineDelimiter, (IType) element); + return createTypeTags(document, command, indentation, lineDelimiter, (IType) element, useMarkdown); case IJavaElement.METHOD: - return createMethodTags(document, command, indentation, lineDelimiter, (IMethod) element); + return createMethodTags(document, command, indentation, lineDelimiter, (IMethod) element, useMarkdown); case IJavaElement.JAVA_MODULE: - return createModuleTags(document, command, indentation, lineDelimiter, (IModuleDescription) element); + return createModuleTags(document, command, indentation, lineDelimiter, (IModuleDescription) element, useMarkdown); default: return null; @@ -305,11 +308,12 @@ private String prepareTemplateComment(String comment, String indentation, IJavaP return Strings.changeIndent(comment, 0, project, indentation, lineDelimiter); } - private String createTypeTags(IDocument document, DocumentCommand command, String indentation, String lineDelimiter, IType type) + private String createTypeTags(IDocument document, DocumentCommand command, String indentation, + String lineDelimiter, IType type, boolean useMarkdown) throws CoreException, BadLocationException { String[] typeParamNames= StubUtility.getTypeParameterNames(type.getTypeParameters()); - String comment= CodeGeneration.getTypeComment(type.getCompilationUnit(), type.getTypeQualifiedName('.'), typeParamNames, lineDelimiter); + String comment= CodeGeneration.getTypeComment(type.getCompilationUnit(), type.getTypeQualifiedName('.'), typeParamNames, lineDelimiter, useMarkdown); if (comment != null) { boolean javadocComment= comment.startsWith("/**"); //$NON-NLS-1$ if (!isFirstComment(document, command, type, javadocComment)) @@ -319,10 +323,11 @@ private String createTypeTags(IDocument document, DocumentCommand command, Strin return null; } - private String createModuleTags(IDocument document, DocumentCommand command, String indentation, String lineDelimiter, IModuleDescription module) + private String createModuleTags(IDocument document, DocumentCommand command, String indentation, + String lineDelimiter, IModuleDescription module, boolean useMarkdown) throws CoreException, BadLocationException { - String comment= CodeGeneration.getModuleComment(module.getCompilationUnit(), module, lineDelimiter); + String comment= CodeGeneration.getModuleComment(module.getCompilationUnit(), module, lineDelimiter, useMarkdown); if (comment != null) { boolean javadocComment= comment.startsWith("/**"); //$NON-NLS-1$ if (!isFirstComment(document, command, module, javadocComment)) @@ -332,12 +337,13 @@ private String createModuleTags(IDocument document, DocumentCommand command, Str return null; } - private String createMethodTags(IDocument document, DocumentCommand command, String indentation, String lineDelimiter, IMethod method) + private String createMethodTags(IDocument document, DocumentCommand command, String indentation, + String lineDelimiter, IMethod method, boolean useMarkdown) throws CoreException, BadLocationException { IRegion partition= TextUtilities.getPartition(document, fPartitioning, command.offset, false); IMethod inheritedMethod= getInheritedMethod(method); - String comment= CodeGeneration.getMethodComment(method, inheritedMethod, lineDelimiter); + String comment= CodeGeneration.getMethodComment(method, inheritedMethod, lineDelimiter, useMarkdown); if (comment != null) { comment= comment.trim(); boolean javadocComment= comment.startsWith("/**"); //$NON-NLS-1$