1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-09-10 03:53:21 +02:00

bug 259318, provide reusable implementation of ICLanguageKeywords

This commit is contained in:
Mike Kucera 2008-12-19 17:00:20 +00:00
parent 602ce8c5f6
commit e3a1eeca7a
10 changed files with 161 additions and 138 deletions

View file

@ -13,10 +13,7 @@
package org.eclipse.cdt.core.dom.parser; package org.eclipse.cdt.core.dom.parser;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Set;
import org.eclipse.cdt.core.dom.ICodeReaderFactory; import org.eclipse.cdt.core.dom.ICodeReaderFactory;
import org.eclipse.cdt.core.dom.ast.ASTVisitor; 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.IParserLogService;
import org.eclipse.cdt.core.parser.IScanner; import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.parser.IScannerInfo; 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.ParserLanguage;
import org.eclipse.cdt.core.parser.ParserMode; 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.dom.parser.AbstractGNUSourceCodeParser;
import org.eclipse.cdt.internal.core.parser.scanner.CPreprocessor; 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.ICancelable;
import org.eclipse.cdt.internal.core.util.ICanceler; import org.eclipse.cdt.internal.core.util.ICanceler;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
@ -231,51 +225,35 @@ public abstract class AbstractCLikeLanguage extends AbstractLanguage implements
return null; return null;
} }
private ICLanguageKeywords cLanguageKeywords = null;
private String[] keywords = null; private synchronized ICLanguageKeywords getCLanguageKeywords() {
private String[] builtinTypes = null; if(cLanguageKeywords == null)
private String[] preprocessorKeywords = null; cLanguageKeywords = new CLanguageKeywords(getParserLanguage(), getScannerExtensionConfiguration());
return cLanguageKeywords;
}
@SuppressWarnings("unchecked")
public String[] getKeywords() { @Override
if(keywords == null) { public Object getAdapter(Class adapter) {
Set<String> keywordSet = new HashSet<String>(KeywordSets.getKeywords(KeywordSetKey.KEYWORDS, getParserLanguage())); if(ICLanguageKeywords.class.equals(adapter))
return getCLanguageKeywords();
CharArrayIntMap additionalKeywords = getScannerExtensionConfiguration().getAdditionalKeywords();
if (additionalKeywords != null) { return super.getAdapter(adapter);
for (Iterator<char[]> iterator = additionalKeywords.toList().iterator(); iterator.hasNext(); ) {
char[] name = iterator.next();
keywordSet.add(new String(name));
}
}
keywords = keywordSet.toArray(new String[keywordSet.size()]);
}
return keywords;
} }
// for backwards compatibility
public String[] getBuiltinTypes() { public String[] getBuiltinTypes() {
if(builtinTypes == null) { return getCLanguageKeywords().getBuiltinTypes();
Set<String> types = KeywordSets.getKeywords(KeywordSetKey.TYPES, getParserLanguage());
builtinTypes = types.toArray(new String[types.size()]);
}
return builtinTypes;
} }
public String[] getKeywords() {
return getCLanguageKeywords().getKeywords();
}
public String[] getPreprocessorKeywords() { public String[] getPreprocessorKeywords() {
if(preprocessorKeywords == null) { return getCLanguageKeywords().getPreprocessorKeywords();
Set<String> keywords = new HashSet<String>(KeywordSets.getKeywords(KeywordSetKey.PP_DIRECTIVE, getParserLanguage()));
CharArrayIntMap additionalKeywords= getScannerExtensionConfiguration().getAdditionalPreprocessorKeywords();
if (additionalKeywords != null) {
for (Iterator<char[]> iterator = additionalKeywords.toList().iterator(); iterator.hasNext(); ) {
char[] name = iterator.next();
keywords.add(new String(name));
}
}
preprocessorKeywords = keywords.toArray(new String[keywords.size()]);
}
return preprocessorKeywords;
} }
} }

View file

@ -8,13 +8,12 @@
* Contributors: * Contributors:
* IBM Corporation - initial API and implementation * 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.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.Set; import java.util.Set;
import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration;
import org.eclipse.cdt.core.model.ICLanguageKeywords; import org.eclipse.cdt.core.model.ICLanguageKeywords;
import org.eclipse.cdt.core.parser.KeywordSetKey; import org.eclipse.cdt.core.parser.KeywordSetKey;
import org.eclipse.cdt.core.parser.ParserLanguage; 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 * This class allows provides a reusable implementation of ICLanguageKeywords
* for use by ILanguage implementations. * 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 * @author Mike Kucera
* @since 5.1
*/ */
@SuppressWarnings({"restriction", "nls"}) public class CLanguageKeywords implements ICLanguageKeywords {
class CLanguageKeywords implements ICLanguageKeywords {
private final ParserLanguage language; private final ParserLanguage language;
private final IScannerExtensionConfiguration config; private final IScannerExtensionConfiguration config;
@ -49,9 +43,9 @@ class CLanguageKeywords implements ICLanguageKeywords {
*/ */
public CLanguageKeywords(ParserLanguage language, IScannerExtensionConfiguration config) { public CLanguageKeywords(ParserLanguage language, IScannerExtensionConfiguration config) {
if(language == null) if(language == null)
throw new NullPointerException("language is null"); throw new NullPointerException("language is null"); //$NON-NLS-1$
if(config == null) if(config == null)
throw new NullPointerException("config is null"); throw new NullPointerException("config is null"); //$NON-NLS-1$
this.language = language; this.language = language;
this.config = config; this.config = config;

View file

@ -182,11 +182,13 @@ public class CSourceViewerConfiguration extends TextSourceViewerConfiguration {
return fPreprocessorScanner; return fPreprocessorScanner;
} }
AbstractCScanner scanner= null; AbstractCScanner scanner= null;
if (language instanceof ICLanguageKeywords) { ICLanguageKeywords keywords = language == null ? null : (ICLanguageKeywords) language.getAdapter(ICLanguageKeywords.class);
scanner= new CPreprocessorScanner(getTokenStoreFactory(), (ICLanguageKeywords)language); if (keywords != null) {
scanner = new CPreprocessorScanner(getTokenStoreFactory(), keywords);
} }
if (scanner == null) { if (scanner == null) {
scanner= new CPreprocessorScanner(getTokenStoreFactory(), GPPLanguage.getDefault()); keywords = (ICLanguageKeywords) GPPLanguage.getDefault().getAdapter(ICLanguageKeywords.class);
scanner= new CPreprocessorScanner(getTokenStoreFactory(), keywords);
} }
fPreprocessorScanner= scanner; fPreprocessorScanner= scanner;
return fPreprocessorScanner; return fPreprocessorScanner;
@ -372,14 +374,19 @@ public class CSourceViewerConfiguration extends TextSourceViewerConfiguration {
return fCodeScanner; return fCodeScanner;
} }
RuleBasedScanner scanner= null; RuleBasedScanner scanner= null;
if (language instanceof ICLanguageKeywords) {
ICLanguageKeywords cLang= (ICLanguageKeywords)language; if(language != null) {
scanner = new CCodeScanner(getTokenStoreFactory(), cLang); ICLanguageKeywords keywords = (ICLanguageKeywords) language.getAdapter(ICLanguageKeywords.class);
} else if (language != null) { if(keywords != null) {
ILanguageUI languageUI = (ILanguageUI)language.getAdapter(ILanguageUI.class); scanner = new CCodeScanner(getTokenStoreFactory(), keywords);
if (languageUI != null) }
scanner = languageUI.getCodeScanner(); else {
ILanguageUI languageUI = (ILanguageUI)language.getAdapter(ILanguageUI.class);
if (languageUI != null)
scanner = languageUI.getCodeScanner();
}
} }
if (scanner == null) { if (scanner == null) {
scanner = new CCodeScanner(getTokenStoreFactory(), GPPLanguage.getDefault()); scanner = new CCodeScanner(getTokenStoreFactory(), GPPLanguage.getDefault());
} }

View file

@ -66,8 +66,8 @@ public class KeywordCompletionProposalComputer extends ParsingBasedProposalCompu
ITranslationUnit tu = context.getTranslationUnit(); ITranslationUnit tu = context.getTranslationUnit();
if(tu != null) { if(tu != null) {
ILanguage language = tu.getLanguage(); ILanguage language = tu.getLanguage();
if(language instanceof ICLanguageKeywords) if(language != null)
languageKeywords = (ICLanguageKeywords)language; languageKeywords = (ICLanguageKeywords) language.getAdapter(ICLanguageKeywords.class);
} }
if(languageKeywords == null) if(languageKeywords == null)

View file

@ -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.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; 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.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.dom.parser.IScannerExtensionConfiguration;
import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.model.AbstractLanguage; 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.model.ILanguage;
import org.eclipse.cdt.core.parser.CodeReader; import org.eclipse.cdt.core.parser.CodeReader;
import org.eclipse.cdt.core.parser.IParserLogService; 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.core.parser.util.DebugUtil;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode; import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.core.parser.scanner.CPreprocessor; 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; import org.eclipse.core.runtime.CoreException;
@ -42,13 +38,11 @@ import org.eclipse.core.runtime.CoreException;
* @author Mike Kucera * @author Mike Kucera
*/ */
@SuppressWarnings("restriction") @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_GCC_AST = true;
private static final boolean DEBUG_PRINT_AST = false; private static final boolean DEBUG_PRINT_AST = true;
private ICLanguageKeywords keywords = null;
/** /**
@ -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") @SuppressWarnings("nls")
@Override @Override
public IASTTranslationUnit getASTTranslationUnit(CodeReader reader, IScannerInfo scanInfo, 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.setScanComments((options & OPTION_ADD_COMMENTS) != 0);
preprocessor.setComputeImageLocations((options & ILanguage.OPTION_NO_IMAGE_LOCATIONS) == 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); IASTTranslationUnit tu = createASTTranslationUnit(index, preprocessor);
IParser parser = getParser();
CPreprocessorAdapter.runCPreprocessor(preprocessor, parser, getTokenMap(), tu); 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 // the TU is marked as either a source file or a header file
tu.setIsHeaderUnit((options & OPTION_IS_SOURCE_UNIT) == 0); 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); 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();
}
} }

View file

@ -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.IDOMTokenMap;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.ScannerExtensionConfiguration; 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.dom.parser.IScannerExtensionConfiguration;
import org.eclipse.cdt.core.index.IIndex; 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.IContributedModelBuilder;
import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.parser.IScanner; 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.lrparser.c99.C99Parser;
import org.eclipse.cdt.internal.core.dom.parser.c.CNodeFactory; 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.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. * ILanguage implementation for the C99 parser.
@ -79,6 +83,20 @@ public class C99Language extends BaseExtensibleLanguage {
return ParserLanguage.C; 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. * Gets the translation unit object and sets the index and the location resolver.
*/ */

View file

@ -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.IDOMTokenMap;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.ScannerExtensionConfiguration; 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.dom.parser.IScannerExtensionConfiguration;
import org.eclipse.cdt.core.index.IIndex; 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.IContributedModelBuilder;
import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.parser.IScanner; import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParser; 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.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. * ILanguage implementation for the C++ parser.
@ -81,6 +85,20 @@ public class ISOCPPLanguage extends BaseExtensibleLanguage {
return ParserLanguage.CPP; 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. * Gets the translation unit object and sets the index and the location resolver.
*/ */

View file

@ -1,12 +1,22 @@
package org.eclipse.cdt.core.dom.parser.upc; package org.eclipse.cdt.core.dom.parser.upc;
import static org.eclipse.cdt.internal.core.dom.parser.upc.UPCParsersym.*; 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 java.util.ArrayList; import static org.eclipse.cdt.internal.core.dom.parser.upc.UPCParsersym.TK_UPC_MAX_BLOCKSIZE;
import java.util.Arrays; import static org.eclipse.cdt.internal.core.dom.parser.upc.UPCParsersym.TK_relaxed;
import java.util.List; 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.dom.lrparser.c99.C99Language;
import org.eclipse.cdt.core.model.ICLanguageKeywords;
import org.eclipse.cdt.core.parser.util.CharArrayMap; import org.eclipse.cdt.core.parser.util.CharArrayMap;
/** /**
@ -34,19 +44,30 @@ public enum UPCKeyword {
private final int tokenKind; private final int tokenKind;
private static List<String> names = new ArrayList<String>();
private static final CharArrayMap<Integer> tokenMap = new CharArrayMap<Integer>(); private static final CharArrayMap<Integer> tokenMap = new CharArrayMap<Integer>();
private static final String[] upcKeywords;
private static final String[] allKeywords;
UPCKeyword(int tokenKind) { UPCKeyword(int tokenKind) {
this.tokenKind = tokenKind; this.tokenKind = tokenKind;
} }
static { // cannot refer to static fields from constructor static {
for(UPCKeyword keyword : values()) { UPCKeyword[] keywords = values();
upcKeywords = new String[keywords.length];
for(int i = 0; i < keywords.length; i++) {
UPCKeyword keyword = keywords[i];
String name = keyword.name(); String name = keyword.name();
names.add(name); upcKeywords[i] = name;
tokenMap.put(name.toCharArray(), keyword.tokenKind); 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() { public int getTokenKind() {
@ -54,16 +75,16 @@ public enum UPCKeyword {
} }
public static String[] getUPCOnlyKeywords() { public static String[] getUPCOnlyKeywords() {
return names.toArray(new String[names.size()]); return upcKeywords;
} }
public static String[] getAllKeywords() { public static String[] getAllKeywords() {
List<String> allKeywords = new ArrayList<String>(names); return allKeywords;
allKeywords.addAll(Arrays.asList(C99Language.getDefault().getKeywords()));
return allKeywords.toArray(new String[allKeywords.size()]);
} }
public static Integer getTokenKind(char[] image) { public static Integer getTokenKind(char[] image) {
if(image == null)
return null;
return tokenMap.get(image); return tokenMap.get(image);
} }
} }

View file

@ -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;
}
}

View file

@ -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.lrparser.ScannerExtensionConfiguration;
import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration; 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.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.index.IIndex;
import org.eclipse.cdt.core.model.ICLanguageKeywords;
import org.eclipse.cdt.core.model.IContributedModelBuilder; import org.eclipse.cdt.core.model.IContributedModelBuilder;
import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.parser.IScanner; import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.parser.ParserLanguage; 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.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.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 IDOMTokenMap TOKEN_MAP = new DOMToUPCTokenMap();
private static final UPCLanguage myDefault = new UPCLanguage(); private static final UPCLanguage myDefault = new UPCLanguage();
private static final String[] upcKeywords = UPCKeyword.getAllKeywords();
private static final IScannerExtensionConfiguration SCANNER_CONFIGURATION = new ScannerExtensionConfiguration(); private static final IScannerExtensionConfiguration SCANNER_CONFIGURATION = new ScannerExtensionConfiguration();
@ -77,11 +79,20 @@ public class UPCLanguage extends BaseExtensibleLanguage {
return ILinkage.C_LINKAGE_ID; 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 @Override
protected ParserLanguage getParserLanguage() { protected ParserLanguage getParserLanguage() {
return ParserLanguage.C; return ParserLanguage.C;