tuna-master/joern/src/main/java/parsing/C/Shared/builders/IdentifierDeclBuilder.java
package parsing.C.Shared.builders;

import ast.ASTNodeBuilder;
import ast.declarations.IdentifierDecl;
import ast.declarations.IdentifierDeclType;
import ast.expressions.Identifier;
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.tree.ParseTree;
import parsing.C.Shared.InitDeclContextWrapper;
import parsing.ParseTreeUtils;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class IdentifierDeclBuilder extends ASTNodeBuilder {
    IdentifierDecl thisItem;

    @Override
    public void createNew(ParserRuleContext ctx) {
        item = new IdentifierDecl();
        thisItem = (IdentifierDecl) item;
        item.initializeFromContext(ctx);
    }

    public void setType(InitDeclContextWrapper decl_ctx,
                        ParserRuleContext typeName) {
        String baseType = "";
        if (typeName != null)
            baseType = ParseTreeUtils.childTokenString(typeName);
        String completeType = baseType;
        if (decl_ctx.ptrs() != null)
            completeType += " "
                    + ParseTreeUtils.childTokenString(decl_ctx.ptrs());
        if (decl_ctx.type_suffix() != null)
            completeType += " "
                    + ParseTreeUtils.childTokenString(decl_ctx.type_suffix());

        IdentifierDeclType newType = new IdentifierDeclType();
        newType.initializeFromContext(decl_ctx.getWrappedObject());
        newType.baseType = baseType;
        newType.completeType = completeType;
        thisItem.setType(newType);
    }

    public void setName(InitDeclContextWrapper decl_ctx) {
        ParserRuleContext identifier = decl_ctx.identifier();
        Identifier newName = new Identifier();
        newName.initializeFromContext(identifier);

        thisItem.setName(newName);
    }

    public List<IdentifierDecl> getDeclarations(ParserRuleContext decl_list,
                                                ParserRuleContext typeName) {
        List<IdentifierDecl> declarations = new LinkedList<IdentifierDecl>();
        InitDeclContextWrapper decl_ctx;
        for (Iterator<ParseTree> i = decl_list.children.iterator(); i.hasNext(); ) {

            decl_ctx = new InitDeclContextWrapper(i.next());
            // for ','s
            if (decl_ctx.getWrappedObject() == null)
                continue;

            createNew(decl_ctx.getWrappedObject());
            setType(decl_ctx, typeName);
            setName(decl_ctx);

            declarations.add((IdentifierDecl) getItem());
        }
        return declarations;
    }

}
