package jif.extension;

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

import jif.ast.Jif_c;
import jif.ast.PrincipalNode;
import jif.translate.ToJavaExt;
import jif.types.*;
import jif.types.principal.Principal;
import jif.visit.LabelChecker;
import polyglot.ast.Node;
import polyglot.types.SemanticException;

public class JifPrincipalNodeExt extends Jif_c {
    public JifPrincipalNodeExt(ToJavaExt toJava) {
        super(toJava);
    }

    public Node labelCheck(LabelChecker lc) throws SemanticException {
        PrincipalNode pn = (PrincipalNode)node();

        JifContext A = lc.jifContext();
        A = (JifContext)pn.enterScope(A);
        JifTypeSystem ts = lc.jifTypeSystem();

        List throwTypes = new ArrayList(pn.del().throwTypes(ts));
        
        Principal p = pn.principal();
        // make sure the principal is runtime representable
        if (!p.isRuntimeRepresentable()) {
            throw new SemanticException(
                    "A principal used in an expression must be representable at runtime.",
                    pn.position());
        }

        PathMap X1 = p.labelCheck(A);
        throwTypes.removeAll(p.throwTypes(ts));
        A = (JifContext)A.pop();
        
        checkThrowTypes(throwTypes);
        return X(pn, X1);
    }

}