Beispiel #1
0
        public IList <DiagnosticMessage> GetAllDiagnostics()
        {
            var messages = new List <DiagnosticMessage>();

            if (_diagnostics != null)
            {
                messages.AddRange(_diagnostics);
            }

            var dependencies = new Dictionary <string, List <DependencyItem> >();
            var topLevel     = new List <LibraryItem>();

            foreach (var library in GetLibraries())
            {
                if (!library.Resolved)
                {
                    string message;
                    string errorCode;
                    if (library.Compatible)
                    {
                        foreach (var range in library.RequestedRanges)
                        {
                            errorCode = ErrorCodes.NU1001;
                            message   = $"The dependency {FormatLibraryRange(range)} could not be resolved.";

                            AddDiagnostics(messages, library, message, DiagnosticMessageSeverity.Error, errorCode);
                        }
                    }
                    else
                    {
                        errorCode = ErrorCodes.NU1002;
                        message   = $"The dependency {library.Identity} does not support framework {library.Framework}.";

                        AddDiagnostics(messages, library, message, DiagnosticMessageSeverity.Error, errorCode);
                    }
                }
                else
                {
                    // Store dependency -> library for later
                    // J.N -> [(R1, P1), (R2, P2)]
                    foreach (var dependency in library.Dependencies)
                    {
                        List <DependencyItem> items;
                        if (!dependencies.TryGetValue(dependency.Name, out items))
                        {
                            items = new List <DependencyItem>();
                            dependencies[dependency.Name] = items;
                        }
                        items.Add(new DependencyItem(dependency, library));
                    }

                    foreach (var range in library.RequestedRanges)
                    {
                        // Skip libraries that aren't specified in a project.json
                        // Only report problems for this project
                        if (string.IsNullOrEmpty(range.SourceFilePath))
                        {
                            continue;
                        }

                        // We only care about things requested in this project
                        if (!string.Equals(_projectPath, range.SourceFilePath))
                        {
                            continue;
                        }

                        if (range.VersionRange == null)
                        {
                            // TODO: Show errors/warnings for things without versions
                            continue;
                        }

                        topLevel.Add(new LibraryItem(range, library));

                        // If we ended up with a declared version that isn't what was asked for directly
                        // then report a warning
                        // Case 1: Non floating version and the minimum doesn't match what was specified
                        // Case 2: Floating version that fell outside of the range
                        if ((!range.VersionRange.IsFloating &&
                             range.VersionRange.MinVersion != library.Identity.Version) ||
                            (range.VersionRange.IsFloating &&
                             !range.VersionRange.Float.Satisfies(library.Identity.Version)))
                        {
                            var message = $"Dependency specified was {FormatLibraryRange(range)} but ended up with {library.Identity}.";

                            messages.Add(
                                new DiagnosticMessage(
                                    ErrorCodes.NU1007,
                                    message,
                                    range.SourceFilePath,
                                    DiagnosticMessageSeverity.Warning,
                                    range.SourceLine,
                                    range.SourceColumn,
                                    library));
                        }
                    }
                }
            }

            // Version conflicts
            foreach (var libraryItem in topLevel)
            {
                var library = libraryItem.Library;

                if (library.Identity.Type != LibraryType.Package)
                {
                    continue;
                }

                List <DependencyItem> items;
                if (dependencies.TryGetValue(library.Identity.Name, out items))
                {
                    foreach (var item in items)
                    {
                        var versionRange = item.Dependency.VersionRange;

                        if (versionRange == null)
                        {
                            continue;
                        }

                        if (library.Identity.Version.IsPrerelease && !versionRange.IncludePrerelease)
                        {
                            versionRange = VersionRange.SetIncludePrerelease(versionRange, includePrerelease: true);
                        }

                        if (item.Library != library && !versionRange.Satisfies(library.Identity.Version))
                        {
                            var message = $"Dependency conflict. {item.Library.Identity} expected {FormatLibraryRange(item.Dependency)} but got {library.Identity.Version}";

                            messages.Add(
                                new DiagnosticMessage(
                                    ErrorCodes.NU1012,
                                    message,
                                    libraryItem.RequestedRange.SourceFilePath,
                                    DiagnosticMessageSeverity.Warning,
                                    libraryItem.RequestedRange.SourceLine,
                                    libraryItem.RequestedRange.SourceColumn,
                                    library));
                        }
                    }
                }
            }

            return(messages);
        }