Search code examples
eclipse-plugineclipse-cdt

CDT : Parsing enumerations, enumerators and corresponding values


I'm developing an extension of eclipse CDT plug-in which has to parse the c++ code and find all

  • enumerations (names)
  • enumerators (names)
  • enumerator values (numbers)

Suppose .cpp file contains following text

enum SomeEnum
{
   One            = 0,
   Two            = 1,
   Three          = 2,
   Four           = 3,
   maxNum
};

The pluging should output following :

  • Enumeration - SomeEnum
  • Enumerators - One, Two, Three, Four, maxNum
  • Values - 0, 1, 2, 3,

The visitor method of ASTVisitor inherited class finds the enumerations this way

public int visit(IASTDeclaration declaration) {
    if (declaration instanceof IASTSimpleDeclaration) {

        IASTDeclSpecifier specifier = ((IASTSimpleDeclaration)declaration).getDeclSpecifier();

        if (specifier instanceof IASTEnumerationSpecifier) {

            IASTEnumerationSpecifier enumSpecifier = (IASTEnumerationSpecifier)specifier;
            IBinding binding = enumSpecifier.getName().resolveBinding(); 
            System.out.println(enumSpecifier.getName());
        }
    }
    return PROCESS_CONTINUE;
} 

Question : How can I iterate over the enumerators and their corresponding values of found enumeration ?


Solution

  • Well figured out on my own

    public int visit(IASTDeclaration declaration) {
        if (declaration instanceof IASTSimpleDeclaration) { 
            IASTDeclSpecifier specifier = ((IASTSimpleDeclaration)declaration).getDeclSpecifier();
            if (specifier instanceof IASTEnumerationSpecifier) {
                IASTEnumerationSpecifier enumSpecifier = (IASTEnumerationSpecifier)specifier;
                // Get the current enumeration name
                String enumerationName = enumSpecifier.getName().toString();
                IASTEnumerator[] enumerators = enumSpecifier.getEnumerators();
                for (IASTEnumerator enumerator : enumerators)
                {
                    System.out.println(enumerator.getName());
                    if (enumerator.getValue() instanceof IASTLiteralExpression  ) {
                        System.out.println(enumerator.getValue());
                    }
                }
            }
        }
        return PROCESS_CONTINUE;
    }