public static SourceAnnotationInfo TryGetSourceInfo(
            [NotNull] Target target,
            [NotNull] IMessageLogger messageLogger)
        {
            SourceAnnotationInfo result = null;

            try
            {
                // ReSharper disable once PossibleNullReferenceException
                var reader = GetReader(target.Method.DeclaringType.Module);

                result = TryGetSourceInfoCore(target, reader, messageLogger);
                if (result == null)
                {
                    messageLogger.WriteSetupErrorMessage(
                        target,
                        "No PDB data available.",
                        $"Ensure that there is actual pdb file for the assembly '{target.Method.DeclaringType?.Module.GetModulePath()}'.");
                }
            }
            catch (COMException ex)
            {
                messageLogger.WriteExceptionMessage(
                    MessageSeverity.ExecutionError, target,
                    "Could not parse method symbols.", ex);
            }

            return(result);
        }
Exemple #2
0
        private static bool TryValidate(SourceAnnotationInfo documentInfo, IMessageLogger messageLogger)
        {
            bool result = true;

            if (documentInfo.SourceLanguage != SourceLanguage.CSharp)
            {
                messageLogger.WriteSetupErrorMessage(
                    $"Document language {documentInfo.SourceLanguage} is unsupported. File '{documentInfo.Path}'.");
                result = false;
            }

            if (documentInfo.MethodLinesMap.IsEmpty)
            {
                // TODO: improve message
                messageLogger.WriteSetupErrorMessage(
                    $"No methods found in document '{documentInfo.Path}'.");
                result = false;
            }

            if (!documentInfo.MethodLinesMap.IsMerged)
            {
                var methodsIntersection = documentInfo.MethodLinesMap
                                          .GetIntersections()
                                          .FirstOrDefault(i => i.Ranges.Count > 1);
                DebugCode.BugIf(methodsIntersection.IsEmpty, "methodsIntersection.IsEmpty");

                var methodNames = methodsIntersection.Ranges.Select(r => r.Key.Name).Join(", ");

                // TODO: improve message
                messageLogger.WriteSetupErrorMessage(
                    $"Some of methods in document share same source lines {methodsIntersection.IntersectionRange}: " +
                    $"{methodNames}. Document '{documentInfo.Path}'.");
                result = false;
            }

            var symbolsChecksum = documentInfo.Checksum;
            var fileChecksum    = AnnotationHelpers.TryGetChecksum(documentInfo.Path, documentInfo.ChecksumAlgorithm);

            if (!symbolsChecksum.EqualsTo(fileChecksum))
            {
                var expected = symbolsChecksum.ToHexString();
                var actual   = fileChecksum.ToHexString();
                messageLogger.WriteSetupErrorMessage(
                    $"{ChecksumAlgorithm.Sha1} checksum validation failed. File '{documentInfo.Path}'." +
                    $"{Environment.NewLine}\tActual: 0x{actual}" +
                    $"{Environment.NewLine}\tExpected: 0x{expected}");

                result = false;
            }

            return(result);
        }