From 307d4a1d40cc636575f903b2e54ef6cd5aeb077d Mon Sep 17 00:00:00 2001 From: Hoda Amer Date: Wed, 3 Dec 2003 20:29:29 +0000 Subject: [PATCH] Content Assist work --- .../tests/CompletionProposalsTest.java | 2 +- core/org.eclipse.cdt.core/ChangeLog | 3 + .../core/parser/ast/IASTCompletionNode.java | 6 +- .../eclipse/cdt/core/parser/ast/IASTNode.java | 8 +- .../cdt/core/ICompletionRequestor.java | 1 + .../core/contentassist/CompletionEngine.java | 245 -------- core/org.eclipse.cdt.ui/ChangeLog | 5 + .../cdt/internal/ui/editor/CEditor.java | 2 +- .../ui/preferences/CEditorPreferencePage.java | 160 ++---- .../ui/preferences/EditTemplateDialog.java | 2 +- .../ui/text/CSourceViewerConfiguration.java | 1 + .../CCompletionProcessor.java | 204 +++---- .../CCompletionProposal.java | 2 +- .../CCompletionProposalComparator.java | 2 +- .../text/contentassist/CompletionEngine.java | 530 ++++++++++++++++++ .../CompletionRequestorAdaptor.java | 14 +- .../ContentAssistElementRequestor.java | 2 +- .../ContentAssistPreference.java | 4 +- .../contentassist/RelevanceConstants.java | 37 ++ .../{ => contentassist}/ResultCollector.java | 30 +- 20 files changed, 791 insertions(+), 469 deletions(-) delete mode 100644 core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/contentassist/CompletionEngine.java rename core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/{ => contentassist}/CCompletionProcessor.java (85%) rename core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/{ => contentassist}/CCompletionProposal.java (99%) rename core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/{ => contentassist}/CCompletionProposalComparator.java (94%) create mode 100644 core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CompletionEngine.java rename core/{org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core => org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text}/contentassist/CompletionRequestorAdaptor.java (92%) rename core/{org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core => org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text}/contentassist/ContentAssistElementRequestor.java (88%) rename core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/{ => contentassist}/ContentAssistPreference.java (97%) create mode 100644 core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/RelevanceConstants.java rename core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/{ => contentassist}/ResultCollector.java (94%) diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/codeassist/tests/CompletionProposalsTest.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/codeassist/tests/CompletionProposalsTest.java index 365e04d6d2e..92d1516c30d 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/codeassist/tests/CompletionProposalsTest.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/codeassist/tests/CompletionProposalsTest.java @@ -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; diff --git a/core/org.eclipse.cdt.core/ChangeLog b/core/org.eclipse.cdt.core/ChangeLog index 1e4209a6bfd..44f19aac147 100644 --- a/core/org.eclipse.cdt.core/ChangeLog +++ b/core/org.eclipse.cdt.core/ChangeLog @@ -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. diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTCompletionNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTCompletionNode.java index 999c86962e5..a9c7d696b64 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTCompletionNode.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTCompletionNode.java @@ -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(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTNode.java index 4379a781c33..329a680557c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTNode.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTNode.java @@ -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 */ diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ICompletionRequestor.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ICompletionRequestor.java index 9421b470906..8c28c9a0aaa 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ICompletionRequestor.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ICompletionRequestor.java @@ -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); } diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/contentassist/CompletionEngine.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/contentassist/CompletionEngine.java deleted file mode 100644 index 9227ee6a124..00000000000 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/contentassist/CompletionEngine.java +++ /dev/null @@ -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; - - } - -} \ No newline at end of file diff --git a/core/org.eclipse.cdt.ui/ChangeLog b/core/org.eclipse.cdt.ui/ChangeLog index 22e104ea079..a225059cdea 100644 --- a/core/org.eclipse.cdt.ui/ChangeLog +++ b/core/org.eclipse.cdt.ui/ChangeLog @@ -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 diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java index 0417b9b92f3..87bc8a1760f 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java @@ -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; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CEditorPreferencePage.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CEditorPreferencePage.java index 2e2644ab268..d9e9ed54413 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CEditorPreferencePage.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CEditorPreferencePage.java @@ -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 ¤t 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); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/EditTemplateDialog.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/EditTemplateDialog.java index d15643ea5f3..f03b353fc46 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/EditTemplateDialog.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/EditTemplateDialog.java @@ -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; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java index 268ee31a347..d14712aec04 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java @@ -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; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CCompletionProcessor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CCompletionProcessor.java similarity index 85% rename from core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CCompletionProcessor.java rename to core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CCompletionProcessor.java index 670c39740ca..39770343c15 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CCompletionProcessor.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CCompletionProcessor.java @@ -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()); } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CCompletionProposal.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CCompletionProposal.java similarity index 99% rename from core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CCompletionProposal.java rename to core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CCompletionProposal.java index 0487aa1444d..5ba4cc9c2bb 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CCompletionProposal.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CCompletionProposal.java @@ -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. diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CCompletionProposalComparator.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CCompletionProposalComparator.java similarity index 94% rename from core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CCompletionProposalComparator.java rename to core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CCompletionProposalComparator.java index fbc039195fc..fc316b47308 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CCompletionProposalComparator.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CCompletionProposalComparator.java @@ -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. diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CompletionEngine.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CompletionEngine.java new file mode 100644 index 00000000000..4a696f1a3d7 --- /dev/null +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CompletionEngine.java @@ -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 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; + + } + +} diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/contentassist/CompletionRequestorAdaptor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CompletionRequestorAdaptor.java similarity index 92% rename from core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/contentassist/CompletionRequestorAdaptor.java rename to core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CompletionRequestorAdaptor.java index a4261b6321c..656e5add17f 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/contentassist/CompletionRequestorAdaptor.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CompletionRequestorAdaptor.java @@ -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 + + } + } diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/contentassist/ContentAssistElementRequestor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/ContentAssistElementRequestor.java similarity index 88% rename from core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/contentassist/ContentAssistElementRequestor.java rename to core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/ContentAssistElementRequestor.java index fcd469f07f9..6196bbb6220 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/contentassist/ContentAssistElementRequestor.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/ContentAssistElementRequestor.java @@ -4,7 +4,7 @@ * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>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; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/ContentAssistPreference.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/ContentAssistPreference.java similarity index 97% rename from core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/ContentAssistPreference.java rename to core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/ContentAssistPreference.java index 21413ab7684..c2e28f84c4c 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/ContentAssistPreference.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/ContentAssistPreference.java @@ -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; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/RelevanceConstants.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/RelevanceConstants.java new file mode 100644 index 00000000000..d7cd38eddfd --- /dev/null +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/RelevanceConstants.java @@ -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; + +} diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/ResultCollector.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/ResultCollector.java similarity index 94% rename from core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/ResultCollector.java rename to core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/ResultCollector.java index de9023bae43..773cf412d96 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/ResultCollector.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/ResultCollector.java @@ -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); + } + }