mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-01 14:15:23 +02:00
Fix for Bug 167077 - Semantic Highlighting: fails to highlight sections of code
This commit is contained in:
parent
e99ef14b18
commit
a08c9254f8
2 changed files with 67 additions and 67 deletions
|
@ -27,7 +27,7 @@ import org.eclipse.cdt.internal.ui.editor.SemanticHighlightings;
|
|||
*/
|
||||
public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
|
||||
|
||||
private static final boolean PRINT_POSITIONS= true;
|
||||
private static final boolean PRINT_POSITIONS= false;
|
||||
|
||||
private static final Class THIS= SemanticHighlightingTest.class;
|
||||
|
||||
|
|
|
@ -19,10 +19,13 @@ import org.eclipse.jface.util.PropertyChangeEvent;
|
|||
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;
|
||||
import org.eclipse.cdt.core.dom.ast.IEnumerator;
|
||||
|
@ -35,6 +38,8 @@ import org.eclipse.cdt.core.dom.ast.IScope;
|
|||
import org.eclipse.cdt.core.dom.ast.ITypedef;
|
||||
import org.eclipse.cdt.core.dom.ast.IVariable;
|
||||
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.ICPPBlockScope;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
|
||||
|
@ -373,7 +378,7 @@ public class SemanticHighlightings {
|
|||
*/
|
||||
public boolean consumes(SemanticToken token) {
|
||||
IBinding binding= token.getBinding();
|
||||
if (binding instanceof IField && !(binding instanceof IProblemBinding)) {
|
||||
if (binding instanceof IField) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -436,8 +441,32 @@ public class SemanticHighlightings {
|
|||
IASTName name= (IASTName)node;
|
||||
if (name.isDeclaration() || name.isDefinition()) {
|
||||
IBinding binding= token.getBinding();
|
||||
if (binding instanceof ICPPMethod && !(binding instanceof IProblemBinding)) {
|
||||
if (binding instanceof ICPPMethod) {
|
||||
return true;
|
||||
} else if (binding instanceof IProblemBinding) {
|
||||
// try to be derive from AST
|
||||
node= name.getParent();
|
||||
while (node instanceof IASTName) {
|
||||
node= node.getParent();
|
||||
}
|
||||
if (node instanceof ICPPASTFunctionDeclarator) {
|
||||
if (name instanceof ICPPASTQualifiedName) {
|
||||
ICPPASTQualifiedName qName= (ICPPASTQualifiedName)name;
|
||||
IASTName[] names= qName.getNames();
|
||||
if (names.length > 1) {
|
||||
if (names[names.length - 2].getBinding() instanceof ICPPClassType) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
while (node != token.getRoot() && !(node.getParent() instanceof IASTDeclSpecifier)) {
|
||||
node= node.getParent();
|
||||
}
|
||||
if (node instanceof ICPPASTCompositeTypeSpecifier) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -695,57 +724,13 @@ public class SemanticHighlightings {
|
|||
IASTNode node= token.getNode();
|
||||
if (node instanceof IASTName) {
|
||||
IBinding binding= token.getBinding();
|
||||
if (binding instanceof ICPPMethod && !(binding instanceof IProblemBinding)) {
|
||||
if (binding instanceof ICPPMethod) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts the method binding from the token's simple name. The method
|
||||
* binding is either the token's binding (if the parent of token is a
|
||||
* method call or declaration) or the constructor binding of a class
|
||||
* instance creation if the node is the type name of a class instance
|
||||
* creation.
|
||||
*
|
||||
* @param token the token to extract the method binding from
|
||||
* @return the corresponding method binding, or <code>null</code>
|
||||
*/
|
||||
// private IBinding getMethodBinding(SemanticToken token) {
|
||||
// IBinding binding= null;
|
||||
// // work around: https://bugs.eclipse.org/bugs/show_bug.cgi?id=62605
|
||||
// IASTNode node= token.getNode();
|
||||
// IASTNode parent= node.getParent();
|
||||
// while (isTypePath(node, parent)) {
|
||||
// node= parent;
|
||||
// parent= parent.getParent();
|
||||
// }
|
||||
//
|
||||
// if (parent != null && node.getLocationInParent() == ClassInstanceCreation.TYPE_PROPERTY)
|
||||
// binding= ((ClassInstanceCreation) parent).resolveConstructorBinding();
|
||||
// else
|
||||
// binding= token.getBinding();
|
||||
// return binding;
|
||||
// }
|
||||
|
||||
/**
|
||||
* Returns <code>true</code> if the given child/parent nodes are valid
|
||||
* sub nodes of a <code>Type</code> IASTNode.
|
||||
* @param child the child node
|
||||
* @param parent the parent node
|
||||
* @return <code>true</code> if the nodes may be the sub nodes of a type node, false otherwise
|
||||
*/
|
||||
// private boolean isTypePath(IASTNode child, IASTNode parent) {
|
||||
// if (parent instanceof Type) {
|
||||
// StructuralPropertyDescriptor location= child.getLocationInParent();
|
||||
// return location == ParameterizedType.TYPE_PROPERTY || location == SimpleType.NAME_PROPERTY;
|
||||
// } else if (parent instanceof QualifiedName) {
|
||||
// StructuralPropertyDescriptor location= child.getLocationInParent();
|
||||
// return location == QualifiedName.NAME_PROPERTY;
|
||||
// }
|
||||
// return false;
|
||||
// }
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -805,9 +790,27 @@ public class SemanticHighlightings {
|
|||
if (name.isDeclaration()) {
|
||||
IBinding binding= token.getBinding();
|
||||
if (binding instanceof IFunction
|
||||
&& !(binding instanceof ICPPMethod)
|
||||
&& !(binding instanceof IProblemBinding)) {
|
||||
&& !(binding instanceof ICPPMethod)) {
|
||||
return true;
|
||||
} else if (binding instanceof IProblemBinding) {
|
||||
// try to derive from AST
|
||||
if (name instanceof ICPPASTQualifiedName) {
|
||||
return false;
|
||||
} else {
|
||||
node= name.getParent();
|
||||
while (node instanceof IASTName) {
|
||||
node= node.getParent();
|
||||
}
|
||||
if (node instanceof IASTFunctionDeclarator) {
|
||||
while (node != token.getRoot() && !(node.getParent() instanceof IASTDeclSpecifier)) {
|
||||
node= node.getParent();
|
||||
}
|
||||
if (node instanceof ICPPASTCompositeTypeSpecifier) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -870,8 +873,7 @@ public class SemanticHighlightings {
|
|||
if (node instanceof IASTName) {
|
||||
IBinding binding= token.getBinding();
|
||||
if (binding instanceof IFunction
|
||||
&& !(binding instanceof ICPPMethod)
|
||||
&& !(binding instanceof IProblemBinding)) {
|
||||
&& !(binding instanceof ICPPMethod)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -1173,7 +1175,7 @@ public class SemanticHighlightings {
|
|||
*/
|
||||
public boolean consumes(SemanticToken token) {
|
||||
IBinding binding= token.getBinding();
|
||||
if (binding instanceof IParameter && !(binding instanceof IProblemBinding)) {
|
||||
if (binding instanceof IParameter) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -1234,15 +1236,9 @@ public class SemanticHighlightings {
|
|||
IASTNode node= token.getNode();
|
||||
if (node instanceof IASTName) {
|
||||
IBinding binding= token.getBinding();
|
||||
if (binding instanceof ICPPTemplateParameter && !(binding instanceof IProblemBinding)) {
|
||||
if (binding instanceof ICPPTemplateParameter) {
|
||||
return true;
|
||||
}
|
||||
// template parameters are resolved as problems??
|
||||
// if (node.getParent() instanceof ICPPASTNamedTypeSpecifier) {
|
||||
// if (binding instanceof IProblemBinding) {
|
||||
// return true;
|
||||
// }
|
||||
// }
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -1302,7 +1298,7 @@ public class SemanticHighlightings {
|
|||
IASTNode node= token.getNode();
|
||||
if (node instanceof IASTName) {
|
||||
IBinding binding= token.getBinding();
|
||||
if (binding instanceof ICPPClassType && !(binding instanceof IProblemBinding)) {
|
||||
if (binding instanceof ICPPClassType) {
|
||||
IASTName name= (IASTName)node;
|
||||
if (name.isReference()) {
|
||||
if (node.getParent() instanceof ICPPASTQualifiedName) {
|
||||
|
@ -1374,7 +1370,7 @@ public class SemanticHighlightings {
|
|||
*/
|
||||
public boolean consumes(SemanticToken token) {
|
||||
IBinding binding= token.getBinding();
|
||||
if (binding instanceof IEnumeration && !(binding instanceof IProblemBinding)) {
|
||||
if (binding instanceof IEnumeration) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -1611,7 +1607,7 @@ public class SemanticHighlightings {
|
|||
*/
|
||||
public boolean consumes(SemanticToken token) {
|
||||
IBinding binding= token.getBinding();
|
||||
if (binding instanceof ITypedef && !(binding instanceof IProblemBinding)) {
|
||||
if (binding instanceof ITypedef) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -1670,7 +1666,7 @@ public class SemanticHighlightings {
|
|||
*/
|
||||
public boolean consumes(SemanticToken token) {
|
||||
IBinding binding= token.getBinding();
|
||||
if (binding instanceof ICPPNamespace && !(binding instanceof IProblemBinding)) {
|
||||
if (binding instanceof ICPPNamespace) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -1729,7 +1725,7 @@ public class SemanticHighlightings {
|
|||
*/
|
||||
public boolean consumes(SemanticToken token) {
|
||||
IBinding binding= token.getBinding();
|
||||
if (binding instanceof ILabel && !(binding instanceof IProblemBinding)) {
|
||||
if (binding instanceof ILabel) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -1788,7 +1784,7 @@ public class SemanticHighlightings {
|
|||
*/
|
||||
public boolean consumes(SemanticToken token) {
|
||||
IBinding binding= token.getBinding();
|
||||
if (binding instanceof IEnumerator && !(binding instanceof IProblemBinding)) {
|
||||
if (binding instanceof IEnumerator) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -1853,6 +1849,10 @@ 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();
|
||||
if (node instanceof IASTProblem) {
|
||||
return true;
|
||||
}
|
||||
IBinding binding= token.getBinding();
|
||||
if (binding instanceof IProblemBinding) {
|
||||
return true;
|
||||
|
@ -1928,6 +1928,7 @@ public class SemanticHighlightings {
|
|||
if (fgSemanticHighlightings == null)
|
||||
fgSemanticHighlightings= new SemanticHighlighting[] {
|
||||
new MacroSubstitutionHighlighting(), // before all others!
|
||||
new ProblemHighlighting(),
|
||||
new ClassHighlighting(),
|
||||
// new StaticConstFieldHighlighting(),
|
||||
new StaticFieldHighlighting(),
|
||||
|
@ -1957,7 +1958,6 @@ public class SemanticHighlightings {
|
|||
new NamespaceHighlighting(),
|
||||
new LabelHighlighting(),
|
||||
new EnumeratorHighlighting(),
|
||||
new ProblemHighlighting(),
|
||||
};
|
||||
return fgSemanticHighlightings;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue