Esempio n. 1
0
        internal override void AccumUsedTypeAndMemberDefs(ValidityContext vctxt, AssemblyDef assemblyDef, TypeDef typeDef)
        {
            base.AccumUsedTypeAndMemberDefs(vctxt, assemblyDef, typeDef);
            var ctxt = MessageContextBuilders.Member(vctxt.Global, assemblyDef, typeDef, this);

            for (var i = 0; i < TypeParameters.Count; i++)
            {
                var p = TypeParameters[i];
                p.AccumUsedTypeDefs(vctxt, assemblyDef, false);
                if (p.Invalid != null)
                {
                    Invalid = new InvalidInfo(MessageContextBuilders.TypeArg(ParameterFlavor.Method, i), p.Invalid);
                    return;
                }
            }
            foreach (var p in ValueParameters)
            {
                Invalid = p.Type.AccumUsedTypeDefs(vctxt, ctxt, usedTypes);
                if (Invalid != null)
                {
                    return;
                }
            }
            if (Result != null)
            {
                Invalid = Result.Type.AccumUsedTypeDefs(vctxt, ctxt, usedTypes);
                if (Invalid != null)
                {
                    return;
                }
            }

            if (vctxt.IgnoreMethodDefBody(assemblyDef, typeDef, this))
            {
                return;
            }

            foreach (var l in Locals)
            {
                Invalid = l.Type.AccumUsedTypeDefs(vctxt, ctxt, usedTypes);
                if (Invalid != null)
                {
                    return;
                }
            }
            var instructions = Instructions(vctxt.Global);

            if (instructions != null)
            {
                foreach (var i in instructions.Body)
                {
                    Invalid = i.AccumUsedTypeAndMemberDefs(vctxt, ctxt, usedTypes, usedMembers);
                    if (Invalid != null)
                    {
                        return;
                    }
                }
            }
        }
Esempio n. 2
0
 public InvalidInfo(MessageContext ctxt, InvalidInfo dependsOn)
 {
     Context   = ctxt;
     DependsOn = dependsOn;
 }
Esempio n. 3
0
 public InvalidInfo(MessageContext ctxt)
 {
     Context   = ctxt;
     DependsOn = null;
 }
Esempio n. 4
0
        private void PropogateInvalidity(Seq <Seq <QualifiedTypeName> > typeSccs, Seq <Seq <QualifiedMemberName> > memberSccs)
        {
            for (var i = typeSccs.Count - 1; i >= 0; i--)
            {
                var typeScc = typeSccs[i];
                if (typeScc.Count == 1)
                {
                    var sccAssemblyDef = default(AssemblyDef);
                    var sccTypeDef     = default(TypeDef);
                    if (typeScc[0].PrimTryResolve(Global, out sccAssemblyDef, out sccTypeDef))
                    {
                        sccTypeDef.PropogateInvalidity(Global, sccAssemblyDef);
                    }
                }
                else
                {
                    // Check if entire scc is valid
                    var invalid = default(InvalidInfo);
                    foreach (var r in typeScc)
                    {
                        var sccAssemblyDef = default(AssemblyDef);
                        var sccTypeDef     = default(TypeDef);
                        if (r.PrimTryResolve(Global, out sccAssemblyDef, out sccTypeDef))
                        {
                            if (sccTypeDef.Invalid != null)
                            {
                                invalid = new InvalidInfo
                                              (MessageContextBuilders.Type(Global, sccAssemblyDef, sccTypeDef),
                                              sccTypeDef.Invalid);
                                break;
                            }
                        }
                    }
                    if (invalid != null)
                    {
                        // Fail entire scc
                        foreach (var r in typeScc)
                        {
                            var sccAssemblyDef = default(AssemblyDef);
                            var sccTypeDef     = default(TypeDef);
                            if (r.PrimTryResolve(Global, out sccAssemblyDef, out sccTypeDef))
                            {
                                if (sccTypeDef.Invalid == null)
                                {
                                    sccTypeDef.Invalid = invalid;
                                }
                            }
                        }
                        // Propogate failure
                        foreach (var r in typeScc)
                        {
                            var sccAssemblyDef = default(AssemblyDef);
                            var sccTypeDef     = default(TypeDef);
                            if (r.PrimTryResolve(Global, out sccAssemblyDef, out sccTypeDef))
                            {
                                sccTypeDef.PropogateInvalidity(Global, sccAssemblyDef);
                            }
                        }
                    }
                }
            }

            for (var i = memberSccs.Count - 1; i >= 0; i--)
            {
                var memberScc = memberSccs[i];
                if (memberScc.Count == 1)
                {
                    var sccAssemblyDef = default(AssemblyDef);
                    var sccTypeDef     = default(TypeDef);
                    var sccMemberDef   = default(MemberDef);
                    if (memberScc[0].PrimTryResolve(Global, out sccAssemblyDef, out sccTypeDef, out sccMemberDef))
                    {
                        sccMemberDef.PropogateInvalidity(Global, sccAssemblyDef, sccTypeDef);
                        var sccMethodDef = sccMemberDef as CST.MethodDef;
                        if (sccMethodDef != null)
                        {
                            // Check if method is recursive
                            if (sccMethodDef.UsedMembers.Contains(memberScc[0]))
                            {
                                sccMethodDef.IsRecursive = true;
                            }
                        }
                    }
                }
                else if (memberScc.Count > 1)
                {
                    // Check if entire scc is valid, and mark methods as recursive
                    var invalid = default(InvalidInfo);
                    foreach (var r in memberScc)
                    {
                        var sccAssemblyDef = default(AssemblyDef);
                        var sccTypeDef     = default(TypeDef);
                        var sccMemberDef   = default(MemberDef);
                        if (r.PrimTryResolve(Global, out sccAssemblyDef, out sccTypeDef, out sccMemberDef))
                        {
                            if (sccMemberDef.Invalid != null && invalid == null)
                            {
                                invalid = new InvalidInfo
                                              (MessageContextBuilders.Member(Global, sccAssemblyDef, sccTypeDef, sccMemberDef),
                                              sccMemberDef.Invalid);
                            }
                            var sccMethodDef = sccMemberDef as CST.MethodDef;
                            if (sccMethodDef != null)
                            {
                                sccMethodDef.IsRecursive = true;
                            }
                        }
                    }
                    if (invalid != null)
                    {
                        // Fail entire scc
                        foreach (var r in memberScc)
                        {
                            var sccAssemblyDef = default(AssemblyDef);
                            var sccTypeDef     = default(TypeDef);
                            var sccMemberDef   = default(MemberDef);
                            if (r.PrimTryResolve(Global, out sccAssemblyDef, out sccTypeDef, out sccMemberDef))
                            {
                                if (sccMemberDef.Invalid == null)
                                {
                                    sccMemberDef.Invalid = invalid;
                                }
                            }
                        }
                        // Propogate failure
                        foreach (var r in memberScc)
                        {
                            var sccAssemblyDef = default(AssemblyDef);
                            var sccTypeDef     = default(TypeDef);
                            var sccMemberDef   = default(MemberDef);
                            if (r.PrimTryResolve(Global, out sccAssemblyDef, out sccTypeDef, out sccMemberDef))
                            {
                                sccMemberDef.PropogateInvalidity(Global, sccAssemblyDef, sccTypeDef);
                            }
                        }
                    }
                }
            }
        }
Esempio n. 5
0
 public UnimplementableUsedTypeMessage(MessageContext ctxt, InvalidInfo info)
     : base(ctxt, Severity.Error, "1028")
 {
     Info = info;
 }
Esempio n. 6
0
 public UnimplementableUsedTypeMessage(MessageContext ctxt, InvalidInfo info)
     : base(ctxt, Severity.Error, "1028")
 {
     Info = info;
 }
Esempio n. 7
0
        internal override void CheckValid(ValidityContext vctxt, TypeEnvironment typeEnv)
        {
            if (Invalid != null || typeEnv.Type.Invalid != null)
                return;

            var methEnv = typeEnv.AddMethod(this).AddSelfMethodBoundArguments();
            for (var i = 0; i < TypeParameters.Count; i++)
            {
                TypeParameters[i].CheckValid(vctxt, methEnv);
                if (TypeParameters[i].Invalid != null)
                {
                    Invalid = new InvalidInfo
                        (MessageContextBuilders.TypeArg(ParameterFlavor.Method, i), TypeParameters[i].Invalid);
                    return;
                }
            }
            var ctxt = MessageContextBuilders.Member(vctxt.Global, typeEnv.Assembly, typeEnv.Type, this);
            foreach (var p in ValueParameters)
            {
                Invalid = p.Type.CheckValid(vctxt, ctxt, methEnv);
                if (Invalid != null)
                    return;
            }
            if (Result != null)
            {
                Invalid = Result.Type.CheckValid(vctxt, ctxt, methEnv);
                if (Invalid != null)
                    return;
            }

            if (vctxt.IgnoreMethodDefBody(typeEnv.Assembly, typeEnv.Type, this))
                return;

            foreach (var l in Locals)
            {
                Invalid = l.Type.CheckValid(vctxt, ctxt, methEnv);
                if (Invalid != null)
                    return;
            }
            var instructions = Instructions(vctxt.Global);
            if (instructions != null)
            {
                foreach (var i in instructions.Body)
                {
                    Invalid = i.CheckValid(vctxt, ctxt, methEnv);
                    if (Invalid != null)
                        return;
                    Invalid = vctxt.ImplementableInstruction(ctxt, methEnv.Assembly, methEnv.Type, this, i);
                    if (Invalid != null)
                        return;
                }
            }

            vctxt.ImplementableMemberDef(typeEnv.Assembly, typeEnv.Type, this);
        }
Esempio n. 8
0
        internal override void AccumUsedTypeAndMemberDefs(ValidityContext vctxt, AssemblyDef assemblyDef, TypeDef typeDef)
        {
            base.AccumUsedTypeAndMemberDefs(vctxt, assemblyDef, typeDef);
            var ctxt = MessageContextBuilders.Member(vctxt.Global, assemblyDef, typeDef, this);
            for (var i = 0; i < TypeParameters.Count; i++)
            {
                var p = TypeParameters[i];
                p.AccumUsedTypeDefs(vctxt, assemblyDef, false);
                if (p.Invalid != null)
                {
                    Invalid = new InvalidInfo(MessageContextBuilders.TypeArg(ParameterFlavor.Method, i), p.Invalid);
                    return;
                }
            }
            foreach (var p in ValueParameters)
            {
                Invalid = p.Type.AccumUsedTypeDefs(vctxt, ctxt, usedTypes);
                if (Invalid != null)
                    return;
            }
            if (Result != null)
            {
                Invalid = Result.Type.AccumUsedTypeDefs(vctxt, ctxt, usedTypes);
                if (Invalid != null)
                    return;
            }

            if (vctxt.IgnoreMethodDefBody(assemblyDef, typeDef, this))
                return;

            foreach (var l in Locals)
            {
                Invalid = l.Type.AccumUsedTypeDefs(vctxt, ctxt, usedTypes);
                if (Invalid != null)
                    return;
            }
            var instructions = Instructions(vctxt.Global);
            if (instructions != null)
            {
                foreach (var i in instructions.Body)
                {
                    Invalid = i.AccumUsedTypeAndMemberDefs(vctxt, ctxt, usedTypes, usedMembers);
                    if (Invalid != null)
                        return;
                }
            }
        }
Esempio n. 9
0
        internal override void CheckValid(ValidityContext vctxt, TypeEnvironment typeEnv)
        {
            if (Invalid != null || typeEnv.Type.Invalid != null)
            {
                return;
            }

            var methEnv = typeEnv.AddMethod(this).AddSelfMethodBoundArguments();

            for (var i = 0; i < TypeParameters.Count; i++)
            {
                TypeParameters[i].CheckValid(vctxt, methEnv);
                if (TypeParameters[i].Invalid != null)
                {
                    Invalid = new InvalidInfo
                                  (MessageContextBuilders.TypeArg(ParameterFlavor.Method, i), TypeParameters[i].Invalid);
                    return;
                }
            }
            var ctxt = MessageContextBuilders.Member(vctxt.Global, typeEnv.Assembly, typeEnv.Type, this);

            foreach (var p in ValueParameters)
            {
                Invalid = p.Type.CheckValid(vctxt, ctxt, methEnv);
                if (Invalid != null)
                {
                    return;
                }
            }
            if (Result != null)
            {
                Invalid = Result.Type.CheckValid(vctxt, ctxt, methEnv);
                if (Invalid != null)
                {
                    return;
                }
            }

            if (vctxt.IgnoreMethodDefBody(typeEnv.Assembly, typeEnv.Type, this))
            {
                return;
            }

            foreach (var l in Locals)
            {
                Invalid = l.Type.CheckValid(vctxt, ctxt, methEnv);
                if (Invalid != null)
                {
                    return;
                }
            }
            var instructions = Instructions(vctxt.Global);

            if (instructions != null)
            {
                foreach (var i in instructions.Body)
                {
                    Invalid = i.CheckValid(vctxt, ctxt, methEnv);
                    if (Invalid != null)
                    {
                        return;
                    }
                    Invalid = vctxt.ImplementableInstruction(ctxt, methEnv.Assembly, methEnv.Type, this, i);
                    if (Invalid != null)
                    {
                        return;
                    }
                }
            }

            vctxt.ImplementableMemberDef(typeEnv.Assembly, typeEnv.Type, this);
        }
Esempio n. 10
0
 public InvalidInfo(MessageContext ctxt, InvalidInfo dependsOn)
 {
     Context = ctxt;
     DependsOn = dependsOn;
 }
Esempio n. 11
0
 public InvalidInfo(MessageContext ctxt)
 {
     Context = ctxt;
     DependsOn = null;
 }
Esempio n. 12
0
        private void PropogateInvalidity(Seq<Seq<QualifiedTypeName>> typeSccs, Seq<Seq<QualifiedMemberName>> memberSccs)
        {
            for (var i = typeSccs.Count - 1; i >= 0; i--)
            {
                var typeScc = typeSccs[i];
                if (typeScc.Count == 1)
                {
                    var sccAssemblyDef = default(AssemblyDef);
                    var sccTypeDef = default(TypeDef);
                    if (typeScc[0].PrimTryResolve(Global, out sccAssemblyDef, out sccTypeDef))
                        sccTypeDef.PropogateInvalidity(Global, sccAssemblyDef);
                }
                else
                {
                    // Check if entire scc is valid
                    var invalid = default(InvalidInfo);
                    foreach (var r in typeScc)
                    {
                        var sccAssemblyDef = default(AssemblyDef);
                        var sccTypeDef = default(TypeDef);
                        if (r.PrimTryResolve(Global, out sccAssemblyDef, out sccTypeDef))
                        {
                            if (sccTypeDef.Invalid != null)
                            {
                                invalid = new InvalidInfo
                                    (MessageContextBuilders.Type(Global, sccAssemblyDef, sccTypeDef),
                                     sccTypeDef.Invalid);
                                break;
                            }
                        }
                    }
                    if (invalid != null)
                    {
                        // Fail entire scc
                        foreach (var r in typeScc)
                        {
                            var sccAssemblyDef = default(AssemblyDef);
                            var sccTypeDef = default(TypeDef);
                            if (r.PrimTryResolve(Global, out sccAssemblyDef, out sccTypeDef))
                            {
                                if (sccTypeDef.Invalid == null)
                                    sccTypeDef.Invalid = invalid;
                            }
                        }
                        // Propogate failure
                        foreach (var r in typeScc)
                        {
                            var sccAssemblyDef = default(AssemblyDef);
                            var sccTypeDef = default(TypeDef);
                            if (r.PrimTryResolve(Global, out sccAssemblyDef, out sccTypeDef))
                                sccTypeDef.PropogateInvalidity(Global, sccAssemblyDef);
                        }
                    }
                }
            }

            for (var i = memberSccs.Count - 1; i >= 0; i--)
            {
                var memberScc = memberSccs[i];
                if (memberScc.Count == 1)
                {
                    var sccAssemblyDef = default(AssemblyDef);
                    var sccTypeDef = default(TypeDef);
                    var sccMemberDef = default(MemberDef);
                    if (memberScc[0].PrimTryResolve(Global, out sccAssemblyDef, out sccTypeDef, out sccMemberDef))
                    {
                        sccMemberDef.PropogateInvalidity(Global, sccAssemblyDef, sccTypeDef);
                        var sccMethodDef = sccMemberDef as CST.MethodDef;
                        if (sccMethodDef != null)
                        {
                            // Check if method is recursive
                            if (sccMethodDef.UsedMembers.Contains(memberScc[0]))
                                sccMethodDef.IsRecursive = true;
                        }
                    }
                }
                else if (memberScc.Count > 1)
                {
                    // Check if entire scc is valid, and mark methods as recursive
                    var invalid = default(InvalidInfo);
                    foreach (var r in memberScc)
                    {
                        var sccAssemblyDef = default(AssemblyDef);
                        var sccTypeDef = default(TypeDef);
                        var sccMemberDef = default(MemberDef);
                        if (r.PrimTryResolve(Global, out sccAssemblyDef, out sccTypeDef, out sccMemberDef))
                        {
                            if (sccMemberDef.Invalid != null && invalid == null) 
                                invalid = new InvalidInfo
                                    (MessageContextBuilders.Member(Global, sccAssemblyDef, sccTypeDef, sccMemberDef),
                                     sccMemberDef.Invalid);
                            var sccMethodDef = sccMemberDef as CST.MethodDef;
                            if (sccMethodDef != null)
                                sccMethodDef.IsRecursive = true;
                        }
                    }
                    if (invalid != null)
                    {
                        // Fail entire scc
                        foreach (var r in memberScc)
                        {
                            var sccAssemblyDef = default(AssemblyDef);
                            var sccTypeDef = default(TypeDef);
                            var sccMemberDef = default(MemberDef);
                            if (r.PrimTryResolve(Global, out sccAssemblyDef, out sccTypeDef, out sccMemberDef))
                            {
                                if (sccMemberDef.Invalid == null)
                                    sccMemberDef.Invalid = invalid;
                            }
                        }
                        // Propogate failure
                        foreach (var r in memberScc)
                        {
                            var sccAssemblyDef = default(AssemblyDef);
                            var sccTypeDef = default(TypeDef);
                            var sccMemberDef = default(MemberDef);
                            if (r.PrimTryResolve(Global, out sccAssemblyDef, out sccTypeDef, out sccMemberDef))
                                sccMemberDef.PropogateInvalidity(Global, sccAssemblyDef, sccTypeDef);
                        }
                    }
                }
            }
        }