internal override InvalidInfo CheckValid(ValidityContext vctxt, MessageContext ctxt, RootEnvironment rootEnv) { var v = base.CheckValid(vctxt, ctxt, rootEnv); if (v != null) { return(v); } var typeEnv = DefiningType.Enter(rootEnv); var methodDef = typeEnv.Type.ResolveMethod(signature); if (methodDef == null) { vctxt.Log(new InvalidMemberRef(ctxt, this, "No such method in defining type")); return(new InvalidInfo(MessageContextBuilders.Member(vctxt.Global, this))); } var methEnv = typeEnv.AddMethod(methodDef).AddSelfMethodBoundArguments(); v = signature.CheckValid(vctxt, ctxt, methEnv); if (v != null) { return(v); } return(vctxt.ImplementableMemberRef(ctxt, rootEnv, this)); }
// // Validity // internal virtual InvalidInfo AccumUsedTypeDefs(ValidityContext vctxt, MessageContext ctxt, Set <QualifiedTypeName> usedTypes) { var v = DefiningType.AccumUsedTypeDefs(vctxt, ctxt, usedTypes); if (v != null) { return(v); } v = Signature.AccumUsedTypeDefs(vctxt, ctxt, usedTypes); if (v != null) { return(v); } var assemblyDef = default(AssemblyDef); var typeDef = default(TypeDef); if (DefiningType.PrimTryResolve(vctxt.Global, out assemblyDef, out typeDef)) { if (!typeDef.HasMember(Signature)) { vctxt.Log (new InvalidMemberRef (ctxt, this, "Defining type does not contain definition for matching member")); return(new InvalidInfo(MessageContextBuilders.Member(vctxt.Global, this))); } } return(null); }
internal override InvalidInfo CheckValid(ValidityContext vctxt, MessageContext ctxt, RootEnvironment rootEnv) { if (Index >= rootEnv.SkolemDefs.Count) { vctxt.Log(new InvalidTypeRef(ctxt, this, "skolemized type index is out of range")); return(new InvalidInfo(MessageContextBuilders.Type(vctxt.Global, this))); } return(vctxt.ImplementableTypeRef(ctxt, rootEnv, this)); }
internal override InvalidInfo CheckValid(ValidityContext vctxt, MessageContext ctxt, RootEnvironment rootEnv) { switch (ParameterFlavor) { case ParameterFlavor.Type: { var typeEnv = rootEnv as TypeEnvironment; if (typeEnv == null) { throw new InvalidOperationException("not in type environment"); } if (Index >= typeEnv.TypeBoundArguments.Count) { vctxt.Log(new InvalidTypeRef(ctxt, this, "type-bound type parameter index is out of range")); return(new InvalidInfo(MessageContextBuilders.Type(vctxt.Global, this))); } break; } case ParameterFlavor.Method: { var methEnv = rootEnv as MethodEnvironment; if (methEnv == null) { throw new InvalidOperationException("not in method environment"); } if (Index >= methEnv.MethodBoundArguments.Count) { vctxt.Log(new InvalidTypeRef(ctxt, this, "method-bound type parameter index is out of range")); return(new InvalidInfo(MessageContextBuilders.Type(vctxt.Global, this))); } break; } default: throw new ArgumentOutOfRangeException(); } return(vctxt.ImplementableTypeRef(ctxt, rootEnv, this)); }
internal override InvalidInfo CheckValid(ValidityContext vctxt, MessageContext ctxt, RootEnvironment rootEnv) { var v = base.CheckValid(vctxt, ctxt, rootEnv); if (v != null) { return(v); } if (MethodTypeArguments.Count != MethodTypeArity) { vctxt.Log (new InvalidMemberRef (ctxt, this, String.Format ("Polymorphic method has {0} type parameters but is applied to {1} type arguments", MethodTypeArity, MethodTypeArguments.Count))); return(new InvalidInfo(MessageContextBuilders.Member(vctxt.Global, this))); } v = MethodTypeArguments.Select(t => t.CheckValid(vctxt, ctxt, rootEnv)).FirstOrDefault(v2 => v2 != null); if (v != null) { return(v); } var groundMethodTypeArguments = rootEnv.SubstituteTypes(MethodTypeArguments); var typeEnv = DefiningType.Enter(rootEnv); var methodDef = typeEnv.Type.ResolveMethod(signature); if (methodDef == null) { throw new InvalidOperationException("unable to resolve method"); } var methEnv = typeEnv.AddMethod(methodDef).AddMethodBoundArguments(groundMethodTypeArguments); return(signature.CheckValid(vctxt, ctxt, methEnv)); }