/*******************************************************************************
 * Copyright (c) 2014 Chris Hansen and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Chris Hansen (U Washington) - Initial API and implementation
 *******************************************************************************/
package org.eclipse.photran.internal.core.analysis.binding;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.photran.internal.core.lexer.Token;
import org.eclipse.photran.internal.core.parser.ASTBindingAttrNode;
import org.eclipse.photran.internal.core.parser.ASTProcComponentDefStmtNode;
import org.eclipse.photran.internal.core.parser.ASTProcDeclNode;
import org.eclipse.photran.internal.core.parser.ASTSpecificBindingNode;
import org.eclipse.photran.internal.core.parser.IASTListNode;
import org.eclipse.photran.internal.core.vpg.AnnotationType;
import org.eclipse.photran.internal.core.vpg.PhotranTokenRef;

/**
 * Phase 6 of name-binding analysis.
 * <p>
 * Visits derived type declarations, setting children in the VPG.
 *
 * @author Chris Hansen
 * @see Binder
 */
class DerivedTypeCollector extends BindingCollector
{
    @Override public void visitASTProcComponentDefStmtNode(ASTProcComponentDefStmtNode node)
    {
        super.traverseChildren(node);
        IASTListNode<ASTProcDeclNode> decls = node.getProcDeclList();
        PhotranTokenRef procRef = decls.get(0).getProcedureEntityName().getTokenRef();
        
        Token bindingInterface = node.getProcInterface().getInterfaceName();
        String compText = null;
        //
        ArrayList<Definition> intDefs = vpg.findAllDeclarationsInInterfacesForExternalSubprogram(bindingInterface.getText());
        if (!intDefs.isEmpty()) {
            Definition subDef = intDefs.get(0);
            compText = subDef.getCompletionText();
        }
        //
        if (compText!=null) { 
            int argStart = compText.indexOf('(');
            if (argStart>=0) {
                compText = compText.substring(argStart);
            } else {
                compText = "()"; //$NON-NLS-1$
            }
        } else {
            compText = "()"; //$NON-NLS-1$
        }
        
        Definition def = vpg.getDefinitionFor(procRef);
        compText = def.getDeclaredName() + compText;
        def.setCompletionText(compText.toString());
        vpgProvider.setDefinitionFor(procRef, def);
    }

    @Override public void visitASTSpecificBindingNode(ASTSpecificBindingNode node)
    {
        super.traverseChildren(node);
        
        boolean skipFirst = true;
        PhotranTokenRef procRef = node.getBindingName().getTokenRef();
        IASTListNode<ASTBindingAttrNode> bindAttrs = node.getBindingAttrList();
        if (bindAttrs != null) {
            for (ASTBindingAttrNode bindAttr: bindAttrs) {
                if (bindAttr.isNoPass())
                    skipFirst = false;
            }
        }
        Token bindingInterface = node.getInterfaceName();
        List<PhotranTokenRef> possParents;
        if (bindingInterface != null) {
            ScopingNode enclosingScope = bindingInterface.getEnclosingScope().getGlobalScope();
            possParents = enclosingScope.manuallyResolve(bindingInterface);
        } else {
            Token proToken = node.getProcedureName();
            if (proToken == null)
                return;
            ScopingNode enclosingScope = proToken.getEnclosingScope();
            possParents = enclosingScope.manuallyResolve(proToken);
        }
        if (!possParents.isEmpty()) {
            PhotranTokenRef tokenRef = possParents.get(0);
            Definition subDef = tokenRef.getAnnotation(AnnotationType.DEFINITION_ANNOTATION_TYPE);
            String compText = subDef.getCompletionText();
            if (compText!=null) { 
                int argStart = compText.indexOf('(');
                if (argStart>=0) {
                    compText = compText.substring(argStart);
                } else {
                    compText = "()"; //$NON-NLS-1$
                }
                if (skipFirst) {
                    argStart = compText.indexOf(',');
                    if (argStart>=0) {
                        compText = compText.substring(argStart+1);
                    } else {
                        compText = ")"; //$NON-NLS-1$
                    }
                    compText = "(" + compText; //$NON-NLS-1$
                }
            } else {
                compText = "()"; //$NON-NLS-1$
            }
            
            Definition def = vpg.getDefinitionFor(procRef);
            compText = def.getDeclaredName() + compText;
            def.setCompletionText(compText.toString());
            vpgProvider.setDefinitionFor(procRef, def);
        }

    }
}
