KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > jdt > internal > corext > codemanipulation > AddJavaDocStubOperation


1 /*******************************************************************************
2  * Copyright (c) 2000, 2007 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  * IBM Corporation - initial API and implementation
10  *******************************************************************************/

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 /**
58  * Add javadoc stubs to members. All members must belong to the same compilation unit.
59  * If the parent type is open in an editor, be sure to pass over its working copy.
60  */

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 JavaDoc createTypeComment(IType type, String JavaDoc lineDelimiter) throws CoreException {
71         String JavaDoc[] typeParameterNames= StubUtility.getTypeParameterNames(type.getTypeParameters());
72         return CodeGeneration.getTypeComment(type.getCompilationUnit(), type.getTypeQualifiedName('.'), typeParameterNames, lineDelimiter);
73     }
74     
75     private String JavaDoc createMethodComment(IMethod meth, String JavaDoc 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 JavaDoc createFieldComment(IField field, String JavaDoc lineDelimiter) throws JavaModelException, CoreException {
88         String JavaDoc typeName= Signature.toString(field.getTypeSignature());
89         String JavaDoc fieldName= field.getElementName();
90         return CodeGeneration.getFieldComment(field.getCompilationUnit(), typeName, fieldName, lineDelimiter);
91     }
92         
93     /**
94      * @return Returns the scheduling rule for this operation
95      */

96     public ISchedulingRule getScheduleRule() {
97         return ResourcesPlugin.getWorkspace().getRoot();
98     }
99
100     /**
101      * Runs the operation.
102      * @throws OperationCanceledException Runtime error thrown when operation is cancelled.
103      */

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 JavaDoc 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 JavaDoc 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 JavaDoc buf= new StringBuffer JavaDoc();
151                     buf.append("/**").append(lineDelim); //$NON-NLS-1$
152
buf.append(" *").append(lineDelim); //$NON-NLS-1$
153
buf.append(" */").append(lineDelim); //$NON-NLS-1$
154
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 JavaDoc line= document.get(region.getOffset(), region.getLength());
165                 String JavaDoc indentString= Strings.getIndentString(line, project);
166                 
167                 String JavaDoc 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); // apply all edits
174
} 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); // read to the first real non comment token
186
} catch (CoreException e) {
187             // ignore
188
}
189         return offset;
190     }
191         
192 }
193
Popular Tags