static string Canonicalize(String methodName, XElement outcomeElement, BaseLiningOptions baselineStrategy) { var outcomeKind = (string)outcomeElement.Attribute("Outcome"); if (outcomeKind != null) { ProofOutcome outcome = (ProofOutcome)Enum.Parse(typeof(ProofOutcome), (string)outcomeElement.Attribute("Outcome"), true); WarningKind kind = (WarningKind)Enum.Parse(typeof(WarningKind), (string)outcomeElement.Attribute("Kind"), true); string message = (string)outcomeElement.Attribute("Message"); int primaryILOffset = Int32.Parse((string)outcomeElement.Attribute("PrimaryILOffset"), System.Globalization.NumberStyles.HexNumber); int methodILOffset = Int32.Parse((string)outcomeElement.Attribute("MethodILOffset"), System.Globalization.NumberStyles.HexNumber); return(CanonicalFormat(methodName, kind, outcome, message, primaryILOffset, methodILOffset, baselineStrategy)); } else { return((string)outcomeElement.Attribute("Message")); } }
static string CanonicalFormat(string methodName, WarningKind kind, ProofOutcome outcome, string message, int primaryILOffset, int methodILOffset, BaseLiningOptions baselineStrategy) { switch (baselineStrategy) { case BaseLiningOptions.ilBased: return(String.Format("{0}:{1} PrimaryIL={2} MethodIL={3}", methodName, message, primaryILOffset, methodILOffset)); case BaseLiningOptions.typeBased: return(String.Format("{0}:{1}", methodName, kind.ToString())); case BaseLiningOptions.mixed: default: switch (kind) { case WarningKind.Invariant: case WarningKind.Assert: case WarningKind.Requires: case WarningKind.Ensures: return(String.Format("{0} PrimaryIL={1}", message, primaryILOffset)); default: return(message); } } }
public static BaseLineOutcomes GetOutcomes(IEnumerable <XElement> methodElements, BaseLiningOptions baselineStrategy) { /* * IEnumerable<string> outcomeStrings = * from o in methodElements.Elements("Outcome") select Canonicalize(o, baselineStrategy); */ Set <string> outcomes = new Set <string>(); // TODO: make more LINQ-y and concise foreach (XElement methodElement in methodElements) { var outcomeElems = methodElement.Elements("Outcome"); if (methodElement.FirstAttribute != null) { // get method name if the elements are associated with a particular method, else they are associated with the assembly as a whole string methodName = methodElement.FirstAttribute != null ? methodElement.FirstAttribute.Value : "Assembly"; foreach (XElement outcomeElement in outcomeElems) { outcomes.Add(Canonicalize(methodName, outcomeElement, baselineStrategy)); } } } return(new BaseLineOutcomes(outcomes, baselineStrategy)); }
/* * public bool MatchesMethodHash(string otherHash) * { * return methodHash == otherHash; * } */ public static BaseLineOutcomes GetOutcomesForMethod(IEnumerable <XElement> methodElements, BaseLiningOptions baselineStrategy) { Set <string> outcomes = new Set <string>(); string hash = null; Contract.Assert(methodElements.Count() < 2, string.Format("Not sure what to do with {0} method elements ", methodElements.Count())); // TODO: make more LINQ-y and concise foreach (XElement methodElement in methodElements) { // save the hash of this element so we can check if it has changed in the current version var hashElem = methodElement.Attribute("Hash"); hash = hashElem != null ? hashElem.Value : "NONE"; foreach (XElement outcomeElement in methodElement.Elements("Outcome")) { outcomes.Add(Canonicalize(methodElement.FirstAttribute.Value, outcomeElement, baselineStrategy)); } } return(new BaseLineOutcomes(outcomes, baselineStrategy, hash)); }
public BaseLineOutcomes(Set <string> outcomes, BaseLiningOptions baselineStrategy, string methodHash) { this.expectedOutcomes = outcomes; this.baselineStrategy = baselineStrategy; this.methodHash = methodHash; }
public BaseLineOutcomes(Set <string> outcomes, BaseLiningOptions baselineStrategy) { this.expectedOutcomes = outcomes; this.baselineStrategy = baselineStrategy; }