Enough with the background, move along and dig into the dirty details. First, CodeObject: Base class for everyone else, contains no data members and all functions are abstract, provides base services contracts copying, assignment and output operations.
Next the six classes in the top row, they do not have much in themselves and do what their name says. A CodeSnippet is a literal code snippet which you will have trouble getting correct through CPlusPlusCodeProvider; a Comment is, well, just a comment; variable declarations are declarations nothing more than that, though, their implementation is full of quirks; a Namespace represents a namespace; a Typedefinition is a typedefinition. VariableDeclaration has two distinct parts, a declarator and a declarator specifier. This distinction is necessary because you can write something like extern static const int** const k; where everything before the pointers is declarator specifier and applies to all the variables which can be specified in this declaration and from pointers onwards is the declarator which applies to k only and can be different for every variable in the list.
Next, consider the two classes PreprocessorDirective and MacroTestDirective. A preprocessor directive represents anything other than #if, meaning things like #define, #undef, #include, #pragma etc. A MacroTestDirective is for everything like #if, #ifdef, #ifndef etc.
Next time, I’ll be discussing Function and its descendants.