mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Content Assist and Refactoring bug fixes
This commit is contained in:
parent
839bb5375c
commit
a0aed1c95c
6 changed files with 480 additions and 228 deletions
|
@ -1,3 +1,9 @@
|
|||
2004-04-05 Hoda Amer
|
||||
Fix for bug#44378 : Content Assist: easy keyboard exit of argument-providing mode
|
||||
Fix for bug#56614 : [Content Assist] Global variables do not appear in a global completion list.
|
||||
Fix for bug#56634 : Renaming a fcn in class A renames same named function of other classes
|
||||
Fix for bug#56646 : Did not get warning when renaming a virtual function
|
||||
|
||||
2004-04-03 Alain Magloire
|
||||
|
||||
Draft support for LibraryReference and IncludeReference
|
||||
|
|
|
@ -343,6 +343,7 @@ RenameTypeRefactoring.local_type=Local Type declared inside ''{0}'' is named {1}
|
|||
RenameTypeRefactoring.member_type=Member Type declared inside ''{0}'' is named {1}
|
||||
RenameTypeRefactoring.another_type=Another type named ''{0} is referenced in ''{1}''
|
||||
RenameTypeRefactoring.wrong_element=Rename refactoring does not handle this type of element.
|
||||
RenameTypeRefactoring.virtual_method=Renaming a virtual method. Consider renaming the base and derived class methods (if any).
|
||||
|
||||
TextMatchFinder.comment=text reference update in a comment
|
||||
TextMatchFinder.string=text reference update in a string literal
|
||||
|
|
|
@ -147,6 +147,27 @@ public class RenameElementProcessor extends RenameProcessor implements IReferenc
|
|||
return ((CElement)fCElement).getIdStartPos();
|
||||
}
|
||||
|
||||
public String getElementQualifiedName(ICElement element){
|
||||
if(element instanceof ITranslationUnit){
|
||||
return "";
|
||||
} else {
|
||||
StringBuffer name = new StringBuffer();
|
||||
if(element instanceof IFunctionDeclaration){
|
||||
// add the whole signature
|
||||
IFunctionDeclaration function = (IFunctionDeclaration)element;
|
||||
name.append(getElementQualifiedName(element.getParent()));
|
||||
if(name.length() > 0)
|
||||
name.append("::");
|
||||
name.append(function.getSignature());
|
||||
} else {
|
||||
name.append(getElementQualifiedName(element.getParent()));
|
||||
if(name.length() > 0)
|
||||
name.append("::");
|
||||
name.append(element.getElementName());
|
||||
}
|
||||
return name.toString();
|
||||
}
|
||||
}
|
||||
public RefactoringStatus checkNewElementName(String newName){
|
||||
if ((fCElement == null) || (!(fCElement instanceof ISourceReference)) || (fCElement instanceof ITranslationUnit)) {
|
||||
return RefactoringStatus.createFatalErrorStatus(RefactoringCoreMessages.getString("RenameTypeRefactoring.wrong_element")); //$NON-NLS-1$
|
||||
|
@ -175,6 +196,15 @@ public class RenameElementProcessor extends RenameProcessor implements IReferenc
|
|||
}
|
||||
}
|
||||
|
||||
if( fCElement instanceof IMethodDeclaration){
|
||||
IMethodDeclaration method = (IMethodDeclaration)fCElement;
|
||||
if (method.isVirtual()){
|
||||
String msg= RefactoringCoreMessages.getFormattedString("RenameTypeRefactoring.virtual_method", //$NON-NLS-1$
|
||||
new String[]{fNewElementName, fCElement.getParent().getElementName()});
|
||||
result.addWarning(msg);
|
||||
}
|
||||
}
|
||||
|
||||
if (Checks.isAlreadyNamed(fCElement, newName))
|
||||
result.addFatalError(RefactoringCoreMessages.getString("RenameTypeRefactoring.choose_another_name")); //$NON-NLS-1$
|
||||
return result;
|
||||
|
@ -257,11 +287,11 @@ public class RenameElementProcessor extends RenameProcessor implements IReferenc
|
|||
|
||||
if (result.hasFatalError())
|
||||
return result;
|
||||
|
||||
|
||||
fReferences= null;
|
||||
if (fUpdateReferences){
|
||||
pm.setTaskName(RefactoringCoreMessages.getString("RenameTypeRefactoring.searching")); //$NON-NLS-1$
|
||||
fReferences= getReferences(fCElement.getElementName(), new SubProgressMonitor(pm, 35));
|
||||
fReferences= getReferences(getElementQualifiedName(fCElement), new SubProgressMonitor(pm, 35));
|
||||
}
|
||||
pm.worked(6);
|
||||
|
||||
|
@ -363,7 +393,10 @@ public class RenameElementProcessor extends RenameProcessor implements IReferenc
|
|||
}
|
||||
|
||||
private ICSearchScope createRefactoringScope() throws CoreException {
|
||||
return SearchEngine.createWorkspaceScope();
|
||||
ICElement[] projectScopeElement = new ICElement[1];
|
||||
projectScopeElement[0] = fCElement.getCProject();
|
||||
ICSearchScope scope = SearchEngine.createCSearchScope(projectScopeElement, true);
|
||||
return scope;
|
||||
}
|
||||
|
||||
private OrPattern createSearchPattern(String searchPrefix) throws CoreException {
|
||||
|
|
|
@ -1,39 +1,74 @@
|
|||
/**********************************************************************
|
||||
* Copyright (c) 2004 Rational Software Corporation and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Common Public License v0.5
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/cpl-v05.html
|
||||
*
|
||||
* Contributors:
|
||||
* IBM Rational Software - Initial API and implementation
|
||||
***********************************************************************/
|
||||
|
||||
package org.eclipse.cdt.internal.ui.text.contentassist;
|
||||
|
||||
/*
|
||||
* (c) Copyright QNX Software Systems Ltd. 2002.
|
||||
* All Rights Reserved.
|
||||
*/
|
||||
|
||||
import org.eclipse.cdt.internal.ui.text.link.LinkedPositionManager;
|
||||
import org.eclipse.cdt.internal.ui.text.link.LinkedPositionUI;
|
||||
import org.eclipse.cdt.internal.ui.text.link.LinkedPositionUI.ExitFlags;
|
||||
import org.eclipse.cdt.internal.ui.text.CTextTools;
|
||||
import org.eclipse.cdt.ui.CUIPlugin;
|
||||
import org.eclipse.cdt.ui.text.ICCompletionProposal;
|
||||
import org.eclipse.jface.preference.IPreferenceStore;
|
||||
import org.eclipse.jface.preference.PreferenceConverter;
|
||||
import org.eclipse.jface.text.Assert;
|
||||
import org.eclipse.jface.text.BadLocationException;
|
||||
import org.eclipse.jface.text.BadPositionCategoryException;
|
||||
import org.eclipse.jface.text.DefaultPositionUpdater;
|
||||
import org.eclipse.jface.text.DocumentEvent;
|
||||
import org.eclipse.jface.text.IDocument;
|
||||
import org.eclipse.jface.text.IInformationControlCreator;
|
||||
import org.eclipse.jface.text.IPositionUpdater;
|
||||
import org.eclipse.jface.text.IRegion;
|
||||
import org.eclipse.jface.text.ITextViewer;
|
||||
import org.eclipse.jface.text.ITextViewerExtension2;
|
||||
import org.eclipse.jface.text.ITextViewerExtension5;
|
||||
import org.eclipse.jface.text.Position;
|
||||
import org.eclipse.jface.text.Region;
|
||||
import org.eclipse.jface.text.contentassist.ICompletionProposalExtension;
|
||||
import org.eclipse.jface.text.contentassist.ICompletionProposalExtension2;
|
||||
import org.eclipse.jface.text.contentassist.ICompletionProposalExtension3;
|
||||
import org.eclipse.jface.text.contentassist.IContextInformation;
|
||||
import org.eclipse.jface.util.Assert;
|
||||
import org.eclipse.jface.text.link.ILinkedListener;
|
||||
import org.eclipse.jface.text.link.LinkedEnvironment;
|
||||
import org.eclipse.jface.text.link.LinkedPositionGroup;
|
||||
import org.eclipse.jface.text.link.LinkedUIControl;
|
||||
import org.eclipse.jface.text.link.LinkedUIControl.ExitFlags;
|
||||
import org.eclipse.jface.text.link.LinkedUIControl.IExitPolicy;
|
||||
import org.eclipse.swt.SWT;
|
||||
import org.eclipse.swt.custom.StyleRange;
|
||||
import org.eclipse.swt.custom.StyledText;
|
||||
import org.eclipse.swt.events.VerifyEvent;
|
||||
import org.eclipse.swt.graphics.Color;
|
||||
import org.eclipse.swt.graphics.Image;
|
||||
import org.eclipse.swt.graphics.Point;
|
||||
import org.eclipse.swt.graphics.RGB;
|
||||
import org.eclipse.ui.texteditor.link.EditorHistoryUpdater;
|
||||
|
||||
|
||||
public class CCompletionProposal implements ICCompletionProposal, ICompletionProposalExtension, ICompletionProposalExtension2, ICompletionProposalExtension3 {
|
||||
|
||||
public class CCompletionProposal implements ICCompletionProposal, ICompletionProposalExtension {
|
||||
private String fDisplayString;
|
||||
private String fReplacementString;
|
||||
private String fAdditionalInfoString;
|
||||
private int fReplacementOffset;
|
||||
private int fReplacementLength;
|
||||
private int fCursorPosition;
|
||||
private Image fImage;
|
||||
private IContextInformation fContextInformation;
|
||||
private int fContextInformationPosition;
|
||||
//private IImportDeclaration fImportDeclaration;
|
||||
private String fProposalInfo;
|
||||
private char[] fTriggerCharacters;
|
||||
protected boolean fToggleEating;
|
||||
protected ITextViewer fTextViewer;
|
||||
|
||||
private int fRelevance;
|
||||
private StyleRange fRememberedStyleRange;
|
||||
|
||||
/**
|
||||
* Creates a new completion proposal. All fields are initialized based on the provided information.
|
||||
|
@ -45,11 +80,26 @@ public class CCompletionProposal implements ICCompletionProposal, ICompletionPro
|
|||
* @param displayString the string to be displayed for the proposal
|
||||
* If set to <code>null</code>, the replacement string will be taken as display string.
|
||||
*/
|
||||
public CCompletionProposal(String replacementString, int replacementOffset, int replacementLength, Image image, String displayString, int relevance) {
|
||||
this(replacementString, replacementOffset, replacementLength, image, displayString, relevance, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new completion proposal. All fields are initialized based on the provided information.
|
||||
*
|
||||
* @param replacementString the actual string to be inserted into the document
|
||||
* @param replacementOffset the offset of the text to be replaced
|
||||
* @param replacementLength the length of the text to be replaced
|
||||
* @param image the image to display for this proposal
|
||||
* @param displayString the string to be displayed for the proposal
|
||||
* @param viewer the text viewer for which this proposal is computed, may be <code>null</code>
|
||||
* If set to <code>null</code>, the replacement string will be taken as display string.
|
||||
*/
|
||||
public CCompletionProposal(String replacementString, int replacementOffset, int replacementLength, Image image, String displayString, int relevance, ITextViewer viewer) {
|
||||
Assert.isNotNull(replacementString);
|
||||
Assert.isTrue(replacementOffset >= 0);
|
||||
Assert.isTrue(replacementLength >= 0);
|
||||
|
||||
|
||||
fReplacementString= replacementString;
|
||||
fReplacementOffset= replacementOffset;
|
||||
fReplacementLength= replacementLength;
|
||||
|
@ -57,21 +107,13 @@ public class CCompletionProposal implements ICCompletionProposal, ICompletionPro
|
|||
fDisplayString= displayString != null ? displayString : replacementString;
|
||||
fRelevance= relevance;
|
||||
fTextViewer= viewer;
|
||||
|
||||
//@@@ Is this the best way to do this, likely it isn't
|
||||
if(replacementString.indexOf("()") == -1) { //Not replacing with a function //$NON-NLS-1$
|
||||
fCursorPosition = replacementString.length();
|
||||
} else if(displayString.indexOf("()") == -1) { //Assume that there are arguments between () //$NON-NLS-1$
|
||||
fCursorPosition = replacementString.length() - 1;
|
||||
} else {
|
||||
fCursorPosition = replacementString.length();
|
||||
}
|
||||
|
||||
fCursorPosition= replacementString.length();
|
||||
|
||||
fAdditionalInfoString = null;
|
||||
fContextInformation= null;
|
||||
fContextInformationPosition= -1;
|
||||
//fIncludeDeclaration= null;
|
||||
fTriggerCharacters= null;
|
||||
fProposalInfo= null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -83,15 +125,6 @@ public class CCompletionProposal implements ICCompletionProposal, ICompletionPro
|
|||
fContextInformationPosition= (fContextInformation != null ? fCursorPosition : -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the import declaration to import when applied.
|
||||
* @param importDeclaration Optional import declaration to be added. Can be <code>null</code>. The underlying compilation unit
|
||||
* is assumed to be compatible with the document passed in <code>apply</code>.
|
||||
*
|
||||
public void setIncludeDeclaration(IImportDeclaration importDeclaration) {
|
||||
fIncludeDeclaration= importDeclaration;
|
||||
} */
|
||||
|
||||
/**
|
||||
* Sets the trigger characters.
|
||||
* @param triggerCharacters The set of characters which can trigger the application of this completion proposal
|
||||
|
@ -100,6 +133,14 @@ public class CCompletionProposal implements ICCompletionProposal, ICompletionPro
|
|||
fTriggerCharacters= triggerCharacters;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the proposal info.
|
||||
* @param additionalProposalInfo The additional information associated with this proposal or <code>null</code>
|
||||
*/
|
||||
public void setAdditionalProposalInfo(String proposalInfo) {
|
||||
fProposalInfo= proposalInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the cursor position relative to the insertion offset. By default this is the length of the completion string
|
||||
* (Cursor positioned after the completion)
|
||||
|
@ -111,88 +152,21 @@ public class CCompletionProposal implements ICCompletionProposal, ICompletionPro
|
|||
fContextInformationPosition= (fContextInformation != null ? fCursorPosition : -1);
|
||||
}
|
||||
|
||||
/* protected void addInclude(IRequiredInclude[] inc, CFileElementWorkingCopy tu) {
|
||||
AddIncludeOperation op= new AddIncludeOperation(fEditor, tu, inc, false);
|
||||
try {
|
||||
ProgressMonitorDialog dialog= new ProgressMonitorDialog(getShell());
|
||||
dialog.run(false, true, op);
|
||||
} catch (InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
MessageDialog.openError(getShell(), CEditorMessages.getString("AddIncludeOnSelection.error.message1"), e.getTargetException().getMessage()); //$NON-NLS-1$
|
||||
} catch (InterruptedException e) {
|
||||
// Do nothing. Operation has been canceled.
|
||||
}
|
||||
} */
|
||||
|
||||
protected void applyIncludes(IDocument document) {
|
||||
//AddIncludeOperation(ITextEditor ed, CFileElementWorkingCopy tu, IRequiredInclude[] includes, boolean save) {
|
||||
|
||||
//if (fIncludeDeclaration == null) {
|
||||
return;
|
||||
//}
|
||||
|
||||
/* ICompilationUnit cu= (ICompilationUnit) JavaModelUtil.findElementOfKind(fImportDeclaration, IJavaElement.COMPILATION_UNIT);
|
||||
if (cu != null) {
|
||||
try {
|
||||
IType[] types= cu.getTypes();
|
||||
if (types.length == 0 || types[0].getSourceRange().getOffset() > fReplacementOffset) {
|
||||
// do not add import for code assist on import statements
|
||||
return;
|
||||
}
|
||||
|
||||
String[] prefOrder= ImportOrganizePreferencePage.getImportOrderPreference();
|
||||
int threshold= ImportOrganizePreferencePage.getImportNumberThreshold();
|
||||
ImportsStructure impStructure= new ImportsStructure(cu, prefOrder, threshold, true);
|
||||
|
||||
impStructure.addImport(fImportDeclaration.getElementName());
|
||||
// will modify the document as the CU works on the document
|
||||
impStructure.create(false, null);
|
||||
|
||||
} catch (CoreException e) {
|
||||
JavaPlugin.log(e);
|
||||
}
|
||||
} */
|
||||
}
|
||||
|
||||
/*
|
||||
* @see ICompletionProposal#apply
|
||||
*/
|
||||
public void apply(IDocument document) {
|
||||
apply(document, (char) 0, fReplacementOffset + fReplacementLength);
|
||||
}
|
||||
|
||||
/*
|
||||
* In this case we need to apply the completion proposal intelligently.
|
||||
* This means that if we are applying it to a function, we don't wipe
|
||||
* out the internal arguments, and if the proposal is a function, and it
|
||||
* already is bracketed, then don't put those brackets in.
|
||||
*
|
||||
* @see ICompletionProposalExtension#apply(IDocument, char, int)
|
||||
*/
|
||||
public void apply(IDocument document, char trigger, int offset) {
|
||||
int functionBracketIndex;
|
||||
boolean isBeforeBracket;
|
||||
String replacementStringCopy = fReplacementString;
|
||||
fReplacementLength = offset - fReplacementOffset;
|
||||
try {
|
||||
functionBracketIndex = fReplacementString.indexOf("()"); //$NON-NLS-1$
|
||||
isBeforeBracket = document.getChar(fReplacementOffset + fReplacementLength) == '(';
|
||||
// patch replacement length
|
||||
int delta= offset - (fReplacementOffset + fReplacementLength);
|
||||
if (delta > 0)
|
||||
fReplacementLength += delta;
|
||||
|
||||
//Strip the brackets off the function if inserting right before brackets
|
||||
if(functionBracketIndex != -1 && isBeforeBracket) {
|
||||
replacementStringCopy = fReplacementString.substring(0, functionBracketIndex);
|
||||
}
|
||||
} catch(Exception ex) {
|
||||
/* Ignore */
|
||||
}
|
||||
|
||||
try {
|
||||
String string;
|
||||
if (trigger == (char) 0) {
|
||||
string= fReplacementString;
|
||||
replace(document, fReplacementOffset, fReplacementLength, replacementStringCopy);
|
||||
} else {
|
||||
StringBuffer buffer= new StringBuffer(replacementStringCopy);
|
||||
StringBuffer buffer= new StringBuffer(fReplacementString);
|
||||
|
||||
// fix for PR #5533. Assumes that no eating takes place.
|
||||
if ((fCursorPosition > 0 && fCursorPosition <= buffer.length() && buffer.charAt(fCursorPosition - 1) != trigger)) {
|
||||
|
@ -201,47 +175,141 @@ public class CCompletionProposal implements ICCompletionProposal, ICompletionPro
|
|||
}
|
||||
|
||||
string= buffer.toString();
|
||||
replace(document, fReplacementOffset, fReplacementLength, string);
|
||||
}
|
||||
|
||||
|
||||
// reference position just at the end of the document change.
|
||||
int referenceOffset= fReplacementOffset + fReplacementLength;
|
||||
final ReferenceTracker referenceTracker= new ReferenceTracker();
|
||||
referenceTracker.preReplace(document, referenceOffset);
|
||||
|
||||
replace(document, fReplacementOffset, fReplacementLength, string);
|
||||
|
||||
referenceOffset= referenceTracker.postReplace(document);
|
||||
fReplacementOffset= referenceOffset - (string == null ? 0 : string.length());
|
||||
|
||||
if (fTextViewer != null && string != null) {
|
||||
int index= string.indexOf("()"); //$NON-NLS-1$
|
||||
if (index != -1 && index + 1 == fCursorPosition) {
|
||||
//IPreferenceStore preferenceStore= JavaPlugin.getDefault().getPreferenceStore();
|
||||
IPreferenceStore preferenceStore= CUIPlugin.getDefault().getPreferenceStore();
|
||||
//if (preferenceStore.getBoolean(PreferenceConstants.EDITOR_CLOSE_BRACKETS)) {
|
||||
if(true){
|
||||
int newOffset= fReplacementOffset + fCursorPosition;
|
||||
|
||||
LinkedPositionManager manager= new LinkedPositionManager(document);
|
||||
manager.addPosition(newOffset, 0);
|
||||
LinkedPositionGroup group= new LinkedPositionGroup();
|
||||
group.createPosition(document, newOffset, 0);
|
||||
|
||||
LinkedPositionUI editor= new LinkedPositionUI(fTextViewer, manager);
|
||||
editor.setExitPolicy(new ExitPolicy(')'));
|
||||
editor.setFinalCaretOffset(newOffset + 1);
|
||||
editor.enter();
|
||||
//}
|
||||
LinkedEnvironment env= new LinkedEnvironment();
|
||||
env.addGroup(group);
|
||||
env.forceInstall();
|
||||
|
||||
LinkedUIControl ui= new LinkedUIControl(env, fTextViewer);
|
||||
ui.setPositionListener(new EditorHistoryUpdater());
|
||||
ui.setExitPolicy(new ExitPolicy(')'));
|
||||
ui.setExitPosition(fTextViewer, newOffset + 1, 0, Integer.MAX_VALUE);
|
||||
ui.setCyclingMode(LinkedUIControl.CYCLE_NEVER);
|
||||
ui.enter();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* The replacement length is used to calculate the new cursor position,
|
||||
* so after we update the includes adjust the replacement offset.
|
||||
* NOTE: This won't work if the include is added after the offset,
|
||||
* such as might be the case with #include completions.
|
||||
*/
|
||||
int oldLen= document.getLength();
|
||||
applyIncludes(document);
|
||||
fReplacementOffset += document.getLength() - oldLen;
|
||||
|
||||
} catch (BadLocationException x) {
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A class to simplify tracking a reference position in a document.
|
||||
*/
|
||||
private static final class ReferenceTracker {
|
||||
|
||||
/** The reference position category name. */
|
||||
private static final String CATEGORY= "reference_position"; //$NON-NLS-1$
|
||||
/** The position updater of the reference position. */
|
||||
private final IPositionUpdater fPositionUpdater= new DefaultPositionUpdater(CATEGORY);
|
||||
/** The reference position. */
|
||||
private final Position fPosition= new Position(0);
|
||||
|
||||
/**
|
||||
* Called before document changes occur. It must be followed by a call to postReplace().
|
||||
*
|
||||
* @param document the document on which to track the reference position.
|
||||
*
|
||||
*/
|
||||
public void preReplace(IDocument document, int offset) throws BadLocationException {
|
||||
fPosition.setOffset(offset);
|
||||
try {
|
||||
document.addPositionCategory(CATEGORY);
|
||||
document.addPositionUpdater(fPositionUpdater);
|
||||
document.addPosition(CATEGORY, fPosition);
|
||||
|
||||
} catch (BadPositionCategoryException e) {
|
||||
// should not happen
|
||||
CUIPlugin.getDefault().log(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Called after the document changed occured. It must be preceded by a call to preReplace().
|
||||
*
|
||||
* @param document the document on which to track the reference position.
|
||||
*/
|
||||
public int postReplace(IDocument document) {
|
||||
try {
|
||||
document.removePosition(CATEGORY, fPosition);
|
||||
document.removePositionUpdater(fPositionUpdater);
|
||||
document.removePositionCategory(CATEGORY);
|
||||
|
||||
} catch (BadPositionCategoryException e) {
|
||||
// should not happen
|
||||
CUIPlugin.getDefault().log(e);
|
||||
}
|
||||
return fPosition.getOffset();
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
*/
|
||||
public ExitFlags doExit(LinkedEnvironment environment, VerifyEvent event, int offset, int length) {
|
||||
|
||||
if (event.character == fExitCharacter) {
|
||||
if (environment.anyPositionContains(offset))
|
||||
return new ExitFlags(ILinkedListener.UPDATE_CARET, false);
|
||||
else
|
||||
return new ExitFlags(ILinkedListener.UPDATE_CARET, true);
|
||||
}
|
||||
|
||||
switch (event.character) {
|
||||
case ';':
|
||||
return new ExitFlags(ILinkedListener.NONE, true);
|
||||
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// #6410 - File unchanged but dirtied by code assist
|
||||
private void replace(IDocument document, int offset, int length, String string) throws BadLocationException {
|
||||
if (!document.get(offset, length).equals(string))
|
||||
document.replace(offset, length, string);
|
||||
}
|
||||
|
||||
/*
|
||||
* @see ICompletionProposal#apply
|
||||
*/
|
||||
public void apply(IDocument document) {
|
||||
apply(document, (char) 0, fReplacementOffset + fReplacementLength);
|
||||
}
|
||||
|
||||
/*
|
||||
* @see ICompletionProposal#getSelection
|
||||
|
@ -271,20 +339,14 @@ public class CCompletionProposal implements ICCompletionProposal, ICompletionPro
|
|||
return fDisplayString;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the additional information which will be shown when this
|
||||
* proposal is selected in the popup list.
|
||||
* @param infoString
|
||||
*/
|
||||
public void setAdditionalProposalInfo(String infoString) {
|
||||
fAdditionalInfoString = infoString;
|
||||
}
|
||||
|
||||
/*
|
||||
* @see ICompletionProposal#getAdditionalProposalInfo()
|
||||
*/
|
||||
public String getAdditionalProposalInfo() {
|
||||
return fAdditionalInfoString;
|
||||
// if (fProposalInfo != null) {
|
||||
// return fProposalInfo.getInfo();
|
||||
// }
|
||||
return fProposalInfo;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -300,27 +362,6 @@ public class CCompletionProposal implements ICCompletionProposal, ICompletionPro
|
|||
public int getContextInformationPosition() {
|
||||
return fReplacementOffset + fContextInformationPosition;
|
||||
}
|
||||
|
||||
/*
|
||||
* @see ICompletionProposalExtension#isValidFor(IDocument, int)
|
||||
*/
|
||||
public boolean isValidFor(IDocument document, int offset) {
|
||||
if (offset < fReplacementOffset)
|
||||
return false;
|
||||
|
||||
int replacementLength= fReplacementString == null ? 0 : fReplacementString.length();
|
||||
if (offset > fReplacementOffset + replacementLength)
|
||||
return false;
|
||||
|
||||
try {
|
||||
int length= offset - fReplacementOffset;
|
||||
String start= document.get(fReplacementOffset, length);
|
||||
return fReplacementString.substring(0, length).equalsIgnoreCase(start);
|
||||
} catch (BadLocationException x) {
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the replacement offset.
|
||||
|
@ -329,6 +370,13 @@ public class CCompletionProposal implements ICCompletionProposal, ICompletionPro
|
|||
public int getReplacementOffset() {
|
||||
return fReplacementOffset;
|
||||
}
|
||||
|
||||
/*
|
||||
* @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension3#getCompletionOffset()
|
||||
*/
|
||||
public int getCompletionOffset() {
|
||||
return getReplacementOffset();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the replacement offset.
|
||||
|
@ -363,6 +411,18 @@ public class CCompletionProposal implements ICCompletionProposal, ICompletionPro
|
|||
public String getReplacementString() {
|
||||
return fReplacementString;
|
||||
}
|
||||
|
||||
/*
|
||||
* @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension3#getReplacementText()
|
||||
*/
|
||||
public CharSequence getCompletionText() {
|
||||
String string= getReplacementString();
|
||||
int pos= string.indexOf('(');
|
||||
if (pos > 0)
|
||||
return string.subSequence(0, pos);
|
||||
else
|
||||
return string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the replacement string.
|
||||
|
@ -379,6 +439,36 @@ public class CCompletionProposal implements ICCompletionProposal, ICompletionPro
|
|||
public void setImage(Image image) {
|
||||
fImage= image;
|
||||
}
|
||||
|
||||
/*
|
||||
* @see ICompletionProposalExtension#isValidFor(IDocument, int)
|
||||
*/
|
||||
public boolean isValidFor(IDocument document, int offset) {
|
||||
return validate(document, offset, null);
|
||||
}
|
||||
|
||||
/*
|
||||
* @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension2#validate(org.eclipse.jface.text.IDocument, int, org.eclipse.jface.text.DocumentEvent)
|
||||
*/
|
||||
public boolean validate(IDocument document, int offset, DocumentEvent event) {
|
||||
|
||||
if (offset < fReplacementOffset)
|
||||
return false;
|
||||
|
||||
/*
|
||||
* See http://dev.eclipse.org/bugs/show_bug.cgi?id=17667
|
||||
String word= fReplacementString;
|
||||
*/
|
||||
boolean validated= startsWith(document, offset, fDisplayString);
|
||||
|
||||
if (validated && event != null) {
|
||||
// adapt replacement range to document change
|
||||
int delta= (event.fText == null ? 0 : event.fText.length()) - event.fLength;
|
||||
fReplacementLength += delta;
|
||||
}
|
||||
|
||||
return validated;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the proposal's relevance.
|
||||
|
@ -396,68 +486,168 @@ public class CCompletionProposal implements ICCompletionProposal, ICompletionPro
|
|||
fRelevance= relevance;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see java.lang.Object#hashCode()
|
||||
*/
|
||||
public int hashCode() {
|
||||
return fDisplayString.hashCode()
|
||||
+ fReplacementString.hashCode()
|
||||
+ ((fAdditionalInfoString == null) ? 0 : fAdditionalInfoString.hashCode());
|
||||
}
|
||||
/* (non-Javadoc)
|
||||
* @see java.lang.Object#equals(java.lang.Object)
|
||||
*/
|
||||
public boolean equals(Object other) {
|
||||
if(!(other instanceof CCompletionProposal))
|
||||
return false;
|
||||
if(!(fDisplayString.equals(((CCompletionProposal)other).fDisplayString)))
|
||||
return false;
|
||||
if(!(fReplacementString.equals(((CCompletionProposal)other).fReplacementString)))
|
||||
return false;
|
||||
if((fAdditionalInfoString != null) && (((CCompletionProposal)other).fAdditionalInfoString != null) && (!(fAdditionalInfoString.equals(((CCompletionProposal)other).fAdditionalInfoString))))
|
||||
/**
|
||||
* Returns <code>true</code> if a words starts with the code completion prefix in the document,
|
||||
* <code>false</code> otherwise.
|
||||
*/
|
||||
protected boolean startsWith(IDocument document, int offset, String word) {
|
||||
int wordLength= word == null ? 0 : word.length();
|
||||
if (offset > fReplacementOffset + wordLength)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private static class ExitPolicy implements LinkedPositionUI.ExitPolicy {
|
||||
|
||||
final char fExitCharacter;
|
||||
|
||||
public ExitPolicy(char exitCharacter) {
|
||||
fExitCharacter= exitCharacter;
|
||||
try {
|
||||
int length= offset - fReplacementOffset;
|
||||
String start= document.get(fReplacementOffset, length);
|
||||
return word.substring(0, length).equalsIgnoreCase(start);
|
||||
} catch (BadLocationException x) {
|
||||
}
|
||||
|
||||
/*
|
||||
* @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)
|
||||
*/
|
||||
public ExitFlags doExit(LinkedPositionManager manager, VerifyEvent event, int offset, int length) {
|
||||
|
||||
if (event.character == fExitCharacter) {
|
||||
if (manager.anyPositionIncludes(offset, length))
|
||||
return new ExitFlags(LinkedPositionUI.COMMIT| LinkedPositionUI.UPDATE_CARET, false);
|
||||
else
|
||||
return new ExitFlags(LinkedPositionUI.COMMIT, true);
|
||||
}
|
||||
|
||||
switch (event.character) {
|
||||
case '\b':
|
||||
if (manager.getFirstPosition().length == 0)
|
||||
return new ExitFlags(0, true);
|
||||
else
|
||||
return null;
|
||||
|
||||
case '\n':
|
||||
case '\r':
|
||||
case ';':
|
||||
return new ExitFlags(LinkedPositionUI.COMMIT, true);
|
||||
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static boolean insertCompletion() {
|
||||
IPreferenceStore preference= CUIPlugin.getDefault().getPreferenceStore();
|
||||
return preference.getBoolean(ContentAssistPreference.AUTOINSERT);
|
||||
}
|
||||
|
||||
/*
|
||||
* @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension1#apply(org.eclipse.jface.text.ITextViewer, char, int, int)
|
||||
*/
|
||||
public void apply(ITextViewer viewer, char trigger, int stateMask, int offset) {
|
||||
|
||||
IDocument document= viewer.getDocument();
|
||||
|
||||
// don't eat if not in preferences, XOR with modifier key 1 (Ctrl)
|
||||
// but: if there is a selection, replace it!
|
||||
Point selection= viewer.getSelectedRange();
|
||||
fToggleEating= (stateMask & SWT.MOD1) != 0;
|
||||
if (insertCompletion() ^ fToggleEating)
|
||||
fReplacementLength= selection.x + selection.y - fReplacementOffset;
|
||||
|
||||
apply(document, trigger, offset);
|
||||
fToggleEating= false;
|
||||
}
|
||||
|
||||
private static Color getForegroundColor(StyledText text) {
|
||||
|
||||
IPreferenceStore preference= CUIPlugin.getDefault().getPreferenceStore();
|
||||
RGB rgb= PreferenceConverter.getColor(preference, ContentAssistPreference.PROPOSALS_FOREGROUND);
|
||||
CTextTools textTools= CUIPlugin.getDefault().getTextTools();
|
||||
return textTools.getColorManager().getColor(rgb);
|
||||
}
|
||||
|
||||
private static Color getBackgroundColor(StyledText text) {
|
||||
|
||||
IPreferenceStore preference= CUIPlugin.getDefault().getPreferenceStore();
|
||||
RGB rgb= PreferenceConverter.getColor(preference, ContentAssistPreference.PROPOSALS_BACKGROUND);
|
||||
CTextTools textTools= CUIPlugin.getDefault().getTextTools();
|
||||
return textTools.getColorManager().getColor(rgb);
|
||||
}
|
||||
|
||||
private void repairPresentation(ITextViewer viewer) {
|
||||
if (fRememberedStyleRange != null) {
|
||||
if (viewer instanceof ITextViewerExtension2) {
|
||||
// attempts to reduce the redraw area
|
||||
ITextViewerExtension2 viewer2= (ITextViewerExtension2) viewer;
|
||||
|
||||
if (viewer instanceof ITextViewerExtension5) {
|
||||
|
||||
ITextViewerExtension5 extension= (ITextViewerExtension5) viewer;
|
||||
IRegion widgetRange= extension.modelRange2WidgetRange(new Region(fRememberedStyleRange.start, fRememberedStyleRange.length));
|
||||
if (widgetRange != null)
|
||||
viewer2.invalidateTextPresentation(widgetRange.getOffset(), widgetRange.getLength());
|
||||
|
||||
} else {
|
||||
viewer2.invalidateTextPresentation(fRememberedStyleRange.start + viewer.getVisibleRegion().getOffset(), fRememberedStyleRange.length);
|
||||
}
|
||||
|
||||
} else
|
||||
viewer.invalidateTextPresentation();
|
||||
}
|
||||
}
|
||||
|
||||
private void updateStyle(ITextViewer viewer) {
|
||||
|
||||
StyledText text= viewer.getTextWidget();
|
||||
if (text == null || text.isDisposed())
|
||||
return;
|
||||
|
||||
int widgetCaret= text.getCaretOffset();
|
||||
|
||||
int modelCaret= 0;
|
||||
if (viewer instanceof ITextViewerExtension5) {
|
||||
ITextViewerExtension5 extension= (ITextViewerExtension5) viewer;
|
||||
modelCaret= extension.widgetOffset2ModelOffset(widgetCaret);
|
||||
} else {
|
||||
IRegion visibleRegion= viewer.getVisibleRegion();
|
||||
modelCaret= widgetCaret + visibleRegion.getOffset();
|
||||
}
|
||||
|
||||
if (modelCaret >= fReplacementOffset + fReplacementLength) {
|
||||
repairPresentation(viewer);
|
||||
return;
|
||||
}
|
||||
|
||||
int offset= widgetCaret;
|
||||
int length= fReplacementOffset + fReplacementLength - modelCaret;
|
||||
|
||||
Color foreground= getForegroundColor(text);
|
||||
Color background= getBackgroundColor(text);
|
||||
|
||||
StyleRange range= text.getStyleRangeAtOffset(offset);
|
||||
int fontStyle= range != null ? range.fontStyle : SWT.NORMAL;
|
||||
|
||||
repairPresentation(viewer);
|
||||
fRememberedStyleRange= new StyleRange(offset, length, foreground, background, fontStyle);
|
||||
|
||||
// http://dev.eclipse.org/bugs/show_bug.cgi?id=34754
|
||||
try {
|
||||
text.setStyleRange(fRememberedStyleRange);
|
||||
} catch (IllegalArgumentException x) {
|
||||
// catching exception as offset + length might be outside of the text widget
|
||||
fRememberedStyleRange= null;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension2#selected(ITextViewer, boolean)
|
||||
*/
|
||||
public void selected(ITextViewer viewer, boolean smartToggle) {
|
||||
if (!insertCompletion() ^ smartToggle)
|
||||
updateStyle(viewer);
|
||||
else {
|
||||
repairPresentation(viewer);
|
||||
fRememberedStyleRange= null;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension2#unselected(ITextViewer)
|
||||
*/
|
||||
public void unselected(ITextViewer viewer) {
|
||||
repairPresentation(viewer);
|
||||
fRememberedStyleRange= null;
|
||||
}
|
||||
|
||||
/*
|
||||
* @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension3#getInformationControlCreator()
|
||||
*/
|
||||
public IInformationControlCreator getInformationControlCreator() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public void updateReplacementOffset(int newOffset) {
|
||||
setReplacementOffset(newOffset);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public void updateReplacementLength(int length) {
|
||||
setReplacementLength(length);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -548,15 +548,22 @@ public class CompletionEngine implements RelevanceConstants {
|
|||
}
|
||||
else // prefix is empty
|
||||
{
|
||||
IASTNode.LookupKind[] kinds = new IASTNode.LookupKind[1];
|
||||
kinds[0] = IASTNode.LookupKind.THIS;
|
||||
result = lookup(searchNode, completionNode.getCompletionPrefix(), kinds, completionNode.getCompletionContext());
|
||||
addToCompletions(result);
|
||||
|
||||
kinds = new IASTNode.LookupKind[1];
|
||||
kinds[0] = IASTNode.LookupKind.LOCAL_VARIABLES;
|
||||
result = lookup(searchNode, completionNode.getCompletionPrefix(), kinds, completionNode.getCompletionContext());
|
||||
addToCompletions(result);
|
||||
if(searchNode instanceof IASTCodeScope){
|
||||
IASTNode.LookupKind[] kinds = new IASTNode.LookupKind[1];
|
||||
kinds[0] = IASTNode.LookupKind.THIS;
|
||||
result = lookup(searchNode, completionNode.getCompletionPrefix(), kinds, completionNode.getCompletionContext());
|
||||
addToCompletions(result);
|
||||
|
||||
kinds = new IASTNode.LookupKind[1];
|
||||
kinds[0] = IASTNode.LookupKind.LOCAL_VARIABLES;
|
||||
result = lookup(searchNode, completionNode.getCompletionPrefix(), kinds, completionNode.getCompletionContext());
|
||||
addToCompletions(result);
|
||||
} else {
|
||||
IASTNode.LookupKind[] kinds = new IASTNode.LookupKind[1];
|
||||
kinds[0] = IASTNode.LookupKind.ALL;
|
||||
result = lookup(searchNode, completionNode.getCompletionPrefix(), kinds, completionNode.getCompletionContext());
|
||||
addToCompletions(result);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -190,8 +190,15 @@ public class ResultCollector extends CompletionRequestorAdaptor {
|
|||
arguments, image, completionStart, completionLength, relevance);
|
||||
|
||||
boolean userMustCompleteParameters= (parameterString != null && parameterString.length() > 0);
|
||||
|
||||
char[] triggers= userMustCompleteParameters ? METHOD_WITH_ARGUMENTS_TRIGGERS : METHOD_TRIGGERS;
|
||||
proposal.setTriggerCharacters(triggers);
|
||||
|
||||
if (userMustCompleteParameters) {
|
||||
// set the cursor before the closing bracket
|
||||
proposal.setCursorPosition(replaceString.length() - 1);
|
||||
}
|
||||
|
||||
completions.add(proposal);
|
||||
}
|
||||
|
||||
|
@ -324,9 +331,17 @@ public class ResultCollector extends CompletionRequestorAdaptor {
|
|||
// create proposal and add it to completions list
|
||||
CCompletionProposal proposal = createProposal(replaceString, displayString, infoString.toString(),
|
||||
arguments, image, completionStart, completionLength, relevance);
|
||||
|
||||
boolean userMustCompleteParameters= (parameterString != null && parameterString.length() > 0);
|
||||
|
||||
char[] triggers= userMustCompleteParameters ? METHOD_WITH_ARGUMENTS_TRIGGERS : METHOD_TRIGGERS;
|
||||
proposal.setTriggerCharacters(triggers);
|
||||
|
||||
if (userMustCompleteParameters) {
|
||||
// set the cursor before the closing bracket
|
||||
proposal.setCursorPosition(replaceString.length() - 1);
|
||||
}
|
||||
|
||||
completions.add(proposal);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue