Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Ward <matt.ward@microsoft.com>2018-05-27 17:51:06 +0300
committerMatt Ward <matt.ward@microsoft.com>2018-10-19 12:56:43 +0300
commit9e6b6bb46c18421e299c909de7be02933ffc0fa2 (patch)
treeccb778e6203d604267cf6892b5652c16f634816f /main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders
parentdd1a443354ee9b48b910c52600d4bb82c43d3ccb (diff)
[DotNetCore] Show warning icon for indirect NuGet diagnostics
Warning icons are now shown in the Solution pad for all higher NuGet packages in the Dependencies tree structure. This makes it easier to find the warning in the tree without having to expand all items. Now you can follow the warning icons down the tree until you find the NuGet diagnostic for a particular NuGet package.
Diffstat (limited to 'main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders')
-rw-r--r--main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/PackageDependenciesNode.cs5
-rw-r--r--main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/PackageDependencyInfo.cs72
-rw-r--r--main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/PackageDependencyNode.cs65
-rw-r--r--main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/PackageDependencyNodeCache.cs37
-rw-r--r--main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/SdkDependenciesNode.cs5
-rw-r--r--main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/TargetFrameworkNode.cs4
6 files changed, 124 insertions, 64 deletions
diff --git a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/PackageDependenciesNode.cs b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/PackageDependenciesNode.cs
index e22d152dca..64b4d05b69 100644
--- a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/PackageDependenciesNode.cs
+++ b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/PackageDependenciesNode.cs
@@ -76,11 +76,6 @@ namespace MonoDevelop.DotNetCore.NodeBuilders
return ParentNode.GetTargetFrameworkNodes (sdkDependencies: false);
}
- public PackageDependency GetDependency (string dependency)
- {
- return ParentNode.PackageDependencyCache.GetDependency (dependency);
- }
-
public IEnumerable<PackageDependencyNode> GetProjectPackageReferencesAsDependencyNodes ()
{
return ParentNode.GetProjectPackageReferencesAsDependencyNodes ();
diff --git a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/PackageDependencyInfo.cs b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/PackageDependencyInfo.cs
new file mode 100644
index 0000000000..be3f05a957
--- /dev/null
+++ b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/PackageDependencyInfo.cs
@@ -0,0 +1,72 @@
+//
+// PackageDependencyInfo.cs
+//
+// Author:
+// Matt Ward <matt.ward@microsoft.com>
+//
+// Copyright (c) 2018 Microsoft
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System.Collections.Generic;
+using System.Collections.Immutable;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.DotNetCore.NodeBuilders
+{
+ class PackageDependencyInfo
+ {
+ ImmutableArray<PackageDependencyInfo> dependencies = ImmutableArray<PackageDependencyInfo>.Empty;
+ PackageDependency dependency;
+
+ public PackageDependencyInfo (PackageDependency dependency)
+ {
+ this.dependency = dependency;
+ }
+
+ public bool HasChildDiagnostic { get; set; }
+ public bool IsBuilt { get; set; }
+
+ public string Name => dependency.Name;
+ public string Version => dependency.Version;
+
+ public string DiagnosticCode => dependency.DiagnosticCode;
+ public string DiagnosticMessage => dependency.DiagnosticMessage;
+ public bool IsDiagnostic => dependency.IsDiagnostic;
+
+ public IEnumerable<string> DependencyNames => dependency.Dependencies;
+
+ public IEnumerable<PackageDependencyInfo> Dependencies {
+ get { return dependencies; }
+ }
+
+ public void AddChild (PackageDependencyInfo dependency)
+ {
+ dependencies = dependencies.Add (dependency);
+
+ if (dependency.HasChildDiagnostic || dependency.IsDiagnostic)
+ HasChildDiagnostic = true;
+ }
+
+ public override string ToString ()
+ {
+ return Name;
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/PackageDependencyNode.cs b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/PackageDependencyNode.cs
index 5215cf7499..47f88e6bfa 100644
--- a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/PackageDependencyNode.cs
+++ b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/PackageDependencyNode.cs
@@ -39,14 +39,13 @@ namespace MonoDevelop.DotNetCore.NodeBuilders
class PackageDependencyNode
{
DependenciesNode dependenciesNode;
- PackageDependency dependency;
- ImmutableArray<PackageDependencyNode> childNodes;
+ PackageDependencyInfo dependency;
string name;
string version;
PackageDependencyNode (
DependenciesNode dependenciesNode,
- PackageDependency dependency,
+ PackageDependencyInfo dependency,
bool topLevel)
{
this.dependenciesNode = dependenciesNode;
@@ -61,22 +60,10 @@ namespace MonoDevelop.DotNetCore.NodeBuilders
if (IsTopLevel) {
IsReadOnly = !PackageReferenceExistsInProject ();
- GetChildDependencies ();
}
}
}
- /// <summary>
- /// Gets the child dependencies of this node. The results are cached.
- /// This is done for top level nodes so diagnostics can be captured.
- /// Does not handle diagnostics that occur far down the child hierarchy.
- /// </summary>
- void GetChildDependencies ()
- {
- var dependencyNodes = GetDependencyNodes ();
- childNodes = ImmutableArray<PackageDependencyNode>.Empty.AddRange (dependencyNodes);
- }
-
PackageDependencyNode (DependenciesNode dependenciesNode, ProjectPackageReference packageReference)
{
this.dependenciesNode = dependenciesNode;
@@ -100,16 +87,13 @@ namespace MonoDevelop.DotNetCore.NodeBuilders
public static PackageDependencyNode Create (
DependenciesNode dependenciesNode,
- string dependencyName,
+ PackageDependencyInfo dependency,
bool sdkDependencies,
bool topLevel)
{
- PackageDependency dependency = dependenciesNode.PackageDependencyCache.GetDependency (dependencyName);
- if (dependency != null) {
- var node = new PackageDependencyNode (dependenciesNode, dependency, topLevel);
- if (node.IsSupported (sdkDependencies)) {
- return node;
- }
+ var node = new PackageDependencyNode (dependenciesNode, dependency, topLevel);
+ if (node.IsSupported (sdkDependencies)) {
+ return node;
}
return null;
@@ -156,7 +140,7 @@ namespace MonoDevelop.DotNetCore.NodeBuilders
public TaskSeverity? GetStatusSeverity ()
{
- if (IsDiagnostic || HasChildDiagnostic ())
+ if (IsDiagnostic || HasChildDiagnostic)
return TaskSeverity.Warning;
return null;
}
@@ -166,7 +150,7 @@ namespace MonoDevelop.DotNetCore.NodeBuilders
if (IsDiagnostic)
return dependency.DiagnosticMessage;
- if (HasChildDiagnostic ())
+ if (HasChildDiagnostic)
return GetChildDiagnosticStatusMessage ();
return null;
@@ -187,6 +171,10 @@ namespace MonoDevelop.DotNetCore.NodeBuilders
get { return dependency?.IsDiagnostic == true; }
}
+ public bool HasChildDiagnostic {
+ get { return dependency?.HasChildDiagnostic == true; }
+ }
+
public bool IsReleaseVersion ()
{
NuGetVersion nugetVersion = null;
@@ -208,9 +196,6 @@ namespace MonoDevelop.DotNetCore.NodeBuilders
public IEnumerable<PackageDependencyNode> GetDependencyNodes ()
{
- if (!childNodes.IsDefault)
- return childNodes;
-
if (dependency != null)
return GetDependencyNodes (dependenciesNode, dependency);
@@ -219,7 +204,7 @@ namespace MonoDevelop.DotNetCore.NodeBuilders
public static IEnumerable<PackageDependencyNode> GetDependencyNodes (
DependenciesNode dependenciesNode,
- PackageDependency dependency,
+ PackageDependencyInfo dependency,
bool sdkDependencies = false,
bool topLevel = false)
{
@@ -238,30 +223,20 @@ namespace MonoDevelop.DotNetCore.NodeBuilders
return StringComparer.OrdinalIgnoreCase.Equals (packageReference.Include, name);
}
- bool HasChildDiagnostic ()
- {
- if (childNodes.IsDefault)
- return false;
-
- return childNodes.Any (node => node.IsDiagnostic);
- }
-
/// <summary>
- /// Use the diagnostic message if there is only one diagnostic. Otherwise
+ /// Use the diagnostic message if there is only one direct diagnostic child. Otherwise
/// return a message indicating the diagnostic message can be seen by expanding
/// the package.
/// </summary>
string GetChildDiagnosticStatusMessage ()
{
string message = null;
- foreach (PackageDependencyNode node in childNodes) {
- if (node.IsDiagnostic) {
- if (message == null) {
- message = node.dependency.DiagnosticMessage;
- } else {
- // Multiple diagnostics so change the status message.
- return GettextCatalog.GetString ("Package restored with warnings. Expand the package to see the warnings.");
- }
+ foreach (PackageDependencyInfo childDependency in dependency.Dependencies) {
+ if (childDependency.IsDiagnostic && message == null) {
+ message = childDependency.DiagnosticMessage;
+ } else if (childDependency.HasChildDiagnostic || childDependency.IsDiagnostic) {
+ // Multiple diagnostics or child diagnostic so change the status message.
+ return GettextCatalog.GetString ("Package restored with warnings. Expand the package to see the warnings.");
}
}
return message;
diff --git a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/PackageDependencyNodeCache.cs b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/PackageDependencyNodeCache.cs
index 73d0fb6983..1d01b82ccd 100644
--- a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/PackageDependencyNodeCache.cs
+++ b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/PackageDependencyNodeCache.cs
@@ -37,8 +37,8 @@ namespace MonoDevelop.DotNetCore.NodeBuilders
{
class PackageDependencyNodeCache
{
- List<PackageDependency> frameworks = new List<PackageDependency> ();
- Dictionary<string, PackageDependency> packageDependencies = new Dictionary<string, PackageDependency> ();
+ List<PackageDependencyInfo> frameworks = new List<PackageDependencyInfo> ();
+ Dictionary<string, PackageDependencyInfo> packageDependencies = new Dictionary<string, PackageDependencyInfo> ();
CancellationTokenSource cancellationTokenSource;
public PackageDependencyNodeCache (DotNetProject project)
@@ -120,15 +120,17 @@ namespace MonoDevelop.DotNetCore.NodeBuilders
foreach (PackageDependency dependency in dependencies) {
if (dependency.IsTargetFramework) {
- frameworks.Add (dependency);
+ frameworks.Add (new PackageDependencyInfo (dependency));
} else if (dependency.IsPackage) {
string key = dependency.Name + "/" + dependency.Version;
- packageDependencies[key] = dependency;
+ packageDependencies [key] = new PackageDependencyInfo (dependency);
} else if (dependency.IsDiagnostic) {
string key = dependency.FrameworkName + "/" + dependency.Name + "/" + dependency.Version + "/" + dependency.DiagnosticCode;
- packageDependencies[key] = dependency;
+ packageDependencies [key] = new PackageDependencyInfo (dependency);
}
}
+
+ BuildPackageDependencyHierarchy ();
}
public IEnumerable<TargetFrameworkNode> GetTargetFrameworkNodes (
@@ -138,9 +140,9 @@ namespace MonoDevelop.DotNetCore.NodeBuilders
return frameworks.Select (dependency => new TargetFrameworkNode (dependenciesNode, dependency, sdkDependencies));
}
- public PackageDependency GetDependency (string dependency)
+ PackageDependencyInfo GetDependency (string dependency)
{
- PackageDependency matchedDependency = null;
+ PackageDependencyInfo matchedDependency = null;
if (packageDependencies.TryGetValue (dependency, out matchedDependency))
return matchedDependency;
@@ -152,5 +154,26 @@ namespace MonoDevelop.DotNetCore.NodeBuilders
return Project.Items.OfType<ProjectPackageReference> ()
.Select (reference => PackageDependencyNode.Create (dependenciesNode, reference));
}
+
+ void BuildPackageDependencyHierarchy ()
+ {
+ foreach (PackageDependencyInfo framework in frameworks) {
+ BuildChildDependencies (framework);
+ }
+ }
+
+ void BuildChildDependencies (PackageDependencyInfo dependency)
+ {
+ foreach (string childDependencyName in dependency.DependencyNames) {
+ var childDependency = GetDependency (childDependencyName);
+ if (childDependency != null) {
+ if (!childDependency.IsBuilt) {
+ BuildChildDependencies (childDependency);
+ }
+ dependency.AddChild (childDependency);
+ }
+ }
+ dependency.IsBuilt = true;
+ }
}
}
diff --git a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/SdkDependenciesNode.cs b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/SdkDependenciesNode.cs
index 137084bee9..d5ecc481f1 100644
--- a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/SdkDependenciesNode.cs
+++ b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/SdkDependenciesNode.cs
@@ -74,11 +74,6 @@ namespace MonoDevelop.DotNetCore.NodeBuilders
return ParentNode.GetTargetFrameworkNodes (sdkDependencies: true);
}
- public PackageDependency GetDependency (string dependency)
- {
- return ParentNode.PackageDependencyCache.GetDependency (dependency);
- }
-
/// <summary>
/// Returns a SDK node for the project whilst the package dependencies are still loading.
/// </summary>
diff --git a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/TargetFrameworkNode.cs b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/TargetFrameworkNode.cs
index 8f52f283ad..af4aa3b18f 100644
--- a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/TargetFrameworkNode.cs
+++ b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.NodeBuilders/TargetFrameworkNode.cs
@@ -34,12 +34,12 @@ namespace MonoDevelop.DotNetCore.NodeBuilders
class TargetFrameworkNode
{
DependenciesNode dependenciesNode;
- PackageDependency dependency;
+ PackageDependencyInfo dependency;
bool sdkDependencies;
public TargetFrameworkNode (
DependenciesNode dependenciesNode,
- PackageDependency dependency,
+ PackageDependencyInfo dependency,
bool sdkDependencies)
{
this.dependenciesNode = dependenciesNode;