2222import java .util .logging .Logger ;
2323
2424import org .apache .commons .lang3 .StringUtils ;
25+ import org .eclipse .core .runtime .Assert ;
2526import org .eclipse .core .runtime .CoreException ;
2627import org .eclipse .core .runtime .IPath ;
2728import org .eclipse .jdt .core .CompletionContext ;
3435import org .eclipse .jdt .core .IType ;
3536import org .eclipse .jdt .core .ITypeRoot ;
3637import org .eclipse .jdt .core .JavaModelException ;
38+ import org .eclipse .jdt .core .Signature ;
3739import org .eclipse .jdt .ls .core .internal .JavaLanguageServerPlugin ;
3840import org .eclipse .jdt .ls .core .internal .contentassist .CompletionProposalDescriptionProvider ;
3941import org .eclipse .jdt .ls .core .internal .contentassist .GetterSetterCompletionProposal ;
@@ -109,6 +111,10 @@ private boolean isTestSource(IJavaProject project, ITypeRoot cu) {
109111
110112 @ Override
111113 public void accept (CompletionProposal proposal ) {
114+ if (isFiltered (proposal )) {
115+ return ;
116+ }
117+
112118 if (!isIgnored (proposal .getKind ())) {
113119 if (proposal .getKind () == CompletionProposal .POTENTIAL_METHOD_DECLARATION ) {
114120 acceptPotentialMethodDeclaration (proposal );
@@ -265,4 +271,80 @@ public CompletionContext getContext() {
265271 return context ;
266272 }
267273
268- }
274+ /**
275+ * copied from
276+ * org.eclipse.jdt.ui.text.java.CompletionProposalCollector.isFiltered(CompletionProposal)
277+ */
278+ private boolean isFiltered (CompletionProposal proposal ) {
279+ if (isIgnored (proposal .getKind ())) {
280+ return true ;
281+ }
282+
283+ try {
284+ // Only filter types and constructors from completion.
285+ // Methods from already imported types and packages can still be proposed.
286+ // See https://github.com/eclipse/eclipse.jdt.ls/issues/1212
287+ switch (proposal .getKind ()) {
288+ case CompletionProposal .CONSTRUCTOR_INVOCATION :
289+ case CompletionProposal .ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION :
290+ case CompletionProposal .JAVADOC_TYPE_REF :
291+ case CompletionProposal .TYPE_REF : {
292+ char [] declaringType = getDeclaringType (proposal );
293+ return declaringType != null && org .eclipse .jdt .ls .core .internal .contentassist .TypeFilter .isFiltered (declaringType );
294+ }
295+ }
296+ } catch (Exception e ) {
297+ // do nothing
298+ }
299+
300+ return false ;
301+ }
302+
303+ /**
304+ * copied from
305+ * org.eclipse.jdt.ui.text.java.CompletionProposalCollector.getDeclaringType(CompletionProposal)
306+ */
307+ private final char [] getDeclaringType (CompletionProposal proposal ) {
308+ switch (proposal .getKind ()) {
309+ case CompletionProposal .METHOD_DECLARATION :
310+ case CompletionProposal .METHOD_NAME_REFERENCE :
311+ case CompletionProposal .JAVADOC_METHOD_REF :
312+ case CompletionProposal .METHOD_REF :
313+ case CompletionProposal .CONSTRUCTOR_INVOCATION :
314+ case CompletionProposal .ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION :
315+ case CompletionProposal .METHOD_REF_WITH_CASTED_RECEIVER :
316+ case CompletionProposal .ANNOTATION_ATTRIBUTE_REF :
317+ case CompletionProposal .POTENTIAL_METHOD_DECLARATION :
318+ case CompletionProposal .ANONYMOUS_CLASS_DECLARATION :
319+ case CompletionProposal .FIELD_REF :
320+ case CompletionProposal .FIELD_REF_WITH_CASTED_RECEIVER :
321+ case CompletionProposal .JAVADOC_FIELD_REF :
322+ case CompletionProposal .JAVADOC_VALUE_REF :
323+ char [] declaration = proposal .getDeclarationSignature ();
324+ // special methods may not have a declaring type: methods defined on arrays etc.
325+ // Currently known: class literals don't have a declaring type - use Object
326+ if (declaration == null ) {
327+ return "java.lang.Object" .toCharArray (); //$NON-NLS-1$
328+ }
329+ return Signature .toCharArray (declaration );
330+ case CompletionProposal .PACKAGE_REF :
331+ case CompletionProposal .MODULE_REF :
332+ case CompletionProposal .MODULE_DECLARATION :
333+ return proposal .getDeclarationSignature ();
334+ case CompletionProposal .JAVADOC_TYPE_REF :
335+ case CompletionProposal .TYPE_REF :
336+ return Signature .toCharArray (proposal .getSignature ());
337+ case CompletionProposal .LOCAL_VARIABLE_REF :
338+ case CompletionProposal .VARIABLE_DECLARATION :
339+ case CompletionProposal .KEYWORD :
340+ case CompletionProposal .LABEL_REF :
341+ case CompletionProposal .JAVADOC_BLOCK_TAG :
342+ case CompletionProposal .JAVADOC_INLINE_TAG :
343+ case CompletionProposal .JAVADOC_PARAM_REF :
344+ return null ;
345+ default :
346+ Assert .isTrue (false );
347+ return null ;
348+ }
349+ }
350+ }
0 commit comments