diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/c/GCCLanguage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/c/GCCLanguage.java index f1bf50b6337..cc7b7cffd0e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/c/GCCLanguage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/c/GCCLanguage.java @@ -10,35 +10,55 @@ * Markus Schorn (Wind River Systems) * IBM Corporation * Anton Leherbauer (Wind River Systems) + * Mike Kucera - IBM *******************************************************************************/ package org.eclipse.cdt.core.dom.ast.gnu.c; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ILinkage; +import org.eclipse.cdt.core.dom.parser.AbstractCLikeLanguage; import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration; -import org.eclipse.cdt.core.dom.parser.c.AbstractCLanguage; +import org.eclipse.cdt.core.dom.parser.ISourceCodeParser; import org.eclipse.cdt.core.dom.parser.c.GCCParserExtensionConfiguration; import org.eclipse.cdt.core.dom.parser.c.GCCScannerExtensionConfiguration; -import org.eclipse.cdt.core.dom.parser.c.ICParserExtensionConfiguration; +import org.eclipse.cdt.core.index.IIndex; +import org.eclipse.cdt.core.parser.IParserLogService; +import org.eclipse.cdt.core.parser.IScanner; +import org.eclipse.cdt.core.parser.ParserLanguage; +import org.eclipse.cdt.core.parser.ParserMode; +import org.eclipse.cdt.internal.core.dom.parser.c.GNUCSourceParser; +import org.eclipse.cdt.internal.core.pdom.dom.IPDOMLinkageFactory; +import org.eclipse.cdt.internal.core.pdom.dom.c.PDOMCLinkageFactory; /** - * @author Doug Schaefer - * + * Concrete ILanguage implementation for the DOM C parser. + * */ -public class GCCLanguage extends AbstractCLanguage { +public class GCCLanguage extends AbstractCLikeLanguage { protected static final GCCScannerExtensionConfiguration C_GNU_SCANNER_EXTENSION = new GCCScannerExtensionConfiguration(); protected static final GCCParserExtensionConfiguration C_GNU_PARSER_EXTENSION = new GCCParserExtensionConfiguration(); // Must match the id in the extension public static final String ID = CCorePlugin.PLUGIN_ID + ".gcc"; //$NON-NLS-1$ - private static final GCCLanguage myDefault = new GCCLanguage(); + private static final GCCLanguage DEFAULT_INSTANCE = new GCCLanguage(); public static GCCLanguage getDefault() { - return myDefault; + return DEFAULT_INSTANCE; } + + @Override + @SuppressWarnings("unchecked") + public Object getAdapter(Class adapter) { + if (adapter == IPDOMLinkageFactory.class) { + return new PDOMCLinkageFactory(); + } + return super.getAdapter(adapter); + } + + public String getId() { return ID; } @@ -47,18 +67,26 @@ public class GCCLanguage extends AbstractCLanguage { return ILinkage.C_LINKAGE_ID; } - /* - * @see org.eclipse.cdt.core.dom.parser.c.AbstractCLanguage#getScannerExtensionConfiguration() - */ + + @Override protected IScannerExtensionConfiguration getScannerExtensionConfiguration() { return C_GNU_SCANNER_EXTENSION; } - - /* - * @see org.eclipse.cdt.core.dom.parser.c.AbstractCLanguage#getParserExtensionConfiguration() - */ - protected ICParserExtensionConfiguration getParserExtensionConfiguration() { - return C_GNU_PARSER_EXTENSION; + + + @Override + protected ISourceCodeParser createParser(IScanner scanner, ParserMode parserMode, IParserLogService logService, IIndex index) { + return new GNUCSourceParser(scanner, parserMode, logService, C_GNU_PARSER_EXTENSION, index); } + + @Override + protected ParserLanguage getParserLanguage() { + return ParserLanguage.C; + } + + + + + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/cpp/GPPLanguage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/cpp/GPPLanguage.java index 63bfe2193ff..9bb52e90ab9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/cpp/GPPLanguage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/cpp/GPPLanguage.java @@ -10,31 +10,50 @@ * Markus Schorn (Wind River Systems) * IBM Corporation * Anton Leherbauer (Wind River Systems) + * Mike Kucera - IBM *******************************************************************************/ package org.eclipse.cdt.core.dom.ast.gnu.cpp; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ILinkage; +import org.eclipse.cdt.core.dom.parser.AbstractCLikeLanguage; import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration; -import org.eclipse.cdt.core.dom.parser.cpp.AbstractCPPLanguage; -import org.eclipse.cdt.core.dom.parser.cpp.AbstractCPPParserExtensionConfiguration; +import org.eclipse.cdt.core.dom.parser.ISourceCodeParser; import org.eclipse.cdt.core.dom.parser.cpp.GPPParserExtensionConfiguration; import org.eclipse.cdt.core.dom.parser.cpp.GPPScannerExtensionConfiguration; +import org.eclipse.cdt.core.index.IIndex; +import org.eclipse.cdt.core.parser.IParserLogService; +import org.eclipse.cdt.core.parser.IScanner; +import org.eclipse.cdt.core.parser.ParserLanguage; +import org.eclipse.cdt.core.parser.ParserMode; +import org.eclipse.cdt.internal.core.dom.parser.cpp.GNUCPPSourceParser; +import org.eclipse.cdt.internal.core.pdom.dom.IPDOMLinkageFactory; +import org.eclipse.cdt.internal.core.pdom.dom.cpp.PDOMCPPLinkageFactory; /** - * @author Doug Schaefer + * Concrete ILanguage implementation for the DOM C++ parser. * */ -public class GPPLanguage extends AbstractCPPLanguage { +public class GPPLanguage extends AbstractCLikeLanguage { protected static final GPPScannerExtensionConfiguration CPP_GNU_SCANNER_EXTENSION = new GPPScannerExtensionConfiguration(); protected static final GPPParserExtensionConfiguration CPP_GNU_PARSER_EXTENSION = new GPPParserExtensionConfiguration(); public static final String ID = CCorePlugin.PLUGIN_ID + ".g++"; //$NON-NLS-1$ - private static final GPPLanguage myDefault = new GPPLanguage(); + private static final GPPLanguage DEFAULT_INSTANCE = new GPPLanguage(); public static GPPLanguage getDefault() { - return myDefault; + return DEFAULT_INSTANCE; + } + + + @Override + @SuppressWarnings("unchecked") + public Object getAdapter(Class adapter) { + if (adapter == IPDOMLinkageFactory.class) { + return new PDOMCPPLinkageFactory(); + } + return super.getAdapter(adapter); } public String getId() { @@ -46,18 +65,19 @@ public class GPPLanguage extends AbstractCPPLanguage { return ILinkage.CPP_LINKAGE_ID; } - /* - * @see org.eclipse.cdt.core.dom.parser.cpp.AbstractCPPLanguage#getScannerExtensionConfiguration() - */ + @Override protected IScannerExtensionConfiguration getScannerExtensionConfiguration() { return CPP_GNU_SCANNER_EXTENSION; } - /* - * @see org.eclipse.cdt.core.dom.parser.cpp.AbstractCPPLanguage#getParserExtensionConfiguration() - */ - protected AbstractCPPParserExtensionConfiguration getParserExtensionConfiguration() { - return CPP_GNU_PARSER_EXTENSION; + @Override + protected ISourceCodeParser createParser(IScanner scanner, ParserMode parserMode, IParserLogService logService, IIndex index) { + return new GNUCPPSourceParser(scanner, parserMode, logService, CPP_GNU_PARSER_EXTENSION, index); + } + + @Override + protected ParserLanguage getParserLanguage() { + return ParserLanguage.CPP; } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/c/AbstractCLanguage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/AbstractCLikeLanguage.java similarity index 69% rename from core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/c/AbstractCLanguage.java rename to core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/AbstractCLikeLanguage.java index 4a6671a17b3..83bb6aeda73 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/c/AbstractCLanguage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/AbstractCLikeLanguage.java @@ -1,15 +1,16 @@ /******************************************************************************* - * Copyright (c) 2007 Wind River Systems, Inc. and others. + * Copyright (c) 2007, 2008 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Anton Leherbauer (Wind River Systems) - initial API and implementation - * Markus Schorn (Wind River Systems) + * Anton Leherbauer (Wind River Systems) - initial API and implementation + * Markus Schorn (Wind River Systems) + * Mike Kucera (IBM) *******************************************************************************/ -package org.eclipse.cdt.core.dom.parser.c; +package org.eclipse.cdt.core.dom.parser; import java.util.ArrayList; import java.util.HashSet; @@ -18,14 +19,11 @@ import java.util.List; import java.util.Set; import org.eclipse.cdt.core.dom.ICodeReaderFactory; +import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.IASTCompletionNode; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; -import org.eclipse.cdt.core.dom.ast.c.CASTVisitor; -import org.eclipse.cdt.core.dom.parser.AbstractScannerExtensionConfiguration; -import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration; -import org.eclipse.cdt.core.dom.parser.ISourceCodeParser; import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.model.AbstractLanguage; import org.eclipse.cdt.core.model.ICLanguageKeywords; @@ -39,17 +37,18 @@ 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.c.GNUCSourceParser; import org.eclipse.cdt.internal.core.parser.scanner.CPreprocessor; import org.eclipse.cdt.internal.core.parser.token.KeywordSets; -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; /** - * Abstract C language. Derived classes need only implement - * {@link getScannerExtensionConfiguration()} and - * {@link getParserExtensionConfiguration()}. + * This class provides a skeletal implementation of the ILanguage interface + * for the DOM parser framework. + * + * This class uses the template method pattern, derived classes need only implement + * {@link getScannerExtensionConfiguration()}, + * {@link getParserLanguage()} and + * {@link createParser()}. * *

* EXPERIMENTAL. This class or interface has been added as @@ -60,39 +59,57 @@ import org.eclipse.core.runtime.CoreException; * * @see AbstractScannerExtensionConfiguration * - * @since 4.0 + * @since 5.0 */ -public abstract class AbstractCLanguage extends AbstractLanguage implements ICLanguageKeywords { +public abstract class AbstractCLikeLanguage extends AbstractLanguage implements ICLanguageKeywords { - protected static class NameCollector extends CASTVisitor { + + static class NameCollector extends ASTVisitor { { shouldVisitNames= true; } - private List nameList= new ArrayList(); + private List nameList= new ArrayList(); - public int visit(IASTName name) { + @Override public int visit(IASTName name) { nameList.add(name); return PROCESS_CONTINUE; } public IASTName[] getNames() { - return (IASTName[]) nameList.toArray(new IASTName[nameList.size()]); + return nameList.toArray(new IASTName[nameList.size()]); } } + + + /** + * @return the scanner extension configuration for this language, may not + * return null + */ + protected abstract IScannerExtensionConfiguration getScannerExtensionConfiguration(); - public Object getAdapter(Class adapter) { - if (adapter == IPDOMLinkageFactory.class) { - return new PDOMCLinkageFactory(); - } - return super.getAdapter(adapter); - } - + + /** + * @returns the actual parser object. + */ + protected abstract ISourceCodeParser createParser(IScanner scanner, ParserMode parserMode, + IParserLogService logService, IIndex index); + + + /** + * @return The ParserLanguage value corresponding to the language supported. + */ + protected abstract ParserLanguage getParserLanguage(); + + + public IASTTranslationUnit getASTTranslationUnit(CodeReader reader, IScannerInfo scanInfo, ICodeReaderFactory fileCreator, IIndex index, IParserLogService log) throws CoreException { return getASTTranslationUnit(reader, scanInfo, fileCreator, index, 0, log); } - + + + @Override public IASTTranslationUnit getASTTranslationUnit(CodeReader reader, IScannerInfo scanInfo, ICodeReaderFactory codeReaderFactory, IIndex index, int options, IParserLogService log) throws CoreException { @@ -106,6 +123,7 @@ public abstract class AbstractCLanguage extends AbstractLanguage implements ICLa IASTTranslationUnit ast= parser.parse(); return ast; } + public IASTCompletionNode getCompletionNode(CodeReader reader, IScannerInfo scanInfo, ICodeReaderFactory fileCreator, IIndex index, IParserLogService log, int offset) throws CoreException { @@ -120,40 +138,8 @@ public abstract class AbstractCLanguage extends AbstractLanguage implements ICLa IASTCompletionNode node= parser.getCompletionNode(); return node; } - - - public IASTName[] getSelectedNames(IASTTranslationUnit ast, int start, int length) { - IASTNode selectedNode= ast.selectNodeForLocation(ast.getFilePath(), start, length); - - if (selectedNode == null) - return new IASTName[0]; - - if (selectedNode instanceof IASTName) - return new IASTName[] { (IASTName) selectedNode }; - - NameCollector collector= new NameCollector(); - selectedNode.accept(collector); - return collector.getNames(); - } - - public IContributedModelBuilder createModelBuilder(ITranslationUnit tu) { - // Use the default CDT model builder - return null; - } - - /** - * Create the scanner to be used with the parser. - * - * @param reader the code reader for the main file - * @param scanInfo the scanner information (macros, include pathes) - * @param fileCreator the code reader factory for inclusions - * @param log the log for debugging - * @return an instance of IScanner - */ - protected IScanner createScanner(CodeReader reader, IScannerInfo scanInfo, ICodeReaderFactory fileCreator, IParserLogService log) { - return new CPreprocessor(reader, scanInfo, ParserLanguage.C, log, getScannerExtensionConfiguration(), fileCreator); - } - + + /** * Create the parser. * @@ -175,51 +161,68 @@ public abstract class AbstractCLanguage extends AbstractLanguage implements ICLa else { mode= ParserMode.COMPLETE_PARSE; } - return new GNUCSourceParser(scanner, mode, log, getParserExtensionConfiguration(), index); + return createParser(scanner, mode, log, index); + } + + + /** + * Create the scanner to be used with the parser. + * + * @param reader the code reader for the main file + * @param scanInfo the scanner information (macros, include pathes) + * @param fileCreator the code reader factory for inclusions + * @param log the log for debugging + * @return an instance of IScanner + */ + protected IScanner createScanner(CodeReader reader, IScannerInfo scanInfo, ICodeReaderFactory fileCreator, IParserLogService log) { + return new CPreprocessor(reader, scanInfo, getParserLanguage(), log, getScannerExtensionConfiguration(), fileCreator); + } + + + + public IASTName[] getSelectedNames(IASTTranslationUnit ast, int start, int length) { + IASTNode selectedNode= ast.selectNodeForLocation(ast.getFilePath(), start, length); + + if (selectedNode == null) + return new IASTName[0]; + + if (selectedNode instanceof IASTName) + return new IASTName[] { (IASTName) selectedNode }; + + NameCollector collector = new NameCollector(); + selectedNode.accept(collector); + return collector.getNames(); + } + + + public IContributedModelBuilder createModelBuilder(ITranslationUnit tu) { + // use default model builder + return null; } - /** - * @return the scanner extension configuration for this language, may not - * return null - */ - protected abstract IScannerExtensionConfiguration getScannerExtensionConfiguration(); - - /** - * @return the parser extension configuration for this language, may not - * return null - */ - protected abstract ICParserExtensionConfiguration getParserExtensionConfiguration(); - - /* - * @see org.eclipse.cdt.core.model.ICLanguageKeywords#getKeywords() - */ + public String[] getKeywords() { - Set keywords= KeywordSets.getKeywords(KeywordSetKey.KEYWORDS, ParserLanguage.C); - keywords= new HashSet(keywords); - CharArrayIntMap additionalKeywords= getScannerExtensionConfiguration().getAdditionalKeywords(); + Set keywords = new HashSet(KeywordSets.getKeywords(KeywordSetKey.KEYWORDS, getParserLanguage())); + + CharArrayIntMap additionalKeywords = getScannerExtensionConfiguration().getAdditionalKeywords(); if (additionalKeywords != null) { for (Iterator iterator = additionalKeywords.toList().iterator(); iterator.hasNext(); ) { char[] name = (char[]) iterator.next(); keywords.add(new String(name)); } } - return (String[]) keywords.toArray(new String[keywords.size()]); + return keywords.toArray(new String[keywords.size()]); } - /* - * @see org.eclipse.cdt.core.model.ICLanguageKeywords#getBuiltinTypes() - */ + public String[] getBuiltinTypes() { - Set types= KeywordSets.getKeywords(KeywordSetKey.TYPES, ParserLanguage.C); - return (String[]) types.toArray(new String[types.size()]); + Set types = KeywordSets.getKeywords(KeywordSetKey.TYPES, getParserLanguage()); + return types.toArray(new String[types.size()]); } - /* - * @see org.eclipse.cdt.core.model.ICLanguageKeywords#getPreprocessorKeywords() - */ + public String[] getPreprocessorKeywords() { - Set keywords= KeywordSets.getKeywords(KeywordSetKey.PP_DIRECTIVE, ParserLanguage.C); - keywords= new HashSet(keywords); + 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(); ) { @@ -227,6 +230,7 @@ public abstract class AbstractCLanguage extends AbstractLanguage implements ICLa keywords.add(new String(name)); } } - return (String[]) keywords.toArray(new String[keywords.size()]); + return keywords.toArray(new String[keywords.size()]); } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/cpp/AbstractCPPLanguage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/cpp/AbstractCPPLanguage.java deleted file mode 100644 index c744759ce1b..00000000000 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/cpp/AbstractCPPLanguage.java +++ /dev/null @@ -1,228 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Anton Leherbauer (Wind River Systems) - initial API and implementation - * Markus Schorn (Wind River Systems) - *******************************************************************************/ -package org.eclipse.cdt.core.dom.parser.cpp; - -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.IASTCompletionNode; -import org.eclipse.cdt.core.dom.ast.IASTName; -import org.eclipse.cdt.core.dom.ast.IASTNode; -import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; -import org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor; -import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration; -import org.eclipse.cdt.core.dom.parser.ISourceCodeParser; -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.IContributedModelBuilder; -import org.eclipse.cdt.core.model.ITranslationUnit; -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.cpp.GNUCPPSourceParser; -import org.eclipse.cdt.internal.core.parser.scanner.CPreprocessor; -import org.eclipse.cdt.internal.core.parser.token.KeywordSets; -import org.eclipse.cdt.internal.core.pdom.dom.IPDOMLinkageFactory; -import org.eclipse.cdt.internal.core.pdom.dom.cpp.PDOMCPPLinkageFactory; -import org.eclipse.core.runtime.CoreException; - -/** - * Abstract C++ language. Derived classes need only implement - * {@link getScannerExtensionConfiguration()} and - * {@link getParserExtensionConfiguration()}. - * - *

- * EXPERIMENTAL. This class or interface has been added as - * part of a work in progress. There is no guarantee that this API will work or - * that it will remain the same. Please do not use this API without consulting - * with the CDT team. - *

- * - * @see IScannerExtensionConfiguration - * @see ICPPParserExtensionConfiguration - * - * @since 4.0 - */ -public abstract class AbstractCPPLanguage extends AbstractLanguage implements ICLanguageKeywords { - - protected static class NameCollector extends CPPASTVisitor { - { - shouldVisitNames= true; - } - - private List nameList= new ArrayList(); - - public int visit(IASTName name) { - nameList.add(name); - return PROCESS_CONTINUE; - } - - public IASTName[] getNames() { - return (IASTName[]) nameList.toArray(new IASTName[nameList.size()]); - } - } - - public Object getAdapter(Class adapter) { - if (adapter == IPDOMLinkageFactory.class) { - return new PDOMCPPLinkageFactory(); - } - return super.getAdapter(adapter); - } - - public IASTTranslationUnit getASTTranslationUnit(CodeReader reader, IScannerInfo scanInfo, - ICodeReaderFactory codeReaderFactory, IIndex index,IParserLogService log) throws CoreException { - return getASTTranslationUnit(reader, scanInfo, codeReaderFactory, index, 0, log); - } - - public IASTTranslationUnit getASTTranslationUnit(CodeReader reader, IScannerInfo scanInfo, - ICodeReaderFactory codeReaderFactory, IIndex index, int options, IParserLogService log) throws CoreException { - - IScanner scanner= createScanner(reader, scanInfo, codeReaderFactory, log); - scanner.setScanComments((options & OPTION_ADD_COMMENTS) != 0); - ISourceCodeParser parser= createParser(scanner, log, index, false, options); - - // Parse - IASTTranslationUnit ast= parser.parse(); - return ast; - } - - public IASTCompletionNode getCompletionNode(CodeReader reader, IScannerInfo scanInfo, - ICodeReaderFactory fileCreator, IIndex index, IParserLogService log, int offset) throws CoreException { - IScanner scanner= createScanner(reader, scanInfo, fileCreator, log); - scanner.setContentAssistMode(offset); - - ISourceCodeParser parser= createParser(scanner, log, index, true, 0); - - // Run the parse and return the completion node - parser.parse(); - IASTCompletionNode node= parser.getCompletionNode(); - return node; - } - - public IASTName[] getSelectedNames(IASTTranslationUnit ast, int start, int length) { - IASTNode selectedNode= ast.selectNodeForLocation(ast.getFilePath(), start, length); - - if (selectedNode == null) - return new IASTName[0]; - - if (selectedNode instanceof IASTName) - return new IASTName[] { (IASTName) selectedNode }; - - NameCollector collector= new NameCollector(); - selectedNode.accept(collector); - return collector.getNames(); - } - - public IContributedModelBuilder createModelBuilder(ITranslationUnit tu) { - // Use the default CDT model builder - return null; - } - - /** - * Create the scanner to be used with the parser. - * - * @param reader the code reader for the main file - * @param scanInfo the scanner information (macros, include pathes) - * @param fileCreator the code reader factory for inclusions - * @param log the log for debugging - * @return an instance of IScanner - */ - protected IScanner createScanner(CodeReader reader, IScannerInfo scanInfo, ICodeReaderFactory fileCreator, IParserLogService log) { - return new CPreprocessor(reader, scanInfo, ParserLanguage.CPP, log, getScannerExtensionConfiguration(), fileCreator); - } - - /** - * Create the parser. - * - * @param scanner the IScanner to get tokens from - * @param log the parser log service - * @param index the index to help resolve bindings - * @param forCompletion whether the parser is used for code completion - * @param options for valid options see {@link AbstractLanguage#getASTTranslationUnit(CodeReader, IScannerInfo, ICodeReaderFactory, IIndex, int, IParserLogService)} - * @return an instance of ISourceCodeParser - */ - protected ISourceCodeParser createParser(IScanner scanner, IParserLogService log, IIndex index, boolean forCompletion, int options) { - ParserMode mode= null; - if (forCompletion) { - mode= ParserMode.COMPLETION_PARSE; - } - else if ((options & OPTION_SKIP_FUNCTION_BODIES) != 0) { - mode= ParserMode.STRUCTURAL_PARSE; - } - else { - mode= ParserMode.COMPLETE_PARSE; - } - return new GNUCPPSourceParser(scanner, mode, log, getParserExtensionConfiguration(), index); - } - - /** - * @return the scanner extension configuration for this language, may not - * return null - */ - protected abstract IScannerExtensionConfiguration getScannerExtensionConfiguration(); - - /** - * @return the parser extension configuration for this language, may not - * return null - */ - protected abstract AbstractCPPParserExtensionConfiguration getParserExtensionConfiguration(); - - /* - * @see org.eclipse.cdt.core.model.ICLanguageKeywords#getKeywords() - */ - public String[] getKeywords() { - Set keywords= KeywordSets.getKeywords(KeywordSetKey.KEYWORDS, ParserLanguage.CPP); - keywords= new HashSet(keywords); - CharArrayIntMap additionalKeywords= getScannerExtensionConfiguration().getAdditionalKeywords(); - if (additionalKeywords != null) { - for (Iterator iterator = additionalKeywords.toList().iterator(); iterator.hasNext(); ) { - char[] name = (char[]) iterator.next(); - keywords.add(new String(name)); - } - } - return (String[]) keywords.toArray(new String[keywords.size()]); - } - - /* - * @see org.eclipse.cdt.core.model.ICLanguageKeywords#getBuiltinTypes() - */ - public String[] getBuiltinTypes() { - Set types= KeywordSets.getKeywords(KeywordSetKey.TYPES, ParserLanguage.CPP); - return (String[]) types.toArray(new String[types.size()]); - } - - /* - * @see org.eclipse.cdt.core.model.ICLanguageKeywords#getPreprocessorKeywords() - */ - public String[] getPreprocessorKeywords() { - Set keywords= KeywordSets.getKeywords(KeywordSetKey.PP_DIRECTIVE, ParserLanguage.CPP); - keywords= new HashSet(keywords); - CharArrayIntMap additionalKeywords= getScannerExtensionConfiguration().getAdditionalPreprocessorKeywords(); - if (additionalKeywords != null) { - for (Iterator iterator = additionalKeywords.toList().iterator(); iterator.hasNext(); ) { - char[] name = (char[]) iterator.next(); - keywords.add(new String(name)); - } - } - return (String[]) keywords.toArray(new String[keywords.size()]); - } -} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/KeywordSets.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/KeywordSets.java index 1f6e5b7ab76..e471ac4c739 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/KeywordSets.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/KeywordSets.java @@ -10,8 +10,9 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.parser.token; +import java.util.HashMap; import java.util.HashSet; -import java.util.Hashtable; +import java.util.Map; import java.util.Set; import java.util.TreeSet; @@ -25,16 +26,16 @@ import org.eclipse.cdt.core.parser.ParserLanguage; */ public class KeywordSets { - public static Set getKeywords( KeywordSetKey kind, ParserLanguage language ) + public static Set getKeywords( KeywordSetKey kind, ParserLanguage language ) { if( kind == KeywordSetKey.EMPTY ) return EMPTY_TABLE; if( kind == KeywordSetKey.DECL_SPECIFIER_SEQUENCE ) - return (Set) DECL_SPECIFIER_SEQUENCE_TABLE.get( language ); + return DECL_SPECIFIER_SEQUENCE_TABLE.get( language ); if( kind == KeywordSetKey.DECLARATION ) - return (Set) DECLARATION_TABLE.get( language ); + return DECLARATION_TABLE.get( language ); if( kind == KeywordSetKey.STATEMENT ) - return (Set) STATEMENT_TABLE.get( language ); + return STATEMENT_TABLE.get( language ); if( kind == KeywordSetKey.BASE_SPECIFIER ) return BASE_SPECIFIER_CPP; if( kind == KeywordSetKey.MEMBER ) @@ -46,46 +47,46 @@ public class KeywordSets { if( kind == KeywordSetKey.POST_USING ) return POST_USING_CPP; if( kind == KeywordSetKey.FUNCTION_MODIFIER ) - return (Set) FUNCTION_MODIFIER_TABLE.get( language ); + return FUNCTION_MODIFIER_TABLE.get( language ); if( kind == KeywordSetKey.NAMESPACE_ONLY ) return NAMESPACE_ONLY_SET; if( kind == KeywordSetKey.MACRO ) return MACRO_ONLY; if( kind == KeywordSetKey.PP_DIRECTIVE ) - return (Set) PP_DIRECTIVES_TABLE.get( language ); + return PP_DIRECTIVES_TABLE.get( language ); if( kind == KeywordSetKey.EXPRESSION ) - return (Set) EXPRESSION_TABLE.get( language ); + return EXPRESSION_TABLE.get( language ); if( kind == KeywordSetKey.ALL ) - return (Set) ALL_TABLE.get( language ); + return ALL_TABLE.get( language ); if( kind == KeywordSetKey.KEYWORDS ) - return (Set) KEYWORDS_TABLE.get( language ); + return KEYWORDS_TABLE.get( language ); if( kind == KeywordSetKey.TYPES ) - return (Set) TYPES_TABLE.get( language ); + return TYPES_TABLE.get( language ); //TODO finish this return null; } - private static final Set EMPTY_TABLE = new HashSet(0); + private static final Set EMPTY_TABLE = new HashSet(0); - private static final Set NAMESPACE_ONLY_SET; + private static final Set NAMESPACE_ONLY_SET; static { - NAMESPACE_ONLY_SET = new HashSet(1); + NAMESPACE_ONLY_SET = new HashSet(1); NAMESPACE_ONLY_SET.add(Keywords.NAMESPACE ); } - private static final Set MACRO_ONLY; + private static final Set MACRO_ONLY; static { - MACRO_ONLY = new HashSet(1); + MACRO_ONLY = new HashSet(1); MACRO_ONLY.add("defined()" ); //$NON-NLS-1$ } - private static final Set DECL_SPECIFIER_SEQUENCE_C; + private static final Set DECL_SPECIFIER_SEQUENCE_C; static { - DECL_SPECIFIER_SEQUENCE_C = new TreeSet(); + DECL_SPECIFIER_SEQUENCE_C = new TreeSet(); DECL_SPECIFIER_SEQUENCE_C.add( Keywords.INLINE ); DECL_SPECIFIER_SEQUENCE_C.add( Keywords.AUTO); DECL_SPECIFIER_SEQUENCE_C.add( Keywords.REGISTER); @@ -113,10 +114,10 @@ public class KeywordSets { DECL_SPECIFIER_SEQUENCE_C.add( Keywords.ENUM); } - private static final Set DECL_SPECIFIER_SEQUENCE_CPP; + private static final Set DECL_SPECIFIER_SEQUENCE_CPP; static { - DECL_SPECIFIER_SEQUENCE_CPP = new TreeSet(); + DECL_SPECIFIER_SEQUENCE_CPP = new TreeSet(); // add all of C then remove the ones we don't need DECL_SPECIFIER_SEQUENCE_CPP.addAll( DECL_SPECIFIER_SEQUENCE_C ); DECL_SPECIFIER_SEQUENCE_CPP.remove( Keywords._COMPLEX); @@ -132,18 +133,18 @@ public class KeywordSets { DECL_SPECIFIER_SEQUENCE_CPP.add( Keywords.CLASS); } - private static final Hashtable DECL_SPECIFIER_SEQUENCE_TABLE; + private static final Map> DECL_SPECIFIER_SEQUENCE_TABLE; static { - DECL_SPECIFIER_SEQUENCE_TABLE = new Hashtable(); + DECL_SPECIFIER_SEQUENCE_TABLE = new HashMap>(); DECL_SPECIFIER_SEQUENCE_TABLE.put( ParserLanguage.CPP, DECL_SPECIFIER_SEQUENCE_CPP ); DECL_SPECIFIER_SEQUENCE_TABLE.put( ParserLanguage.C, DECL_SPECIFIER_SEQUENCE_C ); } - private static final Set DECLARATION_CPP; + private static final Set DECLARATION_CPP; static { - DECLARATION_CPP = new TreeSet(); + DECLARATION_CPP = new TreeSet(); DECLARATION_CPP.addAll( DECL_SPECIFIER_SEQUENCE_CPP ); DECLARATION_CPP.add( Keywords.ASM ); DECLARATION_CPP.add( Keywords.TEMPLATE ); @@ -152,26 +153,26 @@ public class KeywordSets { DECLARATION_CPP.add( Keywords.EXPORT ); } - private static final Set DECLARATION_C; + private static final Set DECLARATION_C; static { - DECLARATION_C = new TreeSet(); + DECLARATION_C = new TreeSet(); DECLARATION_C.addAll(DECL_SPECIFIER_SEQUENCE_C ); DECLARATION_C.add(Keywords.ASM ); } - private static final Hashtable DECLARATION_TABLE; + private static final Map> DECLARATION_TABLE; static { - DECLARATION_TABLE = new Hashtable(); + DECLARATION_TABLE = new HashMap>(); DECLARATION_TABLE.put( ParserLanguage.CPP, DECLARATION_CPP ); DECLARATION_TABLE.put( ParserLanguage.C, DECLARATION_C ); } - private static final Set EXPRESSION_C; + private static final Set EXPRESSION_C; static { - EXPRESSION_C = new TreeSet(); + EXPRESSION_C = new TreeSet(); EXPRESSION_C.add( Keywords.CHAR ); EXPRESSION_C.add( Keywords.WCHAR_T); EXPRESSION_C.add( Keywords.SHORT); @@ -185,10 +186,10 @@ public class KeywordSets { } - private static final Set EXPRESSION_CPP; + private static final Set EXPRESSION_CPP; static { - EXPRESSION_CPP = new TreeSet(EXPRESSION_C); + EXPRESSION_CPP = new TreeSet(EXPRESSION_C); EXPRESSION_CPP.add( Keywords.BOOL ); EXPRESSION_CPP.add( Keywords.NEW ); EXPRESSION_CPP.add( Keywords.DELETE ); @@ -205,18 +206,18 @@ public class KeywordSets { EXPRESSION_CPP.add( Keywords.THROW ); } - private static final Hashtable EXPRESSION_TABLE; + private static final Map> EXPRESSION_TABLE; static { - EXPRESSION_TABLE = new Hashtable(); + EXPRESSION_TABLE = new HashMap>(); EXPRESSION_TABLE.put( ParserLanguage.CPP, EXPRESSION_CPP ); EXPRESSION_TABLE.put( ParserLanguage.C, EXPRESSION_C ); } - private static final Set STATEMENT_C; + private static final Set STATEMENT_C; static { - STATEMENT_C= new TreeSet(); + STATEMENT_C= new TreeSet(); STATEMENT_C.addAll( DECLARATION_C ); STATEMENT_C.addAll( EXPRESSION_C ); STATEMENT_C.add( Keywords.FOR ); @@ -233,10 +234,10 @@ public class KeywordSets { STATEMENT_C.add( Keywords.DO); } - private static final Set STATEMENT_CPP; + private static final Set STATEMENT_CPP; static { - STATEMENT_CPP = new TreeSet( DECLARATION_CPP ); + STATEMENT_CPP = new TreeSet( DECLARATION_CPP ); STATEMENT_CPP.addAll( EXPRESSION_CPP ); STATEMENT_CPP.add( Keywords.TRY ); STATEMENT_CPP.add( Keywords.FOR ); @@ -254,65 +255,65 @@ public class KeywordSets { STATEMENT_CPP.add( Keywords.DO); } - private static final Hashtable STATEMENT_TABLE; + private static final Map> STATEMENT_TABLE; static { - STATEMENT_TABLE = new Hashtable(); + STATEMENT_TABLE = new HashMap>(); STATEMENT_TABLE.put( ParserLanguage.CPP, STATEMENT_CPP); STATEMENT_TABLE.put( ParserLanguage.C, STATEMENT_C ); } - private static final Set BASE_SPECIFIER_CPP; + private static final Set BASE_SPECIFIER_CPP; static { - BASE_SPECIFIER_CPP = new TreeSet(); + BASE_SPECIFIER_CPP = new TreeSet(); BASE_SPECIFIER_CPP.add(Keywords.PUBLIC); BASE_SPECIFIER_CPP.add(Keywords.PROTECTED); BASE_SPECIFIER_CPP.add(Keywords.PRIVATE); BASE_SPECIFIER_CPP.add(Keywords.VIRTUAL); } - private static final Set CLASS_MEMBER; + private static final Set CLASS_MEMBER; static { - CLASS_MEMBER = new TreeSet(DECL_SPECIFIER_SEQUENCE_CPP); + CLASS_MEMBER = new TreeSet(DECL_SPECIFIER_SEQUENCE_CPP); CLASS_MEMBER.add(Keywords.PUBLIC); CLASS_MEMBER.add(Keywords.PROTECTED); CLASS_MEMBER.add(Keywords.PRIVATE); } - private static final Set POST_USING_CPP; + private static final Set POST_USING_CPP; static { - POST_USING_CPP = new TreeSet(); + POST_USING_CPP = new TreeSet(); POST_USING_CPP.add(Keywords.NAMESPACE); POST_USING_CPP.add(Keywords.TYPENAME); } - private static final Set FUNCTION_MODIFIER_C = EMPTY_TABLE; + private static final Set FUNCTION_MODIFIER_C = EMPTY_TABLE; - private static final Set FUNCTION_MODIFIER_CPP; + private static final Set FUNCTION_MODIFIER_CPP; static { - FUNCTION_MODIFIER_CPP = new TreeSet( FUNCTION_MODIFIER_C ); + FUNCTION_MODIFIER_CPP = new TreeSet( FUNCTION_MODIFIER_C ); FUNCTION_MODIFIER_CPP.add( Keywords.THROW); FUNCTION_MODIFIER_CPP.add( Keywords.TRY ); FUNCTION_MODIFIER_CPP.add( Keywords.VOLATILE ); } - private static final Hashtable FUNCTION_MODIFIER_TABLE; + private static final Map> FUNCTION_MODIFIER_TABLE; static { - FUNCTION_MODIFIER_TABLE= new Hashtable(2); + FUNCTION_MODIFIER_TABLE= new HashMap>(2); FUNCTION_MODIFIER_TABLE.put( ParserLanguage.CPP, FUNCTION_MODIFIER_CPP ); FUNCTION_MODIFIER_TABLE.put( ParserLanguage.C, FUNCTION_MODIFIER_C ); } - private static final Set PP_DIRECTIVES_C; + private static final Set PP_DIRECTIVES_C; static { - PP_DIRECTIVES_C = new TreeSet(); + PP_DIRECTIVES_C = new TreeSet(); PP_DIRECTIVES_C.add(Directives.POUND_BLANK); PP_DIRECTIVES_C.add(Directives.POUND_DEFINE); PP_DIRECTIVES_C.add(Directives.POUND_UNDEF); @@ -330,10 +331,10 @@ public class KeywordSets { } - private static final Set PP_DIRECTIVES_CPP; + private static final Set PP_DIRECTIVES_CPP; static { - PP_DIRECTIVES_CPP = new TreeSet(); + PP_DIRECTIVES_CPP = new TreeSet(); PP_DIRECTIVES_CPP.add(Directives.POUND_BLANK); PP_DIRECTIVES_CPP.add(Directives.POUND_DEFINE); PP_DIRECTIVES_CPP.add(Directives.POUND_UNDEF); @@ -349,10 +350,10 @@ public class KeywordSets { PP_DIRECTIVES_CPP.add(Directives.POUND_ELIF); } - private static final Set ALL_C; + private static final Set ALL_C; static { - ALL_C = new TreeSet(PP_DIRECTIVES_CPP); + ALL_C = new TreeSet(PP_DIRECTIVES_CPP); ALL_C.add( Keywords.AUTO); ALL_C.add( Keywords.BREAK); ALL_C.add( Keywords.CASE); @@ -393,10 +394,10 @@ public class KeywordSets { ALL_C.add( Keywords._IMAGINARY); } - private static final Set ALL_CPP; + private static final Set ALL_CPP; static { - ALL_CPP = new TreeSet(PP_DIRECTIVES_CPP); + ALL_CPP = new TreeSet(PP_DIRECTIVES_CPP); ALL_CPP.add( Keywords.AND ); ALL_CPP.add( Keywords.AND_EQ); ALL_CPP.add( Keywords.ASM); @@ -473,18 +474,18 @@ public class KeywordSets { ALL_CPP.add( Keywords.XOR_EQ); } - private static final Hashtable ALL_TABLE; + private static final Map> ALL_TABLE; static { - ALL_TABLE = new Hashtable( 2 ); + ALL_TABLE = new HashMap>( 2 ); ALL_TABLE.put( ParserLanguage.C, ALL_C ); ALL_TABLE.put( ParserLanguage.CPP, ALL_CPP ); } - private static final Set KEYWORDS_CPP; + private static final Set KEYWORDS_CPP; static { - KEYWORDS_CPP = new TreeSet(); + KEYWORDS_CPP = new TreeSet(); KEYWORDS_CPP.add( Keywords.AND ); KEYWORDS_CPP.add( Keywords.AND_EQ ); KEYWORDS_CPP.add( Keywords.ASM ); @@ -552,10 +553,10 @@ public class KeywordSets { } - private static Set KEYWORDS_C; + private static Set KEYWORDS_C; static { - KEYWORDS_C = new TreeSet(); + KEYWORDS_C = new TreeSet(); KEYWORDS_C.add( Keywords.ASM ); KEYWORDS_C.add( Keywords.AUTO ); KEYWORDS_C.add( Keywords.BREAK ); @@ -586,18 +587,18 @@ public class KeywordSets { - private static final Hashtable KEYWORDS_TABLE; + private static final Map> KEYWORDS_TABLE; static { - KEYWORDS_TABLE = new Hashtable(2); + KEYWORDS_TABLE = new HashMap>(2); KEYWORDS_TABLE.put( ParserLanguage.C, KEYWORDS_C ); KEYWORDS_TABLE.put( ParserLanguage.CPP, KEYWORDS_CPP ); } - private static final Set TYPES_C; + private static final Set TYPES_C; static { - TYPES_C = new TreeSet(); + TYPES_C = new TreeSet(); TYPES_C.add( Keywords.CHAR ); TYPES_C.add( Keywords.DOUBLE ); TYPES_C.add( Keywords.FLOAT ); @@ -611,10 +612,10 @@ public class KeywordSets { TYPES_C.add( Keywords._COMPLEX ); TYPES_C.add( Keywords._IMAGINARY ); } - private static final Set TYPES_CPP; + private static final Set TYPES_CPP; static { - TYPES_CPP = new TreeSet(); + TYPES_CPP = new TreeSet(); TYPES_CPP.add( Keywords.BOOL ); TYPES_CPP.add( Keywords.CHAR ); TYPES_CPP.add( Keywords.DOUBLE ); @@ -628,18 +629,18 @@ public class KeywordSets { TYPES_CPP.add( Keywords.WCHAR_T ); } - private static Hashtable TYPES_TABLE; + private static Map> TYPES_TABLE; static { - TYPES_TABLE = new Hashtable( 2 ); + TYPES_TABLE = new HashMap>( 2 ); TYPES_TABLE.put( ParserLanguage.C, TYPES_C ); TYPES_TABLE.put( ParserLanguage.CPP, TYPES_CPP ); } - private static Hashtable PP_DIRECTIVES_TABLE; + private static Map> PP_DIRECTIVES_TABLE; static { - PP_DIRECTIVES_TABLE = new Hashtable( 2 ); + PP_DIRECTIVES_TABLE = new HashMap>( 2 ); PP_DIRECTIVES_TABLE.put( ParserLanguage.C, PP_DIRECTIVES_C ); PP_DIRECTIVES_TABLE.put( ParserLanguage.CPP, PP_DIRECTIVES_CPP ); }