package org.scribble.del; import java.util.Iterator; import org.scribble.ast.Do; import org.scribble.ast.NonRoleArg; import org.scribble.ast.NonRoleArgList; import org.scribble.ast.NonRoleParamDecl; import org.scribble.ast.NonRoleParamDeclList; import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.name.simple.NonRoleParamNode; import org.scribble.main.ScribbleException; import org.scribble.sesstype.kind.DataTypeKind; import org.scribble.sesstype.kind.NonRoleParamKind; import org.scribble.sesstype.kind.SigKind; import org.scribble.visit.wf.NameDisambiguator; public class NonRoleArgListDel extends DoArgListDel { public NonRoleArgListDel() { } // Doing in leave allows the arguments to be individually checked first @Override public NonRoleArgList leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException { NonRoleArgList nral = (NonRoleArgList) super.leaveDisambiguation(parent, child, disamb, visited); // Checks matching arity ProtocolDecl<?> pd = getTargetProtocolDecl((Do<?>) parent, disamb); Iterator<NonRoleArg> args = nral.getDoArgs().iterator(); for (NonRoleParamDecl<?> param : pd.header.paramdecls.getDecls()) { NonRoleParamKind kind = param.kind; NonRoleArg arg = args.next(); if (arg.val.isParamNode()) { if (!((NonRoleParamNode<?>) arg.val).kind.equals(kind)) { throw new ScribbleException(arg.getSource(), "Bad arg " + arg + " for param kind: " + kind); } } else if (kind.equals(SigKind.KIND)) { if (!arg.val.isMessageSigNode() && !arg.val.isMessageSigNameNode()) { throw new ScribbleException(arg.getSource(), "Bad arg " + arg + " for param kind: " + kind); } } else if (kind.equals(DataTypeKind.KIND)) { if (!arg.val.isDataTypeNameNode()) { throw new ScribbleException(arg.getSource(), "Bad arg " + arg + " for param kind: " + kind); } } else { throw new RuntimeException("Shouldn't get in here: " + kind); } } return nral; } @Override protected NonRoleParamDeclList getParamDeclList(ProtocolDecl<?> pd) { return pd.header.paramdecls; } }