Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        //
        // 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);
        }
Exemplo n.º 3
0
        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));
        }
Exemplo n.º 4
0
        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));
        }
Exemplo n.º 5
0
        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));
        }