1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Content Assist work

This commit is contained in:
Hoda Amer 2003-12-03 20:29:29 +00:00
parent 429e4b8a9b
commit 307d4a1d40
20 changed files with 791 additions and 469 deletions

View file

@ -21,7 +21,7 @@ import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.internal.core.model.TranslationUnit;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.cdt.internal.ui.text.CCompletionProcessor;
import org.eclipse.cdt.internal.ui.text.contentassist.CCompletionProcessor;
import org.eclipse.cdt.testplugin.CProjectHelper;
import org.eclipse.core.internal.resources.ResourceException;
import org.eclipse.core.resources.IFile;

View file

@ -1,3 +1,6 @@
2003-12-03 Hoda Amer
Content Assist work :Moved CompletionEngine out of CDT core
2003-11-27 Hoda Amer
Content Assist work : Added an ICompletionRequestor interface
and a CompletionRequestorAdaptor classe.

View file

@ -49,7 +49,7 @@ public interface IASTCompletionNode {
}
public CompletionKind getCompletionKind();
public IASTNode getCompletionContext();
public String getCompletionPrefix();
public CompletionKind getCompletionKind();
public IASTNode getCompletionContext();
public String getCompletionPrefix();
}

View file

@ -32,8 +32,12 @@ public interface IASTNode {
public static final LookupKind LOCAL_VARIABLES = new LookupKind( 7 );
public static final LookupKind METHODS = new LookupKind( 8 );
public static final LookupKind FIELDS = new LookupKind( 9 );
public static final LookupKind NAMESPACES = new LookupKind( 10 );
public static final LookupKind CONSTRUCTORS = new LookupKind (10);
public static final LookupKind NAMESPACES = new LookupKind( 11 );
public static final LookupKind MACROS = new LookupKind( 12 );
public static final LookupKind ENUMERATIONS = new LookupKind( 13 );
public static final LookupKind ENUMERATORS = new LookupKind( 14 );
/**
* @param enumValue
*/

View file

@ -31,4 +31,5 @@ public interface ICompletionRequestor {
void acceptMacro(String name, int completionStart, int completionLength, int relevance);
void acceptEnumeration(String name, int completionStart, int completionLength, int relevance);
void acceptEnumerator(String name, int completionStart, int completionLength, int relevance);
void acceptKeyword(String name, int completionStart, int completionLength, int relevance);
}

View file

@ -1,245 +0,0 @@
/**********************************************************************
* Copyright (c) 2002,2003 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.core.contentassist;
import java.io.CharArrayReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICompletionRequestor;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.parser.IParser;
import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.core.parser.IScannerInfoProvider;
import org.eclipse.cdt.core.parser.ParserFactory;
import org.eclipse.cdt.core.parser.ParserFactoryException;
import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.ParserMode;
import org.eclipse.cdt.core.parser.ParserUtil;
import org.eclipse.cdt.core.parser.ScannerInfo;
import org.eclipse.cdt.core.parser.ast.IASTCompletionNode;
import org.eclipse.cdt.core.parser.ast.IASTField;
import org.eclipse.cdt.core.parser.ast.IASTNode;
import org.eclipse.cdt.core.parser.ast.IASTNode.LookupResult;
import org.eclipse.cdt.internal.core.model.IWorkingCopy;
import org.eclipse.cdt.internal.core.parser.util.ASTUtil;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
/**
* @author hamer
*
* This class is the entry point for code completions.
* It contains a public API used to call ContentAssist on a given working copy
* and a given completion offset.
*
*/
public class CompletionEngine {
List completions = new ArrayList();
ICompletionRequestor requestor;
int completionStart = 0;
int completionLength = 0;
public static final int LOCAL_VARIABLE_TYPE_RELEVANCE = 12;
public static final int FIELD_TYPE_RELEVANCE = 11;
public static final int VARIABLE_TYPE_RELEVANCE = 10;
public static final int METHOD_TYPE_RELEVANCE = 9;
public static final int FUNCTION_TYPE_RELEVANCE = 8;
public static final int CLASS_TYPE_RELEVANCE = 7;
public static final int STRUCT_TYPE_RELEVANCE = 6;
public static final int UNION_TYPE_RELEVANCE = 5;
public static final int NAMESPACE_TYPE_RELEVANCE = 4;
public static final int MACRO_TYPE_RELEVANCE = 3;
public static final int ENUMERATION_TYPE_RELEVANCE = 2;
public static final int ENUMERATOR_TYPE_RELEVANCE = 1;
public static final int DEFAULT_TYPE_RELEVANCE = 0;
public CompletionEngine(ICompletionRequestor completionRequestor){
completions.clear();
requestor = completionRequestor;
}
public int computeTypeRelevance(int type){
switch (type){
case ICElement.C_FIELD:
return FIELD_TYPE_RELEVANCE;
case ICElement.C_VARIABLE:
case ICElement.C_VARIABLE_DECLARATION:
return VARIABLE_TYPE_RELEVANCE;
case ICElement.C_METHOD:
case ICElement.C_METHOD_DECLARATION:
return METHOD_TYPE_RELEVANCE;
case ICElement.C_FUNCTION:
case ICElement.C_FUNCTION_DECLARATION:
return FUNCTION_TYPE_RELEVANCE;
case ICElement.C_CLASS:
return CLASS_TYPE_RELEVANCE;
case ICElement.C_STRUCT:
return STRUCT_TYPE_RELEVANCE;
case ICElement.C_UNION:
return UNION_TYPE_RELEVANCE;
case ICElement.C_NAMESPACE:
return NAMESPACE_TYPE_RELEVANCE;
case ICElement.C_MACRO:
return MACRO_TYPE_RELEVANCE;
case ICElement.C_ENUMERATION:
return ENUMERATION_TYPE_RELEVANCE;
case ICElement.C_ENUMERATOR:
return ENUMERATOR_TYPE_RELEVANCE;
default :
return DEFAULT_TYPE_RELEVANCE;
}
}
private IASTCompletionNode parse(IWorkingCopy sourceUnit, int completionOffset){
ContentAssistElementRequestor requestor = new ContentAssistElementRequestor();
// Get resource info
IResource currentResource = sourceUnit.getResource();
IPath realPath = currentResource.getLocation();
IProject project = currentResource.getProject();
Reader reader = new CharArrayReader( sourceUnit.getContents() );
//Get the scanner info
IScannerInfo scanInfo = new ScannerInfo();
IScannerInfoProvider provider = CCorePlugin.getDefault().getScannerInfoProvider(project);
if (provider != null){
IScannerInfo buildScanInfo = provider.getScannerInformation(project);
if( buildScanInfo != null )
scanInfo = new ScannerInfo(buildScanInfo.getDefinedSymbols(), buildScanInfo.getIncludePaths());
}
//C or CPP?
ParserLanguage language = CoreModel.getDefault().hasCCNature(project) ? ParserLanguage.CPP : ParserLanguage.C;
IParser parser = null;
try
{
IScanner scanner = ParserFactory.createScanner( reader, realPath.toOSString(), scanInfo, ParserMode.COMPLETE_PARSE, language, requestor, ParserUtil.getParserLogService() );
parser = ParserFactory.createParser( scanner, requestor, ParserMode.COMPLETE_PARSE, language, ParserUtil.getParserLogService() );
}
catch( ParserFactoryException pfe )
{
}
if(parser != null){
IASTCompletionNode result = parser.parse(completionOffset);
return result;
} else {
return null;
}
}
private void addToCompletions (LookupResult result){
Iterator nodes = result.getNodes();
while (nodes.hasNext()){
IASTNode node = (IASTNode) nodes.next();
if(node instanceof IASTField){
int relevance = computeTypeRelevance(ICElement.C_FIELD);
IASTField field = (IASTField)node;
requestor.acceptField(field.getName(),
ASTUtil.getType(field.getAbstractDeclaration()),
field.getVisiblity(), completionStart, completionLength, relevance);
}
}
return ;
}
private void completionOnDotMember(IASTCompletionNode completionNode){
// Completing after a dot
// 1. Get the search scope node
IASTNode searchNode = completionNode.getCompletionContext();
// 2. lookup fields & add to completion proposals
LookupResult result = searchNode.lookup (completionNode.getCompletionPrefix(), IASTNode.LookupKind.FIELDS);
addToCompletions (result);
// 3. looup methods & add to completion proposals
result = searchNode.lookup (completionNode.getCompletionPrefix(), IASTNode.LookupKind.METHODS);
addToCompletions (result);
// 4. lookup nested structures & add to completion proposals
result = searchNode.lookup (completionNode.getCompletionPrefix(), IASTNode.LookupKind.METHODS);
addToCompletions (result);
}
public void complete(IWorkingCopy sourceUnit, int completionOffset, List completionList) {
// 1- Parse the translation unit
IASTCompletionNode completionNode = parse(sourceUnit, completionOffset);
if (completionNode == null)
return;
// set the completionStart and the completionLength
completionStart = completionOffset;
completionLength = completionNode.getCompletionPrefix().length();
// 2- Check the return value
if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.DOT_MEMBER){
completionOnDotMember(completionNode);
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.ARROW_MEMBER){
// CompletionOnArrowMember
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.QUALIFIEDNAME_MEMBER){
// CompletionOnQualifiedNameMember
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.FIELD_TYPE){
// CompletionOnFieldType
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.VARIABLE_TYPE){
// CompletionOnVariableType
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.ARGUMENT_TYPE){
// CompletionOnArgumentType
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.METHOD_RETURN_TYPE){
// CompletionOnMethodReturnType
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.FUNCTIOND_RETURN_TYPE){
// CompletionOnFunctionReturnType
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.SINGLE_NAME_REFERENCE){
// CompletionOnSingleNameReference
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.QUALIFIED_NAME_REFERENCE){
// CompletionOnQualifiedNameReference
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.STRUCTURE_REFERENCE){
// CompletionOnStructureReference
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.CLASS_REFERENCE){
// CompletionOnClassReference
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.EXCEPTION_REFERENCE){
// CompletionOnExceptionReference
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.MACRO_REFERENCE){
// CompletionOnMacroReference
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.MESSAGE_SEND){
// CompletionOnMessageSend
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.QUALIFIED_ALLOCATION_EXPRESSION){
// CompletionOnQualifiedAllocationExpression
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.KEYWORD){
// CompletionOnKeyword
}
completionList.addAll(completions);
return;
}
}

View file

@ -1,3 +1,8 @@
2003-12-03 Hoda Amer
Content Assist work :Added a new internal package for content assist
Added more functionality to the CompletionEngine.
Added the Case Sensitive user preference.
2003-11-27 Hoda Amer
Content Assist work : Added a ResultCollector class
and moved the ICCompletionProposal from an internal package

View file

@ -23,7 +23,7 @@ import org.eclipse.cdt.internal.ui.editor.asm.AsmTextTools;
import org.eclipse.cdt.internal.ui.text.CPairMatcher;
import org.eclipse.cdt.internal.ui.text.CSourceViewerConfiguration;
import org.eclipse.cdt.internal.ui.text.CTextTools;
import org.eclipse.cdt.internal.ui.text.ContentAssistPreference;
import org.eclipse.cdt.internal.ui.text.contentassist.ContentAssistPreference;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.IWorkingCopyManager;
import org.eclipse.core.resources.IFile;

View file

@ -20,8 +20,8 @@ import org.eclipse.cdt.internal.ui.dialogs.StatusUtil;
import org.eclipse.cdt.internal.ui.editor.CEditor;
import org.eclipse.cdt.internal.ui.text.CSourceViewerConfiguration;
import org.eclipse.cdt.internal.ui.text.CTextTools;
import org.eclipse.cdt.internal.ui.text.ContentAssistPreference;
import org.eclipse.cdt.internal.ui.text.ICColorConstants;
import org.eclipse.cdt.internal.ui.text.contentassist.ContentAssistPreference;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.PreferenceConstants;
import org.eclipse.cdt.utils.ui.controls.TabFolderLayout;
@ -58,9 +58,9 @@ import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.editors.text.TextEditorPreferenceConstants;
import org.eclipse.ui.help.WorkbenchHelp;
import org.eclipse.ui.texteditor.AnnotationPreference;
import org.eclipse.ui.texteditor.ExtendedTextEditorPreferenceConstants;
import org.eclipse.ui.texteditor.MarkerAnnotationPreferences;
import org.eclipse.ui.texteditor.WorkbenchChainedTextFontFieldEditor;
@ -78,13 +78,13 @@ public class CEditorPreferencePage extends PreferencePage implements IWorkbenchP
PreferencesMessages.getString("CEditorPreferencePage.cCommentTaskTags"), PreferenceConstants.EDITOR_TASK_TAG_COLOR }
};
protected final String[][] fAppearanceColorListModel = new String[][] { { "Line number color", TextEditorPreferenceConstants.EDITOR_LINE_NUMBER_RULER_COLOR }, //$NON-NLS-1$
protected final String[][] fAppearanceColorListModel = new String[][] { { "Line number color", ExtendedTextEditorPreferenceConstants.EDITOR_LINE_NUMBER_RULER_COLOR }, //$NON-NLS-1$
{
"Matching bracket color", CEditor.MATCHING_BRACKETS_COLOR }, //$NON-NLS-1$
{
"Current line highlight color", TextEditorPreferenceConstants.EDITOR_CURRENT_LINE_COLOR }, //$NON-NLS-1$
"Current line highlight color", ExtendedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE_COLOR }, //$NON-NLS-1$
{
"Print margin color", TextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_COLOR }, //$NON-NLS-1$
"Print margin color", ExtendedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_COLOR }, //$NON-NLS-1$
{
"Linked position color", CEditor.LINKED_POSITION_COLOR }, //$NON-NLS-1$
};
@ -158,114 +158,54 @@ public class CEditorPreferencePage extends PreferencePage implements IWorkbenchP
new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, info.getOverviewRulerPreferenceKey()));
}
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, CEditor.PREFERENCE_COLOR_FOREGROUND));
overlayKeys.add(
new OverlayPreferenceStore.OverlayKey(
OverlayPreferenceStore.BOOLEAN,
CEditor.PREFERENCE_COLOR_FOREGROUND_SYSTEM_DEFAULT));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN,CEditor.PREFERENCE_COLOR_FOREGROUND_SYSTEM_DEFAULT));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, CEditor.PREFERENCE_COLOR_BACKGROUND));
overlayKeys.add(
new OverlayPreferenceStore.OverlayKey(
OverlayPreferenceStore.BOOLEAN,
CEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT));
overlayKeys.add(
new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, CSourceViewerConfiguration.PREFERENCE_TAB_WIDTH));
overlayKeys.add(
new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ICColorConstants.C_MULTI_LINE_COMMENT));
overlayKeys.add(
new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, ICColorConstants.C_MULTI_LINE_COMMENT + "_bold"));
overlayKeys.add(
new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ICColorConstants.C_SINGLE_LINE_COMMENT));
overlayKeys.add(
new OverlayPreferenceStore.OverlayKey(
OverlayPreferenceStore.BOOLEAN,
ICColorConstants.C_SINGLE_LINE_COMMENT + "_bold"));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN,CEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, CSourceViewerConfiguration.PREFERENCE_TAB_WIDTH));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ICColorConstants.C_MULTI_LINE_COMMENT));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, ICColorConstants.C_MULTI_LINE_COMMENT + "_bold"));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ICColorConstants.C_SINGLE_LINE_COMMENT));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, ICColorConstants.C_SINGLE_LINE_COMMENT + "_bold"));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ICColorConstants.C_KEYWORD));
overlayKeys.add(
new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, ICColorConstants.C_KEYWORD + "_bold"));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, ICColorConstants.C_KEYWORD + "_bold"));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ICColorConstants.C_TYPE));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, ICColorConstants.C_TYPE + "_bold"));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ICColorConstants.C_STRING));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, ICColorConstants.C_STRING + "_bold"));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ICColorConstants.C_DEFAULT));
overlayKeys.add(
new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, ICColorConstants.C_DEFAULT + "_bold"));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, ICColorConstants.C_DEFAULT + "_bold"));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, CEditor.MATCHING_BRACKETS_COLOR));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, CEditor.MATCHING_BRACKETS));
overlayKeys.add(
new OverlayPreferenceStore.OverlayKey(
OverlayPreferenceStore.STRING,
TextEditorPreferenceConstants.EDITOR_CURRENT_LINE_COLOR));
overlayKeys.add(
new OverlayPreferenceStore.OverlayKey(
OverlayPreferenceStore.BOOLEAN,
TextEditorPreferenceConstants.EDITOR_CURRENT_LINE));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ExtendedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE_COLOR));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, ExtendedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, CEditor.SPACES_FOR_TABS));
overlayKeys.add(
new OverlayPreferenceStore.OverlayKey(
OverlayPreferenceStore.STRING,
TextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_COLOR));
overlayKeys.add(
new OverlayPreferenceStore.OverlayKey(
OverlayPreferenceStore.INT,
TextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_COLUMN));
overlayKeys.add(
new OverlayPreferenceStore.OverlayKey(
OverlayPreferenceStore.BOOLEAN,
TextEditorPreferenceConstants.EDITOR_PRINT_MARGIN));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ExtendedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_COLOR));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, ExtendedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_COLUMN));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, ExtendedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, CEditor.LINKED_POSITION_COLOR));
overlayKeys.add(
new OverlayPreferenceStore.OverlayKey(
OverlayPreferenceStore.STRING,
TextEditorPreferenceConstants.EDITOR_LINE_NUMBER_RULER_COLOR));
overlayKeys.add(
new OverlayPreferenceStore.OverlayKey(
OverlayPreferenceStore.BOOLEAN,
TextEditorPreferenceConstants.EDITOR_LINE_NUMBER_RULER));
overlayKeys.add(
new OverlayPreferenceStore.OverlayKey(
OverlayPreferenceStore.BOOLEAN,
TextEditorPreferenceConstants.EDITOR_OVERVIEW_RULER));
overlayKeys.add(
new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, ContentAssistPreference.AUTOACTIVATION));
overlayKeys.add(
new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, ContentAssistPreference.AUTOACTIVATION_DELAY));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ExtendedTextEditorPreferenceConstants.EDITOR_LINE_NUMBER_RULER_COLOR));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, ExtendedTextEditorPreferenceConstants.EDITOR_LINE_NUMBER_RULER));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, ExtendedTextEditorPreferenceConstants.EDITOR_OVERVIEW_RULER));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, ContentAssistPreference.AUTOACTIVATION));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, ContentAssistPreference.AUTOACTIVATION_DELAY));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, ContentAssistPreference.AUTOINSERT));
overlayKeys.add(
new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ContentAssistPreference.PROPOSALS_BACKGROUND));
overlayKeys.add(
new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ContentAssistPreference.PROPOSALS_FOREGROUND));
overlayKeys.add(
new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ContentAssistPreference.PARAMETERS_BACKGROUND));
overlayKeys.add(
new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ContentAssistPreference.PARAMETERS_FOREGROUND));
overlayKeys.add(
new OverlayPreferenceStore.OverlayKey(
OverlayPreferenceStore.STRING,
ContentAssistPreference.AUTOACTIVATION_TRIGGERS_C));
overlayKeys.add(
new OverlayPreferenceStore.OverlayKey(
OverlayPreferenceStore.BOOLEAN,
ContentAssistPreference.SHOW_DOCUMENTED_PROPOSALS));
overlayKeys.add(
new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, ContentAssistPreference.ORDER_PROPOSALS));
overlayKeys.add(
new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, ContentAssistPreference.CASE_SENSITIVITY));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ContentAssistPreference.PROPOSALS_BACKGROUND));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ContentAssistPreference.PROPOSALS_FOREGROUND));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ContentAssistPreference.PARAMETERS_BACKGROUND));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ContentAssistPreference.PARAMETERS_FOREGROUND));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ContentAssistPreference.AUTOACTIVATION_TRIGGERS_C));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, ContentAssistPreference.SHOW_DOCUMENTED_PROPOSALS));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, ContentAssistPreference.ORDER_PROPOSALS));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, ContentAssistPreference.CASE_SENSITIVITY));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, ContentAssistPreference.ADD_INCLUDE));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, ContentAssistPreference.PROJECT_SCOPE_SEARCH));
//new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ContentAssistPreference.PROPOSALS_FOREGROUND),
//new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ContentAssistPreference.PARAMETERS_BACKGROUND),
//new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ContentAssistPreference.PARAMETERS_FOREGROUND),
//new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ContentAssistPreference.AUTOACTIVATION_TRIGGERS_JAVADOC),
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, ContentAssistPreference.PROJECT_SCOPE_SEARCH));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, PreferenceConstants.EDITOR_TASK_TAG_COLOR));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_TASK_TAG_BOLD));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, PreferenceConstants.EDITOR_TASK_INDICATION_COLOR));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_TASK_INDICATION));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_TASK_INDICATION_IN_OVERVIEW_RULER));
OverlayPreferenceStore.OverlayKey[] keys = new OverlayPreferenceStore.OverlayKey[overlayKeys.size()];
OverlayPreferenceStore.OverlayKey[] keys = new OverlayPreferenceStore.OverlayKey[overlayKeys.size()];
overlayKeys.toArray(keys);
return new OverlayPreferenceStore(getPreferenceStore(), keys);
}
@ -287,12 +227,12 @@ public class CEditorPreferencePage extends PreferencePage implements IWorkbenchP
color = display.getSystemColor(SWT.COLOR_GRAY);
PreferenceConverter.setDefault(store, CEditor.MATCHING_BRACKETS_COLOR, color.getRGB());
store.setDefault(TextEditorPreferenceConstants.EDITOR_CURRENT_LINE, true);
PreferenceConverter.setDefault(store, TextEditorPreferenceConstants.EDITOR_CURRENT_LINE_COLOR, new RGB(225, 235, 224));
store.setDefault(ExtendedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE, true);
PreferenceConverter.setDefault(store, ExtendedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE_COLOR, new RGB(225, 235, 224));
store.setDefault(TextEditorPreferenceConstants.EDITOR_PRINT_MARGIN, true);
store.setDefault(TextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_COLUMN, 80);
PreferenceConverter.setDefault(store, TextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_COLOR, new RGB(176, 180, 185));
store.setDefault(ExtendedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN, true);
store.setDefault(ExtendedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_COLUMN, 80);
PreferenceConverter.setDefault(store, ExtendedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_COLOR, new RGB(176, 180, 185));
WorkbenchChainedTextFontFieldEditor.startPropagate(store, JFaceResources.TEXT_FONT);
@ -328,10 +268,10 @@ public class CEditorPreferencePage extends PreferencePage implements IWorkbenchP
PreferenceConverter.setDefault(store, CEditor.LINKED_POSITION_COLOR, new RGB(0, 200, 100));
store.setDefault(TextEditorPreferenceConstants.EDITOR_LINE_NUMBER_RULER, false);
PreferenceConverter.setDefault(store, TextEditorPreferenceConstants.EDITOR_LINE_NUMBER_RULER_COLOR, new RGB(0, 0, 0));
store.setDefault(ExtendedTextEditorPreferenceConstants.EDITOR_LINE_NUMBER_RULER, false);
PreferenceConverter.setDefault(store, ExtendedTextEditorPreferenceConstants.EDITOR_LINE_NUMBER_RULER_COLOR, new RGB(0, 0, 0));
store.setDefault(TextEditorPreferenceConstants.EDITOR_OVERVIEW_RULER, true);
store.setDefault(ExtendedTextEditorPreferenceConstants.EDITOR_OVERVIEW_RULER, true);
store.setDefault(ContentAssistPreference.AUTOACTIVATION, false);
store.setDefault(ContentAssistPreference.AUTOACTIVATION_DELAY, 500);
@ -792,7 +732,7 @@ public class CEditorPreferencePage extends PreferencePage implements IWorkbenchP
addTextField(behaviorComposite, label, CSourceViewerConfiguration.PREFERENCE_TAB_WIDTH, 2, 0, true);
label = "Print margin col&umn:";
addTextField(behaviorComposite, label, TextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_COLUMN, 4, 0, true);
addTextField(behaviorComposite, label, ExtendedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_COLUMN, 4, 0, true);
label = "Insert &space for tabs";
addCheckBox(behaviorComposite, label, CEditor.SPACES_FOR_TABS, 0);
@ -801,16 +741,16 @@ public class CEditorPreferencePage extends PreferencePage implements IWorkbenchP
fBracketHighlightButton = addCheckBox(behaviorComposite, label, CEditor.MATCHING_BRACKETS, 0);
label = "Show line numbers"; //$NON-NLS-1$
addCheckBox(behaviorComposite, label, TextEditorPreferenceConstants.EDITOR_LINE_NUMBER_RULER, 0);
addCheckBox(behaviorComposite, label, ExtendedTextEditorPreferenceConstants.EDITOR_LINE_NUMBER_RULER, 0);
label = "Highlight &current line";
fLineHighlightButton = addCheckBox(behaviorComposite, label, TextEditorPreferenceConstants.EDITOR_CURRENT_LINE, 0);
fLineHighlightButton = addCheckBox(behaviorComposite, label, ExtendedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE, 0);
label = "Show overview ruler"; //$NON-NLS-1$
addCheckBox(behaviorComposite, label, TextEditorPreferenceConstants.EDITOR_OVERVIEW_RULER, 0);
addCheckBox(behaviorComposite, label, ExtendedTextEditorPreferenceConstants.EDITOR_OVERVIEW_RULER, 0);
label = "Show print &margin";
addCheckBox(behaviorComposite, label, TextEditorPreferenceConstants.EDITOR_PRINT_MARGIN, 0);
addCheckBox(behaviorComposite, label, ExtendedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN, 0);
Label l = new Label(behaviorComposite, SWT.LEFT);
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
@ -899,8 +839,8 @@ public class CEditorPreferencePage extends PreferencePage implements IWorkbenchP
//label= "Show only proposals visible in the invocation conte&xt";
//addCheckBox(contentAssistComposite, label, ContentAssistPreference.SHOW_VISIBLE_PROPOSALS, 0);
//label= "Show only proposals with &matching cases";
//addCheckBox(contentAssistComposite, label, ContentAssistPreference.CASE_SENSITIVITY, 0);
label= "Show only proposals with &matching cases";
addCheckBox(contentAssistComposite, label, ContentAssistPreference.CASE_SENSITIVITY, 0);
//label= "Present proposals in a&lphabetical order";
//addCheckBox(contentAssistComposite, label, ContentAssistPreference.ORDER_PROPOSALS, 0);

View file

@ -15,7 +15,7 @@ import org.eclipse.cdt.internal.ui.dialogs.StatusInfo;
import org.eclipse.cdt.internal.ui.editor.CEditor;
import org.eclipse.cdt.internal.ui.text.CSourceViewerConfiguration;
import org.eclipse.cdt.internal.ui.text.CTextTools;
import org.eclipse.cdt.internal.ui.text.ContentAssistPreference;
import org.eclipse.cdt.internal.ui.text.contentassist.ContentAssistPreference;
import org.eclipse.cdt.internal.ui.text.template.TemplateVariableProcessor;
import org.eclipse.cdt.internal.ui.util.SWTUtil;
import org.eclipse.cdt.ui.CUIPlugin;

View file

@ -9,6 +9,7 @@ import java.util.Vector;
import org.eclipse.cdt.internal.ui.editor.CEditor;
import org.eclipse.cdt.internal.ui.editor.CEditorTextHoverDispatcher;
import org.eclipse.cdt.internal.ui.text.contentassist.*;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.ICDTConstants;
import org.eclipse.core.runtime.CoreException;

View file

@ -1,4 +1,4 @@
package org.eclipse.cdt.internal.ui.text;
package org.eclipse.cdt.internal.ui.text.contentassist;
/*
* (c) Copyright IBM Corp. 2000, 2001.
@ -26,7 +26,6 @@ import org.eclipse.cdt.core.search.BasicSearchResultCollector;
import org.eclipse.cdt.core.search.ICSearchConstants;
import org.eclipse.cdt.core.search.ICSearchScope;
import org.eclipse.cdt.core.search.SearchEngine;
import org.eclipse.cdt.internal.core.contentassist.CompletionEngine;
import org.eclipse.cdt.internal.core.model.CElement;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.cdt.internal.core.search.matching.OrPattern;
@ -36,6 +35,8 @@ import org.eclipse.cdt.internal.corext.template.ContextTypeRegistry;
import org.eclipse.cdt.internal.ui.CCompletionContributorManager;
import org.eclipse.cdt.internal.ui.CPluginImages;
import org.eclipse.cdt.internal.ui.editor.CEditor;
import org.eclipse.cdt.internal.ui.text.CParameterListValidator;
import org.eclipse.cdt.internal.ui.text.CWordFinder;
import org.eclipse.cdt.internal.ui.text.template.TemplateEngine;
import org.eclipse.cdt.ui.CSearchResultLabelProvider;
import org.eclipse.cdt.ui.CUIPlugin;
@ -56,7 +57,6 @@ import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
import org.eclipse.jface.text.contentassist.IContextInformation;
import org.eclipse.jface.text.contentassist.IContextInformationValidator;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.ui.IEditorPart;
@ -472,7 +472,10 @@ public class CCompletionProcessor implements IContentAssistProcessor {
// TODO: change that to resource scope later
if (currentScope == null)
return;
// clear the completion list at the result collector
resultCollector.clearCompletions();
IPreferenceStore store = CUIPlugin.getDefault().getPreferenceStore();
boolean projectScope = store.getBoolean(ContentAssistPreference.PROJECT_SCOPE_SEARCH);
ICSearchScope scope = null;
@ -557,8 +560,41 @@ public class CCompletionProcessor implements IContentAssistProcessor {
BasicSearchMatch match = (BasicSearchMatch)i.next();
int type = match.getElementType();
switch (type){
case ICElement.C_FIELD:
int relevance = completionEngine.computeRelevance(type, frag, match.getName());
if(relevance > 0){
switch (type){
case ICElement.C_FIELD:
switch (match.getVisibility()){
case ICElement.CPP_PUBLIC:
visibility = ASTAccessVisibility.PUBLIC;
break;
case ICElement.CPP_PROTECTED:
visibility = ASTAccessVisibility.PROTECTED;
break;
default:
visibility = ASTAccessVisibility.PRIVATE;
break;
};
resultCollector.acceptField(
match.getName(),
null,
visibility,
completionStart,
completionLength,
relevance);
break;
case ICElement.C_VARIABLE:
case ICElement.C_VARIABLE_DECLARATION:
resultCollector.acceptVariable(
match.getName(),
null,
completionStart,
completionLength,
relevance);
break;
case ICElement.C_METHOD:
case ICElement.C_METHOD_DECLARATION:
switch (match.getVisibility()){
case ICElement.CPP_PUBLIC:
visibility = ASTAccessVisibility.PUBLIC;
@ -570,109 +606,79 @@ public class CCompletionProcessor implements IContentAssistProcessor {
visibility = ASTAccessVisibility.PRIVATE;
break;
};
resultCollector.acceptField(
resultCollector.acceptMethod(
match.getName(),
null,
null,
match.getReturnType(),
visibility,
completionStart,
completionLength,
completionEngine.computeTypeRelevance(type));
break;
case ICElement.C_VARIABLE:
case ICElement.C_VARIABLE_DECLARATION:
resultCollector.acceptVariable(
completionEngine.computeRelevance(type, prefix, match.getName()));
break;
case ICElement.C_FUNCTION:
case ICElement.C_FUNCTION_DECLARATION:
resultCollector.acceptFunction(
match.getName(),
null,
null,
match.getReturnType(),
completionStart,
completionLength,
completionEngine.computeTypeRelevance(type));
break;
case ICElement.C_METHOD:
case ICElement.C_METHOD_DECLARATION:
switch (match.getVisibility()){
case ICElement.CPP_PUBLIC:
visibility = ASTAccessVisibility.PUBLIC;
completionEngine.computeRelevance(type, prefix, match.getName()));
break;
case ICElement.CPP_PROTECTED:
visibility = ASTAccessVisibility.PROTECTED;
case ICElement.C_CLASS:
resultCollector.acceptClass(
match.getName(),
completionStart,
completionLength,
completionEngine.computeRelevance(type, prefix, match.getName()));
break;
default:
visibility = ASTAccessVisibility.PRIVATE;
case ICElement.C_STRUCT:
resultCollector.acceptStruct(
match.getName(),
completionStart,
completionLength,
completionEngine.computeRelevance(type, prefix, match.getName()));
break;
};
resultCollector.acceptMethod(
match.getName(),
null,
match.getReturnType(),
visibility,
completionStart,
completionLength,
completionEngine.computeTypeRelevance(type));
break;
case ICElement.C_FUNCTION:
case ICElement.C_FUNCTION_DECLARATION:
resultCollector.acceptFunction(
match.getName(),
null,
match.getReturnType(),
completionStart,
completionLength,
completionEngine.computeTypeRelevance(type));
break;
case ICElement.C_CLASS:
resultCollector.acceptClass(
match.getName(),
completionStart,
completionLength,
completionEngine.computeTypeRelevance(type));
break;
case ICElement.C_STRUCT:
resultCollector.acceptStruct(
match.getName(),
completionStart,
completionLength,
completionEngine.computeTypeRelevance(type));
break;
case ICElement.C_UNION:
resultCollector.acceptUnion(
match.getName(),
completionStart,
completionLength,
completionEngine.computeTypeRelevance(type));
break;
case ICElement.C_NAMESPACE:
resultCollector.acceptNamespace(
match.getName(),
completionStart,
completionLength,
completionEngine.computeTypeRelevance(type));
break;
case ICElement.C_MACRO:
resultCollector.acceptMacro(
match.getName(),
completionStart,
completionLength,
completionEngine.computeTypeRelevance(type));
break;
case ICElement.C_ENUMERATION:
resultCollector.acceptEnumeration(
match.getName(),
completionStart,
completionLength,
completionEngine.computeTypeRelevance(type));
break;
case ICElement.C_ENUMERATOR:
resultCollector.acceptEnumerator(
match.getName(),
completionStart,
completionLength,
completionEngine.computeTypeRelevance(type));
break;
default :
break;
}
}
case ICElement.C_UNION:
resultCollector.acceptUnion(
match.getName(),
completionStart,
completionLength,
completionEngine.computeRelevance(type, prefix, match.getName()));
break;
case ICElement.C_NAMESPACE:
resultCollector.acceptNamespace(
match.getName(),
completionStart,
completionLength,
completionEngine.computeRelevance(type, prefix, match.getName()));
break;
case ICElement.C_MACRO:
resultCollector.acceptMacro(
match.getName(),
completionStart,
completionLength,
completionEngine.computeRelevance(type, prefix, match.getName()));
break;
case ICElement.C_ENUMERATION:
resultCollector.acceptEnumeration(
match.getName(),
completionStart,
completionLength,
completionEngine.computeRelevance(type, prefix, match.getName()));
break;
case ICElement.C_ENUMERATOR:
resultCollector.acceptEnumerator(
match.getName(),
completionStart,
completionLength,
completionEngine.computeRelevance(type, prefix, match.getName()));
break;
default :
break;
} // end switch
} // end if relevance
} // end while
completions.addAll(resultCollector.getCompletions());
}

View file

@ -1,4 +1,4 @@
package org.eclipse.cdt.internal.ui.text;
package org.eclipse.cdt.internal.ui.text.contentassist;
/*
* (c) Copyright QNX Software Systems Ltd. 2002.

View file

@ -1,4 +1,4 @@
package org.eclipse.cdt.internal.ui.text;
package org.eclipse.cdt.internal.ui.text.contentassist;
/*
* (c) Copyright QNX Software Systems Ltd. 2002.

View file

@ -0,0 +1,530 @@
/**********************************************************************
* Copyright (c) 2002,2003 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;
import java.io.CharArrayReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICompletionRequestor;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.parser.IParser;
import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.core.parser.IScannerInfoProvider;
import org.eclipse.cdt.core.parser.ParserFactory;
import org.eclipse.cdt.core.parser.ParserFactoryException;
import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.ParserMode;
import org.eclipse.cdt.core.parser.ParserUtil;
import org.eclipse.cdt.core.parser.ScannerInfo;
import org.eclipse.cdt.core.parser.ast.ASTClassKind;
import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTCompletionNode;
import org.eclipse.cdt.core.parser.ast.IASTEnumerationSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTEnumerator;
import org.eclipse.cdt.core.parser.ast.IASTField;
import org.eclipse.cdt.core.parser.ast.IASTFunction;
import org.eclipse.cdt.core.parser.ast.IASTMacro;
import org.eclipse.cdt.core.parser.ast.IASTMethod;
import org.eclipse.cdt.core.parser.ast.IASTNamespaceDefinition;
import org.eclipse.cdt.core.parser.ast.IASTNode;
import org.eclipse.cdt.core.parser.ast.IASTVariable;
import org.eclipse.cdt.core.parser.ast.IASTNode.LookupResult;
import org.eclipse.cdt.internal.core.CharOperation;
import org.eclipse.cdt.internal.core.model.IWorkingCopy;
import org.eclipse.cdt.internal.core.parser.util.ASTUtil;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.preference.IPreferenceStore;
/**
* @author hamer
*
* This class is the entry point for code completions.
* It contains a public API used to call ContentAssist on a given working copy
* and a given completion offset.
*
*/
public class CompletionEngine implements RelevanceConstants{
List completions = new ArrayList();
ICompletionRequestor requestor;
int completionStart = 0;
int completionLength = 0;
IPreferenceStore store = CUIPlugin.getDefault().getPreferenceStore();
// keywords types
public static final int BASIC_TYPES_KEYWORDS = 0;
private static final String basicTypesKeywords[] = {
"namespace",
"class",
"struct",
"union",
"enum",
"bool",
"char",
"wchar_t",
"int",
"float",
"double",
"void",
"template",
};
private static final String exceptionKeyword = "...";
public CompletionEngine(ICompletionRequestor completionRequestor){
completions.clear();
requestor = completionRequestor;
}
private int computeCaseMatchingRelevance(String prefix, String proposalName){
if (CharOperation.prefixEquals(prefix.toCharArray(), proposalName.toCharArray(), true /* do not ignore case */)) {
if(CharOperation.equals(prefix.toCharArray(), proposalName.toCharArray(), true /* do not ignore case */)) {
return CASE_MATCH_RELEVANCE + EXACT_NAME_MATCH_RELEVANCE;
} else {
return CASE_MATCH_RELEVANCE;
}
} else {
boolean matchCase = store.getBoolean(ContentAssistPreference.CASE_SENSITIVITY);
if(matchCase)
return CASE_NOT_VALID_RELEVANCE;
else
return 0;
}
}
private int computeTypeRelevance(int type){
switch (type){
case ICElement.C_FIELD:
return FIELD_TYPE_RELEVANCE;
case ICElement.C_VARIABLE:
case ICElement.C_VARIABLE_DECLARATION:
return VARIABLE_TYPE_RELEVANCE;
case ICElement.C_METHOD:
case ICElement.C_METHOD_DECLARATION:
return METHOD_TYPE_RELEVANCE;
case ICElement.C_FUNCTION:
case ICElement.C_FUNCTION_DECLARATION:
return FUNCTION_TYPE_RELEVANCE;
case ICElement.C_CLASS:
return CLASS_TYPE_RELEVANCE;
case ICElement.C_STRUCT:
return STRUCT_TYPE_RELEVANCE;
case ICElement.C_UNION:
return UNION_TYPE_RELEVANCE;
case ICElement.C_NAMESPACE:
return NAMESPACE_TYPE_RELEVANCE;
case ICElement.C_MACRO:
return MACRO_TYPE_RELEVANCE;
case ICElement.C_ENUMERATION:
return ENUMERATION_TYPE_RELEVANCE;
case ICElement.C_ENUMERATOR:
return ENUMERATOR_TYPE_RELEVANCE;
default :
return DEFAULT_TYPE_RELEVANCE;
}
}
public int computeRelevance(int elementType, String prefix, String proposalName){
// compute the relevance according to the elemnent type
int relevance = computeTypeRelevance(elementType);
// compute the relevance according to the case sensitivity
relevance += computeCaseMatchingRelevance(prefix, proposalName);
return relevance;
}
private IASTCompletionNode parse(IWorkingCopy sourceUnit, int completionOffset){
ContentAssistElementRequestor requestor = new ContentAssistElementRequestor();
// Get resource info
IResource currentResource = sourceUnit.getResource();
IPath realPath = currentResource.getLocation();
IProject project = currentResource.getProject();
Reader reader = new CharArrayReader( sourceUnit.getContents() );
//Get the scanner info
IScannerInfo scanInfo = new ScannerInfo();
IScannerInfoProvider provider = CCorePlugin.getDefault().getScannerInfoProvider(project);
if (provider != null){
IScannerInfo buildScanInfo = provider.getScannerInformation(project);
if( buildScanInfo != null )
scanInfo = new ScannerInfo(buildScanInfo.getDefinedSymbols(), buildScanInfo.getIncludePaths());
}
//C or CPP?
ParserLanguage language = CoreModel.getDefault().hasCCNature(project) ? ParserLanguage.CPP : ParserLanguage.C;
IParser parser = null;
try
{
IScanner scanner = ParserFactory.createScanner( reader, realPath.toOSString(), scanInfo, ParserMode.COMPLETE_PARSE, language, requestor, ParserUtil.getParserLogService() );
parser = ParserFactory.createParser( scanner, requestor, ParserMode.COMPLETE_PARSE, language, ParserUtil.getParserLogService() );
}
catch( ParserFactoryException pfe )
{
}
if(parser != null){
IASTCompletionNode result = parser.parse(completionOffset);
return result;
} else {
return null;
}
}
private void addNodeToCompletions(IASTNode node, String prefix){
if(node instanceof IASTField){
IASTField field = (IASTField)node;
int relevance = computeRelevance(ICElement.C_FIELD, prefix, field.getName());
if(relevance >= 0){
requestor.acceptField(field.getName(),
ASTUtil.getType(field.getAbstractDeclaration()),
field.getVisiblity(), completionStart, completionLength, relevance);
}
}
else if(node instanceof IASTVariable){
IASTVariable variable = (IASTVariable)node;
int relevance = computeRelevance(ICElement.C_VARIABLE, prefix, variable.getName());
if(relevance >= 0){
requestor.acceptVariable(variable.getName(),
ASTUtil.getType(variable.getAbstractDeclaration()),
completionStart, completionLength, relevance);
}
}
else if(node instanceof IASTMethod) {
IASTMethod method = (IASTMethod)node;
int relevance = computeRelevance(ICElement.C_METHOD, prefix, method.getName());
if(relevance >= 0){
String parameterString = ASTUtil.getParametersString(ASTUtil.getFunctionParameterTypes(method));
requestor.acceptMethod(method.getName(),
ASTUtil.getType(method.getReturnType()), parameterString,
method.getVisiblity(), completionStart, completionLength, relevance);
}
}
else if(node instanceof IASTFunction){
IASTFunction function = (IASTFunction)node;
int relevance = computeRelevance(ICElement.C_FUNCTION, prefix, function.getName());
if(relevance >= 0){
String parameterString = ASTUtil.getParametersString(ASTUtil.getFunctionParameterTypes(function));
requestor.acceptFunction(function.getName(),
ASTUtil.getType(function.getReturnType()), parameterString,
completionStart, completionLength, relevance);
}
}
else if(node instanceof IASTClassSpecifier){
IASTClassSpecifier classSpecifier = (IASTClassSpecifier)node;
ASTClassKind classkind = classSpecifier.getClassKind();
if(classkind == ASTClassKind.CLASS){
int relevance = computeRelevance(ICElement.C_CLASS, prefix, classSpecifier.getName());
if(relevance >= 0){
requestor.acceptClass(classSpecifier.getName(),
completionStart, completionLength, relevance);
}
}
if(classkind == ASTClassKind.STRUCT){
int relevance = computeRelevance(ICElement.C_STRUCT, prefix, classSpecifier.getName());
if(relevance >= 0){
requestor.acceptStruct(classSpecifier.getName(),
completionStart, completionLength, relevance);
}
}
if(classkind == ASTClassKind.UNION){
int relevance = computeRelevance(ICElement.C_UNION, prefix, classSpecifier.getName());
if(relevance >= 0){
requestor.acceptUnion(classSpecifier.getName(),
completionStart, completionLength, relevance);
}
}
}
else if(node instanceof IASTMacro){
IASTMacro macro = (IASTMacro)node;
int relevance = computeRelevance(ICElement.C_MACRO, prefix, macro.getName());
if(relevance >= 0){
requestor.acceptMacro(macro.getName(), completionStart, completionLength, relevance);
}
}
else if(node instanceof IASTNamespaceDefinition){
IASTNamespaceDefinition namespace = (IASTNamespaceDefinition)node;
int relevance = computeRelevance(ICElement.C_NAMESPACE, prefix, namespace.getName());
if(relevance >= 0){
requestor.acceptNamespace(namespace.getName(), completionStart, completionLength, relevance);
}
}
else if(node instanceof IASTEnumerationSpecifier){
IASTEnumerationSpecifier enumeration = (IASTEnumerationSpecifier)node;
int relevance = computeRelevance(ICElement.C_ENUMERATION, prefix, enumeration.getName());
if(relevance >= 0){
requestor.acceptEnumeration(enumeration.getName(), completionStart, completionLength, relevance);
}
}
else if(node instanceof IASTEnumerator){
IASTEnumerator enumerator = (IASTEnumerator)node;
int relevance = computeRelevance(ICElement.C_ENUMERATOR, prefix, enumerator.getName());
if(relevance >= 0){
requestor.acceptEnumerator(enumerator.getName(), completionStart, completionLength, relevance);
}
}
}
private void addKeywordToCompletions (String keyword){
int relevance = KEYWORD_TYPE_RELEVANCE;
requestor.acceptKeyword(keyword, completionStart, completionLength, relevance);
}
private void addKeywordsToCompletions(Iterator keywords){
while (keywords.hasNext()){
String keyword = (String) keywords.next();
addKeywordToCompletions(keyword);
}
}
private void addToCompletions (LookupResult result){
Iterator nodes = result.getNodes();
while (nodes.hasNext()){
IASTNode node = (IASTNode) nodes.next();
addNodeToCompletions(node, result.getPrefix());
}
Iterator keywords = result.getKeywords();
addKeywordsToCompletions(keywords);
return ;
}
private List lookupKeyword(String prefix, int lookupType){
List result = new ArrayList();
switch (lookupType){
case BASIC_TYPES_KEYWORDS:
for(int i = 0; i <basicTypesKeywords.length; i++){
String kw =basicTypesKeywords[i];
if(kw.startsWith(prefix))
result.add(kw);
}
break;
}
return result;
}
private void completionOnMember(IASTCompletionNode completionNode){
// Completing after a dot
// 1. Get the search scope node
IASTNode searchNode = completionNode.getCompletionContext();
// 2. lookup fields & add to completion proposals
LookupResult result = searchNode.lookup (completionNode.getCompletionPrefix(), IASTNode.LookupKind.FIELDS);
addToCompletions (result);
// 3. looup methods & add to completion proposals
result = searchNode.lookup (completionNode.getCompletionPrefix(), IASTNode.LookupKind.METHODS);
addToCompletions (result);
// 4. lookup nested structures & add to completion proposals
result = searchNode.lookup (completionNode.getCompletionPrefix(), IASTNode.LookupKind.STRUCTURES);
addToCompletions (result);
}
private void completionOnType(IASTCompletionNode completionNode){
// completing on a type
// 1. Get the search scope node
IASTNode searchNode = completionNode.getCompletionContext();
// if the prefix is not empty
if(completionNode.getCompletionPrefix().length() > 0 ) {
// 2. Lookup all types that could be used here
LookupResult result = searchNode.lookup(completionNode.getCompletionPrefix(), IASTNode.LookupKind.STRUCTURES);
addToCompletions(result);
// 3. Lookup keywords
// basic types should be in the keyword list
List keywords = lookupKeyword(completionNode.getCompletionPrefix(), BASIC_TYPES_KEYWORDS);
addKeywordsToCompletions(keywords.iterator());
} else // prefix is empty, we can not look for everything
{
}
}
private void completionOnFieldType(IASTCompletionNode completionNode){
// 1. basic completion on all types
completionOnType(completionNode);
// 2. Get the search scope node
IASTNode searchNode = completionNode.getCompletionContext();
// 3. lookup methods
// we are at a field declaration place, the user could be trying to override a function.
// We have to lookup functions that could be overridden here.
LookupResult result = searchNode.lookup(completionNode.getCompletionPrefix(), IASTNode.LookupKind.METHODS);
addToCompletions(result);
}
private void completionOnVariableType(IASTCompletionNode completionNode){
// 1. basic completion on all types
completionOnType(completionNode);
}
private void completionOnMethodReturnType(IASTCompletionNode completionNode){
// 1. basic completion on all types
completionOnType(completionNode);
}
private void completionOnFunctionReturnType(IASTCompletionNode completionNode){
// 1. basic completion on all types
completionOnType(completionNode);
}
private void completionOnSingleNameReference(IASTCompletionNode completionNode){
// 1. Get the search scope node
// the search node is the code scope inwhich completion is requested
IASTNode searchNode = completionNode.getCompletionContext();
// if prefix is not empty
if (completionNode.getCompletionPrefix().length() > 0){
// here we have to look for anything that could be referenced within this scope
// 1. lookup local variables, global variables, functions, methods, structures, enums, macros, and namespaces
LookupResult result = searchNode.lookup(completionNode.getCompletionPrefix(), IASTNode.LookupKind.ALL);
addToCompletions(result);
} else // prefix is empty
{
// 1. look only for local variables
LookupResult result = searchNode.lookup(completionNode.getCompletionPrefix(), IASTNode.LookupKind.LOCAL_VARIABLES);
addToCompletions(result);
// 2. and what can be accessed through the "this" pointer
// TODO : complete the lookup call
}
}
private void completionOnQualifiedNameReference(IASTCompletionNode completionNode){
// 1. Get the search scope node
// the search node is the name before the qualification
IASTNode searchNode = completionNode.getCompletionContext();
// here we have to look for anything that could be referenced within this scope
// 1. lookup local variables, global variables, functions, methods, structures, enums, macros, and namespaces
LookupResult result = searchNode.lookup(completionNode.getCompletionPrefix(), IASTNode.LookupKind.ALL);
addToCompletions(result);
}
private void completionOnStructureReference(IASTCompletionNode completionNode){
// 1. Get the search scope node
IASTNode searchNode = completionNode.getCompletionContext();
// only look for structures : classes, structs, and unions
LookupResult result = searchNode.lookup(completionNode.getCompletionPrefix(), IASTNode.LookupKind.STRUCTURES);
addToCompletions(result);
}
private void completionOnClassReference(IASTCompletionNode completionNode){
// 1. Get the search scope node
IASTNode searchNode = completionNode.getCompletionContext();
// only look for classes
LookupResult result = searchNode.lookup(completionNode.getCompletionPrefix(), IASTNode.LookupKind.CLASSES);
addToCompletions(result);
}
private void completionOnExceptionReference(IASTCompletionNode completionNode){
// here we have to look for all types
completionOnType(completionNode);
// plus if the prefix is empty, add "..." to the proposals
if(completionNode.getCompletionPrefix().length() == 0){
addKeywordToCompletions(exceptionKeyword);
}
}
private void completionOnMacroReference(IASTCompletionNode completionNode){
// 1. Get the search scope node
IASTNode searchNode = completionNode.getCompletionContext();
// only look for macros
LookupResult result = searchNode.lookup(completionNode.getCompletionPrefix(), IASTNode.LookupKind.MACROS);
addToCompletions(result);
}
private void completionOnMessageSend(IASTCompletionNode completionNode){
// TODO: complete the lookups
}
private void completionOnQualifiedAllocationExpression(IASTCompletionNode completionNode){
// 1. Get the search scope node
IASTNode searchNode = completionNode.getCompletionContext();
// only lookup constructors
LookupResult result = searchNode.lookup(completionNode.getCompletionPrefix(), IASTNode.LookupKind.CONSTRUCTORS);
}
private void completionOnKeyword(IASTCompletionNode completionNode){
// lookup every type of keywords
// 1. basic types keword list
List result = lookupKeyword(completionNode.getCompletionPrefix(), BASIC_TYPES_KEYWORDS);
addKeywordsToCompletions(result.iterator());
}
public void complete(IWorkingCopy sourceUnit, int completionOffset, List completionList) {
// 1- Parse the translation unit
IASTCompletionNode completionNode = parse(sourceUnit, completionOffset);
if (completionNode == null)
return;
// set the completionStart and the completionLength
completionStart = completionOffset;
completionLength = completionNode.getCompletionPrefix().length();
// 2- Check the return value
if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.DOT_MEMBER){
// CompletionOnDotMember
completionOnMember(completionNode);
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.ARROW_MEMBER){
//CompletionOnArrowMember
completionOnMember(completionNode);
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.QUALIFIEDNAME_MEMBER){
//CompletionOnQualifiedNameMember
completionOnMember(completionNode);
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.FIELD_TYPE){
// CompletionOnFieldType
completionOnFieldType(completionNode);
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.VARIABLE_TYPE){
// CompletionOnVariableType
completionOnType(completionNode);
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.ARGUMENT_TYPE){
// CompletionOnArgumentType
completionOnVariableType(completionNode);
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.METHOD_RETURN_TYPE){
// CompletionOnMethodReturnType
completionOnMethodReturnType(completionNode);
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.FUNCTIOND_RETURN_TYPE){
// CompletionOnFunctionReturnType
completionOnFunctionReturnType(completionNode);
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.SINGLE_NAME_REFERENCE){
// CompletionOnSingleNameReference
completionOnSingleNameReference(completionNode);
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.QUALIFIED_NAME_REFERENCE){
// CompletionOnQualifiedNameReference
completionOnQualifiedNameReference(completionNode);
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.STRUCTURE_REFERENCE){
// CompletionOnStructureReference
completionOnStructureReference(completionNode);
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.CLASS_REFERENCE){
// CompletionOnClassReference
completionOnClassReference(completionNode);
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.EXCEPTION_REFERENCE){
// CompletionOnExceptionReference
completionOnExceptionReference(completionNode);
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.MACRO_REFERENCE){
// CompletionOnMacroReference
completionOnMacroReference(completionNode);
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.MESSAGE_SEND){
// CompletionOnMessageSend
completionOnMessageSend(completionNode);
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.QUALIFIED_ALLOCATION_EXPRESSION){
// CompletionOnQualifiedAllocationExpression
completionOnQualifiedAllocationExpression(completionNode);
}
else if(completionNode.getCompletionKind() == IASTCompletionNode.CompletionKind.KEYWORD){
// CompletionOnKeyword
completionOnKeyword(completionNode);
}
completionList.addAll(completions);
return;
}
}

View file

@ -8,7 +8,7 @@
* Contributors:
* IBM Rational Software - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.internal.core.contentassist;
package org.eclipse.cdt.internal.ui.text.contentassist;
import org.eclipse.cdt.core.ICompletionRequestor;
import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
@ -125,4 +125,16 @@ public class CompletionRequestorAdaptor implements ICompletionRequestor {
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.ICompletionRequestor#acceptKeyword(java.lang.String, int, int, int)
*/
public void acceptKeyword(
String name,
int completionStart,
int completionLength,
int relevance) {
// TODO Auto-generated method stub
}
}

View file

@ -4,7 +4,7 @@
* To change the template for this generated file go to
* Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
*/
package org.eclipse.cdt.internal.core.contentassist;
package org.eclipse.cdt.internal.ui.text.contentassist;
import org.eclipse.cdt.core.parser.NullSourceElementRequestor;

View file

@ -1,4 +1,4 @@
package org.eclipse.cdt.internal.ui.text;
package org.eclipse.cdt.internal.ui.text.contentassist;
/*
* (c) Copyright IBM Corp. 2000, 2001.
@ -8,6 +8,8 @@ package org.eclipse.cdt.internal.ui.text;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.cdt.internal.ui.text.CTextTools;
import org.eclipse.cdt.internal.ui.text.IColorManager;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceConverter;

View file

@ -0,0 +1,37 @@
/**********************************************************************
* Copyright (c) 2002,2003 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;
/**
* @author hamer
*
*/
public interface RelevanceConstants {
final int KEYWORD_TYPE_RELEVANCE = 13;
final int LOCAL_VARIABLE_TYPE_RELEVANCE = 12;
final int FIELD_TYPE_RELEVANCE = 11;
final int VARIABLE_TYPE_RELEVANCE = 10;
final int METHOD_TYPE_RELEVANCE = 9;
final int FUNCTION_TYPE_RELEVANCE = 8;
final int CLASS_TYPE_RELEVANCE = 7;
final int STRUCT_TYPE_RELEVANCE = 6;
final int UNION_TYPE_RELEVANCE = 5;
final int NAMESPACE_TYPE_RELEVANCE = 4;
final int MACRO_TYPE_RELEVANCE = 3;
final int ENUMERATION_TYPE_RELEVANCE = 2;
final int ENUMERATOR_TYPE_RELEVANCE = 1;
final int DEFAULT_TYPE_RELEVANCE = 0;
final int CASE_MATCH_RELEVANCE = 10;
final int EXACT_NAME_MATCH_RELEVANCE = 4;
final int CASE_NOT_VALID_RELEVANCE = -100;
}

View file

@ -8,13 +8,12 @@
* Contributors:
* IBM Rational Software - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.internal.ui.text;
package org.eclipse.cdt.internal.ui.text.contentassist;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
import org.eclipse.cdt.internal.core.contentassist.CompletionRequestorAdaptor;
import org.eclipse.cdt.internal.ui.CElementImageProvider;
import org.eclipse.cdt.internal.ui.util.ImageDescriptorRegistry;
import org.eclipse.cdt.ui.CUIPlugin;
@ -46,6 +45,9 @@ public class ResultCollector extends CompletionRequestorAdaptor {
public List getCompletions() {
return completions;
}
public void clearCompletions() {
completions.clear();
}
/*
* Create a proposal
*/
@ -420,4 +422,28 @@ public class ResultCollector extends CompletionRequestorAdaptor {
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.ICompletionRequestor#acceptKeyword(java.lang.String, int, int, int)
*/
public void acceptKeyword(
String name,
int completionStart,
int completionLength,
int relevance) {
String replaceString = "";
String displayString = "";
Image image = null;
StringBuffer infoString = new StringBuffer();
// fill the replace, display and info strings
replaceString = name;
displayString = name;
// no image for keywords
// create proposal and add it to completions list
ICompletionProposal proposal = createProposal(replaceString, displayString, infoString.toString(),
null, image, completionStart, completionLength, relevance);
completions.add(proposal);
}
}