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;
 }