1 11 package org.eclipse.jdt.internal.corext.codemanipulation; 12 13 import org.eclipse.text.edits.InsertEdit; 14 import org.eclipse.text.edits.MultiTextEdit; 15 16 import org.eclipse.core.runtime.CoreException; 17 import org.eclipse.core.runtime.IPath; 18 import org.eclipse.core.runtime.IProgressMonitor; 19 import org.eclipse.core.runtime.IStatus; 20 import org.eclipse.core.runtime.NullProgressMonitor; 21 import org.eclipse.core.runtime.OperationCanceledException; 22 import org.eclipse.core.runtime.SubProgressMonitor; 23 import org.eclipse.core.runtime.jobs.ISchedulingRule; 24 25 import org.eclipse.core.filebuffers.FileBuffers; 26 import org.eclipse.core.filebuffers.ITextFileBufferManager; 27 import org.eclipse.core.filebuffers.LocationKind; 28 29 import org.eclipse.core.resources.IWorkspaceRunnable; 30 import org.eclipse.core.resources.ResourcesPlugin; 31 32 import org.eclipse.jface.text.BadLocationException; 33 import org.eclipse.jface.text.IDocument; 34 import org.eclipse.jface.text.IRegion; 35 import org.eclipse.jface.text.TextUtilities; 36 37 import org.eclipse.jdt.core.ICompilationUnit; 38 import org.eclipse.jdt.core.IField; 39 import org.eclipse.jdt.core.IJavaElement; 40 import org.eclipse.jdt.core.IJavaProject; 41 import org.eclipse.jdt.core.IMember; 42 import org.eclipse.jdt.core.IMethod; 43 import org.eclipse.jdt.core.IType; 44 import org.eclipse.jdt.core.ITypeHierarchy; 45 import org.eclipse.jdt.core.JavaModelException; 46 import org.eclipse.jdt.core.Signature; 47 48 import org.eclipse.jdt.internal.corext.dom.TokenScanner; 49 import org.eclipse.jdt.internal.corext.util.MethodOverrideTester; 50 import org.eclipse.jdt.internal.corext.util.Strings; 51 import org.eclipse.jdt.internal.corext.util.SuperTypeHierarchyCache; 52 53 import org.eclipse.jdt.ui.CodeGeneration; 54 55 import org.eclipse.jdt.internal.ui.JavaUIStatus; 56 57 61 public class AddJavaDocStubOperation implements IWorkspaceRunnable { 62 63 private IMember[] fMembers; 64 65 public AddJavaDocStubOperation(IMember[] members) { 66 super(); 67 fMembers= members; 68 } 69 70 private String createTypeComment(IType type, String lineDelimiter) throws CoreException { 71 String [] typeParameterNames= StubUtility.getTypeParameterNames(type.getTypeParameters()); 72 return CodeGeneration.getTypeComment(type.getCompilationUnit(), type.getTypeQualifiedName('.'), typeParameterNames, lineDelimiter); 73 } 74 75 private String createMethodComment(IMethod meth, String lineDelimiter) throws CoreException { 76 IType declaringType= meth.getDeclaringType(); 77 78 IMethod overridden= null; 79 if (!meth.isConstructor()) { 80 ITypeHierarchy hierarchy= SuperTypeHierarchyCache.getTypeHierarchy(declaringType); 81 MethodOverrideTester tester= new MethodOverrideTester(declaringType, hierarchy); 82 overridden= tester.findOverriddenMethod(meth, true); 83 } 84 return CodeGeneration.getMethodComment(meth, overridden, lineDelimiter); 85 } 86 87 private String createFieldComment(IField field, String lineDelimiter) throws JavaModelException, CoreException { 88 String typeName= Signature.toString(field.getTypeSignature()); 89 String fieldName= field.getElementName(); 90 return CodeGeneration.getFieldComment(field.getCompilationUnit(), typeName, fieldName, lineDelimiter); 91 } 92 93 96 public ISchedulingRule getScheduleRule() { 97 return ResourcesPlugin.getWorkspace().getRoot(); 98 } 99 100 104 public void run(IProgressMonitor monitor) throws CoreException, OperationCanceledException { 105 if (monitor == null) { 106 monitor= new NullProgressMonitor(); 107 } 108 if (fMembers.length == 0) { 109 return; 110 } 111 try { 112 monitor.beginTask(CodeGenerationMessages.AddJavaDocStubOperation_description, fMembers.length + 2); 113 114 addJavadocComments(monitor); 115 } finally { 116 monitor.done(); 117 } 118 } 119 120 private void addJavadocComments(IProgressMonitor monitor) throws CoreException { 121 ICompilationUnit cu= fMembers[0].getCompilationUnit(); 122 123 ITextFileBufferManager manager= FileBuffers.getTextFileBufferManager(); 124 IPath path= cu.getPath(); 125 126 manager.connect(path, LocationKind.IFILE, new SubProgressMonitor(monitor, 1)); 127 try { 128 IDocument document= manager.getTextFileBuffer(path, LocationKind.IFILE).getDocument(); 129 130 String lineDelim= TextUtilities.getDefaultLineDelimiter(document); 131 MultiTextEdit edit= new MultiTextEdit(); 132 133 for (int i= 0; i < fMembers.length; i++) { 134 IMember curr= fMembers[i]; 135 int memberStartOffset= getMemberStartOffset(curr, document); 136 137 String comment= null; 138 switch (curr.getElementType()) { 139 case IJavaElement.TYPE: 140 comment= createTypeComment((IType) curr, lineDelim); 141 break; 142 case IJavaElement.FIELD: 143 comment= createFieldComment((IField) curr, lineDelim); 144 break; 145 case IJavaElement.METHOD: 146 comment= createMethodComment((IMethod) curr, lineDelim); 147 break; 148 } 149 if (comment == null) { 150 StringBuffer buf= new StringBuffer (); 151 buf.append("/**").append(lineDelim); buf.append(" *").append(lineDelim); buf.append(" */").append(lineDelim); comment= buf.toString(); 155 } else { 156 if (!comment.endsWith(lineDelim)) { 157 comment= comment + lineDelim; 158 } 159 } 160 161 final IJavaProject project= cu.getJavaProject(); 162 IRegion region= document.getLineInformationOfOffset(memberStartOffset); 163 164 String line= document.get(region.getOffset(), region.getLength()); 165 String indentString= Strings.getIndentString(line, project); 166 167 String indentedComment= Strings.changeIndent(comment, 0, project, indentString, lineDelim); 168 169 edit.addChild(new InsertEdit(memberStartOffset, indentedComment)); 170 171 monitor.worked(1); 172 } 173 edit.apply(document); } catch (BadLocationException e) { 175 throw new CoreException(JavaUIStatus.createError(IStatus.ERROR, e)); 176 } finally { 177 manager.disconnect(path, LocationKind.IFILE,new SubProgressMonitor(monitor, 1)); 178 } 179 } 180 181 private int getMemberStartOffset(IMember curr, IDocument document) throws JavaModelException { 182 int offset= curr.getSourceRange().getOffset(); 183 TokenScanner scanner= new TokenScanner(document, curr.getJavaProject()); 184 try { 185 return scanner.getNextStartOffset(offset, true); } catch (CoreException e) { 187 } 189 return offset; 190 } 191 192 } 193 | Popular Tags |