Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams One is field's type.

when source code like under I want to extract info's Type when info.call() is called.

Info info;
//skip
info.call(); //<- from here

Trough making a visitor which visit IASTName node, I tried to extract type info like under.

public class CDTVisitor extends ASTVisitor {
    public CDTVisitor(boolean visitNodes) {
        super(true);
    public int visit(IASTName node){
        if(node.resolveBinding().getName().toString().equals("info"))
            System.out.println(((IField)node.getBinding()).getType()); 
            // this not work properly. 
            //result is "org.eclipse.cdt.internal.core.dom.parser.ProblemType@86be70a"
        return 3;

Assuming the code is in fact valid, a variable's type resolving to a ProblemType is an indication of a configuration problem in whatever tool or plugin is running this code, or in the project/workspace containing the code on which it is run.

In this case, the type of the variable info is Info, which is presumably a class or structure type, or a typedef. To resolve it correctly, CDT needs to be able to see the declaration of this type.

If this type is not declared in the same file that's being analyzed, but rather in a header file included by that file, CDT needs to use the project's index to find the declaration. That means:

  • The AST must be index-based. For example, if using ITranslationUnit.getAST to create the AST, the overload that takes an IIndex parameter must be used, and a non-null argument must be provided for it.

  • Since an IIndex is associated with a CDT project, the code being analyzed needs to be part of a CDT project, and the project needs to be indexed.

  • In order for the indexer to resolve #include directives correctly, the project's include paths need to be configured correctly, so that the indexer can actually find the right header files to parse.

  • Any one of these not being the case can lead to a type resolving to a ProblemType.

    Yes! I just put nul value to Index. I think that's the point. Is there any DOCs. or examples to see how to use index? – Ui-Gyun Jeong Feb 6, 2017 at 0:35 @Ui-GyunJeong: Maybe wiki.eclipse.org/images/c/c7/… is helpful? The general idea is that the code needs to be in a project, and you get the index from the project. – HighCommander4 Feb 6, 2017 at 3:53 @Ui-GyunJeong: This might also be useful background info: wiki.eclipse.org/CDT/designs/Overview_of_Parsing – HighCommander4 Feb 6, 2017 at 3:57 The reason I couldn't get a binding object was the type of AST.

    When try to parse C++ source code, I should have used ICPPASTTranslationUnit. There is no code related this, I used IASTTranslationUnit as a return type of AST.

    After using ICPPASTTranslationUnit instead of IASTTranslationUnit, I solved this problem.

    Cool! How you used the ICPPASTTranslationUnit? I am workin in a standalone C++ parsing using the Eclipse CDT and I also need to solve the binding. I wrote some code, but the AST is not working properly. If you could share your code I will be thankfull. – Felipe Gomes Feb 2, 2018 at 17:54 @FelipeGomes to resolve binding you need to use indexer but the indexer has coupling with eclipse studio. – Ui-Gyun Jeong Feb 19, 2018 at 1:59

    Yes, I figure it out! Here is the entire code which can index all files in "src" folder of a cpp project and output the resolved type binding for all code expressions including the return value of low level API such as memcpy. Note that the project variable in following code is created by programatically importing an existing manually configured cpp project. I often manually create an empty cpp project and programatically import it as a general project (once imported, Eclipse will automatically detect the project type and complete the relevant configuration of CPP project). This is much more convenient than creating and configuring a cpp project from scratch programmatically. When importing project, you'd better not to copy the project or containment structures into workspace, because this may lead to infinitely copying same project in subfolder (infinite folder depth). The code works in Eclipse-2021-12 version. I download Eclipse-For-cpp and install plugin-development and jdt plugins. Then I create an Eclipse plugin project and extend the "org.eclipse.core.runtime.applications" extension point. In another word, it is an Eclipse-Application plugin project which can use nearly all features of Eclipse but do not start the graphical interface (UI) of Eclipse. You should add all cdt related non-ui plugins as the dependencies because new version of Eclipse does not automatically add missing plugins any more.

            ICProject cproject = CoreModel.getDefault().getCModel().getCProject(project.getName());
            // this code creates index for entire project. 
            IIndex index = CCorePlugin.getIndexManager().getIndex(cproject);
            IFolder folder = project.getFolder("src");
            IResource[] rcs = folder.members();
            // iterate all source files in src folder and visit all expressions to print the resolved type binding. 
            for (IResource rc : rcs) {
                if (rc instanceof IFile) {
                    IFile f = (IFile) rc;
                    ITranslationUnit tu= (ITranslationUnit) CoreModel.getDefault().create(f);
                    index.acquireReadLock(); // we need a read-lock on the index
                    ICPPASTTranslationUnit ast = null;
                    try {
                        ast = (ICPPASTTranslationUnit) tu.getAST(index, ITranslationUnit.AST_SKIP_INDEXED_HEADERS);
                    } finally {
                        index.releaseReadLock();
                    if (ast != null) {
                        ast.accept(new ASTVisitor() {
                            @Override
                            public int visit(IASTExpression expression) {
                                // get the resolved type binding of expression. 
                                IType etp = expression.getExpressionType();
                                System.out.println("IASTExpression type:" + etp + "#expr_str:" + expression.toString());
                                return super.visit(expression);
            

    Thanks for contributing an answer to Stack Overflow!

    • Please be sure to answer the question. Provide details and share your research!

    But avoid

    • Asking for help, clarification, or responding to other answers.
    • Making statements based on opinion; back them up with references or personal experience.

    To learn more, see our tips on writing great answers.