1 11 package org.eclipse.jdt.internal.ui.text.java; 12 13 import java.util.HashSet ; 14 import java.util.Iterator ; 15 import java.util.List ; 16 import java.util.Set ; 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 44 public class JavaTypeCompletionProposalComputer extends JavaCompletionProposalComputer { 45 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 78 public List computeCompletionProposals(ContentAssistInvocationContext context, IProgressMonitor monitor) { 79 List 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 88 int relevance= Integer.MAX_VALUE; 90 Set proposed= new HashSet (); 91 for (Iterator 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 List history= JavaPlugin.getDefault().getContentAssistHistory().getHistory(expectedType.getFullyQualifiedName()).getTypes(); 101 relevance-= history.size() + 1; 102 for (Iterator it= history.iterator(); it.hasNext();) { 103 String type= (String ) 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 JavaPlugin.log(x); 118 } catch (JavaModelException x) { 119 JavaPlugin.log(x); 121 } 122 } 123 return types; 124 } 125 126 private IJavaCompletionProposal createTypeProposal(int relevance, String 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 155 private final boolean shouldProposeGenerics(IJavaProject project) { 156 String 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 { 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 if (token == Symbols.TokenIDENT) { 182 int off= scanner.getPosition() + 1; 183 int end= angle; 184 String 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 |