diff options
author | Nathan Ridge | 2014-05-15 05:12:41 +0000 |
---|---|---|
committer | Sergey Prigogin | 2014-05-16 05:16:02 +0000 |
commit | a7b73d776c3ed7445b02014556ed4cff16a4e76f (patch) | |
tree | cd7d2ad8162e4dd2fe1e8abee92b9f52069e122e | |
parent | c8b14a3c3e6c209a3e74003b586c04f097ee4001 (diff) | |
download | org.eclipse.cdt-a7b73d776c3ed7445b02014556ed4cff16a4e76f.tar.gz org.eclipse.cdt-a7b73d776c3ed7445b02014556ed4cff16a4e76f.tar.xz org.eclipse.cdt-a7b73d776c3ed7445b02014556ed4cff16a4e76f.zip |
Bug 399149 - Syntax-coloring for class-virt-specifier
Change-Id: I13bd4b3fcc82e1ce0339f2a357f0854f9e56bba8
Signed-off-by: Nathan Ridge <zeratul976@hotmail.com>
Reviewed-on: https://git.eclipse.org/r/26555
Tested-by: Hudson CI
Reviewed-by: Sergey Prigogin <eclipse.sprigogin@gmail.com>
Tested-by: Sergey Prigogin <eclipse.sprigogin@gmail.com>
12 files changed, 194 insertions, 15 deletions
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTVisitor.java index 5154b9a74b5..3baae85be56 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTVisitor.java @@ -17,6 +17,7 @@ package org.eclipse.cdt.core.dom.ast; import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator; import org.eclipse.cdt.core.dom.ast.c.ICASTDesignator; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCapture; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTClassVirtSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter; @@ -329,6 +330,13 @@ public abstract class ASTVisitor { public int visit(ICPPASTVirtSpecifier virtSpecifier) { return PROCESS_CONTINUE; } + + /** + * @since 5.7 + */ + public int visit(ICPPASTClassVirtSpecifier classVirtSpecifier) { + return PROCESS_CONTINUE; + } // leave methods public int leave(IASTTranslationUnit tu) { @@ -447,6 +455,13 @@ public abstract class ASTVisitor { } /** + * @since 5.7 + */ + public int leave(ICPPASTClassVirtSpecifier virtSpecifier) { + return PROCESS_CONTINUE; + } + + /** * @deprecated use {@link IASTTranslationUnit#getComments()}, instead. */ @Deprecated diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTClassVirtSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTClassVirtSpecifier.java new file mode 100644 index 00000000000..6f640ae5b3b --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTClassVirtSpecifier.java @@ -0,0 +1,43 @@ +/******************************************************************************* + * Copyright (c) 2014 Nathan Ridge. + * 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: + * Nathan Ridge - Initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.core.dom.ast.cpp; + +import org.eclipse.cdt.core.dom.ast.IASTNode; + +/** + * A class-virt-specifier after a class name. + * There is currently one specifier, 'final'. + * + * @noimplement This interface is not intended to be implemented by clients. + * @noextend This interface is not intended to be extended by clients. + * @since 5.7 + */ +public interface ICPPASTClassVirtSpecifier extends IASTNode { + + public enum SpecifierKind { + /** + * 'final' specifier + */ + Final + } + + /** + * Return the kind of this class-virt-specifier. + * Currently the only kind is 'final'. + */ + SpecifierKind getKind(); + + @Override + public ICPPASTClassVirtSpecifier copy(); + + @Override + public ICPPASTClassVirtSpecifier copy(CopyStyle style); +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTCompositeTypeSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTCompositeTypeSpecifier.java index adf5b3c0cea..f69d5ef0e40 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTCompositeTypeSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTCompositeTypeSpecifier.java @@ -45,6 +45,10 @@ public interface ICPPASTCompositeTypeSpecifier extends IASTCompositeTypeSpecifie */ public static final ASTNodeProperty BASE_SPECIFIER = new ASTNodeProperty( "ICPPASTCompositeTypeSpecifier.BASE_SPECIFIER - Expresses the subclass role"); //$NON-NLS-1$ + + /** @since 5.7 */ + public static final ASTNodeProperty CLASS_VIRT_SPECIFIER = new ASTNodeProperty( + "ICPPASTCompositeTypeSpecifier.CLASS_VIRT_SPECIFIER [ICPPASTClassVirtSpecifier]"); //$NON-NLS-1$ /** * Base Specifiers are where a class expresses from whom it inherits. @@ -150,6 +154,20 @@ public interface ICPPASTCompositeTypeSpecifier extends IASTCompositeTypeSpecifie * Sets whether the type is final. * * @since 5.5 + * @deprecated Use setVirtSpecifier() instead. */ + @Deprecated public void setFinal(boolean isFinal); + + /** + * Returns the class-virt-specifier of this class, or null if it doesn't have one. + * @since 5.7 + */ + public ICPPASTClassVirtSpecifier getVirtSpecifier(); + + /** + * Set the class-virt-specifier for this class. + * @since 5.7 + */ + public void setVirtSpecifier(ICPPASTClassVirtSpecifier virtSpecifier); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPNodeFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPNodeFactory.java index cd7a689bcf0..91e6e5bc8e4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPNodeFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPNodeFactory.java @@ -30,7 +30,6 @@ import org.eclipse.cdt.core.dom.ast.IASTTypeId; import org.eclipse.cdt.core.dom.ast.INodeFactory; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPUnaryTypeTransformation.Operator; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTVirtSpecifier.SpecifierKind; import org.eclipse.cdt.core.dom.parser.cpp.ICPPASTAttributeSpecifier; import org.eclipse.cdt.core.parser.IScanner; @@ -91,6 +90,11 @@ public interface ICPPNodeFactory extends INodeFactory { public ICPPASTCatchHandler newCatchHandler(IASTDeclaration decl, IASTStatement body); + /** + * @since 5.7 + */ + public ICPPASTClassVirtSpecifier newClassVirtSpecifier(ICPPASTClassVirtSpecifier.SpecifierKind kind); + @Override public ICPPASTCompositeTypeSpecifier newCompositeTypeSpecifier(int key, IASTName name); @@ -384,7 +388,7 @@ public interface ICPPNodeFactory extends INodeFactory { /** * @since 5.7 */ - public ICPPASTVirtSpecifier newVirtSpecifier(SpecifierKind kind); + public ICPPASTVirtSpecifier newVirtSpecifier(ICPPASTVirtSpecifier.SpecifierKind kind); public ICPPASTVisibilityLabel newVisibilityLabel(int visibility); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTClassVirtSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTClassVirtSpecifier.java new file mode 100644 index 00000000000..3bdc4827a88 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTClassVirtSpecifier.java @@ -0,0 +1,55 @@ +/******************************************************************************* + * Copyright (c) 2014 Nathan Ridge. + * 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: + * Nathan Ridge - Initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.dom.parser.cpp; + +import org.eclipse.cdt.core.dom.ast.ASTVisitor; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTClassVirtSpecifier; +import org.eclipse.cdt.internal.core.dom.parser.ASTNode; + +public class CPPASTClassVirtSpecifier extends ASTNode implements ICPPASTClassVirtSpecifier { + // Not much point storing the kind while there is only one. + + @Override + public SpecifierKind getKind() { + return SpecifierKind.Final; + } + + @Override + public ICPPASTClassVirtSpecifier copy() { + return copy(CopyStyle.withoutLocations); + } + + @Override + public ICPPASTClassVirtSpecifier copy(CopyStyle style) { + CPPASTClassVirtSpecifier copy = new CPPASTClassVirtSpecifier(); + return copy(copy, style); + } + + @Override + public boolean accept(ASTVisitor action) { + if (action.shouldVisitVirtSpecifiers) { + switch (action.visit(this)) { + case ASTVisitor.PROCESS_ABORT: return false; + case ASTVisitor.PROCESS_SKIP: return true; + default: break; + } + } + + if (action.shouldVisitVirtSpecifiers) { + switch (action.leave(this)) { + case ASTVisitor.PROCESS_ABORT: return false; + case ASTVisitor.PROCESS_SKIP: return true; + default: break; + } + } + return true; + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCompositeTypeSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCompositeTypeSpecifier.java index e5f962e7171..733e58cd9e8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCompositeTypeSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCompositeTypeSpecifier.java @@ -16,6 +16,7 @@ import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTClassVirtSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTVisibilityLabel; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; @@ -37,7 +38,7 @@ public class CPPASTCompositeTypeSpecifier extends CPPASTBaseDeclSpecifier private ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier[] baseSpecs; private int baseSpecsPos = -1; private boolean fAmbiguitiesResolved; - private boolean isFinal; + private ICPPASTClassVirtSpecifier virtSpecifier; public CPPASTCompositeTypeSpecifier() { } @@ -67,7 +68,7 @@ public class CPPASTCompositeTypeSpecifier extends CPPASTBaseDeclSpecifier copy.addMemberDeclaration(member == null ? null : member.copy(style)); for (ICPPASTBaseSpecifier baseSpecifier : getBaseSpecifiers()) copy.addBaseSpecifier(baseSpecifier == null ? null : baseSpecifier.copy(style)); - copy.isFinal = isFinal; + copy.setVirtSpecifier(virtSpecifier == null ? null : virtSpecifier.copy(style)); return super.copy(copy, style); } @@ -185,6 +186,9 @@ public class CPPASTCompositeTypeSpecifier extends CPPASTBaseDeclSpecifier if (fName != null && !fName.accept(action)) return false; + if (virtSpecifier != null && !virtSpecifier.accept(action)) + return false; + ICPPASTBaseSpecifier[] bases = getBaseSpecifiers(); for (int i = 0; i < bases.length; i++) { if (!bases[i].accept(action)) @@ -225,12 +229,28 @@ public class CPPASTCompositeTypeSpecifier extends CPPASTBaseDeclSpecifier @Override public boolean isFinal() { - return isFinal; + return virtSpecifier != null; } @Override + @Deprecated public void setFinal(boolean value) { assertNotFrozen(); - isFinal = value; + // Do nothing here. Use setVirtSpecifier() instead. + } + + @Override + public ICPPASTClassVirtSpecifier getVirtSpecifier() { + return virtSpecifier; + } + + @Override + public void setVirtSpecifier(ICPPASTClassVirtSpecifier virtSpecifier) { + assertNotFrozen(); + this.virtSpecifier = virtSpecifier; + if (virtSpecifier != null) { + virtSpecifier.setParent(this); + virtSpecifier.setPropertyInParent(CLASS_VIRT_SPECIFIER); + } } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNodeFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNodeFactory.java index b0f1d433633..883a84030d0 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNodeFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNodeFactory.java @@ -59,6 +59,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTBinaryExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCapture; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCastExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCatchHandler; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTClassVirtSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorChainInitializer; @@ -227,6 +228,13 @@ public class CPPNodeFactory extends NodeFactory implements ICPPNodeFactory { } @Override + public ICPPASTClassVirtSpecifier newClassVirtSpecifier(ICPPASTClassVirtSpecifier.SpecifierKind kind) { + // Don't use the 'kind' argument as there is currently only one kind. + assert kind == ICPPASTClassVirtSpecifier.SpecifierKind.Final; + return new CPPASTClassVirtSpecifier(); + } + + @Override public ICPPASTCompositeTypeSpecifier newCompositeTypeSpecifier(int key, IASTName name) { return new CPPASTCompositeTypeSpecifier(key, name); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java index 5d2333a0c78..d8463f1dc07 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java @@ -96,6 +96,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTIfStatement; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTInitializerList; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLambdaExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLambdaExpression.CaptureDefault; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTClassVirtSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLinkageSpecification; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLiteralExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTName; @@ -129,7 +130,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUnaryExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDirective; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTVirtSpecifier; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTVirtSpecifier.SpecifierKind; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTVisibilityLabel; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNodeFactory; import org.eclipse.cdt.core.dom.ast.cpp.ICPPUnaryTypeTransformation; @@ -3623,12 +3623,14 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { char[] tokenImage = token.getCharImage(); if (Arrays.equals(Keywords.cOVERRIDE, tokenImage)) { consume(); - ICPPASTVirtSpecifier spec = nodeFactory.newVirtSpecifier(SpecifierKind.Override); + ICPPASTVirtSpecifier spec = nodeFactory.newVirtSpecifier( + ICPPASTVirtSpecifier.SpecifierKind.Override); setRange(spec, token.getOffset(), token.getOffset() + token.getLength()); typeRelevantDtor.addVirtSpecifier(spec); } else if (Arrays.equals(Keywords.cFINAL, tokenImage)) { consume(); - ICPPASTVirtSpecifier spec = nodeFactory.newVirtSpecifier(SpecifierKind.Final); + ICPPASTVirtSpecifier spec = nodeFactory.newVirtSpecifier( + ICPPASTVirtSpecifier.SpecifierKind.Final); setRange(spec, token.getOffset(), token.getOffset() + token.getLength()); typeRelevantDtor.addVirtSpecifier(spec); } else { @@ -4454,7 +4456,10 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { char[] tokenImage = token.getCharImage(); if (token.getType() == IToken.tIDENTIFIER && Arrays.equals(Keywords.cFINAL, tokenImage)){ consume(); - astClassSpecifier.setFinal(true); + ICPPASTClassVirtSpecifier spec = nodeFactory.newClassVirtSpecifier( + ICPPASTClassVirtSpecifier.SpecifierKind.Final); + setRange(spec, token.getOffset(), token.getOffset() + token.getLength()); + astClassSpecifier.setVirtSpecifier(spec); } } diff --git a/core/org.eclipse.cdt.ui.tests/resources/semanticHighlighting/SHTest.cpp b/core/org.eclipse.cdt.ui.tests/resources/semanticHighlighting/SHTest.cpp index 8d1cf8637f7..30487ba4737 100644 --- a/core/org.eclipse.cdt.ui.tests/resources/semanticHighlighting/SHTest.cpp +++ b/core/org.eclipse.cdt.ui.tests/resources/semanticHighlighting/SHTest.cpp @@ -153,7 +153,7 @@ void g() { } //http://bugs.eclipse.org/399149 -class C { +class C final { void finalMethod() final; void overrideMethod() override; diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/SemanticHighlightingTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/SemanticHighlightingTest.java index d69427addc5..a9d9cd40ea2 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/SemanticHighlightingTest.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/SemanticHighlightingTest.java @@ -435,6 +435,7 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest { setUpSemanticHighlighting(ICColorConstants.C_KEYWORD); Position[] actual= getSemanticHighlightingPositions(); Position[] expected= new Position[] { + createPosition(155, 8, 5), createPosition(156, 23, 5), createPosition(157, 26, 8), }; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SemanticHighlightingReconciler.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SemanticHighlightingReconciler.java index 6a30f4aa31c..566daaed356 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SemanticHighlightingReconciler.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SemanticHighlightingReconciler.java @@ -40,6 +40,7 @@ import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroExpansion; import org.eclipse.cdt.core.dom.ast.IASTStatement; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTClassVirtSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTVirtSpecifier; import org.eclipse.cdt.core.model.ICElement; @@ -170,6 +171,12 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener { return PROCESS_CONTINUE; } + @Override + public int visit(ICPPASTClassVirtSpecifier classVirtSpecifier) { + visitNode(classVirtSpecifier); + return PROCESS_CONTINUE; + } + private boolean visitNode(IASTNode node) { boolean consumed= false; fToken.update(node); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SemanticHighlightings.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SemanticHighlightings.java index efee625a9cd..c0bdc67a782 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SemanticHighlightings.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SemanticHighlightings.java @@ -43,6 +43,7 @@ import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.c.ICExternalBinding; import org.eclipse.cdt.core.dom.ast.c.ICFunctionScope; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTClassVirtSpecifier; 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.ICPPASTNameSpecifier; @@ -1517,10 +1518,12 @@ public class SemanticHighlightings { @Override public boolean consumes(ISemanticToken token) { - // Currently the only context-sensitive keywords are 'final' - // and 'override', both of which are virt-specifiers at the - // end of a method declaration. - return token.getNode() instanceof ICPPASTVirtSpecifier; + // Currently the only context-sensitive keywords are the + // 'final' and 'override' virt-specifiers at the end of a + // method declaration, and the 'final' class-virt-specifier + // after a class name. + return token.getNode() instanceof ICPPASTVirtSpecifier + || token.getNode() instanceof ICPPASTClassVirtSpecifier; } } |