package org.scribble.del; import java.util.List; import org.scribble.ast.Do; import org.scribble.ast.DoArgList; import org.scribble.ast.HeaderParamDeclList; import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.context.ModuleContext; import org.scribble.main.JobContext; import org.scribble.main.ScribbleException; import org.scribble.sesstype.name.ProtocolName; import org.scribble.visit.wf.NameDisambiguator; public abstract class DoArgListDel extends ScribDelBase { public DoArgListDel() { } // Doing in leave allows the arguments to be individually checked first @Override public DoArgList<?> leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException { DoArgList<?> dal = (DoArgList<?>) visited; List<?> args = dal.getDoArgs(); ProtocolDecl<?> pd = getTargetProtocolDecl((Do<?>) parent, disamb); if (args.size() != getParamDeclList(pd).getDecls().size()) { throw new ScribbleException(visited.getSource(), "Do arity mismatch for " + pd.header + ": " + args); } return dal; } // Not using Do#getTargetProtocolDecl, because that currently relies on namedisamb pass to convert targets to fullnames (because it just gets the full name dependency, it doesn't do visible name resolution) protected ProtocolDecl<?> getTargetProtocolDecl(Do<?> parent, NameDisambiguator disamb) throws ScribbleException { ModuleContext mc = disamb.getModuleContext(); JobContext jc = disamb.job.getContext(); Do<?> doo = (Do<?>) parent; ProtocolName<?> pn = doo.proto.toName(); /*if (!mc.isVisibleProtocolDeclName(simpname)) // FIXME: should be checked somewhere else? earlier (do-entry?) -- done { throw new ScribbleException("Protocol decl not visible: " + simpname); }*/ ProtocolName<?> fullname = mc.getVisibleProtocolDeclFullName(pn); // Lookup in visible names -- not deps, because do target name not disambiguated yet (will be done later this pass) return jc.getModule(fullname.getPrefix()).getProtocolDecl(pn.getSimpleName()); } protected abstract HeaderParamDeclList<?> getParamDeclList(ProtocolDecl<?> pd); }