1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-24 01:15:29 +02:00

Make keyword highlighting dependent on language dialect (follow-up to 175493)

This commit is contained in:
Anton Leherbauer 2007-03-16 10:00:38 +00:00
parent db758116da
commit bbd2239f57
9 changed files with 282 additions and 308 deletions

View file

@ -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.
*
* <p>
* <strong>EXPERIMENTAL</strong>. 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.
* </p>
*
* @since 4.0
*/
public interface ICLanguageKeywords {
/**
* Get the keywords defined for this language, excluding bult-in types.
*
* @return an array of keywords, never <code>null</code>
*/
public abstract String[] getKeywords();
/**
* Get the built-in type names defined for this language.
*
* @return an array of names, never <code>null</code>
*/
public abstract String[] getBuiltinTypes();
/**
* Get the preprocessor keywords (directives) defined for this language.
*
* @return an array of keywords, never <code>null</code>
*/
public abstract String[] getPreprocessorKeywords();
}

View file

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

View file

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

View file

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

View file

@ -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; j<fgConstants.length; j++)
wordRule.addWord(fgConstants[j], token);
String[] types= fKeywords.getBuiltinTypes();
for (int i = 0; i < types.length; i++) {
wordRule.addWord(types[i], token);
}
rules.add(wordRule);
token = getToken(ICColorConstants.C_NUMBER);
@ -114,25 +106,10 @@ public final class CCodeScanner extends AbstractCScanner {
return rules;
}
/**
* @see org.eclipse.jface.text.rules.RuleBasedScanner#setRules(org.eclipse.jface.text.rules.IRule[])
*/
public void setRules(IRule[] rules) {
super.setRules(rules);
}
/**
* @see AbstractCScanner#affectsBehavior(PropertyChangeEvent)
*/
public boolean affectsBehavior(PropertyChangeEvent event) {
return super.affectsBehavior(event);
}
/**
/*
* @see AbstractCScanner#adaptToPreferenceChange(PropertyChangeEvent)
*/
public void adaptToPreferenceChange(PropertyChangeEvent event) {
if (super.affectsBehavior(event)) {
super.adaptToPreferenceChange(event);
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2006 Wind River Systems, Inc. and others.
* 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
@ -8,11 +8,9 @@
* Contributors:
* Anton Leherbauer (Wind River Systems) - initial API and implementation
*******************************************************************************/
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;
@ -24,9 +22,7 @@ import org.eclipse.jface.text.rules.Token;
import org.eclipse.jface.text.rules.WhitespaceRule;
import org.eclipse.jface.text.rules.WordRule;
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;
@ -49,19 +45,18 @@ public class CPreprocessorScanner extends AbstractCScanner {
ICColorConstants.C_STRING,
ICColorConstants.PP_HEADER
};
private ICLanguageKeywords fKeywords;
private boolean fIsCpp;
/**
* Creates a C/C++ preprocessor scanner.
*
* @param manager the color manager.
* @param store the preference store.
* @param isCpp if <code>true</code> 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);

View file

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

View file

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

View file

@ -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<fgConstants.length; i++)
wordRule.addWord(fgConstants[i], token);
rules.add(wordRule);
token = getToken(ICColorConstants.C_NUMBER);
NumberRule numberRule = new NumberRule(token);
rules.add(numberRule);
token = getToken(ICColorConstants.C_OPERATOR);
COperatorRule opRule = new COperatorRule(token);
rules.add(opRule);
token = getToken(ICColorConstants.C_BRACES);
CBraceRule braceRule = new CBraceRule(token);
rules.add(braceRule);
setDefaultReturnToken(getToken(ICColorConstants.C_DEFAULT));
return rules;
}
/*
* @see RuleBasedScanner#setRules(IRule[])
*/
public void setRules(IRule[] rules) {
super.setRules(rules);
}
/*
* @see AbstractCScanner#affectsBehavior(PropertyChangeEvent)
*/
public boolean affectsBehavior(PropertyChangeEvent event) {
return super.affectsBehavior(event);
}
/*
* @see AbstractCScanner#adaptToPreferenceChange(PropertyChangeEvent)
*/
public void adaptToPreferenceChange(PropertyChangeEvent event) {
if (super.affectsBehavior(event)) {
super.adaptToPreferenceChange(event);
}
}
}