1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-19 23:15:24 +02:00

Revert "Cosmetics."

This reverts commit e98bf3e3e3.
This commit is contained in:
Sergey Prigogin 2015-02-06 14:12:45 -08:00
parent 9de6de9fd4
commit 1b6b3f0f06
10 changed files with 182 additions and 107 deletions

View file

@ -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.
*

View file

@ -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.

View file

@ -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

View file

@ -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;

View file

@ -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()) {

View file

@ -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);
}
}
}

View file

@ -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;
/**

View file

@ -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);
}
}

View file

@ -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.
*

View file

@ -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);