1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-23 08:55:25 +02:00

Fix for 177457: Invalid syntax coloring of macros

and 171675: Syntax Coloring & Macro arguments
This commit is contained in:
Anton Leherbauer 2007-03-16 13:38:20 +00:00
parent 5e04b06ded
commit ca89f453d0
7 changed files with 313 additions and 582 deletions

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
@ -27,7 +27,7 @@ import org.eclipse.cdt.internal.ui.editor.SemanticHighlightings;
*/
public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
private static final boolean PRINT_POSITIONS= false;
private static final boolean PRINT_POSITIONS= true;
private static final Class THIS= SemanticHighlightingTest.class;
@ -35,17 +35,6 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
return new SemanticHighlightingTestSetup(new TestSuite(THIS), "/SHTest/src/SHTest.cpp");
}
// public void testStaticConstFieldHighlighting() throws Exception {
// setUpSemanticHighlighting(SemanticHighlightings.STATIC_CONST_FIELD);
// Position[] expected= new Position[] {
// createPosition(6, 18, 16),
// createPosition(35, 37, 16),
// };
// Position[] actual= getSemanticHighlightingPositions();
//// System.out.println(toString(actual));
// assertEqualPositions(expected, actual);
// }
public void testStaticFieldHighlighting() throws Exception {
setUpSemanticHighlighting(SemanticHighlightings.STATIC_FIELD);
Position[] actual= getSemanticHighlightingPositions();
@ -108,12 +97,9 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
createPosition(63, 8, 10),
createPosition(77, 4, 13),
createPosition(104, 4, 26),
createPosition(104, 20, 10),
createPosition(108, 4, 25),
createPosition(108, 20, 9),
createPosition(113, 4, 32),
createPosition(113, 20, 16),
};
};
if (PRINT_POSITIONS) System.out.println(toString(actual));
assertEqualPositions(expected, actual);
}
@ -129,50 +115,25 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
createPosition(63, 8, 10),
createPosition(77, 4, 13),
createPosition(104, 4, 26),
createPosition(104, 20, 10),
createPosition(108, 4, 25),
createPosition(108, 20, 9),
createPosition(113, 4, 32),
createPosition(113, 20, 16),
createPosition(114, 23, 9),
createPosition(118, 4, 15),
};
};
Position[] actual= getSemanticHighlightingPositions();
if (PRINT_POSITIONS) System.out.println(toString(actual));
assertEqualPositions(expected, actual);
}
// public void testStaticMethodInvocationHighlighting() throws Exception {
// setUpSemanticHighlighting(SemanticHighlightings.STATIC_METHOD_INVOCATION);
// Position[] expected= new Position[] {
// };
// Position[] actual= getSemanticHighlightingPositions();
// System.out.println(toString(actual));
// assertEqualPositions(expected, actual);
// }
/*
*/
// public void testVirtualMethodInvocationHighlighting() throws Exception {
// setUpSemanticHighlighting(SemanticHighlightings.VIRTUAL_METHOD_INVOCATION);
// Position[] expected= new Position[] {
// createPosition(11, 2, 14),
// };
// Position[] actual= getSemanticHighlightingPositions();
//// System.out.println(toString(actual));
// assertEqualPositions(expected, actual);
// }
// public void testInheritedMethodInvocationHighlighting() throws Exception {
// setUpSemanticHighlighting(SemanticHighlightings.INHERITED_METHOD_INVOCATION);
// Position[] expected= new Position[] {
// createPosition(12, 2, 8),
// createPosition(15, 17, 8),
// };
// Position[] actual= getSemanticHighlightingPositions();
//// System.out.println(toString(actual));
// assertEqualPositions(expected, actual);
// }
public void testStaticMethodInvocationHighlighting() throws Exception {
setUpSemanticHighlighting(SemanticHighlightings.STATIC_METHOD_INVOCATION);
Position[] expected= new Position[] {
createPosition(118, 4, 15),
};
Position[] actual= getSemanticHighlightingPositions();
System.out.println(toString(actual));
assertEqualPositions(expected, actual);
}
public void testLocalVariableDeclarationHighlighting() throws Exception {
setUpSemanticHighlighting(SemanticHighlightings.LOCAL_VARIABLE_DECLARATION);
@ -206,7 +167,6 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
Position[] expected= new Position[] {
createPosition(11, 20, 1),
createPosition(28, 35, 3),
createPosition(29, 8, 19),
createPosition(30, 19, 3),
createPosition(77, 21, 4),
createPosition(77, 30, 4),
@ -234,16 +194,6 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
assertEqualPositions(expected, actual);
}
// public void testTemplateArgumentHighlighting() throws Exception {
// setUpSemanticHighlighting(SemanticHighlightings.TEMPLATE_ARGUMENT);
// Position[] actual= getSemanticHighlightingPositions();
// Position[] expected= new Position[] {
// createPosition(41, 8, 6),
// };
//// System.out.println(toString(actual));
// assertEqualPositions(expected, actual);
// }
public void testEnumHighlighting() throws Exception {
setUpSemanticHighlighting(SemanticHighlightings.ENUM);
Position[] actual= getSemanticHighlightingPositions();
@ -282,11 +232,13 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
createPosition(74, 35, 13),
createPosition(83, 25, 24),
createPosition(83, 52, 13),
createPosition(83, 52, 24),
createPosition(83, 70, 5),
createPosition(86, 7, 9),
createPosition(90, 6, 8),
createPosition(94, 8, 8),
createPosition(104, 4, 14),
createPosition(108, 4, 14),
createPosition(113, 4, 14),
createPosition(114, 4, 9),
createPosition(116, 4, 8),
};
@ -314,11 +266,9 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
createPosition(11, 5, 10),
createPosition(12, 12, 16),
createPosition(19, 16, 10),
createPosition(29, 8, 19),
createPosition(30, 8, 10),
createPosition(98, 8, 13),
createPosition(99, 1, 16),
createPosition(120, 4, 17),
};
if (PRINT_POSITIONS) System.out.println(toString(actual));
assertEqualPositions(expected, actual);
@ -340,15 +290,26 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
assertEqualPositions(expected, actual);
}
public void testMacroSubstitutionHighlighting() throws Exception {
setUpSemanticHighlighting(SemanticHighlightings.MACRO_SUBSTITUTION);
public void testMacroDefinitionHighlighting() throws Exception {
setUpSemanticHighlighting(SemanticHighlightings.MACRO_DEFINITION);
Position[] actual= getSemanticHighlightingPositions();
Position[] expected= new Position[] {
createPosition(29, 8, 19),
createPosition(0, 8, 3),
createPosition(1, 8, 14),
};
if (PRINT_POSITIONS) System.out.println(toString(actual));
assertEqualPositions(expected, actual);
}
public void testMacroReferencesHighlighting() throws Exception {
setUpSemanticHighlighting(SemanticHighlightings.MACRO_REFERENCE);
Position[] actual= getSemanticHighlightingPositions();
Position[] expected= new Position[] {
createPosition(29, 8, 14),
createPosition(104, 0, 3),
createPosition(108, 0, 3),
createPosition(113, 0, 3),
createPosition(120, 4, 17),
createPosition(120, 4, 14),
};
if (PRINT_POSITIONS) System.out.println(toString(actual));
assertEqualPositions(expected, actual);

View file

@ -153,8 +153,6 @@ SemanticHighlighting_staticField= Static fields
SemanticHighlighting_staticConstField= Constants
SemanticHighlighting_methodDeclaration= Method declarations
SemanticHighlighting_staticMethodInvocation= Static method invocations
SemanticHighlighting_virtualMethodInvocation= Virtual method invocations
SemanticHighlighting_inheritedMethodInvocation= Inherited method invocations
SemanticHighlighting_localVariableDeclaration= Local variable declarations
SemanticHighlighting_localVariable= Local variable references
SemanticHighlighting_globalVariable= Global variables

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
@ -84,20 +84,4 @@ public abstract class SemanticHighlighting {
* @return <code>true</code> iff the semantic highlighting consumes the semantic token
*/
public abstract boolean consumes(SemanticToken token);
/**
* Returns <code>true</code> iff the semantic highlighting consumes the
* semantic token.
* <p>
* NOTE: Implementors are not allowed to keep a reference on the token or on
* any object retrieved from the token.
* </p>
* @param token the semantic token for a
* {@link org.eclipse.cdt.core.dom.ast.IASTLiteralExpression}
* @return <code>true</code> iff the semantic highlighting consumes the
* semantic token
*/
public boolean consumesLiteral(SemanticToken token) {
return false;
}
}

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
@ -39,6 +39,8 @@ import org.eclipse.cdt.core.dom.ast.IASTMacroExpansion;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTNodeLocation;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition;
import org.eclipse.cdt.core.dom.ast.IASTStatement;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.ui.CUIPlugin;
@ -62,9 +64,11 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener {
*/
private class PositionCollector extends ASTVisitor {
{
shouldVisitTranslationUnit= true;
shouldVisitNames= true;
shouldVisitDeclarations= true;
shouldVisitExpressions= true;
shouldVisitStatements= true;
shouldVisitDeclSpecifiers= true;
}
@ -82,6 +86,21 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener {
fPositionTracker= positionTracker;
}
/*
* @see org.eclipse.cdt.core.dom.ast.ASTVisitor#visit(org.eclipse.cdt.core.dom.ast.IASTTranslationUnit)
*/
public int visit(IASTTranslationUnit tu) {
// visit macro definitions
IASTPreprocessorMacroDefinition[] macroDefs= tu.getMacroDefinitions();
for (int i= 0; i < macroDefs.length; i++) {
IASTPreprocessorMacroDefinition macroDef= macroDefs[i];
if (fFilePath.equals(macroDef.getContainingFilename())) {
visit(macroDef.getName());
}
}
return super.visit(tu);
}
/*
* @see org.eclipse.cdt.core.dom.ast.ASTVisitor#visit(org.eclipse.cdt.core.dom.ast.IASTDeclaration)
*/
@ -115,29 +134,63 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener {
return PROCESS_CONTINUE;
}
/*
* @see org.eclipse.cdt.core.dom.ast.ASTVisitor#visit(org.eclipse.cdt.core.dom.ast.IASTStatement)
*/
public int visit(IASTStatement statement) {
if (checkForMacro(statement)) {
return PROCESS_SKIP;
}
return PROCESS_CONTINUE;
}
/*
* @see org.eclipse.cdt.core.dom.ast.ASTVisitor#visit(org.eclipse.cdt.core.dom.ast.IASTName)
*/
public int visit(IASTName node) {
visitNode(node);
if (visitNode(node)) {
return PROCESS_SKIP;
}
return PROCESS_CONTINUE;
}
private boolean checkForMacro(IASTNode node) {
IASTNodeLocation[] nodeLocations= node.getNodeLocations();
if (nodeLocations.length == 1 && nodeLocations[0] instanceof IASTMacroExpansion) {
return visitNode(node);
IASTNodeLocation useLocation= getMinFileLocation(nodeLocations);
if (useLocation != null) {
IASTPreprocessorMacroDefinition macroDef= ((IASTMacroExpansion)nodeLocations[0]).getMacroDefinition();
IASTNodeLocation defLocation= macroDef.getName().getFileLocation();
IASTNode macroNode= node.getTranslationUnit().selectNodeForLocation(fFilePath, useLocation.getNodeOffset(), defLocation.getNodeLength());
if (macroNode != null && visitMacro(macroNode, defLocation.getNodeLength())) {
return true;
}
}
}
return false;
}
private boolean visitMacro(IASTNode node, int macroLength) {
fToken.update(node);
for (int i= 0, n= fJobSemanticHighlightings.length; i < n; ++i) {
SemanticHighlighting semanticHighlighting= fJobSemanticHighlightings[i];
if (fJobHighlightings[i].isEnabled() && semanticHighlighting.consumes(fToken)) {
addMacroLocation(node.getFileLocation(), macroLength, fJobHighlightings[i]);
break;
}
}
fToken.clear();
// always consume this node
return true;
}
private boolean visitNode(IASTNode node) {
boolean consumed= false;
fToken.update(node);
for (int i= 0, n= fJobSemanticHighlightings.length; i < n; ++i) {
SemanticHighlighting semanticHighlighting= fJobSemanticHighlightings[i];
if (fJobHighlightings[i].isEnabled() && semanticHighlighting.consumes(fToken)) {
addNodeLocations(node.getNodeLocations(), fJobHighlightings[i]);
addNodeLocation(node.getFileLocation(), fJobHighlightings[i]);
consumed= true;
break;
}
@ -149,20 +202,15 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener {
/**
* Add the a location range for the given highlighting.
*
* @param nodeLocations The node locations
* @param nodeLocation The node location
* @param highlighting The highlighting
*/
private void addNodeLocations(IASTNodeLocation[] nodeLocations, HighlightingStyle highlighting) {
final IASTFileLocation minLocation= getMinFileLocation(nodeLocations);
if (minLocation == null) {
private void addNodeLocation(IASTNodeLocation nodeLocation, HighlightingStyle highlighting) {
if (nodeLocation == null) {
return;
}
final IASTFileLocation maxLocation= getMaxFileLocation(nodeLocations);
if (maxLocation == null) {
return;
}
int offset= minLocation.getNodeOffset();
int length= maxLocation.getNodeOffset() + maxLocation.getNodeLength() - offset;
int offset= nodeLocation.getNodeOffset();
int length= nodeLocation.getNodeLength();
if (fPositionTracker != null) {
IRegion actualPos= fPositionTracker.historicToActual(new Region(offset, length));
offset= actualPos.getOffset();
@ -173,18 +221,27 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener {
}
}
private IASTFileLocation getMaxFileLocation(IASTNodeLocation[] locations) {
if (locations == null || locations.length == 0) {
return null;
/**
* Add the a location range for the given macro highlighting.
*
* @param macroUseLocaton The location of the macro occurrence
* @param macroLength the length of the macro name
* @param highlighting The highlighting
*/
private void addMacroLocation(IASTNodeLocation macroUseLocation, int macroLength, HighlightingStyle highlighting) {
if (macroUseLocation == null) {
return;
}
final IASTNodeLocation nodeLocation= locations[locations.length-1];
if (nodeLocation instanceof IASTFileLocation) {
return (IASTFileLocation)nodeLocation;
} else if (nodeLocation instanceof IASTMacroExpansion) {
IASTNodeLocation[] macroLocations= ((IASTMacroExpansion)nodeLocation).getExpansionLocations();
return getMaxFileLocation(macroLocations);
int offset= macroUseLocation.getNodeOffset();
int length= macroLength;
if (fPositionTracker != null) {
IRegion actualPos= fPositionTracker.historicToActual(new Region(offset, length));
offset= actualPos.getOffset();
length= actualPos.getLength();
}
if (offset > -1 && length > 0) {
addPosition(offset, length, highlighting);
}
return null;
}
private IASTFileLocation getMinFileLocation(IASTNodeLocation[] locations) {
@ -298,14 +355,11 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener {
return;
PositionCollector collector= new PositionCollector(ast.getFilePath(), positionTracker);
IASTNode[] subtrees= getAffectedSubtrees(ast);
if (subtrees.length == 0)
return;
startReconcilingPositions();
if (!fJobPresenter.isCanceled())
reconcilePositions(subtrees, collector);
reconcilePositions(ast, collector);
TextPresentation textPresentation= null;
if (!fJobPresenter.isCanceled())
@ -325,14 +379,6 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener {
}
}
/**
* @param node Root node
* @return Array of subtrees that may be affected by past document changes
*/
private IASTNode[] getAffectedSubtrees(IASTNode node) {
return new IASTNode[] { node };
}
/**
* Start reconciling positions.
*/
@ -342,15 +388,13 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener {
}
/**
* Reconcile positions based on the AST subtrees
* Reconcile positions based on the AST.
*
* @param subtrees the AST subtrees
* @param ast the AST
* @param visitor the AST visitor
*/
private void reconcilePositions(IASTNode[] subtrees, ASTVisitor visitor) {
// FIXME: remove positions not covered by subtrees
for (int i= 0, n= subtrees.length; i < n; i++) {
subtrees[i].accept(visitor);
}
private void reconcilePositions(IASTTranslationUnit ast, PositionCollector visitor) {
ast.accept(visitor);
List oldPositions= fRemovedPositions;
List newPositions= new ArrayList(fNOfRemovedPositions);
for (int i= 0, n= oldPositions.size(); i < n; i ++) {

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
@ -21,10 +21,8 @@ import org.eclipse.swt.graphics.RGB;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTMacroExpansion;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTNodeLocation;
import org.eclipse.cdt.core.dom.ast.IASTProblem;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IEnumeration;
@ -32,6 +30,7 @@ import org.eclipse.cdt.core.dom.ast.IEnumerator;
import org.eclipse.cdt.core.dom.ast.IField;
import org.eclipse.cdt.core.dom.ast.IFunction;
import org.eclipse.cdt.core.dom.ast.ILabel;
import org.eclipse.cdt.core.dom.ast.IMacroBinding;
import org.eclipse.cdt.core.dom.ast.IParameter;
import org.eclipse.cdt.core.dom.ast.IProblemBinding;
import org.eclipse.cdt.core.dom.ast.IScope;
@ -41,6 +40,7 @@ import org.eclipse.cdt.core.dom.ast.c.ICFunctionScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBlockScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionScope;
@ -60,11 +60,6 @@ public class SemanticHighlightings {
private static final RGB RGB_BLACK = new RGB(0, 0, 0);
/**
* A named preference part that controls the highlighting of static const fields.
*/
public static final String STATIC_CONST_FIELD="staticConstField"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of static fields.
*/
@ -83,17 +78,7 @@ public class SemanticHighlightings {
/**
* A named preference part that controls the highlighting of static method invocations.
*/
public static final String STATIC_METHOD_INVOCATION="staticMethodInvocation"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of inherited method invocations.
*/
public static final String INHERITED_METHOD_INVOCATION="inheritedMethodInvocation"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of virtual method invocations.
*/
public static final String VIRTUAL_METHOD_INVOCATION="virtualMethodInvocation"; //$NON-NLS-1$
public static final String STATIC_METHOD_INVOCATION="staticMethod"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of function declarations.
@ -146,15 +131,9 @@ public class SemanticHighlightings {
public static final String ENUM="enum"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of template arguments.
* A named preference part that controls the highlighting of macro references.
*/
public static final String TEMPLATE_ARGUMENT="templateArgument"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of macro substitutions
* (=references).
*/
public static final String MACRO_SUBSTITUTION="macroSubstitution"; //$NON-NLS-1$
public static final String MACRO_REFERENCE="macroSubstitution"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of macro definitions.
@ -194,73 +173,6 @@ public class SemanticHighlightings {
*/
private static SemanticHighlighting[] fgSemanticHighlightings;
/**
* Semantic highlighting for static const fields.
*/
// private static final class StaticConstFieldHighlighting extends SemanticHighlighting {
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey()
// */
// public String getPreferenceKey() {
// return STATIC_CONST_FIELD;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor()
// */
// public RGB getDefaultTextColor() {
// return RGB_BLACK;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold()
// */
// public boolean isBoldByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault()
// */
// public boolean isItalicByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault()
// */
// public boolean isEnabledByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName()
// */
// public String getDisplayName() {
// return CEditorMessages.getString("SemanticHighlighting_staticConstField"); //$NON-NLS-1$
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken)
// */
// public boolean consumes(SemanticToken token) {
// IBinding binding= token.getBinding();
// if (binding instanceof ICPPField && !(binding instanceof IProblemBinding)) {
// ICPPField field= (ICPPField)binding;
// try {
// // TLETODO [semanticHighlighting] need access to const storage class
// return field.isStatic() /* && field.isConst() */;
// } catch (DOMException exc) {
// CUIPlugin.getDefault().log(exc.getStatus());
// } catch (Error e) /* PDOMNotImplementedError */ {
// // ignore
// }
// }
// return false;
// }
// }
/**
* Semantic highlighting for static fields.
*/
@ -312,14 +224,21 @@ public class SemanticHighlightings {
* @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken)
*/
public boolean consumes(SemanticToken token) {
IBinding binding= token.getBinding();
if (binding instanceof IField && !(binding instanceof IProblemBinding)) {
try {
return ((IField)binding).isStatic();
} catch (DOMException exc) {
CUIPlugin.getDefault().log(exc);
} catch (Error e) /* PDOMNotImplementedError */ {
// ignore
IASTNode node= token.getNode();
if (node instanceof IASTName) {
IASTName name= (IASTName)node;
if (name instanceof ICPPASTQualifiedName && name.isReference()) {
return false;
}
IBinding binding= token.getBinding();
if (binding instanceof IField && !(binding instanceof IProblemBinding)) {
try {
return ((IField)binding).isStatic();
} catch (DOMException exc) {
CUIPlugin.getDefault().log(exc);
} catch (Error e) /* PDOMNotImplementedError */ {
// ignore
}
}
}
return false;
@ -377,9 +296,16 @@ public class SemanticHighlightings {
* @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken)
*/
public boolean consumes(SemanticToken token) {
IBinding binding= token.getBinding();
if (binding instanceof IField) {
return true;
IASTNode node= token.getNode();
if (node instanceof IASTName) {
IASTName name= (IASTName)node;
if (name instanceof ICPPASTQualifiedName && name.isReference()) {
return false;
}
IBinding binding= token.getBinding();
if (binding instanceof IField) {
return true;
}
}
return false;
}
@ -439,7 +365,7 @@ public class SemanticHighlightings {
IASTNode node= token.getNode();
if (node instanceof IASTName) {
IASTName name= (IASTName)node;
if (name.isDeclaration() || name.isDefinition()) {
if (!name.isReference()) {
IBinding binding= token.getBinding();
if (binding instanceof ICPPMethod) {
return true;
@ -477,198 +403,77 @@ public class SemanticHighlightings {
/**
* Semantic highlighting for static method invocations.
*/
// private static final class StaticMethodInvocationHighlighting extends SemanticHighlighting {
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey()
// */
// public String getPreferenceKey() {
// return STATIC_METHOD_INVOCATION;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor()
// */
// public RGB getDefaultTextColor() {
// return RGB_BLACK;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold()
// */
// public boolean isBoldByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault()
// */
// public boolean isItalicByDefault() {
// return true;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault()
// */
// public boolean isEnabledByDefault() {
// return true;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName()
// */
// public String getDisplayName() {
// return CEditorMessages.getString("SemanticHighlighting_staticMethodInvocation"); //$NON-NLS-1$
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken)
// */
// public boolean consumes(SemanticToken token) {
// IASTNode node= token.getNode();
// if (node instanceof IASTName) {
// IASTName name= (IASTName)node;
// if (name.isReference()) {
// IBinding binding= token.getBinding();
// if (binding instanceof ICPPMethod) {
// try {
// return ((ICPPMethod)binding).isStatic();
// } catch (DOMException exc) {
// CUIPlugin.getDefault().log(exc.getStatus());
// } catch (Error e) /* PDOMNotImplementedError */ {
// // ignore
// }
// }
// }
// }
// return false;
// }
// }
private static final class StaticMethodInvocationHighlighting extends SemanticHighlighting {
/**
* Semantic highlighting for virtual method invocations.
*/
// private static final class VirtualMethodInvocationHighlighting extends SemanticHighlighting {
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey()
// */
// public String getPreferenceKey() {
// return VIRTUAL_METHOD_INVOCATION;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor()
// */
// public RGB getDefaultTextColor() {
// return RGB_BLACK;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold()
// */
// public boolean isBoldByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault()
// */
// public boolean isItalicByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault()
// */
// public boolean isEnabledByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName()
// */
// public String getDisplayName() {
// return CEditorMessages.getString("SemanticHighlighting_virtualMethodInvocation"); //$NON-NLS-1$
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken)
// */
// public boolean consumes(SemanticToken token) {
// IASTName node= token.getNode();
// if (node.isReference()) {
// IBinding binding= token.getBinding();
// if (binding instanceof ICPPMethod) {
// try {
// // TLETODO [semanticHighlighting] need proper check for virtual method
// return ((ICPPMethod)binding).isVirtual();
// } catch (DOMException exc) {
// CUIPlugin.getDefault().log(exc.getStatus());
// } catch (Error e) /* PDOMNotImplementedError */ {
// // ignore
// }
// }
// }
// return false;
// }
// }
/*
* @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey()
*/
public String getPreferenceKey() {
return STATIC_METHOD_INVOCATION;
}
/**
* Semantic highlighting for inherited method invocations.
*/
// private static final class InheritedMethodInvocationHighlighting extends SemanticHighlighting {
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey()
// */
// public String getPreferenceKey() {
// return INHERITED_METHOD_INVOCATION;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor()
// */
// public RGB getDefaultTextColor() {
// return RGB_BLACK;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold()
// */
// public boolean isBoldByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault()
// */
// public boolean isItalicByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault()
// */
// public boolean isEnabledByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName()
// */
// public String getDisplayName() {
// return CEditorMessages.getString("SemanticHighlighting_inheritedMethodInvocation"); //$NON-NLS-1$
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken)
// */
// public boolean consumes(SemanticToken token) {
// // TLETODO [semanticHighlighting] inherited method invocation
// return false;
// }
// }
/*
* @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor()
*/
public RGB getDefaultTextColor() {
return RGB_BLACK;
}
/*
* @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold()
*/
public boolean isBoldByDefault() {
return false;
}
/*
* @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault()
*/
public boolean isItalicByDefault() {
return true;
}
/*
* @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault()
*/
public boolean isEnabledByDefault() {
return true;
}
/*
* @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName()
*/
public String getDisplayName() {
return CEditorMessages.getString("SemanticHighlighting_staticMethodInvocation"); //$NON-NLS-1$
}
/*
* @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken)
*/
public boolean consumes(SemanticToken token) {
IASTNode node= token.getNode();
if (node instanceof IASTName) {
IASTName name= (IASTName)node;
if (name instanceof ICPPASTQualifiedName) {
return false;
}
if (!name.isReference()) {
return false;
}
IBinding binding= token.getBinding();
if (binding instanceof ICPPMethod) {
try {
return ((ICPPMethod)binding).isStatic();
} catch (DOMException exc) {
CUIPlugin.getDefault().log(exc);
} catch (Error e) /* PDOMNotImplementedError */ {
// ignore
}
}
}
return false;
}
}
/**
* Semantic highlighting for methods.
@ -723,6 +528,10 @@ public class SemanticHighlightings {
public boolean consumes(SemanticToken token) {
IASTNode node= token.getNode();
if (node instanceof IASTName) {
IASTName name= (IASTName)node;
if (name instanceof ICPPASTQualifiedName && name.isReference()) {
return false;
}
IBinding binding= token.getBinding();
if (binding instanceof ICPPMethod) {
return true;
@ -1296,22 +1105,13 @@ public class SemanticHighlightings {
*/
public boolean consumes(SemanticToken token) {
IASTNode node= token.getNode();
if (node instanceof ICPPASTQualifiedName || node instanceof ICPPASTTemplateId) {
return false;
}
if (node instanceof IASTName) {
IBinding binding= token.getBinding();
if (binding instanceof ICPPClassType) {
IASTName name= (IASTName)node;
if (name.isReference()) {
if (node.getParent() instanceof ICPPASTQualifiedName) {
ICPPASTQualifiedName qName= (ICPPASTQualifiedName)node.getParent();
if (qName.getLastName() == name) {
return true;
}
} else {
return true;
}
} else {
return true;
}
return true;
}
}
return false;
@ -1369,83 +1169,27 @@ public class SemanticHighlightings {
* @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken)
*/
public boolean consumes(SemanticToken token) {
IBinding binding= token.getBinding();
if (binding instanceof IEnumeration) {
return true;
IASTNode node= token.getNode();
if (node instanceof IASTName) {
IBinding binding= token.getBinding();
if (binding instanceof IEnumeration) {
return true;
}
}
return false;
}
}
/**
* Semantic highlighting for template arguments.
* Semantic highlighting for macro references.
*/
// private static final class TemplateArgumentHighlighting extends SemanticHighlighting {
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey()
// */
// public String getPreferenceKey() {
// return TEMPLATE_ARGUMENT;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor()
// */
// public RGB getDefaultTextColor() {
// return new RGB(13, 100, 0);
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold()
// */
// public boolean isBoldByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault()
// */
// public boolean isItalicByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault()
// */
// public boolean isEnabledByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName()
// */
// public String getDisplayName() {
// return CEditorMessages.getString("SemanticHighlighting_templateArguments"); //$NON-NLS-1$
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken)
// */
// public boolean consumes(SemanticToken token) {
// IBinding binding= token.getBinding();
// if (binding instanceof ICPPTemplateParameter) {
// return true;
// }
// return false;
// }
// }
/**
* Semantic highlighting for macro substitutions (references).
*/
private static final class MacroSubstitutionHighlighting extends SemanticHighlighting {
private static final class MacroReferenceHighlighting extends SemanticHighlighting {
/*
* @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey()
*/
public String getPreferenceKey() {
return MACRO_SUBSTITUTION;
return MACRO_REFERENCE;
}
/*
@ -1487,10 +1231,12 @@ public class SemanticHighlightings {
* @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken)
*/
public boolean consumes(SemanticToken token) {
IASTNode node= token.getNode();
IASTNodeLocation[] nodeLocations= node.getNodeLocations();
if (nodeLocations.length == 1 && nodeLocations[0] instanceof IASTMacroExpansion) {
return true;
IBinding binding= token.getBinding();
if (binding instanceof IMacroBinding) {
IASTName name= (IASTName)token.getNode();
if (name.isReference()) {
return true;
}
}
return false;
}
@ -1499,61 +1245,64 @@ public class SemanticHighlightings {
/**
* Semantic highlighting for macro definitions.
*/
// private static final class MacroDefinitionHighlighting extends SemanticHighlighting {
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey()
// */
// public String getPreferenceKey() {
// return MACRO_DEFINITION;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor()
// */
// public RGB getDefaultTextColor() {
// return RGB_BLACK;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold()
// */
// public boolean isBoldByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault()
// */
// public boolean isItalicByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault()
// */
// public boolean isEnabledByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName()
// */
// public String getDisplayName() {
// return CEditorMessages.getString("SemanticHighlighting_macroDefinition"); //$NON-NLS-1$
// }
//
// /*
// * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken)
// */
// public boolean consumes(SemanticToken token) {
// IASTNode node= token.getNode();
// if (node instanceof IASTName && node.getParent() instanceof IASTPreprocessorMacroDefinition) {
// return true;
// }
// return false;
// }
// }
private static final class MacroDefinitionHighlighting extends SemanticHighlighting {
/*
* @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getPreferenceKey()
*/
public String getPreferenceKey() {
return MACRO_DEFINITION;
}
/*
* @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor()
*/
public RGB getDefaultTextColor() {
return RGB_BLACK;
}
/*
* @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextStyleBold()
*/
public boolean isBoldByDefault() {
return false;
}
/*
* @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isItalicByDefault()
*/
public boolean isItalicByDefault() {
return false;
}
/*
* @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#isEnabledByDefault()
*/
public boolean isEnabledByDefault() {
return false;
}
/*
* @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDisplayName()
*/
public String getDisplayName() {
return CEditorMessages.getString("SemanticHighlighting_macroDefintion"); //$NON-NLS-1$
}
/*
* @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#consumes(org.eclipse.cdt.internal.ui.editor.SemanticToken)
*/
public boolean consumes(SemanticToken token) {
IBinding binding= token.getBinding();
if (binding instanceof IMacroBinding) {
IASTName name= (IASTName)token.getNode();
if (!name.isReference()) {
return true;
}
}
return false;
}
}
/**
* Semantic highlighting for typedefs.
@ -1927,31 +1676,21 @@ public class SemanticHighlightings {
public static SemanticHighlighting[] getSemanticHighlightings() {
if (fgSemanticHighlightings == null)
fgSemanticHighlightings= new SemanticHighlighting[] {
new MacroSubstitutionHighlighting(), // before all others!
new MacroReferenceHighlighting(), // before all others!
new ProblemHighlighting(),
new ClassHighlighting(),
// new StaticConstFieldHighlighting(),
new StaticFieldHighlighting(),
new FieldHighlighting(), // after all other fields
new MethodDeclarationHighlighting(),
// TLETODO [semanticHighlighting] Static method invocations
// new StaticMethodInvocationHighlighting(),
// TLETODO [semanticHighlighting] Virtual method invocations
// new VirtualMethodInvocationHighlighting(),
// TLETODO [semanticHighlighting] Inherited method invocations
// new InheritedMethodInvocationHighlighting(),
new StaticMethodInvocationHighlighting(),
new ParameterVariableHighlighting(), // before local variables
new LocalVariableDeclarationHighlighting(),
new LocalVariableHighlighting(),
new GlobalVariableHighlighting(),
// TLETODO [semanticHighlighting] Template parameter highlighting
new TemplateParameterHighlighting(), // before template arguments!
new MethodHighlighting(), // before types to get ctors
// TLETODO [semanticHighlighting] Template argument highlighting
// new TemplateArgumentHighlighting(), // before other types
new EnumHighlighting(),
// TLETODO [semanticHighlighting] Macro definition highlighting
// new MacroDefinitionHighlighting(),
new MacroDefinitionHighlighting(),
new FunctionDeclarationHighlighting(),
new FunctionHighlighting(),
new TypedefHighlighting(),

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
@ -851,6 +851,7 @@ class CEditorColoringConfigurationBlock extends AbstractConfigurationBlock {
*/
private SemanticHighlightingManager.HighlightedRange[][] createPreviewerRanges() {
return new SemanticHighlightingManager.HighlightedRange[][] {
{ createHighlightedRange( 2, 8, 5, SemanticHighlightings.MACRO_DEFINITION) },
{ createHighlightedRange( 3, 16, 3, SemanticHighlightings.NAMESPACE) },
{ createHighlightedRange( 5, 21, 4, SemanticHighlightings.TYPEDEF) },
{ createHighlightedRange( 6, 11, 6, SemanticHighlightings.FUNCTION_DECLARATION), createHighlightedRange( 6, 11, 6, SemanticHighlightings.FUNCTION) },
@ -877,9 +878,11 @@ class CEditorColoringConfigurationBlock extends AbstractConfigurationBlock {
{ createHighlightedRange(18, 0, 5, SemanticHighlightings.LABEL) },
{ createHighlightedRange(18, 7, 6, SemanticHighlightings.FUNCTION) },
{ createHighlightedRange(18, 14, 5, SemanticHighlightings.LOCAL_VARIABLE) },
{ createHighlightedRange(18, 21, 11, SemanticHighlightings.MACRO_SUBSTITUTION) },
{ createHighlightedRange(18, 21, 5, SemanticHighlightings.MACRO_REFERENCE) },
{ createHighlightedRange(19, 4, 7, SemanticHighlightings.METHOD) },
{ createHighlightedRange(20, 4, 7, SemanticHighlightings.PROBLEM) },
{ createHighlightedRange(20, 4, 12, SemanticHighlightings.STATIC_METHOD_INVOCATION), createHighlightedRange(20, 4, 12, SemanticHighlightings.METHOD) },
{ createHighlightedRange(21, 4, 7, SemanticHighlightings.PROBLEM) },
{ createHighlightedRange(23, 14, 12, SemanticHighlightings.METHOD_DECLARATION), createHighlightedRange(23, 14, 12, SemanticHighlightings.METHOD) },
};
}

View file

@ -18,6 +18,8 @@ public:
int local= (int)n;
label: myfunc(local, MACRO('\0'));
vmethod();
staticMethod();
problem();
}
static void staticMethod();
};