mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-24 09:25:31 +02:00
bug 259318, provide reusable implementation of ICLanguageKeywords
This commit is contained in:
parent
602ce8c5f6
commit
e3a1eeca7a
10 changed files with 161 additions and 138 deletions
|
@ -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<String> keywordSet = new HashSet<String>(KeywordSets.getKeywords(KeywordSetKey.KEYWORDS, getParserLanguage()));
|
||||
|
||||
CharArrayIntMap additionalKeywords = getScannerExtensionConfiguration().getAdditionalKeywords();
|
||||
if (additionalKeywords != null) {
|
||||
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;
|
||||
@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<String> 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<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;
|
||||
return getCLanguageKeywords().getPreprocessorKeywords();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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<String> names = new ArrayList<String>();
|
||||
|
||||
private static final CharArrayMap<Integer> tokenMap = new CharArrayMap<Integer>();
|
||||
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<String> allKeywords = new ArrayList<String>(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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue