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; } } } }
public InvalidInfo(MessageContext ctxt, InvalidInfo dependsOn) { Context = ctxt; DependsOn = dependsOn; }
public InvalidInfo(MessageContext ctxt) { Context = ctxt; DependsOn = null; }
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); } } } } } }
public UnimplementableUsedTypeMessage(MessageContext ctxt, InvalidInfo info) : base(ctxt, Severity.Error, "1028") { Info = info; }
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); }
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; } } }
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); }
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); } } } } }