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 275a32b7781..9025b81234a 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 @@ -13,10 +13,7 @@ package org.eclipse.cdt.core.dom.parser; import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; import java.util.List; -import java.util.Set; import org.eclipse.cdt.core.dom.ICodeReaderFactory; import org.eclipse.cdt.core.dom.ast.ASTVisitor; @@ -34,13 +31,10 @@ import org.eclipse.cdt.core.parser.CodeReader; import org.eclipse.cdt.core.parser.IParserLogService; import org.eclipse.cdt.core.parser.IScanner; import org.eclipse.cdt.core.parser.IScannerInfo; -import org.eclipse.cdt.core.parser.KeywordSetKey; import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.core.parser.ParserMode; -import org.eclipse.cdt.core.parser.util.CharArrayIntMap; import org.eclipse.cdt.internal.core.dom.parser.AbstractGNUSourceCodeParser; import org.eclipse.cdt.internal.core.parser.scanner.CPreprocessor; -import org.eclipse.cdt.internal.core.parser.token.KeywordSets; import org.eclipse.cdt.internal.core.util.ICancelable; import org.eclipse.cdt.internal.core.util.ICanceler; import org.eclipse.core.runtime.CoreException; @@ -231,51 +225,35 @@ public abstract class AbstractCLikeLanguage extends AbstractLanguage implements return null; } + + private ICLanguageKeywords cLanguageKeywords = null; - private String[] keywords = null; - private String[] builtinTypes = null; - private String[] preprocessorKeywords = null; + private synchronized ICLanguageKeywords getCLanguageKeywords() { + if(cLanguageKeywords == null) + cLanguageKeywords = new CLanguageKeywords(getParserLanguage(), getScannerExtensionConfiguration()); + return cLanguageKeywords; + } - - public String[] getKeywords() { - 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; + @SuppressWarnings("unchecked") + @Override + public Object getAdapter(Class adapter) { + if(ICLanguageKeywords.class.equals(adapter)) + return getCLanguageKeywords(); + + return super.getAdapter(adapter); } - + // for backwards compatibility public String[] getBuiltinTypes() { - if(builtinTypes == null) { - Set types = KeywordSets.getKeywords(KeywordSetKey.TYPES, getParserLanguage()); - builtinTypes = types.toArray(new String[types.size()]); - } - return builtinTypes; + return getCLanguageKeywords().getBuiltinTypes(); } + public String[] getKeywords() { + return getCLanguageKeywords().getKeywords(); + } public String[] getPreprocessorKeywords() { - 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 preprocessorKeywords; + return getCLanguageKeywords().getPreprocessorKeywords(); } - + } diff --git a/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/CLanguageKeywords.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/CLanguageKeywords.java similarity index 86% rename from lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/CLanguageKeywords.java rename to core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/CLanguageKeywords.java index 850792e1669..ac5ec02b5cb 100644 --- a/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/CLanguageKeywords.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/CLanguageKeywords.java @@ -8,13 +8,12 @@ * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ -package org.eclipse.cdt.core.dom.lrparser; +package org.eclipse.cdt.core.dom.parser; import java.util.HashSet; import java.util.Iterator; import java.util.Set; -import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration; import org.eclipse.cdt.core.model.ICLanguageKeywords; import org.eclipse.cdt.core.parser.KeywordSetKey; import org.eclipse.cdt.core.parser.ParserLanguage; @@ -25,15 +24,10 @@ import org.eclipse.cdt.internal.core.parser.token.KeywordSets; * This class allows provides a reusable implementation of ICLanguageKeywords * for use by ILanguage implementations. * - * Note: this code was mostly copied from AbstractCLikeLanguage. - * - * - * TODO move this into the core and use it with AbstractCLikeLanguage. - * * @author Mike Kucera + * @since 5.1 */ -@SuppressWarnings({"restriction", "nls"}) -class CLanguageKeywords implements ICLanguageKeywords { +public class CLanguageKeywords implements ICLanguageKeywords { private final ParserLanguage language; private final IScannerExtensionConfiguration config; @@ -49,9 +43,9 @@ class CLanguageKeywords implements ICLanguageKeywords { */ public CLanguageKeywords(ParserLanguage language, IScannerExtensionConfiguration config) { if(language == null) - throw new NullPointerException("language is null"); + throw new NullPointerException("language is null"); //$NON-NLS-1$ if(config == null) - throw new NullPointerException("config is null"); + throw new NullPointerException("config is null"); //$NON-NLS-1$ this.language = language; this.config = config; 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 d76db76e793..a0ade1e1180 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 @@ -182,11 +182,13 @@ public class CSourceViewerConfiguration extends TextSourceViewerConfiguration { return fPreprocessorScanner; } AbstractCScanner scanner= null; - if (language instanceof ICLanguageKeywords) { - scanner= new CPreprocessorScanner(getTokenStoreFactory(), (ICLanguageKeywords)language); + ICLanguageKeywords keywords = language == null ? null : (ICLanguageKeywords) language.getAdapter(ICLanguageKeywords.class); + if (keywords != null) { + scanner = new CPreprocessorScanner(getTokenStoreFactory(), keywords); } if (scanner == null) { - scanner= new CPreprocessorScanner(getTokenStoreFactory(), GPPLanguage.getDefault()); + keywords = (ICLanguageKeywords) GPPLanguage.getDefault().getAdapter(ICLanguageKeywords.class); + scanner= new CPreprocessorScanner(getTokenStoreFactory(), keywords); } fPreprocessorScanner= scanner; return fPreprocessorScanner; @@ -372,14 +374,19 @@ public class CSourceViewerConfiguration extends TextSourceViewerConfiguration { return fCodeScanner; } RuleBasedScanner scanner= null; - if (language instanceof ICLanguageKeywords) { - ICLanguageKeywords cLang= (ICLanguageKeywords)language; - scanner = new CCodeScanner(getTokenStoreFactory(), cLang); - } else if (language != null) { - ILanguageUI languageUI = (ILanguageUI)language.getAdapter(ILanguageUI.class); - if (languageUI != null) - scanner = languageUI.getCodeScanner(); + + if(language != null) { + ICLanguageKeywords keywords = (ICLanguageKeywords) language.getAdapter(ICLanguageKeywords.class); + if(keywords != null) { + scanner = new CCodeScanner(getTokenStoreFactory(), keywords); + } + else { + ILanguageUI languageUI = (ILanguageUI)language.getAdapter(ILanguageUI.class); + if (languageUI != null) + scanner = languageUI.getCodeScanner(); + } } + if (scanner == null) { scanner = new CCodeScanner(getTokenStoreFactory(), GPPLanguage.getDefault()); } 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 9f9586ba6e4..6205757e37c 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 @@ -66,8 +66,8 @@ public class KeywordCompletionProposalComputer extends ParsingBasedProposalCompu ITranslationUnit tu = context.getTranslationUnit(); if(tu != null) { ILanguage language = tu.getLanguage(); - if(language instanceof ICLanguageKeywords) - languageKeywords = (ICLanguageKeywords)language; + if(language != null) + languageKeywords = (ICLanguageKeywords) language.getAdapter(ICLanguageKeywords.class); } if(languageKeywords == null) diff --git a/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/BaseExtensibleLanguage.java b/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/BaseExtensibleLanguage.java index 36796131f30..d4df96ba2c0 100644 --- a/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/BaseExtensibleLanguage.java +++ b/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/BaseExtensibleLanguage.java @@ -15,11 +15,9 @@ import org.eclipse.cdt.core.dom.ast.IASTCompletionNode; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage; -import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage; import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration; import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.model.AbstractLanguage; -import org.eclipse.cdt.core.model.ICLanguageKeywords; import org.eclipse.cdt.core.model.ILanguage; import org.eclipse.cdt.core.parser.CodeReader; import org.eclipse.cdt.core.parser.IParserLogService; @@ -30,8 +28,6 @@ import org.eclipse.cdt.core.parser.util.ASTPrinter; import org.eclipse.cdt.core.parser.util.DebugUtil; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; import org.eclipse.cdt.internal.core.parser.scanner.CPreprocessor; -import org.eclipse.cdt.internal.core.pdom.dom.IPDOMLinkageFactory; -import org.eclipse.cdt.internal.core.pdom.dom.c.PDOMCLinkageFactory; import org.eclipse.core.runtime.CoreException; @@ -42,13 +38,11 @@ import org.eclipse.core.runtime.CoreException; * @author Mike Kucera */ @SuppressWarnings("restriction") -public abstract class BaseExtensibleLanguage extends AbstractLanguage implements ILanguage, ICLanguageKeywords { +public abstract class BaseExtensibleLanguage extends AbstractLanguage { - private static final boolean DEBUG_PRINT_GCC_AST = false; - private static final boolean DEBUG_PRINT_AST = false; - - private ICLanguageKeywords keywords = null; + private static final boolean DEBUG_PRINT_GCC_AST = true; + private static final boolean DEBUG_PRINT_AST = true; /** @@ -95,25 +89,6 @@ public abstract class BaseExtensibleLanguage extends AbstractLanguage implements - private void getCLanguageKeywords() { - ParserLanguage lang = getParserLanguage(); - IScannerExtensionConfiguration config = getScannerExtensionConfiguration(); - keywords = new CLanguageKeywords(lang, config); - } - - - @SuppressWarnings("unchecked") - @Override - public Object getAdapter(Class adapter) { - if (adapter == IPDOMLinkageFactory.class) - return new PDOMCLinkageFactory(); - - return super.getAdapter(adapter); - } - - - - @SuppressWarnings("nls") @Override public IASTTranslationUnit getASTTranslationUnit(CodeReader reader, IScannerInfo scanInfo, @@ -141,12 +116,13 @@ public abstract class BaseExtensibleLanguage extends AbstractLanguage implements preprocessor.setScanComments((options & OPTION_ADD_COMMENTS) != 0); preprocessor.setComputeImageLocations((options & ILanguage.OPTION_NO_IMAGE_LOCATIONS) == 0); - IParser parser = getParser(); + // The translation unit has to be created here so that the preprocessor + // can fill in the preprocessor AST nodes. IASTTranslationUnit tu = createASTTranslationUnit(index, preprocessor); - + IParser parser = getParser(); CPreprocessorAdapter.runCPreprocessor(preprocessor, parser, getTokenMap(), tu); - parser.parse(tu); // the parser will fill in the rest of the AST + parser.parse(tu); // The parser will fill in the rest of the AST // the TU is marked as either a source file or a header file tu.setIsHeaderUnit((options & OPTION_IS_SOURCE_UNIT) == 0); @@ -241,25 +217,6 @@ public abstract class BaseExtensibleLanguage extends AbstractLanguage implements return GCCLanguage.getDefault().getSelectedNames(ast, start, length); } - public String[] getBuiltinTypes() { - if(keywords == null) - getCLanguageKeywords(); - - return keywords.getBuiltinTypes(); - } - - public String[] getKeywords() { - if(keywords == null) - getCLanguageKeywords(); - - return keywords.getKeywords(); - } - - public String[] getPreprocessorKeywords() { - if(keywords == null) - getCLanguageKeywords(); - - return keywords.getPreprocessorKeywords(); - } + } diff --git a/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/c99/C99Language.java b/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/c99/C99Language.java index 98215dde0a7..50a825be716 100644 --- a/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/c99/C99Language.java +++ b/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/c99/C99Language.java @@ -16,8 +16,10 @@ import org.eclipse.cdt.core.dom.lrparser.BaseExtensibleLanguage; import org.eclipse.cdt.core.dom.lrparser.IDOMTokenMap; import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.ScannerExtensionConfiguration; +import org.eclipse.cdt.core.dom.parser.CLanguageKeywords; import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration; import org.eclipse.cdt.core.index.IIndex; +import org.eclipse.cdt.core.model.ICLanguageKeywords; import org.eclipse.cdt.core.model.IContributedModelBuilder; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.parser.IScanner; @@ -25,6 +27,8 @@ import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.internal.core.dom.lrparser.c99.C99Parser; import org.eclipse.cdt.internal.core.dom.parser.c.CNodeFactory; import org.eclipse.cdt.internal.core.dom.parser.c.CASTTranslationUnit; +import org.eclipse.cdt.internal.core.pdom.dom.IPDOMLinkageFactory; +import org.eclipse.cdt.internal.core.pdom.dom.c.PDOMCLinkageFactory; /** * ILanguage implementation for the C99 parser. @@ -79,6 +83,20 @@ public class C99Language extends BaseExtensibleLanguage { return ParserLanguage.C; } + private ICLanguageKeywords cLanguageKeywords = new CLanguageKeywords(ParserLanguage.C, SCANNER_CONFIGURATION); + + + @SuppressWarnings("unchecked") + @Override + public Object getAdapter(Class adapter) { + if(IPDOMLinkageFactory.class.equals(adapter)) + return new PDOMCLinkageFactory(); + if(ICLanguageKeywords.class.equals(adapter)) + return cLanguageKeywords; + + return super.getAdapter(adapter); + } + /** * Gets the translation unit object and sets the index and the location resolver. */ diff --git a/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/cpp/ISOCPPLanguage.java b/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/cpp/ISOCPPLanguage.java index a7a639bd35f..b4bc11eff16 100644 --- a/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/cpp/ISOCPPLanguage.java +++ b/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/cpp/ISOCPPLanguage.java @@ -16,15 +16,19 @@ import org.eclipse.cdt.core.dom.lrparser.BaseExtensibleLanguage; import org.eclipse.cdt.core.dom.lrparser.IDOMTokenMap; import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.ScannerExtensionConfiguration; +import org.eclipse.cdt.core.dom.parser.CLanguageKeywords; import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration; import org.eclipse.cdt.core.index.IIndex; +import org.eclipse.cdt.core.model.ICLanguageKeywords; import org.eclipse.cdt.core.model.IContributedModelBuilder; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.parser.IScanner; import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParser; -import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNodeFactory; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTTranslationUnit; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNodeFactory; +import org.eclipse.cdt.internal.core.pdom.dom.IPDOMLinkageFactory; +import org.eclipse.cdt.internal.core.pdom.dom.cpp.PDOMCPPLinkageFactory; /** * ILanguage implementation for the C++ parser. @@ -81,6 +85,20 @@ public class ISOCPPLanguage extends BaseExtensibleLanguage { return ParserLanguage.CPP; } + private ICLanguageKeywords cppLanguageKeywords = new CLanguageKeywords(ParserLanguage.CPP, SCANNER_CONFIGURATION); + + + @SuppressWarnings("unchecked") + @Override + public Object getAdapter(Class adapter) { + if(IPDOMLinkageFactory.class.equals(adapter)) + return new PDOMCPPLinkageFactory(); + if(ICLanguageKeywords.class.equals(adapter)) + return cppLanguageKeywords; + + return super.getAdapter(adapter); + } + /** * Gets the translation unit object and sets the index and the location resolver. */ diff --git a/upc/org.eclipse.cdt.core.parser.upc/src/org/eclipse/cdt/core/dom/parser/upc/UPCKeyword.java b/upc/org.eclipse.cdt.core.parser.upc/src/org/eclipse/cdt/core/dom/parser/upc/UPCKeyword.java index 30cd0d1d91b..64b3be282ac 100644 --- a/upc/org.eclipse.cdt.core.parser.upc/src/org/eclipse/cdt/core/dom/parser/upc/UPCKeyword.java +++ b/upc/org.eclipse.cdt.core.parser.upc/src/org/eclipse/cdt/core/dom/parser/upc/UPCKeyword.java @@ -1,12 +1,22 @@ package org.eclipse.cdt.core.dom.parser.upc; -import static org.eclipse.cdt.internal.core.dom.parser.upc.UPCParsersym.*; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import static org.eclipse.cdt.internal.core.dom.parser.upc.UPCParsersym.TK_MYTHREAD; +import static org.eclipse.cdt.internal.core.dom.parser.upc.UPCParsersym.TK_THREADS; +import static org.eclipse.cdt.internal.core.dom.parser.upc.UPCParsersym.TK_UPC_MAX_BLOCKSIZE; +import static org.eclipse.cdt.internal.core.dom.parser.upc.UPCParsersym.TK_relaxed; +import static org.eclipse.cdt.internal.core.dom.parser.upc.UPCParsersym.TK_shared; +import static org.eclipse.cdt.internal.core.dom.parser.upc.UPCParsersym.TK_strict; +import static org.eclipse.cdt.internal.core.dom.parser.upc.UPCParsersym.TK_upc_barrier; +import static org.eclipse.cdt.internal.core.dom.parser.upc.UPCParsersym.TK_upc_blocksizeof; +import static org.eclipse.cdt.internal.core.dom.parser.upc.UPCParsersym.TK_upc_elemsizeof; +import static org.eclipse.cdt.internal.core.dom.parser.upc.UPCParsersym.TK_upc_fence; +import static org.eclipse.cdt.internal.core.dom.parser.upc.UPCParsersym.TK_upc_forall; +import static org.eclipse.cdt.internal.core.dom.parser.upc.UPCParsersym.TK_upc_localsizeof; +import static org.eclipse.cdt.internal.core.dom.parser.upc.UPCParsersym.TK_upc_notify; +import static org.eclipse.cdt.internal.core.dom.parser.upc.UPCParsersym.TK_upc_wait; import org.eclipse.cdt.core.dom.lrparser.c99.C99Language; +import org.eclipse.cdt.core.model.ICLanguageKeywords; import org.eclipse.cdt.core.parser.util.CharArrayMap; /** @@ -34,19 +44,30 @@ public enum UPCKeyword { private final int tokenKind; - private static List names = new ArrayList(); + private static final CharArrayMap tokenMap = new CharArrayMap(); + private static final String[] upcKeywords; + private static final String[] allKeywords; UPCKeyword(int tokenKind) { this.tokenKind = tokenKind; } - static { // cannot refer to static fields from constructor - for(UPCKeyword keyword : values()) { + static { + UPCKeyword[] keywords = values(); + upcKeywords = new String[keywords.length]; + for(int i = 0; i < keywords.length; i++) { + UPCKeyword keyword = keywords[i]; String name = keyword.name(); - names.add(name); + upcKeywords[i] = name; tokenMap.put(name.toCharArray(), keyword.tokenKind); } + + ICLanguageKeywords c99Keywords = (ICLanguageKeywords) C99Language.getDefault().getAdapter(ICLanguageKeywords.class); + String[] c99ks = c99Keywords.getKeywords(); + allKeywords = new String[upcKeywords.length + c99ks.length]; + System.arraycopy(c99ks, 0, allKeywords, 0, c99ks.length); + System.arraycopy(upcKeywords, 0, allKeywords, c99ks.length, upcKeywords.length); } public int getTokenKind() { @@ -54,16 +75,16 @@ public enum UPCKeyword { } public static String[] getUPCOnlyKeywords() { - return names.toArray(new String[names.size()]); + return upcKeywords; } public static String[] getAllKeywords() { - List allKeywords = new ArrayList(names); - allKeywords.addAll(Arrays.asList(C99Language.getDefault().getKeywords())); - return allKeywords.toArray(new String[allKeywords.size()]); + return allKeywords; } public static Integer getTokenKind(char[] image) { + if(image == null) + return null; return tokenMap.get(image); } } diff --git a/upc/org.eclipse.cdt.core.parser.upc/src/org/eclipse/cdt/core/dom/parser/upc/UPCLanguageKeywords.java b/upc/org.eclipse.cdt.core.parser.upc/src/org/eclipse/cdt/core/dom/parser/upc/UPCLanguageKeywords.java new file mode 100644 index 00000000000..90acf2bcada --- /dev/null +++ b/upc/org.eclipse.cdt.core.parser.upc/src/org/eclipse/cdt/core/dom/parser/upc/UPCLanguageKeywords.java @@ -0,0 +1,19 @@ +package org.eclipse.cdt.core.dom.parser.upc; + +import org.eclipse.cdt.core.dom.parser.CLanguageKeywords; +import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration; +import org.eclipse.cdt.core.parser.ParserLanguage; + +public class UPCLanguageKeywords extends CLanguageKeywords { + + public UPCLanguageKeywords(IScannerExtensionConfiguration config) { + super(ParserLanguage.C, config); + } + + private static String[] upcKeywords = UPCKeyword.getAllKeywords(); + + @Override + public String[] getKeywords() { + return upcKeywords; + } +} diff --git a/upc/org.eclipse.cdt.core.parser.upc/src/org/eclipse/cdt/core/dom/upc/UPCLanguage.java b/upc/org.eclipse.cdt.core.parser.upc/src/org/eclipse/cdt/core/dom/upc/UPCLanguage.java index 01ce11c287f..c2b879a92dc 100644 --- a/upc/org.eclipse.cdt.core.parser.upc/src/org/eclipse/cdt/core/dom/upc/UPCLanguage.java +++ b/upc/org.eclipse.cdt.core.parser.upc/src/org/eclipse/cdt/core/dom/upc/UPCLanguage.java @@ -18,15 +18,18 @@ import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.ScannerExtensionConfiguration; import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration; import org.eclipse.cdt.core.dom.parser.upc.DOMToUPCTokenMap; -import org.eclipse.cdt.core.dom.parser.upc.UPCKeyword; +import org.eclipse.cdt.core.dom.parser.upc.UPCLanguageKeywords; import org.eclipse.cdt.core.index.IIndex; +import org.eclipse.cdt.core.model.ICLanguageKeywords; import org.eclipse.cdt.core.model.IContributedModelBuilder; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.parser.IScanner; import org.eclipse.cdt.core.parser.ParserLanguage; -import org.eclipse.cdt.internal.core.dom.parser.c.CNodeFactory; import org.eclipse.cdt.internal.core.dom.parser.c.CASTTranslationUnit; +import org.eclipse.cdt.internal.core.dom.parser.c.CNodeFactory; import org.eclipse.cdt.internal.core.dom.parser.upc.UPCParser; +import org.eclipse.cdt.internal.core.pdom.dom.IPDOMLinkageFactory; +import org.eclipse.cdt.internal.core.pdom.dom.c.PDOMCLinkageFactory; /** @@ -43,7 +46,6 @@ public class UPCLanguage extends BaseExtensibleLanguage { private static final IDOMTokenMap TOKEN_MAP = new DOMToUPCTokenMap(); private static final UPCLanguage myDefault = new UPCLanguage(); - private static final String[] upcKeywords = UPCKeyword.getAllKeywords(); private static final IScannerExtensionConfiguration SCANNER_CONFIGURATION = new ScannerExtensionConfiguration(); @@ -77,11 +79,20 @@ public class UPCLanguage extends BaseExtensibleLanguage { return ILinkage.C_LINKAGE_ID; } - @Override - public String[] getKeywords() { - return upcKeywords; - } + private static final ICLanguageKeywords upcKeywords = new UPCLanguageKeywords(SCANNER_CONFIGURATION); + + @SuppressWarnings("unchecked") + @Override + public Object getAdapter(Class adapter) { + if(IPDOMLinkageFactory.class.equals(adapter)) + return new PDOMCLinkageFactory(); + if(ICLanguageKeywords.class.equals(adapter)) + return upcKeywords; + + return super.getAdapter(adapter); + } + @Override protected ParserLanguage getParserLanguage() { return ParserLanguage.C;