mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-19 23:15:24 +02:00
parent
9de6de9fd4
commit
1b6b3f0f06
10 changed files with 182 additions and 107 deletions
|
@ -123,13 +123,14 @@ public interface ILanguage extends IAdaptable {
|
|||
throws CoreException;
|
||||
|
||||
/**
|
||||
* Returns the AST completion node for the given offset.
|
||||
* Return the AST completion node for the given offset.
|
||||
* @since 5.2
|
||||
*/
|
||||
public IASTCompletionNode getCompletionNode(FileContent reader, IScannerInfo scanInfo,
|
||||
IncludeFileContentProvider fileCreator, IIndex index, IParserLogService log, int offset)
|
||||
throws CoreException;
|
||||
|
||||
|
||||
/**
|
||||
* Used to override the default model building behavior for a translation unit.
|
||||
*
|
||||
|
|
|
@ -468,10 +468,11 @@ public interface ITranslationUnit extends ICElement, IParent, IOpenable, ISource
|
|||
public IASTTranslationUnit getAST(IIndex index, int style) throws CoreException;
|
||||
|
||||
/**
|
||||
* Returns the completion node using the given index and parsing style at the given offset.
|
||||
* Return the completion node using the given index and parsing style at the given offset.
|
||||
*/
|
||||
public IASTCompletionNode getCompletionNode(IIndex index, int style, int offset) throws CoreException;
|
||||
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #getSharedWorkingCopy(IProgressMonitor, IProblemRequestor)},
|
||||
* or CDTUITools.getWorkingCopyManager() instead.
|
||||
|
|
|
@ -213,7 +213,7 @@ public abstract class AbstractCLikeLanguage extends AbstractLanguage implements
|
|||
}
|
||||
|
||||
/**
|
||||
* Creates the parser.
|
||||
* Create the parser.
|
||||
*
|
||||
* @param scanner the IScanner to get tokens from
|
||||
* @param log the parser log service
|
||||
|
|
|
@ -57,6 +57,7 @@ import org.eclipse.cdt.internal.ui.text.contentassist.CContentAssistInvocationCo
|
|||
import org.eclipse.cdt.internal.ui.text.contentassist.TemplateCompletionProposalComputer;
|
||||
|
||||
public class SurroundWithTemplateMenuAction implements IWorkbenchWindowPulldownDelegate2 {
|
||||
|
||||
public static final String SURROUND_WITH_QUICK_MENU_ACTION_ID= "org.eclipse.cdt.ui.edit.text.c.surround.with.quickMenu"; //$NON-NLS-1$
|
||||
|
||||
private static final String C_TEMPLATE_PREFERENCE_PAGE_ID= "org.eclipse.cdt.ui.preferences.TemplatePreferencePage"; //$NON-NLS-1$
|
||||
|
@ -66,10 +67,14 @@ public class SurroundWithTemplateMenuAction implements IWorkbenchWindowPulldownD
|
|||
private static final String CONFIG_GROUP= "configGroup"; //$NON-NLS-1$
|
||||
|
||||
private static class ConfigureTemplatesAction extends Action {
|
||||
|
||||
public ConfigureTemplatesAction() {
|
||||
super(ActionMessages.SurroundWithTemplateMenuAction_ConfigureTemplatesActionName);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public void run() {
|
||||
PreferencesUtil.createPreferenceDialogOn(getShell(), C_TEMPLATE_PREFERENCE_PAGE_ID, new String[] {C_TEMPLATE_PREFERENCE_PAGE_ID}, null).open();
|
||||
|
@ -85,7 +90,6 @@ public class SurroundWithTemplateMenuAction implements IWorkbenchWindowPulldownD
|
|||
public void run() {
|
||||
//Do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabled() {
|
||||
return false;
|
||||
|
@ -95,6 +99,7 @@ public class SurroundWithTemplateMenuAction implements IWorkbenchWindowPulldownD
|
|||
private Menu fMenu;
|
||||
private IPartService fPartService;
|
||||
private IPartListener fPartListener= new IPartListener() {
|
||||
|
||||
@Override
|
||||
public void partActivated(IWorkbenchPart part) {
|
||||
}
|
||||
|
@ -130,6 +135,9 @@ public class SurroundWithTemplateMenuAction implements IWorkbenchWindowPulldownD
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public Menu getMenu(Menu parent) {
|
||||
setMenu(new Menu(parent));
|
||||
|
@ -138,6 +146,9 @@ public class SurroundWithTemplateMenuAction implements IWorkbenchWindowPulldownD
|
|||
return fMenu;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public Menu getMenu(Control parent) {
|
||||
setMenu(new Menu(parent));
|
||||
|
@ -160,6 +171,9 @@ public class SurroundWithTemplateMenuAction implements IWorkbenchWindowPulldownD
|
|||
menu.add(new ConfigureTemplatesAction());
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public void dispose() {
|
||||
if (fPartService != null) {
|
||||
|
@ -169,6 +183,9 @@ public class SurroundWithTemplateMenuAction implements IWorkbenchWindowPulldownD
|
|||
setMenu(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public void init(IWorkbenchWindow window) {
|
||||
if (fPartService != null) {
|
||||
|
@ -185,6 +202,9 @@ public class SurroundWithTemplateMenuAction implements IWorkbenchWindowPulldownD
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public void run(IAction action) {
|
||||
IWorkbenchPart activePart= CUIPlugin.getActivePage().getActivePart();
|
||||
|
@ -201,6 +221,9 @@ public class SurroundWithTemplateMenuAction implements IWorkbenchWindowPulldownD
|
|||
}.createMenu();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public void selectionChanged(IAction action, ISelection selection) {
|
||||
// Default do nothing
|
||||
|
@ -211,6 +234,7 @@ public class SurroundWithTemplateMenuAction implements IWorkbenchWindowPulldownD
|
|||
* @param menu the menu to fill entries into it
|
||||
*/
|
||||
protected void fillMenu(Menu menu) {
|
||||
|
||||
IWorkbenchPart activePart= CUIPlugin.getActivePage().getActivePart();
|
||||
if (!(activePart instanceof CEditor)) {
|
||||
ActionContributionItem item= new ActionContributionItem(NONE_APPLICABLE_ACTION);
|
||||
|
@ -218,7 +242,7 @@ public class SurroundWithTemplateMenuAction implements IWorkbenchWindowPulldownD
|
|||
return;
|
||||
}
|
||||
|
||||
CEditor editor= (CEditor) activePart;
|
||||
CEditor editor= (CEditor)activePart;
|
||||
IAction[] actions= getTemplateActions(editor);
|
||||
|
||||
if ( actions == null || actions.length <= 0) {
|
||||
|
@ -243,9 +267,9 @@ public class SurroundWithTemplateMenuAction implements IWorkbenchWindowPulldownD
|
|||
fMenu.addMenuListener(new MenuAdapter() {
|
||||
@Override
|
||||
public void menuShown(MenuEvent e) {
|
||||
Menu m = (Menu) e.widget;
|
||||
Menu m = (Menu)e.widget;
|
||||
MenuItem[] items = m.getItems();
|
||||
for (int i= 0; i < items.length; i++) {
|
||||
for (int i=0; i < items.length; i++) {
|
||||
items[i].dispose();
|
||||
}
|
||||
fillMenu(m);
|
||||
|
@ -291,19 +315,21 @@ public class SurroundWithTemplateMenuAction implements IWorkbenchWindowPulldownD
|
|||
return (ITextSelection)selection;
|
||||
}
|
||||
|
||||
private static IAction[] getActionsFromProposals(List<ICompletionProposal> proposals, final int offset,
|
||||
final ITextViewer viewer) {
|
||||
List<Action> result= new ArrayList<>();
|
||||
private static IAction[] getActionsFromProposals(List<ICompletionProposal> proposals, final int offset, final ITextViewer viewer) {
|
||||
List<Action> result= new ArrayList<Action>();
|
||||
int j = 1;
|
||||
for (Iterator<ICompletionProposal> it= proposals.iterator(); it.hasNext();) {
|
||||
final ICompletionProposal proposal= it.next();
|
||||
|
||||
StringBuilder actionName= new StringBuilder();
|
||||
StringBuffer actionName= new StringBuffer();
|
||||
if (j < 10) {
|
||||
actionName.append('&').append(j).append(' ');
|
||||
}
|
||||
actionName.append(proposal.getDisplayString());
|
||||
Action action= new Action(actionName.toString()) {
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public void run() {
|
||||
applyProposal(proposal, viewer, (char)0, 0, offset);
|
||||
|
@ -313,19 +339,19 @@ public class SurroundWithTemplateMenuAction implements IWorkbenchWindowPulldownD
|
|||
result.add(action);
|
||||
j++;
|
||||
}
|
||||
if (result.isEmpty())
|
||||
if (result.size() == 0)
|
||||
return null;
|
||||
|
||||
return result.toArray(new IAction[result.size()]);
|
||||
}
|
||||
|
||||
private static void applyProposal(ICompletionProposal proposal, ITextViewer viewer, char trigger,
|
||||
int stateMask, final int offset) {
|
||||
private static void applyProposal(ICompletionProposal proposal, ITextViewer viewer, char trigger, int stateMask, final int offset) {
|
||||
Assert.isTrue(proposal instanceof ICompletionProposalExtension2);
|
||||
|
||||
IRewriteTarget target= null;
|
||||
IEditingSupportRegistry registry= null;
|
||||
IEditingSupport helper= new IEditingSupport() {
|
||||
|
||||
@Override
|
||||
public boolean isOriginator(DocumentEvent event, IRegion focus) {
|
||||
return focus.getOffset() <= offset && focus.getOffset() + focus.getLength() >= offset;
|
||||
|
|
|
@ -78,17 +78,12 @@ public class CContentAssistInvocationContext extends ContentAssistInvocationCont
|
|||
@Override
|
||||
protected IASTCompletionNode calculateValue() {
|
||||
int offset = getParseOffset();
|
||||
if (offset < 0)
|
||||
return null;
|
||||
if (offset < 0) return null;
|
||||
|
||||
ICProject proj= getProject();
|
||||
if (proj == null)
|
||||
return null;
|
||||
if (proj == null) return null;
|
||||
|
||||
try {
|
||||
if (fIndex != null)
|
||||
throw new IllegalStateException("The method should not be called multiple times."); //$NON-NLS-1$
|
||||
|
||||
IIndexManager manager= CCorePlugin.getIndexManager();
|
||||
fIndex = manager.getIndex(proj, IIndexManager.ADD_DEPENDENCIES | IIndexManager.ADD_EXTENSION_FRAGMENTS_CONTENT_ASSIST);
|
||||
|
||||
|
@ -206,19 +201,18 @@ public class CContentAssistInvocationContext extends ContentAssistInvocationCont
|
|||
* @param editor the editor that content assist is invoked in
|
||||
* @param isAutoActivated indicates whether content assist was auto-activated
|
||||
*/
|
||||
public CContentAssistInvocationContext(ITextViewer viewer, int offset, IEditorPart editor,
|
||||
boolean isCompletion, boolean isAutoActivated) {
|
||||
public CContentAssistInvocationContext(ITextViewer viewer, int offset, IEditorPart editor, boolean isCompletion, boolean isAutoActivated) {
|
||||
super(viewer, offset);
|
||||
Assert.isNotNull(editor);
|
||||
fEditor= editor;
|
||||
fIsCompletion= isCompletion;
|
||||
fIsAutoActivated= isAutoActivated;
|
||||
fTU = new Lazy<ITranslationUnit>() {
|
||||
@Override
|
||||
protected ITranslationUnit calculateValue() {
|
||||
return CUIPlugin.getDefault().getWorkingCopyManager().getWorkingCopy(fEditor.getEditorInput());
|
||||
}
|
||||
};
|
||||
@Override
|
||||
protected ITranslationUnit calculateValue() {
|
||||
return CUIPlugin.getDefault().getWorkingCopyManager().getWorkingCopy(fEditor.getEditorInput());
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -264,13 +258,13 @@ public class CContentAssistInvocationContext extends ContentAssistInvocationCont
|
|||
|
||||
@Override
|
||||
public IASTCompletionNode getCompletionNode() {
|
||||
// For scalability.
|
||||
//for scalability
|
||||
if (fEditor != null && fEditor instanceof CEditor) {
|
||||
CEditor editor = (CEditor) fEditor;
|
||||
CEditor editor = (CEditor)fEditor;
|
||||
|
||||
// Check to make sure we should attempt local parsing completions... for remote projects
|
||||
// we should not do this.
|
||||
if (!editor.shouldProcessLocalParsingCompletions()) {
|
||||
// check to make sure we should attempt local parsing completions... for remote projects
|
||||
// we should not do this
|
||||
if(!editor.shouldProcessLocalParsingCompletions()) {
|
||||
return null;
|
||||
}
|
||||
if (editor.isEnableScalablilityMode()) {
|
||||
|
|
|
@ -37,16 +37,15 @@ import org.eclipse.cdt.ui.CUIPlugin;
|
|||
* exit policy.
|
||||
*/
|
||||
public class FunctionCompletionProposal extends CCompletionProposal {
|
||||
private boolean fHasParametersComputed;
|
||||
private boolean fHasParametersComputed= false;
|
||||
private boolean fHasParameters;
|
||||
protected IParameter[] fFunctionParameters;
|
||||
protected IParameter [] fFunctionParameters;
|
||||
protected CContentAssistInvocationContext fContext;
|
||||
|
||||
public FunctionCompletionProposal(String replacementString, int replacementOffset, int replacementLength,
|
||||
Image image, String displayString, String idString, int relevance, ITextViewer viewer,
|
||||
IFunction function, CContentAssistInvocationContext context) {
|
||||
super(replacementString, replacementOffset, replacementLength, image, displayString,
|
||||
idString, relevance, viewer);
|
||||
Image image, String displayString, String idString, int relevance, ITextViewer viewer, IFunction function, CContentAssistInvocationContext context) {
|
||||
super(replacementString, replacementOffset, replacementLength, image, displayString, idString, relevance,
|
||||
viewer);
|
||||
fFunctionParameters = function.getParameters();
|
||||
fContext = context;
|
||||
}
|
||||
|
@ -64,8 +63,8 @@ public class FunctionCompletionProposal extends CCompletionProposal {
|
|||
}
|
||||
|
||||
/**
|
||||
* Returns <code>true</code> if the method has any parameters, <code>false</code> if it has
|
||||
* no parameters.
|
||||
* @return <code>true</code> if the method has any parameters, <code>false</code> if it has
|
||||
* no parameters
|
||||
*/
|
||||
protected final boolean hasParameters() {
|
||||
if (!fHasParametersComputed) {
|
||||
|
@ -76,24 +75,28 @@ public class FunctionCompletionProposal extends CCompletionProposal {
|
|||
}
|
||||
|
||||
private boolean computeHasParameters() {
|
||||
return fFunctionParameters != null && fFunctionParameters.length != 0;
|
||||
return (fFunctionParameters != null && fFunctionParameters.length != 0);
|
||||
}
|
||||
|
||||
protected static class ExitPolicy implements IExitPolicy {
|
||||
|
||||
final char fExitCharacter;
|
||||
|
||||
public ExitPolicy(char exitCharacter) {
|
||||
fExitCharacter = exitCharacter;
|
||||
}
|
||||
|
||||
/*
|
||||
* @see org.eclipse.jdt.internal.ui.text.link.LinkedPositionUI.ExitPolicy#doExit(org.eclipse.jdt.internal.ui.text.link.LinkedPositionManager, org.eclipse.swt.events.VerifyEvent, int, int)
|
||||
*/
|
||||
@Override
|
||||
public ExitFlags doExit(LinkedModeModel environment, VerifyEvent event, int offset, int length) {
|
||||
|
||||
if (event.character == fExitCharacter) {
|
||||
if (environment.anyPositionContains(offset)) {
|
||||
if (environment.anyPositionContains(offset))
|
||||
return new ExitFlags(ILinkedModeListener.UPDATE_CARET, false);
|
||||
} else {
|
||||
else
|
||||
return new ExitFlags(ILinkedModeListener.UPDATE_CARET, true);
|
||||
}
|
||||
}
|
||||
|
||||
switch (event.character) {
|
||||
|
@ -124,8 +127,8 @@ public class FunctionCompletionProposal extends CCompletionProposal {
|
|||
ui.setExitPosition(fTextViewer, exit, 0, Integer.MAX_VALUE);
|
||||
ui.setCyclingMode(LinkedModeUI.CYCLE_NEVER);
|
||||
ui.enter();
|
||||
} catch (BadLocationException e) {
|
||||
CUIPlugin.log(e);
|
||||
} catch (BadLocationException x) {
|
||||
CUIPlugin.log(x);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,16 +12,16 @@
|
|||
package org.eclipse.cdt.internal.ui.text.contentassist;
|
||||
|
||||
/**
|
||||
* This class represents a field or variable which shall be initialized lazily when accessed
|
||||
* the first time. It's value is computed once by the {@code calculateValue()} method. The value is
|
||||
* accessed by {@code value()}.
|
||||
* This class represents a field or variable which shall be initialized lazily when accessed the
|
||||
* first time. It's value is computed once by the <code>calculateValue()</code> method. The value is
|
||||
* accessed by <code>value()</code>.
|
||||
*
|
||||
* This implementation is NOT thread-safe!
|
||||
*
|
||||
* @param <E> The type of the lazy initialized variable.
|
||||
*/
|
||||
public abstract class Lazy<E> {
|
||||
private static final Object NOT_INITIALIZED = new Object();
|
||||
private final static Object NOT_INITIALIZED = new Object();
|
||||
private Object value = NOT_INITIALIZED;
|
||||
|
||||
/**
|
||||
|
|
|
@ -26,7 +26,6 @@ import org.eclipse.jface.text.contentassist.ICompletionProposal;
|
|||
import org.eclipse.swt.graphics.Image;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.ICompositeType;
|
||||
|
@ -37,6 +36,7 @@ import org.eclipse.cdt.core.dom.ast.IPointerType;
|
|||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.ITypedef;
|
||||
import org.eclipse.cdt.core.dom.ast.IVariable;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
|
||||
|
@ -61,10 +61,10 @@ import org.eclipse.cdt.internal.ui.util.StringMatcher;
|
|||
import org.eclipse.cdt.internal.ui.viewsupport.CElementImageProvider;
|
||||
|
||||
/**
|
||||
* This class is based on org.eclipse.jdt.internal.ui.text.java.ParameterGuesser
|
||||
* This iAPI layout is copied from org.eclipse.jdt.internal.ui.text.java.ParameterGuesser
|
||||
*
|
||||
* This class triggers a code-completion that will track all global, local and member variables and
|
||||
* order them logically for later use as a parameter guessing proposal.
|
||||
* This class triggers a code-completion that will track all global, local and member variables and order them logically for later
|
||||
* use as a parameter guessing proposal.
|
||||
*/
|
||||
public class ParameterGuesser {
|
||||
private IASTTranslationUnit fTranslationUnit;
|
||||
|
@ -72,9 +72,9 @@ public class ParameterGuesser {
|
|||
private final Set<String> fAlreadyMatchedNames;
|
||||
|
||||
private final static class Variable {
|
||||
|
||||
/**
|
||||
* Variable type. Used to choose the best guess based on scope
|
||||
* (Local beats instance beats inherited beats global).
|
||||
* Variable type. Used to choose the best guess based on scope (Local beats instance beats inherited beats global).
|
||||
*/
|
||||
public static final int LOCAL = 0;
|
||||
public static final int FIELD = 1;
|
||||
|
@ -92,8 +92,7 @@ public class ParameterGuesser {
|
|||
|
||||
public boolean alreadyMatched;
|
||||
|
||||
public Variable(IType qualifiedTypeName, String name, int variableType,
|
||||
boolean isAutoboxMatch, int positionScore, char[] triggerChars, ImageDescriptor descriptor) {
|
||||
public Variable(IType qualifiedTypeName, String name, int variableType, boolean isAutoboxMatch, int positionScore, char[] triggerChars, ImageDescriptor descriptor) {
|
||||
this.qualifiedTypeName= qualifiedTypeName;
|
||||
this.name= name;
|
||||
this.variableType= variableType;
|
||||
|
@ -104,15 +103,20 @@ public class ParameterGuesser {
|
|||
this.alreadyMatched= false;
|
||||
}
|
||||
|
||||
/*
|
||||
* @see Object#toString()
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder buffer= new StringBuilder();
|
||||
|
||||
StringBuffer buffer= new StringBuffer();
|
||||
buffer.append(qualifiedTypeName);
|
||||
buffer.append(' ');
|
||||
buffer.append(name);
|
||||
buffer.append(" ("); //$NON-NLS-1$
|
||||
buffer.append(variableType);
|
||||
buffer.append(')');
|
||||
|
||||
return buffer.toString();
|
||||
}
|
||||
}
|
||||
|
@ -125,9 +129,8 @@ public class ParameterGuesser {
|
|||
fTranslationUnit = translationUnit;
|
||||
}
|
||||
|
||||
private List<Variable> evaluateVisibleMatches(IType expectedType, List<IBinding> suggestions)
|
||||
throws CModelException {
|
||||
ArrayList<Variable> res= new ArrayList<>();
|
||||
private List<Variable> evaluateVisibleMatches(IType expectedType, ArrayList<IBinding> suggestions) throws CModelException {
|
||||
ArrayList<Variable> res= new ArrayList<Variable>();
|
||||
int size = suggestions.size();
|
||||
for (int i= 0; i < size; i++) {
|
||||
Variable variable= createVariable(suggestions.get(i), expectedType, i);
|
||||
|
@ -169,6 +172,7 @@ public class ParameterGuesser {
|
|||
int variableType = Variable.GLOBAL;
|
||||
if (element instanceof ICPPField) {
|
||||
variableType = Variable.FIELD;
|
||||
|
||||
} else if (element instanceof IVariable) {
|
||||
try {
|
||||
if (element instanceof ICPPBinding && ((ICPPBinding) element).isGloballyQualified()) {
|
||||
|
@ -181,13 +185,11 @@ public class ParameterGuesser {
|
|||
}
|
||||
|
||||
// Handle reference case
|
||||
if (isReferenceTo(enclosingType, elementType)) {
|
||||
if (isReferenceTo(enclosingType, elementType))
|
||||
elementName = "&" + elementName; //$NON-NLS-1$
|
||||
} else if (isReferenceTo(elementType, enclosingType)) {
|
||||
else if (isReferenceTo(elementType, enclosingType))
|
||||
elementName = "*" + elementName; //$NON-NLS-1$
|
||||
}
|
||||
return new Variable(elementType, elementName, variableType, false, positionScore,
|
||||
NO_TRIGGERS, getImageDescriptor(element));
|
||||
return new Variable(elementType, elementName, variableType, false, positionScore, NO_TRIGGERS, getImageDescriptor(element));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
@ -292,6 +294,9 @@ public class ParameterGuesser {
|
|||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* Copied from JDT
|
||||
*
|
||||
* Returns the matches for the type and name argument, ordered by match quality.
|
||||
*
|
||||
* @param expectedType - the qualified type of the parameter we are trying to match
|
||||
|
@ -302,7 +307,7 @@ public class ParameterGuesser {
|
|||
* @param isLastParameter <code>true</code> iff this proposal is for the last parameter of a method
|
||||
* @return returns the name of the best match, or <code>null</code> if no match found
|
||||
*/
|
||||
public ICompletionProposal[] parameterProposals(IType expectedType, String paramName, Position pos, List<IBinding> suggestions, boolean fillBestGuess, boolean isLastParameter) throws CModelException {
|
||||
public ICompletionProposal[] parameterProposals(IType expectedType, String paramName, Position pos, ArrayList<IBinding> suggestions, boolean fillBestGuess, boolean isLastParameter) throws CModelException {
|
||||
List<Variable> typeMatches= evaluateVisibleMatches(expectedType, suggestions);
|
||||
typeMatches = removeDuplicates(typeMatches);
|
||||
orderMatches(typeMatches, paramName);
|
||||
|
@ -340,7 +345,11 @@ public class ParameterGuesser {
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Copied from JDT
|
||||
*/
|
||||
private static class MatchComparator implements Comparator<Variable> {
|
||||
|
||||
private String fParamName;
|
||||
|
||||
MatchComparator(String paramName) {
|
||||
|
@ -380,7 +389,10 @@ public class ParameterGuesser {
|
|||
}
|
||||
|
||||
/**
|
||||
* Determines the best match of all possible type matches. The input into this method is all
|
||||
*
|
||||
* Copied from JDT
|
||||
*
|
||||
* Determine the best match of all possible type matches. The input into this method is all
|
||||
* possible completions that match the type of the argument. The purpose of this method is to
|
||||
* choose among them based on the following simple rules:
|
||||
*
|
||||
|
@ -403,7 +415,10 @@ public class ParameterGuesser {
|
|||
}
|
||||
|
||||
/**
|
||||
* Removes the duplicates from the list if any.
|
||||
*
|
||||
* Copied from JDT
|
||||
*
|
||||
* Remove the duplicates from the list if any.
|
||||
*/
|
||||
private static List<Variable> removeDuplicates(List<Variable> typeMatches) {
|
||||
HashSet<Variable> set = new HashSet<Variable>();
|
||||
|
@ -412,6 +427,9 @@ public class ParameterGuesser {
|
|||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* Copied from JDT
|
||||
*
|
||||
* Returns the longest common substring of two strings.
|
||||
*
|
||||
* @param first the first string
|
||||
|
@ -419,12 +437,13 @@ public class ParameterGuesser {
|
|||
* @return the longest common substring
|
||||
*/
|
||||
private static String getLongestCommonSubstring(String first, String second) {
|
||||
String shorter= first.length() <= second.length() ? first : second;
|
||||
|
||||
String shorter= (first.length() <= second.length()) ? first : second;
|
||||
String longer= shorter == first ? second : first;
|
||||
|
||||
int minLength= shorter.length();
|
||||
|
||||
StringBuilder pattern= new StringBuilder(shorter.length() + 2);
|
||||
StringBuffer pattern= new StringBuffer(shorter.length() + 2);
|
||||
String longestCommonSubstring= ""; //$NON-NLS-1$
|
||||
|
||||
for (int i= 0; i < minLength; i++) {
|
||||
|
@ -447,7 +466,11 @@ public class ParameterGuesser {
|
|||
return longestCommonSubstring;
|
||||
}
|
||||
|
||||
/**
|
||||
* Copied from JDT
|
||||
*/
|
||||
private Image getImage(ImageDescriptor descriptor) {
|
||||
return descriptor == null ? null : CUIPlugin.getImageDescriptorRegistry().get(descriptor);
|
||||
return (descriptor == null) ? null : CUIPlugin.getImageDescriptorRegistry().get(descriptor);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -14,7 +14,6 @@ package org.eclipse.cdt.internal.ui.text.contentassist;
|
|||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import org.eclipse.jface.text.BadLocationException;
|
||||
import org.eclipse.jface.text.BadPositionCategoryException;
|
||||
|
@ -55,7 +54,7 @@ import org.eclipse.cdt.internal.ui.editor.CEditor;
|
|||
import org.eclipse.cdt.internal.ui.editor.EditorHighlightingSynchronizer;
|
||||
|
||||
/**
|
||||
* This class is based on org.eclipse.jdt.internal.ui.text.java.ParameterGuessingProposal
|
||||
* This API layout is copied from org.eclipse.jdt.internal.ui.text.java.ParameterGuessingProposal
|
||||
*
|
||||
* Extents the basic Function Compilation Proposal to add a linked mode for each of
|
||||
* the function parameters with a list of suggestions for each parameter.
|
||||
|
@ -63,16 +62,15 @@ import org.eclipse.cdt.internal.ui.editor.EditorHighlightingSynchronizer;
|
|||
public class ParameterGuessingProposal extends FunctionCompletionProposal {
|
||||
private ICompletionProposal[][] fChoices; // initialized by guessParameters()
|
||||
private Position[] fPositions; // initialized by guessParameters()
|
||||
private boolean fReplacementStringComputed;
|
||||
private boolean fReplacementStringComputed = false;
|
||||
private IRegion fSelectedRegion; // initialized by apply()
|
||||
private IPositionUpdater fUpdater;
|
||||
private String fPrefix; // The string from the start of the statement to the parse offset.
|
||||
private String fFullPrefix; // The string from the start of the statement to the invocation offset.
|
||||
private char[][] fParametersNames;
|
||||
private IType[] fParametersTypes;
|
||||
private IType [] fParametersTypes;
|
||||
|
||||
public static ParameterGuessingProposal createProposal(CContentAssistInvocationContext context,
|
||||
CCompletionProposal proposal, IFunction function, String prefix) {
|
||||
public static ParameterGuessingProposal createProposal(CContentAssistInvocationContext context, CCompletionProposal proposal, IFunction function, String prefix) {
|
||||
String replacement = getParametersList(function);
|
||||
String fullPrefix = function.getName() + "("; //$NON-NLS-1$
|
||||
int replacementOffset = proposal.getReplacementOffset();
|
||||
|
@ -91,10 +89,10 @@ public class ParameterGuessingProposal extends FunctionCompletionProposal {
|
|||
try {
|
||||
fullPrefix = context.getDocument().get(replacementOffset, context.getInvocationOffset() - replacementOffset);
|
||||
replacement = fullPrefix + replacement + ")"; //$NON-NLS-1$
|
||||
} catch (BadLocationException e) {
|
||||
} catch (BadLocationException e1) {
|
||||
}
|
||||
try {
|
||||
// Remove ')' from the replacement string if it is auto appended.
|
||||
// remove ')' from the replacement string if it is auto appended.
|
||||
if (context.getDocument().getChar(context.getInvocationOffset()) == ')')
|
||||
replacement = replacement.substring(0, replacement.length() - 1);
|
||||
} catch (BadLocationException e) {
|
||||
|
@ -105,9 +103,7 @@ public class ParameterGuessingProposal extends FunctionCompletionProposal {
|
|||
}
|
||||
replacementLength = replacement.length();
|
||||
|
||||
ParameterGuessingProposal ret = new ParameterGuessingProposal(replacement, replacementOffset,
|
||||
replacementLength, proposal.getImage(), proposal.getDisplayString(),
|
||||
proposal.getIdString(), proposal.getRelevance(), context.getViewer(), function, context);
|
||||
ParameterGuessingProposal ret = new ParameterGuessingProposal(replacement, replacementOffset, replacementLength, proposal.getImage(), proposal.getDisplayString(), proposal.getIdString(), proposal.getRelevance(), context.getViewer(), function, context);
|
||||
ret.setContextInformation(proposal.getContextInformation());
|
||||
ret.fPrefix = prefix;
|
||||
ret.fFullPrefix = fullPrefix;
|
||||
|
@ -159,6 +155,9 @@ public class ParameterGuessingProposal extends FunctionCompletionProposal {
|
|||
return super.getPrefixCompletionText(document, completionOffset);
|
||||
}
|
||||
|
||||
/**
|
||||
* Copied from JDT
|
||||
*/
|
||||
@Override
|
||||
public void apply(final IDocument document, char trigger, int offset) {
|
||||
try {
|
||||
|
@ -236,6 +235,9 @@ public class ParameterGuessingProposal extends FunctionCompletionProposal {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Copied from JDT
|
||||
*/
|
||||
@Override
|
||||
public Point getSelection(IDocument document) {
|
||||
if (fSelectedRegion == null)
|
||||
|
@ -244,6 +246,9 @@ public class ParameterGuessingProposal extends FunctionCompletionProposal {
|
|||
return new Point(fSelectedRegion.getOffset(), fSelectedRegion.getLength());
|
||||
}
|
||||
|
||||
/**
|
||||
* Copied from JDT
|
||||
*/
|
||||
@Override
|
||||
public String getReplacementString() {
|
||||
if (!fReplacementStringComputed) {
|
||||
|
@ -254,6 +259,9 @@ public class ParameterGuessingProposal extends FunctionCompletionProposal {
|
|||
return super.getReplacementString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Copied from JDT
|
||||
*/
|
||||
private String computeReplacementString() {
|
||||
if (!hasParameters())
|
||||
return super.getReplacementString();
|
||||
|
@ -261,18 +269,21 @@ public class ParameterGuessingProposal extends FunctionCompletionProposal {
|
|||
String replacement;
|
||||
try {
|
||||
replacement = computeGuessingCompletion();
|
||||
} catch (Exception e) {
|
||||
} catch (Exception x) {
|
||||
fPositions = null;
|
||||
fChoices = null;
|
||||
CUIPlugin.log(e);
|
||||
CUIPlugin.log(x);
|
||||
return super.getReplacementString();
|
||||
}
|
||||
|
||||
return replacement;
|
||||
}
|
||||
|
||||
/**
|
||||
* Copied from JDT with replacing JDT types with CDT types
|
||||
*/
|
||||
private String computeGuessingCompletion() throws Exception {
|
||||
StringBuilder buffer = new StringBuilder();
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
buffer.append(fFullPrefix);
|
||||
setCursorPosition(buffer.length());
|
||||
|
||||
|
@ -305,26 +316,28 @@ public class ParameterGuessingProposal extends FunctionCompletionProposal {
|
|||
return buffer.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Copied from JDT with replacing JDT types with CDT types
|
||||
*/
|
||||
private ICompletionProposal[][] guessParameters(char[][] parameterNames) throws Exception {
|
||||
int count= parameterNames.length;
|
||||
fPositions= new Position[count];
|
||||
fChoices= new ICompletionProposal[count][];
|
||||
|
||||
ParameterGuesser guesser= new ParameterGuesser(fContext.getCompletionNode().getTranslationUnit());
|
||||
List<IBinding> assignableElements = getAssignableElements();
|
||||
ArrayList<IBinding> assignableElements = getAssignableElements();
|
||||
|
||||
for (int i= count - 1; i >= 0; i--) {
|
||||
String paramName= new String(parameterNames[i]);
|
||||
Position position= new Position(0, 0);
|
||||
Position position= new Position(0,0);
|
||||
|
||||
boolean isLastParameter= i == count - 1;
|
||||
List<ICompletionProposal> allProposals = new ArrayList<>();
|
||||
ArrayList<ICompletionProposal> allProposals = new ArrayList<ICompletionProposal>();
|
||||
CCompletionProposal proposal= new CCompletionProposal(paramName, 0, paramName.length(), null, paramName, 0);
|
||||
if (isLastParameter)
|
||||
proposal.setTriggerCharacters(new char[] { ',' });
|
||||
allProposals.add(proposal);
|
||||
ICompletionProposal[] argumentProposals=
|
||||
guesser.parameterProposals(fParametersTypes[i], paramName, position, assignableElements, true, isLastParameter);
|
||||
ICompletionProposal[] argumentProposals= guesser.parameterProposals(fParametersTypes[i], paramName, position, assignableElements, true, isLastParameter);
|
||||
allProposals.addAll(Arrays.asList(argumentProposals));
|
||||
fPositions[i]= position;
|
||||
fChoices[i]= allProposals.toArray(new ICompletionProposal[allProposals.size()]);
|
||||
|
@ -333,8 +346,8 @@ public class ParameterGuessingProposal extends FunctionCompletionProposal {
|
|||
return fChoices;
|
||||
}
|
||||
|
||||
private static IType[] getFunctionParametersTypes(IParameter[] functionParameters) {
|
||||
IType[] ret = new IType[functionParameters.length];
|
||||
private static IType[] getFunctionParametersTypes(IParameter [] functionParameters) {
|
||||
IType [] ret = new IType[functionParameters.length];
|
||||
for (int i = 0; i < functionParameters.length; i++) {
|
||||
ret[i] = functionParameters[i].getType();
|
||||
}
|
||||
|
@ -342,7 +355,7 @@ public class ParameterGuessingProposal extends FunctionCompletionProposal {
|
|||
}
|
||||
|
||||
|
||||
private static char[][] getFunctionParametersNames(IParameter[] functionParameters) {
|
||||
private static char[][] getFunctionParametersNames(IParameter [] functionParameters) {
|
||||
char[][] parameterNames = new char[functionParameters.length][];
|
||||
for (int i = 0; i < functionParameters.length; i++) {
|
||||
parameterNames[i] = functionParameters[i].getNameCharArray();
|
||||
|
@ -361,12 +374,12 @@ public class ParameterGuessingProposal extends FunctionCompletionProposal {
|
|||
* Returns a list of functions and variables that are defined in current context.
|
||||
* @return a list of assignable elements.
|
||||
*/
|
||||
private List<IBinding> getAssignableElements() {
|
||||
private ArrayList<IBinding> getAssignableElements() {
|
||||
int i = getStatementStartOffset(fContext.getDocument(), getStatementStartOffset());
|
||||
CContentAssistInvocationContext c = new CContentAssistInvocationContext(fTextViewer, i, getCEditor(), true, false);
|
||||
IASTCompletionNode node = c.getCompletionNode();
|
||||
IASTName[] names = node.getNames();
|
||||
List<IBinding> allBindings = new ArrayList<>();
|
||||
IASTName [] names = node.getNames();
|
||||
ArrayList<IBinding> allBindings = new ArrayList<IBinding>();
|
||||
for (IASTName name : names) {
|
||||
IASTCompletionContext astContext = name.getCompletionContext();
|
||||
if (astContext != null) {
|
||||
|
@ -408,6 +421,9 @@ public class ParameterGuessingProposal extends FunctionCompletionProposal {
|
|||
return offset;
|
||||
}
|
||||
|
||||
/**
|
||||
* Copied from JDT
|
||||
*/
|
||||
private void ensurePositionCategoryInstalled(final IDocument document, LinkedModeModel model) {
|
||||
if (!document.containsPositionCategory(getCategory())) {
|
||||
document.addPositionCategory(getCategory());
|
||||
|
@ -429,6 +445,9 @@ public class ParameterGuessingProposal extends FunctionCompletionProposal {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Copied from JDT
|
||||
*/
|
||||
private void ensurePositionCategoryRemoved(IDocument document) {
|
||||
if (document.containsPositionCategory(getCategory())) {
|
||||
try {
|
||||
|
@ -440,11 +459,16 @@ public class ParameterGuessingProposal extends FunctionCompletionProposal {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Copied from JDT
|
||||
*/
|
||||
private String getCategory() {
|
||||
return "ParameterGuessingProposal_" + toString(); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
/**
|
||||
* Copied from JDT with replacing JDT types with CDT types.
|
||||
*
|
||||
* Returns the currently active C/C++ editor, or <code>null</code> if it
|
||||
* cannot be determined.
|
||||
*
|
||||
|
|
|
@ -6,10 +6,11 @@
|
|||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* QNX - Initial API and implementation
|
||||
* Anton Leherbauer (Wind River Systems)
|
||||
* Mentor Graphics (Mohamed Azab) - added the API to CDT
|
||||
* QNX - Initial API and implementation
|
||||
* Anton Leherbauer (Wind River Systems)
|
||||
* Mentor Graphics (Mohamed Azab) - added the API to CDT
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.internal.ui.text.contentassist;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
@ -35,7 +36,8 @@ import org.eclipse.cdt.ui.text.contentassist.ICompletionProposalComputer;
|
|||
* @author Bryan Wilkinson
|
||||
*/
|
||||
public abstract class ParsingBasedProposalComputer implements ICompletionProposalComputer {
|
||||
private String fErrorMessage;
|
||||
|
||||
private String fErrorMessage = null;
|
||||
|
||||
@Override
|
||||
public List<ICompletionProposal> computeCompletionProposals(
|
||||
|
@ -71,7 +73,8 @@ public abstract class ParsingBasedProposalComputer implements ICompletionProposa
|
|||
public List<IContextInformation> computeContextInformation(
|
||||
ContentAssistInvocationContext context, IProgressMonitor monitor) {
|
||||
Collection<ICompletionProposal> proposals= computeCompletionProposals(context, monitor);
|
||||
// Remove duplicates
|
||||
// remove duplicates
|
||||
|
||||
proposals= (new LinkedHashSet<ICompletionProposal>(proposals));
|
||||
List<IContextInformation> result= new ArrayList<IContextInformation>();
|
||||
for (ICompletionProposal proposal : proposals) {
|
||||
|
@ -99,11 +102,11 @@ public abstract class ParsingBasedProposalComputer implements ICompletionProposa
|
|||
}
|
||||
|
||||
/**
|
||||
* Computes base relevance depending on quality of name / prefix match.
|
||||
* Compute base relevance depending on quality of name / prefix match.
|
||||
*
|
||||
* @param prefix the completion prefix
|
||||
* @param prefix the completion pefix
|
||||
* @param match the matching identifier
|
||||
* @return a relevance value indicating the quality of the name match
|
||||
* @return a relevance value inidicating the quality of the name match
|
||||
*/
|
||||
protected int computeBaseRelevance(String prefix, String match) {
|
||||
boolean caseMatch= prefix.length() > 0 && match.startsWith(prefix);
|
||||
|
|
Loading…
Add table
Reference in a new issue