blob: bfd826b9392596a137b21458920aea47cebdc561 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2020 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* 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.CompletionContext;
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= 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] == '.')
return super.createJavaCompletionProposal(typeProposal);
if (getInvocationContext().getCoreContext().getTokenLocation() == CompletionContext.TL_IN_IMPORT)
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 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);
}
}