mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-31 21:05:37 +02:00
Added method to check that node belongs to macro expansion
This commit is contained in:
parent
5d3f18cb04
commit
85d6bff98e
1 changed files with 23 additions and 4 deletions
|
@ -10,6 +10,10 @@
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.codan.core.cxx;
|
package org.eclipse.cdt.codan.core.cxx;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTNodeSelector;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroExpansion;
|
||||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||||
import org.eclipse.cdt.core.dom.ast.IType;
|
import org.eclipse.cdt.core.dom.ast.IType;
|
||||||
import org.eclipse.cdt.core.dom.ast.ITypedef;
|
import org.eclipse.cdt.core.dom.ast.ITypedef;
|
||||||
|
@ -25,23 +29,38 @@ public final class CxxAstUtils {
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized static CxxAstUtils getInstance() {
|
public synchronized static CxxAstUtils getInstance() {
|
||||||
if (instance == null) instance = new CxxAstUtils();
|
if (instance == null)
|
||||||
|
instance = new CxxAstUtils();
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IType unwindTypedef(IType type) {
|
public IType unwindTypedef(IType type) {
|
||||||
if (!(type instanceof IBinding)) return type;
|
if (!(type instanceof IBinding))
|
||||||
|
return type;
|
||||||
IBinding typeName = (IBinding) type;
|
IBinding typeName = (IBinding) type;
|
||||||
// unwind typedef chain
|
// unwind typedef chain
|
||||||
try {
|
try {
|
||||||
while (typeName instanceof ITypedef) {
|
while (typeName instanceof ITypedef) {
|
||||||
IType t = ((ITypedef) typeName).getType();
|
IType t = ((ITypedef) typeName).getType();
|
||||||
if (t instanceof IBinding) typeName = (IBinding) t;
|
if (t instanceof IBinding)
|
||||||
else return t;
|
typeName = (IBinding) t;
|
||||||
|
else
|
||||||
|
return t;
|
||||||
}
|
}
|
||||||
} catch (Exception e) { // in CDT 6.0 getType throws DOMException
|
} catch (Exception e) { // in CDT 6.0 getType throws DOMException
|
||||||
Activator.log(e);
|
Activator.log(e);
|
||||||
}
|
}
|
||||||
return (IType) typeName;
|
return (IType) typeName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isInMacro(IASTNode node) {
|
||||||
|
IASTNodeSelector nodeSelector = node.getTranslationUnit()
|
||||||
|
.getNodeSelector(node.getTranslationUnit().getFilePath());
|
||||||
|
IASTFileLocation fileLocation = node.getFileLocation();
|
||||||
|
|
||||||
|
IASTPreprocessorMacroExpansion macro = nodeSelector
|
||||||
|
.findEnclosingMacroExpansion(fileLocation.getNodeOffset(),
|
||||||
|
fileLocation.getNodeLength());
|
||||||
|
return macro != null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue