--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.internal.ui.text.java;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+
+import org.eclipse.jdt.core.CompletionProposal;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.Signature;
+
+import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
+
+import org.eclipse.jdt.ui.PreferenceConstants;
+import org.eclipse.jdt.ui.text.java.CompletionProposalCollector;
+import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
+import org.eclipse.jdt.ui.text.java.JavaContentAssistInvocationContext;
+
+import org.eclipse.jdt.internal.ui.JavaPlugin;
+
+/**
+ * Completion proposal collector which creates proposals with
+ * filled in argument names.
+ * <p>
+ * This collector is used when
+ * {@link PreferenceConstants#CODEASSIST_FILL_ARGUMENT_NAMES} is enabled.
+ * <p/>
+ */
+public final class FillArgumentNamesCompletionProposalCollector extends CompletionProposalCollector {
+
+ private final boolean fIsGuessArguments;
+
+ public FillArgumentNamesCompletionProposalCollector(JavaContentAssistInvocationContext context) {
+ super(context.getCompilationUnit(), true);
+ setInvocationContext(context);
+ IPreferenceStore preferenceStore= JavaPlugin.getDefault().getPreferenceStore();
+ fIsGuessArguments= preferenceStore.getBoolean(PreferenceConstants.CODEASSIST_GUESS_METHOD_ARGUMENTS);
+ if (preferenceStore.getBoolean(PreferenceConstants.CODEASSIST_FILL_ARGUMENT_NAMES)) {
+ setRequireExtendedContext(true);
+ }
+ }
+
+ /*
+ * @see org.eclipse.jdt.internal.ui.text.java.ResultCollector#createJavaCompletionProposal(org.eclipse.jdt.core.CompletionProposal)
+ */
+ @Override
+ protected IJavaCompletionProposal createJavaCompletionProposal(CompletionProposal proposal) {
+ switch (proposal.getKind()) {
+ case CompletionProposal.METHOD_REF:
+ case CompletionProposal.CONSTRUCTOR_INVOCATION:
+ case CompletionProposal.METHOD_REF_WITH_CASTED_RECEIVER:
+ return createMethodReferenceProposal(proposal);
+ case CompletionProposal.TYPE_REF:
+ return createTypeProposal(proposal);
+ default:
+ return super.createJavaCompletionProposal(proposal);
+ }
+ }
+
+ private IJavaCompletionProposal createMethodReferenceProposal(CompletionProposal methodProposal) {
+ String completion= String.valueOf(methodProposal.getCompletion());
+ // super class' behavior if this is not a normal completion or has no
+ // parameters
+ if ((completion.length() == 0) || ((completion.length() == 1) && completion.charAt(0) == ')') || Signature.getParameterCount(methodProposal.getSignature()) == 0 || getContext().isInJavadoc())
+ return super.createJavaCompletionProposal(methodProposal);
+
+ LazyJavaCompletionProposal proposal= null;
+ proposal= ParameterGuessingProposal.createProposal(methodProposal, getInvocationContext(), fIsGuessArguments);
+ if (proposal == null) {
+ proposal= new FilledArgumentNamesMethodProposal(methodProposal, getInvocationContext());
+ }
+ return proposal;
+ }
+
+ /*
+ * @see org.eclipse.jdt.internal.ui.text.java.ResultCollector#createTypeCompletion(org.eclipse.jdt.core.CompletionProposal)
+ */
+ IJavaCompletionProposal createTypeProposal(CompletionProposal typeProposal) {
+ final ICompilationUnit cu= getCompilationUnit();
+ if (cu == null || getContext() != null && getContext().isInJavadoc())
+ return super.createJavaCompletionProposal(typeProposal);
+
+ IJavaProject project= cu.getJavaProject();
+ if (!shouldProposeGenerics(project))
+ return super.createJavaCompletionProposal(typeProposal);
+
+ char[] completion= typeProposal.getCompletion();
+ // don't add parameters for import-completions nor for proposals with an empty completion (e.g. inside the type argument list)
+ if (completion.length > 0 && (completion[completion.length - 1] == ';' || completion[completion.length - 1] == '.'))
+ return super.createJavaCompletionProposal(typeProposal);
+
+ LazyJavaCompletionProposal newProposal= new LazyGenericTypeProposal(typeProposal, getInvocationContext());
+ return newProposal;
+ }
+
+ /**
+ * Returns <code>true</code> if generic proposals should be allowed,
+ * <code>false</code> if not. Note that even though code (in a library)
+ * may be referenced that uses generics, it is still possible that the
+ * current source does not allow generics.
+ *
+ * @param project the Java project
+ * @return <code>true</code> if the generic proposals should be allowed,
+ * <code>false</code> if not
+ */
+ private final boolean shouldProposeGenerics(IJavaProject project) {
+ String sourceVersion;
+ if (project != null)
+ sourceVersion= project.getOption(JavaCore.COMPILER_SOURCE, true);
+ else
+ sourceVersion= JavaCore.getOption(JavaCore.COMPILER_SOURCE);
+
+ return JavaModelUtil.is50OrHigher(sourceVersion);
+ }
+}