KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > jdt > internal > ui > text > java > JavaTypeCompletionProposalComputer


1 /*******************************************************************************
2  * Copyright (c) 2005, 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.ui.text.java;
12
13 import java.util.HashSet JavaDoc;
14 import java.util.Iterator JavaDoc;
15 import java.util.List JavaDoc;
16 import java.util.Set JavaDoc;
17
18 import org.eclipse.core.runtime.IProgressMonitor;
19
20 import org.eclipse.jface.text.BadLocationException;
21 import org.eclipse.jface.text.IDocument;
22
23 import org.eclipse.jdt.core.CompletionProposal;
24 import org.eclipse.jdt.core.IJavaElement;
25 import org.eclipse.jdt.core.IJavaProject;
26 import org.eclipse.jdt.core.IType;
27 import org.eclipse.jdt.core.JavaCore;
28 import org.eclipse.jdt.core.JavaModelException;
29 import org.eclipse.jdt.core.Signature;
30
31 import org.eclipse.jdt.ui.text.java.CompletionProposalCollector;
32 import org.eclipse.jdt.ui.text.java.ContentAssistInvocationContext;
33 import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
34 import org.eclipse.jdt.ui.text.java.JavaContentAssistInvocationContext;
35
36 import org.eclipse.jdt.internal.ui.JavaPlugin;
37 import org.eclipse.jdt.internal.ui.text.JavaHeuristicScanner;
38 import org.eclipse.jdt.internal.ui.text.Symbols;
39
40 /**
41  *
42  * @since 3.2
43  */

44 public class JavaTypeCompletionProposalComputer extends JavaCompletionProposalComputer {
45     /*
46      * @see org.eclipse.jdt.internal.ui.text.java.JavaCompletionProposalComputer#createCollector(org.eclipse.jdt.ui.text.java.JavaContentAssistInvocationContext)
47      */

48     protected CompletionProposalCollector createCollector(JavaContentAssistInvocationContext context) {
49         CompletionProposalCollector collector= super.createCollector(context);
50         collector.setIgnored(CompletionProposal.ANNOTATION_ATTRIBUTE_REF, true);
51         collector.setIgnored(CompletionProposal.ANONYMOUS_CLASS_DECLARATION, true);
52         collector.setIgnored(CompletionProposal.FIELD_REF, true);
53         collector.setIgnored(CompletionProposal.KEYWORD, true);
54         collector.setIgnored(CompletionProposal.LABEL_REF, true);
55         collector.setIgnored(CompletionProposal.LOCAL_VARIABLE_REF, true);
56         collector.setIgnored(CompletionProposal.METHOD_DECLARATION, true);
57         collector.setIgnored(CompletionProposal.METHOD_NAME_REFERENCE, true);
58         collector.setIgnored(CompletionProposal.METHOD_REF, true);
59         collector.setIgnored(CompletionProposal.PACKAGE_REF, true);
60         collector.setIgnored(CompletionProposal.POTENTIAL_METHOD_DECLARATION, true);
61         collector.setIgnored(CompletionProposal.VARIABLE_DECLARATION, true);
62         
63         collector.setIgnored(CompletionProposal.JAVADOC_BLOCK_TAG, true);
64         collector.setIgnored(CompletionProposal.JAVADOC_FIELD_REF, true);
65         collector.setIgnored(CompletionProposal.JAVADOC_INLINE_TAG, true);
66         collector.setIgnored(CompletionProposal.JAVADOC_METHOD_REF, true);
67         collector.setIgnored(CompletionProposal.JAVADOC_PARAM_REF, true);
68         collector.setIgnored(CompletionProposal.JAVADOC_TYPE_REF, true);
69         collector.setIgnored(CompletionProposal.JAVADOC_VALUE_REF, true);
70         
71         collector.setIgnored(CompletionProposal.TYPE_REF, false);
72         return collector;
73     }
74     
75     /*
76      * @see org.eclipse.jdt.internal.ui.text.java.JavaCompletionProposalComputer#computeCompletionProposals(org.eclipse.jface.text.contentassist.TextContentAssistInvocationContext, org.eclipse.core.runtime.IProgressMonitor)
77      */

78     public List JavaDoc computeCompletionProposals(ContentAssistInvocationContext context, IProgressMonitor monitor) {
79         List JavaDoc types= super.computeCompletionProposals(context, monitor);
80         if (context instanceof JavaContentAssistInvocationContext) {
81             JavaContentAssistInvocationContext javaContext= (JavaContentAssistInvocationContext) context;
82             try {
83                 if (types.size() > 0 && context.computeIdentifierPrefix().length() == 0) {
84                     IType expectedType= javaContext.getExpectedType();
85                     if (expectedType != null) {
86                         // empty prefix completion - insert LRU types if known, but prune if they already occur in the core list
87

88                         // compute minmimum relevance and already proposed list
89
int relevance= Integer.MAX_VALUE;
90                         Set JavaDoc proposed= new HashSet JavaDoc();
91                         for (Iterator JavaDoc it= types.iterator(); it.hasNext();) {
92                             AbstractJavaCompletionProposal p= (AbstractJavaCompletionProposal) it.next();
93                             IJavaElement element= p.getJavaElement();
94                             if (element instanceof IType)
95                                 proposed.add(((IType) element).getFullyQualifiedName());
96                             relevance= Math.min(relevance, p.getRelevance());
97                         }
98
99                         // insert history types
100
List JavaDoc history= JavaPlugin.getDefault().getContentAssistHistory().getHistory(expectedType.getFullyQualifiedName()).getTypes();
101                         relevance-= history.size() + 1;
102                         for (Iterator JavaDoc it= history.iterator(); it.hasNext();) {
103                             String JavaDoc type= (String JavaDoc) it.next();
104                             if (proposed.contains(type))
105                                 continue;
106                             
107                             IJavaCompletionProposal proposal= createTypeProposal(relevance, type, javaContext);
108                             
109                             if (proposal != null)
110                                 types.add(proposal);
111                             relevance++;
112                         }
113                     }
114                 }
115             } catch (BadLocationException x) {
116                 // log & ignore
117
JavaPlugin.log(x);
118             } catch (JavaModelException x) {
119                 // log & ignore
120
JavaPlugin.log(x);
121             }
122         }
123         return types;
124     }
125
126     private IJavaCompletionProposal createTypeProposal(int relevance, String JavaDoc fullyQualifiedType, JavaContentAssistInvocationContext context) throws JavaModelException {
127         IType type= context.getCompilationUnit().getJavaProject().findType(fullyQualifiedType);
128         if (type == null)
129             return null;
130         
131         CompletionProposal proposal= CompletionProposal.create(CompletionProposal.TYPE_REF, context.getInvocationOffset());
132         proposal.setCompletion(fullyQualifiedType.toCharArray());
133         proposal.setDeclarationSignature(type.getPackageFragment().getElementName().toCharArray());
134         proposal.setFlags(type.getFlags());
135         proposal.setRelevance(relevance);
136         proposal.setReplaceRange(context.getInvocationOffset(), context.getInvocationOffset());
137         proposal.setSignature(Signature.createTypeSignature(fullyQualifiedType, true).toCharArray());
138
139         if (shouldProposeGenerics(context.getProject()))
140             return new LazyGenericTypeProposal(proposal, context);
141         else
142             return new LazyJavaTypeCompletionProposal(proposal, context);
143     }
144     
145     /**
146      * Returns <code>true</code> if generic proposals should be allowed,
147      * <code>false</code> if not. Note that even though code (in a library)
148      * may be referenced that uses generics, it is still possible that the
149      * current source does not allow generics.
150      *
151      * @param project the Java project
152      * @return <code>true</code> if the generic proposals should be allowed,
153      * <code>false</code> if not
154      */

155     private final boolean shouldProposeGenerics(IJavaProject project) {
156         String JavaDoc sourceVersion;
157         if (project != null)
158             sourceVersion= project.getOption(JavaCore.COMPILER_SOURCE, true);
159         else
160             sourceVersion= JavaCore.getOption(JavaCore.COMPILER_SOURCE);
161
162         return sourceVersion != null && JavaCore.VERSION_1_5.compareTo(sourceVersion) <= 0;
163     }
164     
165     protected int guessContextInformationPosition(ContentAssistInvocationContext context) {
166         final int contextPosition= context.getInvocationOffset();
167         
168         IDocument document= context.getDocument();
169         JavaHeuristicScanner scanner= new JavaHeuristicScanner(document);
170         int bound= Math.max(-1, contextPosition - 200);
171         
172         // try the innermost scope of angle brackets that looks like a generic type argument list
173
try {
174             int pos= contextPosition - 1;
175             do {
176                 int angle= scanner.findOpeningPeer(pos, bound, '<', '>');
177                 if (angle == JavaHeuristicScanner.NOT_FOUND)
178                     break;
179                 int token= scanner.previousToken(angle - 1, bound);
180                 // next token must be a method name that is a generic type
181
if (token == Symbols.TokenIDENT) {
182                     int off= scanner.getPosition() + 1;
183                     int end= angle;
184                     String JavaDoc ident= document.get(off, end - off).trim();
185                     if (JavaHeuristicScanner.isGenericStarter(ident))
186                         return angle + 1;
187                 }
188                 pos= angle - 1;
189             } while (true);
190         } catch (BadLocationException x) {
191         }
192         
193         return super.guessContextInformationPosition(context);
194     }
195
196 }
197
Popular Tags