From f3ee65691f4fcf26b1b778dc517b287e1baf52dc Mon Sep 17 00:00:00 2001 From: Mike Kucera Date: Wed, 30 Apr 2008 15:16:41 +0000 Subject: [PATCH] bug 229482, keyword completion proposals based on ILanguage --- .../dom/parser/AbstractCLikeLanguage.java | 48 +++--- .../eclipse/cdt/core/parser/Directives.java | 32 ++-- .../core/parser/token/KeywordSets.java | 4 +- .../KeywordCompletionProposalComputer.java | 137 ++++-------------- 4 files changed, 79 insertions(+), 142 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/AbstractCLikeLanguage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/AbstractCLikeLanguage.java index ea03d1967e2..5b759eabd42 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/AbstractCLikeLanguage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/AbstractCLikeLanguage.java @@ -225,36 +225,50 @@ public abstract class AbstractCLikeLanguage extends AbstractLanguage implements } + private String[] keywords = null; + private String[] builtinTypes = null; + private String[] preprocessorKeywords = null; + + public String[] getKeywords() { - Set keywords = new HashSet(KeywordSets.getKeywords(KeywordSetKey.KEYWORDS, getParserLanguage())); - - CharArrayIntMap additionalKeywords = getScannerExtensionConfiguration().getAdditionalKeywords(); - if (additionalKeywords != null) { - for (Iterator iterator = additionalKeywords.toList().iterator(); iterator.hasNext(); ) { - char[] name = iterator.next(); - keywords.add(new String(name)); + if(keywords == null) { + Set keywordSet = new HashSet(KeywordSets.getKeywords(KeywordSetKey.KEYWORDS, getParserLanguage())); + + CharArrayIntMap additionalKeywords = getScannerExtensionConfiguration().getAdditionalKeywords(); + if (additionalKeywords != null) { + for (Iterator iterator = additionalKeywords.toList().iterator(); iterator.hasNext(); ) { + char[] name = iterator.next(); + keywordSet.add(new String(name)); + } } + keywords = keywordSet.toArray(new String[keywordSet.size()]); } - return keywords.toArray(new String[keywords.size()]); + return keywords; } public String[] getBuiltinTypes() { - Set types = KeywordSets.getKeywords(KeywordSetKey.TYPES, getParserLanguage()); - return types.toArray(new String[types.size()]); + if(builtinTypes == null) { + Set types = KeywordSets.getKeywords(KeywordSetKey.TYPES, getParserLanguage()); + builtinTypes = types.toArray(new String[types.size()]); + } + return builtinTypes; } public String[] getPreprocessorKeywords() { - Set keywords = new HashSet(KeywordSets.getKeywords(KeywordSetKey.PP_DIRECTIVE, getParserLanguage())); - CharArrayIntMap additionalKeywords= getScannerExtensionConfiguration().getAdditionalPreprocessorKeywords(); - if (additionalKeywords != null) { - for (Iterator iterator = additionalKeywords.toList().iterator(); iterator.hasNext(); ) { - char[] name = iterator.next(); - keywords.add(new String(name)); + if(preprocessorKeywords == null) { + Set keywords = new HashSet(KeywordSets.getKeywords(KeywordSetKey.PP_DIRECTIVE, getParserLanguage())); + CharArrayIntMap additionalKeywords= getScannerExtensionConfiguration().getAdditionalPreprocessorKeywords(); + if (additionalKeywords != null) { + for (Iterator iterator = additionalKeywords.toList().iterator(); iterator.hasNext(); ) { + char[] name = iterator.next(); + keywords.add(new String(name)); + } } + preprocessorKeywords = keywords.toArray(new String[keywords.size()]); } - return keywords.toArray(new String[keywords.size()]); + return preprocessorKeywords; } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/Directives.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/Directives.java index ba7251814cb..15d1fc13dc1 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/Directives.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/Directives.java @@ -13,21 +13,25 @@ package org.eclipse.cdt.core.parser; /** * @author jcamelon */ + +@SuppressWarnings("nls") public class Directives { - public static final String POUND_DEFINE = "#define"; //$NON-NLS-1$ - public static final String POUND_UNDEF = "#undef"; //$NON-NLS-1$ - public static final String POUND_IF = "#if"; //$NON-NLS-1$ - public static final String POUND_IFDEF = "#ifdef"; //$NON-NLS-1$ - public static final String POUND_IFNDEF = "#ifndef"; //$NON-NLS-1$ - public static final String POUND_ELSE = "#else"; //$NON-NLS-1$ - public static final String POUND_ENDIF = "#endif"; //$NON-NLS-1$ - public static final String POUND_INCLUDE = "#include"; //$NON-NLS-1$ - public static final String POUND_LINE = "#line"; //$NON-NLS-1$ - public static final String POUND_ERROR = "#error"; //$NON-NLS-1$ - public static final String POUND_PRAGMA = "#pragma"; //$NON-NLS-1$ - public static final String POUND_ELIF = "#elif"; //$NON-NLS-1$ - public static final String POUND_BLANK = "#"; //$NON-NLS-1$ - public static final String _PRAGMA = "_Pragma"; //$NON-NLS-1$ + public static final String + POUND_DEFINE = "#define", + POUND_UNDEF = "#undef", + POUND_IF = "#if", + POUND_IFDEF = "#ifdef", + POUND_IFNDEF = "#ifndef", + POUND_ELSE = "#else", + POUND_ENDIF = "#endif", + POUND_INCLUDE = "#include", + POUND_LINE = "#line", + POUND_ERROR = "#error", + POUND_PRAGMA = "#pragma", + POUND_ELIF = "#elif", + POUND_BLANK = "#", + _PRAGMA = "_Pragma", + DEFINED = "defined"; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/KeywordSets.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/KeywordSets.java index e471ac4c739..62b0fd1b337 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/KeywordSets.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/KeywordSets.java @@ -327,7 +327,8 @@ public class KeywordSets { PP_DIRECTIVES_C.add(Directives.POUND_ERROR); PP_DIRECTIVES_C.add(Directives.POUND_PRAGMA); PP_DIRECTIVES_C.add(Directives.POUND_ELIF); - PP_DIRECTIVES_C.add(Directives._PRAGMA ); + PP_DIRECTIVES_C.add(Directives._PRAGMA); + PP_DIRECTIVES_C.add(Directives.DEFINED); } @@ -348,6 +349,7 @@ public class KeywordSets { PP_DIRECTIVES_CPP.add(Directives.POUND_ERROR); PP_DIRECTIVES_CPP.add(Directives.POUND_PRAGMA); PP_DIRECTIVES_CPP.add(Directives.POUND_ELIF); + PP_DIRECTIVES_CPP.add(Directives.DEFINED); } private static final Set ALL_C; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/KeywordCompletionProposalComputer.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/KeywordCompletionProposalComputer.java index b4beb87b895..39610e5ad9e 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/KeywordCompletionProposalComputer.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/KeywordCompletionProposalComputer.java @@ -27,9 +27,9 @@ import org.eclipse.swt.graphics.Image; import org.eclipse.cdt.core.dom.ast.IASTCompletionNode; import org.eclipse.cdt.core.dom.ast.IASTFieldReference; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.model.ICLanguageKeywords; +import org.eclipse.cdt.core.model.ILanguage; import org.eclipse.cdt.core.model.ITranslationUnit; -import org.eclipse.cdt.core.parser.Directives; -import org.eclipse.cdt.core.parser.Keywords; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.text.ICPartitions; @@ -37,6 +37,8 @@ import org.eclipse.cdt.internal.ui.viewsupport.CElementImageProvider; public class KeywordCompletionProposalComputer extends ParsingBasedProposalComputer { + private static final int MIN_KEYWORD_LENGTH = 5; + @Override protected List computeCompletionProposals( CContentAssistInvocationContext context, @@ -60,17 +62,30 @@ public class KeywordCompletionProposalComputer extends ParsingBasedProposalCompu List proposals = new ArrayList(); + ICLanguageKeywords languageKeywords = null; + ITranslationUnit tu = context.getTranslationUnit(); + if(tu != null) { + ILanguage language = tu.getLanguage(); + if(language instanceof ICLanguageKeywords) + languageKeywords = (ICLanguageKeywords)language; + } + + if(languageKeywords == null) + return Collections.emptyList(); + + if (inPreprocessorDirective(context)) { // TODO split this into a separate proposal computer? boolean needDirectiveKeyword= inPreprocessorKeyword(context); - String[] keywords= preprocessorKeywords; // add matching preprocessor keyword proposals ImageDescriptor imagedesc = CElementImageProvider.getKeywordImageDescriptor(); Image image = imagedesc != null ? CUIPlugin.getImageDescriptorRegistry().get(imagedesc) : null; - for (int i = 0; i < keywords.length; ++i) { - String repString= keywords[i]; - if (repString.startsWith(prefix) && keywords[i].length() > prefixLength) { + + for(String keyword : languageKeywords.getPreprocessorKeywords()) { + keyword = keyword + ' '; + String repString = keyword; + if (repString.startsWith(prefix) && keyword.length() > prefixLength) { int repLength = prefixLength; int repOffset = context.getInvocationOffset() - repLength; if (prefix.charAt(0) == '#') { @@ -82,28 +97,23 @@ public class KeywordCompletionProposalComputer extends ParsingBasedProposalCompu continue; } proposals.add(new CCompletionProposal(repString, repOffset, - repLength, image, keywords[i], relevance, context.getViewer())); + repLength, image, keyword, relevance, context.getViewer())); } } } else { if (!isValidContext(completionNode)) return Collections.emptyList(); - ITranslationUnit tu = context.getTranslationUnit(); - - String[] keywords = cppkeywords; // default to C++ - if (tu != null && tu.isCLanguage()) - keywords = ckeywords; - // add matching keyword proposals ImageDescriptor imagedesc = CElementImageProvider.getKeywordImageDescriptor(); Image image = imagedesc != null ? CUIPlugin.getImageDescriptorRegistry().get(imagedesc) : null; - for (int i = 0; i < keywords.length; ++i) { - if (keywords[i].startsWith(prefix) && keywords[i].length() > prefixLength) { + + for(String keyword : languageKeywords.getKeywords()) { + if (keyword.startsWith(prefix) && keyword.length() > prefixLength && keyword.length() >= MIN_KEYWORD_LENGTH) { int repLength = prefixLength; int repOffset = context.getInvocationOffset() - repLength; - proposals.add(new CCompletionProposal(keywords[i], repOffset, - repLength, image, keywords[i], relevance, context.getViewer())); + proposals.add(new CCompletionProposal(keyword, repOffset, + repLength, image, keyword, relevance, context.getViewer())); } } } @@ -181,97 +191,4 @@ public class KeywordCompletionProposalComputer extends ParsingBasedProposalCompu } return false; } - - // These are the keywords we complete - // We only do the ones that are >= 5 characters long - private static String [] ckeywords = { - Keywords.BREAK, - Keywords.CONST, - Keywords.CONTINUE, - Keywords.DEFAULT, - Keywords.DOUBLE, - Keywords.EXTERN, - Keywords.FLOAT, - Keywords.INLINE, - Keywords.REGISTER, - Keywords.RESTRICT, - Keywords.RETURN, - Keywords.SHORT, - Keywords.SIGNED, - Keywords.SIZEOF, - Keywords.STATIC, - Keywords.STRUCT, - Keywords.SWITCH, - Keywords.TYPEDEF, - Keywords.UNION, - Keywords.UNSIGNED, - Keywords.VOLATILE, - Keywords.WHILE, - Keywords._BOOL, - Keywords._COMPLEX, - Keywords._IMAGINARY - }; - - private static String [] cppkeywords = { - Keywords.BREAK, - Keywords.CATCH, - Keywords.CLASS, - Keywords.CONST, - Keywords.CONST_CAST, - Keywords.CONTINUE, - Keywords.DEFAULT, - Keywords.DELETE, - Keywords.DOUBLE, - Keywords.DYNAMIC_CAST, - Keywords.EXPLICIT, - Keywords.EXPORT, - Keywords.EXTERN, - Keywords.FALSE, - Keywords.FLOAT, - Keywords.FRIEND, - Keywords.INLINE, - Keywords.MUTABLE, - Keywords.NAMESPACE, - Keywords.OPERATOR, - Keywords.PRIVATE, - Keywords.PROTECTED, - Keywords.PUBLIC, - Keywords.REGISTER, - Keywords.REINTERPRET_CAST, - Keywords.RETURN, - Keywords.SHORT, - Keywords.SIGNED, - Keywords.SIZEOF, - Keywords.STATIC, - Keywords.STATIC_CAST, - Keywords.STRUCT, - Keywords.SWITCH, - Keywords.TEMPLATE, - Keywords.THROW, - Keywords.TYPEDEF, - Keywords.TYPEID, - Keywords.TYPENAME, - Keywords.UNION, - Keywords.UNSIGNED, - Keywords.USING, - Keywords.VIRTUAL, - Keywords.VOLATILE, - Keywords.WCHAR_T, - Keywords.WHILE - }; - - private static String [] preprocessorKeywords = { - Directives.POUND_DEFINE + ' ', - Directives.POUND_ELIF + ' ', - Directives.POUND_ELSE, - Directives.POUND_ENDIF, - Directives.POUND_ERROR + ' ', - Directives.POUND_IF + ' ', - Directives.POUND_IFDEF + ' ', - Directives.POUND_IFNDEF + ' ', - Directives.POUND_INCLUDE + ' ', - Directives.POUND_PRAGMA + ' ', - Directives.POUND_UNDEF + ' ', - "defined" //$NON-NLS-1$ - }; }