package org.scribble.del.name; import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.MessageTransfer; import org.scribble.ast.PayloadElem; import org.scribble.ast.ScribNode; import org.scribble.ast.context.ModuleContext; import org.scribble.ast.name.simple.AmbigNameNode; import org.scribble.del.ScribDelBase; import org.scribble.main.ScribbleException; import org.scribble.sesstype.kind.DataTypeKind; import org.scribble.sesstype.kind.SigKind; import org.scribble.sesstype.name.AmbigName; import org.scribble.visit.wf.NameDisambiguator; public class AmbigNameNodeDel extends ScribDelBase { public AmbigNameNodeDel() { } // Currently only in "message positions (see Scribble.g ambiguousname) @Override public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException { ModuleContext mcontext = disamb.getModuleContext(); AmbigNameNode ann = (AmbigNameNode) visited; AmbigName name = ann.toName(); // By well-formedness (checked later), payload type and parameter names are distinct // FIXME: are conflicts checked elsewhere? if (mcontext.isDataTypeVisible(name.toDataType())) { if (parent instanceof MessageTransfer<?>) // FIXME HACK: MessageTransfer assumes MessageNode (cast in visitChildren), so this needs to be caught here // FIXME: other similar cases? { throw new ScribbleException(ann.getSource(), "Invalid occurrence of data type: " + parent); } return AstFactoryImpl.FACTORY.QualifiedNameNode(ann.getSource(), DataTypeKind.KIND, name.getElements()); } else if (mcontext.isMessageSigNameVisible(name.toMessageSigName())) { if (parent instanceof PayloadElem) // FIXME HACK { throw new ScribbleException(ann.getSource(), "Invalid occurrence of message signature name: " + parent); } return AstFactoryImpl.FACTORY.QualifiedNameNode(ann.getSource(), SigKind.KIND, name.getElements()); } else if (disamb.isBoundParameter(name)) { return AstFactoryImpl.FACTORY.NonRoleParamNode(ann.getSource(), disamb.getParameterKind(name), name.toString()); } throw new ScribbleException(ann.getSource(), "Cannot disambiguate name: " + name); } }