1
0
Fork 0
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:
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;
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();
}
}

View file

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

View file

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

View file

@ -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)

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.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();
}
}

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.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.
*/

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.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.
*/

View file

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

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.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;