diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ICLanguageKeywords.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ICLanguageKeywords.java new file mode 100644 index 00000000000..9845990712b --- /dev/null +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ICLanguageKeywords.java @@ -0,0 +1,49 @@ +/******************************************************************************* + * 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 + *******************************************************************************/ +package org.eclipse.cdt.core.model; + +/** + * This is an optional extension interface to {@link ILanguage} which allows + * a C/C++ language variant to expose the set of keywords it defines. + * + *

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

+ * + * @since 4.0 + */ +public interface ICLanguageKeywords { + + /** + * Get the keywords defined for this language, excluding bult-in types. + * + * @return an array of keywords, never null + */ + public abstract String[] getKeywords(); + + /** + * Get the built-in type names defined for this language. + * + * @return an array of names, never null + */ + public abstract String[] getBuiltinTypes(); + + /** + * Get the preprocessor keywords (directives) defined for this language. + * + * @return an array of keywords, never null + */ + public abstract String[] getPreprocessorKeywords(); + +} 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/c/AbstractCLanguage.java index 5557b4b69cc..55a85168011 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/c/AbstractCLanguage.java @@ -11,7 +11,10 @@ package org.eclipse.cdt.core.dom.parser.c; 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.ASTCompletionNode; @@ -25,15 +28,18 @@ 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.IContributedModelBuilder; +import org.eclipse.cdt.core.model.ICLanguageKeywords; 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.internal.core.dom.parser.c.GNUCSourceParser; import org.eclipse.cdt.internal.core.parser.scanner2.DOMScanner; +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; @@ -55,7 +61,7 @@ import org.eclipse.core.runtime.CoreException; * * @since 4.0 */ -public abstract class AbstractCLanguage extends AbstractLanguage { +public abstract class AbstractCLanguage extends AbstractLanguage implements ICLanguageKeywords { protected static class NameCollector extends CASTVisitor { { @@ -75,10 +81,10 @@ public abstract class AbstractCLanguage extends AbstractLanguage { } public Object getAdapter(Class adapter) { - if (adapter == IPDOMLinkageFactory.class) + if (adapter == IPDOMLinkageFactory.class) { return new PDOMCLinkageFactory(); - else - return super.getAdapter(adapter); + } + return super.getAdapter(adapter); } public IASTTranslationUnit getASTTranslationUnit(CodeReader reader, IScannerInfo scanInfo, @@ -169,4 +175,39 @@ public abstract class AbstractCLanguage extends AbstractLanguage { */ 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); + List additionalKeywords= getScannerExtensionConfiguration().getAdditionalKeywords().toList(); + for (Iterator iterator = additionalKeywords.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.C); + 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.C); + keywords= new HashSet(keywords); + List additionalKeywords= getScannerExtensionConfiguration().getAdditionalPreprocessorKeywords().toList(); + for (Iterator iterator = additionalKeywords.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/core/dom/parser/cpp/AbstractCPPLanguage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/cpp/AbstractCPPLanguage.java index b8e57dd2564..766d3410972 100644 --- 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 @@ -11,7 +11,10 @@ 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.ASTCompletionNode; @@ -23,16 +26,19 @@ 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.internal.core.dom.parser.cpp.GNUCPPSourceParser; import org.eclipse.cdt.internal.core.parser.scanner2.DOMScanner; +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; @@ -54,7 +60,7 @@ import org.eclipse.core.runtime.CoreException; * * @since 4.0 */ -public abstract class AbstractCPPLanguage extends AbstractLanguage { +public abstract class AbstractCPPLanguage extends AbstractLanguage implements ICLanguageKeywords { protected static class NameCollector extends CPPASTVisitor { { @@ -74,10 +80,10 @@ public abstract class AbstractCPPLanguage extends AbstractLanguage { } public Object getAdapter(Class adapter) { - if (adapter == IPDOMLinkageFactory.class) + if (adapter == IPDOMLinkageFactory.class) { return new PDOMCPPLinkageFactory(); - else - return super.getAdapter(adapter); + } + return super.getAdapter(adapter); } public IASTTranslationUnit getASTTranslationUnit(CodeReader reader, IScannerInfo scanInfo, @@ -166,4 +172,39 @@ public abstract class AbstractCPPLanguage extends AbstractLanguage { */ 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); + List additionalKeywords= getScannerExtensionConfiguration().getAdditionalKeywords().toList(); + for (Iterator iterator = additionalKeywords.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); + List additionalKeywords= getScannerExtensionConfiguration().getAdditionalPreprocessorKeywords().toList(); + for (Iterator iterator = additionalKeywords.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/core/dom/parser/cpp/GPPScannerExtensionConfiguration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/cpp/GPPScannerExtensionConfiguration.java index 2984be5df35..23e9edeaa23 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/cpp/GPPScannerExtensionConfiguration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/cpp/GPPScannerExtensionConfiguration.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004, 2005 IBM Corporation and others. + * Copyright (c) 2004, 2007 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 @@ -8,11 +8,11 @@ * Contributors: * IBM - Initial API and implementation * Ed Swartz (Nokia) + * Anton Leherbauer (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.parser.GNUScannerExtensionConfiguration; -import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration; import org.eclipse.cdt.core.parser.GCCKeywords; import org.eclipse.cdt.core.parser.IGCCToken; import org.eclipse.cdt.core.parser.IToken; @@ -22,8 +22,7 @@ import org.eclipse.cdt.core.parser.util.CharArrayIntMap; /** * @author jcamelon */ -public class GPPScannerExtensionConfiguration extends GNUScannerExtensionConfiguration implements - IScannerExtensionConfiguration { +public class GPPScannerExtensionConfiguration extends GNUScannerExtensionConfiguration { /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.parser.scanner2.IScannerConfiguration#supportMinAndMaxOperators() diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CCodeScanner.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CCodeScanner.java index 7a01b06ce2a..4820b3627e3 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CCodeScanner.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CCodeScanner.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2006 IBM Corporation and others. + * Copyright (c) 2000, 2007 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 @@ -13,34 +13,25 @@ package org.eclipse.cdt.internal.ui.text; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.text.rules.IRule; import org.eclipse.jface.text.rules.Token; import org.eclipse.jface.text.rules.WhitespaceRule; import org.eclipse.jface.text.rules.WordRule; import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.cdt.core.parser.KeywordSetKey; -import org.eclipse.cdt.core.parser.ParserFactory; -import org.eclipse.cdt.core.parser.ParserLanguage; +import org.eclipse.cdt.core.model.ICLanguageKeywords; import org.eclipse.cdt.internal.ui.text.util.CWhitespaceDetector; import org.eclipse.cdt.internal.ui.text.util.CWordDetector; /** - * A C code scanner. + * A C/C++ code scanner. */ public final class CCodeScanner extends AbstractCScanner { - /** Constants which are additionally colored. */ - private static String[] fgConstants= { "NULL", "__DATE__", "__LINE__", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - "__TIME__", "__FILE__", "__STDC__", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - "bool", "TRUE", "FALSE", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - "EXT_TEXT"}; //$NON-NLS-1$ /** Properties for tokens. */ private static String[] fgTokenProperties= { ICColorConstants.C_KEYWORD, @@ -50,26 +41,29 @@ public final class CCodeScanner extends AbstractCScanner { ICColorConstants.C_NUMBER, ICColorConstants.C_DEFAULT, }; - + private ICLanguageKeywords fKeywords; /** - * Creates a C code scanner. - * @param manager Color manager. - * @param store Preference store. + * Creates a C/C++ code scanner. + * + * @param manager the color manager + * @param store the reference store + * @param keywords the keywords defined by the language dialect */ - public CCodeScanner(IColorManager manager, IPreferenceStore store) { + public CCodeScanner(IColorManager manager, IPreferenceStore store, ICLanguageKeywords keywords) { super(manager, store); + fKeywords= keywords; initialize(); } - - /** + + /* * @see AbstractCScanner#getTokenProperties() */ protected String[] getTokenProperties() { return fgTokenProperties; } - /** + /* * @see AbstractCScanner#createRules() */ protected List createRules() { @@ -85,17 +79,15 @@ public final class CCodeScanner extends AbstractCScanner { WordRule wordRule= new WordRule(new CWordDetector(), token); token= getToken(ICColorConstants.C_KEYWORD); - Iterator i = ParserFactory.getKeywordSet( KeywordSetKey.KEYWORDS, ParserLanguage.C ).iterator(); - while( i.hasNext() ) - wordRule.addWord((String) i.next(), token); + String[] keywords= fKeywords.getKeywords(); + for (int i = 0; i < keywords.length; i++) { + wordRule.addWord(keywords[i], token); + } token= getToken(ICColorConstants.C_TYPE); - i = ParserFactory.getKeywordSet( KeywordSetKey.TYPES, ParserLanguage.C ).iterator(); - while( i.hasNext() ) - wordRule.addWord((String) i.next(), token); - - for (int j=0; jtrue C++ keywords are used, else C keywords + * @param manager the color manager + * @param store the preference store + * @param keywords the keywords defined by the language dialect */ - public CPreprocessorScanner(IColorManager manager, IPreferenceStore store, boolean isCpp) { + public CPreprocessorScanner(IColorManager manager, IPreferenceStore store, ICLanguageKeywords keywords) { super(manager, store); - fIsCpp= isCpp; + fKeywords= keywords; initialize(); } @@ -80,14 +75,11 @@ public class CPreprocessorScanner extends AbstractCScanner { token= getToken(ICColorConstants.PP_DIRECTIVE); PreprocessorRule preprocessorRule = new PreprocessorRule(new CWordDetector(), token); - Iterator iter; - if (fIsCpp) { - iter = ParserFactory.getKeywordSet( KeywordSetKey.PP_DIRECTIVE, ParserLanguage.CPP ).iterator(); - } else { - iter = ParserFactory.getKeywordSet( KeywordSetKey.PP_DIRECTIVE, ParserLanguage.C ).iterator(); + token= getToken(ICColorConstants.C_TYPE); + String[] ppKeywords= fKeywords.getPreprocessorKeywords(); + for (int i = 0; i < ppKeywords.length; i++) { + preprocessorRule.addWord(ppKeywords[i], token); } - while( iter.hasNext() ) - preprocessorRule.addWord((String) iter.next(), token); // add ## operator preprocessorRule.addWord("##", token); //$NON-NLS-1$ @@ -97,19 +89,16 @@ public class CPreprocessorScanner extends AbstractCScanner { WordRule wordRule= new WordRule(new CWordDetector(), defaultToken); token= getToken(ICColorConstants.C_KEYWORD); - if (fIsCpp) { - iter = ParserFactory.getKeywordSet( KeywordSetKey.KEYWORDS, ParserLanguage.CPP ).iterator(); - } else { - iter = ParserFactory.getKeywordSet( KeywordSetKey.KEYWORDS, ParserLanguage.C ).iterator(); + String[] keywords= fKeywords.getKeywords(); + for (int i = 0; i < keywords.length; i++) { + wordRule.addWord(keywords[i], token); } - while( iter.hasNext() ) - wordRule.addWord((String) iter.next(), token); - - token= getToken(ICColorConstants.C_TYPE); - iter = ParserFactory.getKeywordSet( KeywordSetKey.TYPES, ParserLanguage.C ).iterator(); - while( iter.hasNext() ) - wordRule.addWord((String) iter.next(), token); - rules.add(wordRule); + token= getToken(ICColorConstants.C_TYPE); + String[] types= fKeywords.getBuiltinTypes(); + for (int i = 0; i < types.length; i++) { + wordRule.addWord(types[i], token); + } + rules.add(wordRule); token = getToken(ICColorConstants.PP_HEADER); CHeaderRule headerRule = new CHeaderRule(token); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java index b8040a09963..23de0133e7d 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java @@ -63,10 +63,10 @@ import org.eclipse.ui.texteditor.IDocumentProvider; import org.eclipse.ui.texteditor.ITextEditor; import org.eclipse.cdt.core.CCorePlugin; -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.formatter.DefaultCodeFormatterConstants; import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.core.model.ICLanguageKeywords; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ILanguage; import org.eclipse.cdt.core.model.ITranslationUnit; @@ -101,13 +101,9 @@ public class CSourceViewerConfiguration extends TextSourceViewerConfiguration { */ private String fDocumentPartitioning; /** - * The C++ source code scanner. + * The code scanner. */ - private AbstractCScanner fCppCodeScanner; - /** - * The C source code scanner. - */ - private AbstractCScanner fCCodeScanner; + private AbstractCScanner fCodeScanner; /** * The C multi-line comment scanner. */ @@ -120,18 +116,14 @@ public class CSourceViewerConfiguration extends TextSourceViewerConfiguration { * The C string scanner. */ private AbstractCScanner fStringScanner; + /** + * The preprocessor scanner. + */ + private AbstractCScanner fPreprocessorScanner; /** * The color manager. */ private IColorManager fColorManager; - /** - * The C preprocessor scanner. - */ - private AbstractCScanner fCPreprocessorScanner; - /** - * The C++ preprocessor scanner. - */ - private AbstractCScanner fCppPreprocessorScanner; /** * Creates a new C source viewer configuration for viewers in the given editor @@ -162,6 +154,8 @@ public class CSourceViewerConfiguration extends TextSourceViewerConfiguration { * * @param tools the C text tools collection to be used * @param editor the editor in which the configured viewer will reside + * + * @deprecated Use {@link #CSourceViewerConfiguration(IColorManager colorManager, IPreferenceStore preferenceStore, ITextEditor editor, String partitioning)} instead. */ public CSourceViewerConfiguration(CTextTools tools, ITextEditor editor) { super(CUIPlugin.getDefault().getCombinedPreferenceStore()); @@ -169,13 +163,9 @@ public class CSourceViewerConfiguration extends TextSourceViewerConfiguration { fColorManager= tools.getColorManager(); fTextEditor= editor; fDocumentPartitioning= fTextTools.getDocumentPartitioning(); - fCppCodeScanner= (AbstractCScanner) fTextTools.getCppCodeScanner(); - fCCodeScanner= (AbstractCScanner) fTextTools.getCCodeScanner(); fMultilineCommentScanner= (AbstractCScanner) fTextTools.getMultilineCommentScanner(); fSinglelineCommentScanner= (AbstractCScanner) fTextTools.getSinglelineCommentScanner(); fStringScanner= (AbstractCScanner) fTextTools.getStringScanner(); - fCPreprocessorScanner= (AbstractCScanner) fTextTools.getCPreprocessorScanner(); - fCppPreprocessorScanner= (AbstractCScanner) fTextTools.getCppPreprocessorScanner(); } /** @@ -206,21 +196,31 @@ public class CSourceViewerConfiguration extends TextSourceViewerConfiguration { } /** - * Returns the C preprocessor scanner for this configuration. + * Returns the preprocessor scanner for this configuration. * - * @return the C preprocessor scanner + * @return the preprocessor scanner */ - protected RuleBasedScanner getCPreprocessorScanner() { - return fCPreprocessorScanner; - } - - /** - * Returns the C++ preprocessor scanner for this configuration. - * - * @return the C++ preprocessor scanner - */ - protected RuleBasedScanner getCppPreprocessorScanner() { - return fCppPreprocessorScanner; + protected RuleBasedScanner getPreprocessorScanner(ILanguage language) { + if (fPreprocessorScanner != null) { + return fPreprocessorScanner; + } + if (isNewSetup()) { + AbstractCScanner scanner= null; + if (language instanceof ICLanguageKeywords) { + scanner= new CPreprocessorScanner(getColorManager(), fPreferenceStore, (ICLanguageKeywords)language); + } + if (scanner == null) { + scanner= new CPreprocessorScanner(getColorManager(), fPreferenceStore, GPPLanguage.getDefault()); + } + fPreprocessorScanner= scanner; + } else { + if (language instanceof ICLanguageKeywords) { + return fTextTools.getCPreprocessorScanner(); + } else { + return fTextTools.getCppPreprocessorScanner(); + } + } + return fPreprocessorScanner; } /** @@ -286,13 +286,9 @@ public class CSourceViewerConfiguration extends TextSourceViewerConfiguration { */ private void initializeScanners() { Assert.isTrue(isNewSetup()); - fCppCodeScanner= new CppCodeScanner(getColorManager(), fPreferenceStore); - fCCodeScanner= new CCodeScanner(getColorManager(), fPreferenceStore); fMultilineCommentScanner= new CCommentScanner(getColorManager(), fPreferenceStore, ICColorConstants.C_MULTI_LINE_COMMENT); fSinglelineCommentScanner= new CCommentScanner(getColorManager(), fPreferenceStore, ICColorConstants.C_SINGLE_LINE_COMMENT); fStringScanner= new SingleTokenCScanner(getColorManager(), fPreferenceStore, ICColorConstants.C_STRING); - fCppPreprocessorScanner= new CPreprocessorScanner(fColorManager, fPreferenceStore, true); - fCPreprocessorScanner= new CPreprocessorScanner(fColorManager, fPreferenceStore, false); } /** @@ -302,20 +298,8 @@ public class CSourceViewerConfiguration extends TextSourceViewerConfiguration { CPresentationReconciler reconciler= new CPresentationReconciler(); reconciler.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer)); - RuleBasedScanner scanner = null; - ILanguage language = getLanguage(); - if (language instanceof GPPLanguage) { - scanner = fCppCodeScanner; - } else if (language instanceof GCCLanguage) { - scanner = fCCodeScanner; - } else if (language != null) { - ILanguageUI languageUI = (ILanguageUI)language.getAdapter(ILanguageUI.class); - if (languageUI != null) - scanner = languageUI.getCodeScanner(); - } - if (scanner == null) { - scanner= fCppCodeScanner; - } + ILanguage language= getLanguage(); + RuleBasedScanner scanner = getCodeScanner(language); DefaultDamagerRepairer dr= new DefaultDamagerRepairer(scanner); @@ -340,13 +324,7 @@ public class CSourceViewerConfiguration extends TextSourceViewerConfiguration { reconciler.setDamager(dr, ICPartitions.C_CHARACTER); reconciler.setRepairer(dr, ICPartitions.C_CHARACTER); - if (language instanceof GPPLanguage) { - dr= new DefaultDamagerRepairer(getCppPreprocessorScanner()); - } else if (language instanceof GCCLanguage) { - dr= new DefaultDamagerRepairer(getCPreprocessorScanner()); - } else { - dr= new DefaultDamagerRepairer(getCppPreprocessorScanner()); - } + dr= new DefaultDamagerRepairer(getPreprocessorScanner(language)); if (dr != null) { reconciler.setDamager(new PartitionDamager(), ICPartitions.C_PREPROCESSOR); reconciler.setRepairer(dr, ICPartitions.C_PREPROCESSOR); @@ -355,6 +333,39 @@ public class CSourceViewerConfiguration extends TextSourceViewerConfiguration { return reconciler; } + /** + * @return the code scanner for the given language + */ + protected RuleBasedScanner getCodeScanner(ILanguage language) { + if (fCodeScanner != null) { + return fCodeScanner; + } + if (isNewSetup()) { + RuleBasedScanner scanner= null; + if (language instanceof ICLanguageKeywords) { + ICLanguageKeywords cLang= (ICLanguageKeywords)language; + scanner = new CCodeScanner(getColorManager(), fPreferenceStore, cLang); + } else if (language != null) { + ILanguageUI languageUI = (ILanguageUI)language.getAdapter(ILanguageUI.class); + if (languageUI != null) + scanner = languageUI.getCodeScanner(); + } + if (scanner == null) { + scanner = new CCodeScanner(getColorManager(), fPreferenceStore, GPPLanguage.getDefault()); + } + if (scanner instanceof AbstractCScanner) { + fCodeScanner= (AbstractCScanner)scanner; + } + return scanner; + } else { + if (language instanceof ICLanguageKeywords) { + return fTextTools.getCCodeScanner(); + } else { + return fTextTools.getCppCodeScanner(); + } + } + } + /* * @see SourceViewerConfiguration#getContentAssistant(ISourceViewer) */ @@ -610,11 +621,18 @@ public class CSourceViewerConfiguration extends TextSourceViewerConfiguration { } public boolean affectsBehavior(PropertyChangeEvent event) { - return fCppCodeScanner.affectsBehavior(event) - || fMultilineCommentScanner.affectsBehavior(event) + if (fMultilineCommentScanner.affectsBehavior(event) || fSinglelineCommentScanner.affectsBehavior(event) - || fStringScanner.affectsBehavior(event) - || fCppPreprocessorScanner.affectsBehavior(event); + || fStringScanner.affectsBehavior(event)) { + return true; + } + if (fCodeScanner != null && fCodeScanner.affectsBehavior(event)) { + return true; + } + if (fPreprocessorScanner != null && fPreprocessorScanner.affectsBehavior(event)) { + return true; + } + return false; } /** @@ -624,6 +642,7 @@ public class CSourceViewerConfiguration extends TextSourceViewerConfiguration { * @param event the event to whch to adapt */ public void adaptToPreferenceChange(PropertyChangeEvent event) { + Assert.isTrue(!isNewSetup()); fTextTools.adaptToPreferenceChange(event); } @@ -673,12 +692,7 @@ public class CSourceViewerConfiguration extends TextSourceViewerConfiguration { * @return true if event causes a behavioral change */ public boolean affectsTextPresentation(PropertyChangeEvent event) { - return fCppCodeScanner.affectsBehavior(event) - || fCCodeScanner.affectsBehavior(event) - || fMultilineCommentScanner.affectsBehavior(event) - || fSinglelineCommentScanner.affectsBehavior(event) - || fStringScanner.affectsBehavior(event) - || fCppPreprocessorScanner.affectsBehavior(event); + return affectsBehavior(event); } /** @@ -694,20 +708,16 @@ public class CSourceViewerConfiguration extends TextSourceViewerConfiguration { */ public void handlePropertyChangeEvent(PropertyChangeEvent event) { Assert.isTrue(isNewSetup()); - if (fCppCodeScanner.affectsBehavior(event)) - fCppCodeScanner.adaptToPreferenceChange(event); - if (fCCodeScanner.affectsBehavior(event)) - fCCodeScanner.adaptToPreferenceChange(event); + if (fCodeScanner != null && fCodeScanner.affectsBehavior(event)) + fCodeScanner.adaptToPreferenceChange(event); if (fMultilineCommentScanner.affectsBehavior(event)) fMultilineCommentScanner.adaptToPreferenceChange(event); if (fSinglelineCommentScanner.affectsBehavior(event)) fSinglelineCommentScanner.adaptToPreferenceChange(event); if (fStringScanner.affectsBehavior(event)) fStringScanner.adaptToPreferenceChange(event); - if (fCppPreprocessorScanner.affectsBehavior(event)) - fCppPreprocessorScanner.adaptToPreferenceChange(event); - if (fCPreprocessorScanner.affectsBehavior(event)) - fCPreprocessorScanner.adaptToPreferenceChange(event); + if (fPreprocessorScanner != null && fPreprocessorScanner.affectsBehavior(event)) + fPreprocessorScanner.adaptToPreferenceChange(event); } /* @@ -780,7 +790,7 @@ public class CSourceViewerConfiguration extends TextSourceViewerConfiguration { protected ILanguage getLanguage() { if (fTextEditor == null) { - return null; + return GPPLanguage.getDefault(); } ICElement element = CUIPlugin.getDefault().getWorkingCopyManager().getWorkingCopy(fTextEditor.getEditorInput()); if (element instanceof ITranslationUnit) { @@ -810,6 +820,7 @@ public class CSourceViewerConfiguration extends TextSourceViewerConfiguration { return LanguageManager.getInstance().getLanguage(contentType); } } - return null; + // fallback + return GPPLanguage.getDefault(); } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CTextTools.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CTextTools.java index b9f6c44333c..0ee1700ed70 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CTextTools.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CTextTools.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2005, 2006 IBM Corporation and others. + * Copyright (c) 2005, 2007 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 @@ -23,6 +23,8 @@ import org.eclipse.jface.text.rules.RuleBasedScanner; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; +import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage; +import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.text.ICPartitions; @@ -49,7 +51,7 @@ public class CTextTools { /** The C source code scanner */ private CCodeScanner fCodeScanner; /** The C++ source code scanner */ - private CppCodeScanner fCppCodeScanner; + private CCodeScanner fCppCodeScanner; /** The C partitions scanner */ private FastCPartitionScanner fPartitionScanner; /** The C multiline comment scanner */ @@ -97,15 +99,15 @@ public class CTextTools { store = CUIPlugin.getDefault().getPreferenceStore(); } fColorManager= new CColorManager(autoDisposeOnDisplayDispose); - fCodeScanner= new CCodeScanner(fColorManager, store); - fCppCodeScanner= new CppCodeScanner(fColorManager, store); + fCodeScanner= new CCodeScanner(fColorManager, store, GCCLanguage.getDefault()); + fCppCodeScanner= new CCodeScanner(fColorManager, store, GPPLanguage.getDefault()); fPartitionScanner= new FastCPartitionScanner(); fMultilineCommentScanner= new CCommentScanner(fColorManager, store, coreStore, ICColorConstants.C_MULTI_LINE_COMMENT); fSinglelineCommentScanner= new CCommentScanner(fColorManager, store, coreStore, ICColorConstants.C_SINGLE_LINE_COMMENT); fStringScanner= new SingleTokenCScanner(fColorManager, store, ICColorConstants.C_STRING); - fCPreprocessorScanner= new CPreprocessorScanner(fColorManager, store, false); - fCppPreprocessorScanner= new CPreprocessorScanner(fColorManager, store, true); + fCPreprocessorScanner= new CPreprocessorScanner(fColorManager, store, GCCLanguage.getDefault()); + fCppPreprocessorScanner= new CPreprocessorScanner(fColorManager, store, GPPLanguage.getDefault()); fPreferenceStore = store; fPreferenceStore.addPropertyChangeListener(fPreferenceListener); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CppCodeScanner.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CppCodeScanner.java deleted file mode 100644 index 5c153bbd80e..00000000000 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CppCodeScanner.java +++ /dev/null @@ -1,135 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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: - * IBM Corporation - initial API and implementation - * QNX Software System - * Anton Leherbauer (Wind River Systems) - *******************************************************************************/ -package org.eclipse.cdt.internal.ui.text; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.text.rules.IRule; -import org.eclipse.jface.text.rules.Token; -import org.eclipse.jface.text.rules.WhitespaceRule; -import org.eclipse.jface.text.rules.WordRule; -import org.eclipse.jface.util.PropertyChangeEvent; - -import org.eclipse.cdt.core.parser.KeywordSetKey; -import org.eclipse.cdt.core.parser.ParserFactory; -import org.eclipse.cdt.core.parser.ParserLanguage; - -import org.eclipse.cdt.internal.ui.text.util.CWhitespaceDetector; -import org.eclipse.cdt.internal.ui.text.util.CWordDetector; - - -/** - * A C code scanner. - */ -public final class CppCodeScanner extends AbstractCScanner { - - private static String[] fgConstants= { "NULL", //$NON-NLS-1$ - "__DATE__", "__LINE__", "__TIME__", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - "__FILE__", "__STDC__"}; //$NON-NLS-1$ //$NON-NLS-2$ - - private static String[] fgTokenProperties= { - ICColorConstants.C_KEYWORD, - ICColorConstants.C_TYPE, - ICColorConstants.C_OPERATOR, - ICColorConstants.C_BRACES, - ICColorConstants.C_NUMBER, - ICColorConstants.C_DEFAULT - }; - - - /** - * Creates a C++ code scanner - */ - public CppCodeScanner(IColorManager manager, IPreferenceStore store) { - super(manager, store); - initialize(); - } - - /* - * @see AbstractCScanner#getTokenProperties() - */ - protected String[] getTokenProperties() { - return fgTokenProperties; - } - - /* - * @see AbstractCScanner#createRules() - */ - protected List createRules() { - - List rules= new ArrayList(); - Token token; - - // Add generic whitespace rule. - rules.add(new WhitespaceRule(new CWhitespaceDetector())); - - // Add word rule for keywords, types, and constants. - token= getToken(ICColorConstants.C_DEFAULT); - WordRule wordRule= new WordRule(new CWordDetector(), token); - - token= getToken(ICColorConstants.C_KEYWORD); - Iterator iter = ParserFactory.getKeywordSet( KeywordSetKey.KEYWORDS, ParserLanguage.CPP ).iterator(); - while( iter.hasNext() ) - wordRule.addWord((String)iter.next(), token); - token= getToken(ICColorConstants.C_TYPE); - iter = ParserFactory.getKeywordSet( KeywordSetKey.TYPES, ParserLanguage.CPP ).iterator(); - while( iter.hasNext() ) - wordRule.addWord((String) iter.next(), token); - for (int i=0; i