private void HandleChangesForRule( IProjectChangeDescription projectChange, DependenciesRuleChangeContext ruleChangeContext, ITargetFramework targetFramework, bool resolved, HashSet <string> unresolvedChanges = null) { Requires.NotNull(targetFramework, nameof(targetFramework)); foreach (string removedItem in projectChange.Difference.RemovedItems) { if (PackageDependencyMetadata.TryGetMetadata( removedItem, resolved, properties: projectChange.Before.GetProjectItemProperties(removedItem), unresolvedChanges, targetFramework, TargetFrameworkProvider, out PackageDependencyMetadata metadata)) { ruleChangeContext.IncludeRemovedChange(targetFramework, ProviderTypeString, metadata.OriginalItemSpec); } } foreach (string changedItem in projectChange.Difference.ChangedItems) { if (PackageDependencyMetadata.TryGetMetadata( changedItem, resolved, properties: projectChange.After.GetProjectItemProperties(changedItem), unresolvedChanges, targetFramework, TargetFrameworkProvider, out PackageDependencyMetadata metadata)) { ruleChangeContext.IncludeRemovedChange(targetFramework, ProviderTypeString, metadata.OriginalItemSpec); ruleChangeContext.IncludeAddedChange(targetFramework, metadata.CreateDependencyModel()); } } foreach (string addedItem in projectChange.Difference.AddedItems) { if (PackageDependencyMetadata.TryGetMetadata( addedItem, resolved, properties: projectChange.After.GetProjectItemProperties(addedItem), unresolvedChanges, targetFramework, TargetFrameworkProvider, out PackageDependencyMetadata metadata)) { ruleChangeContext.IncludeAddedChange(targetFramework, metadata.CreateDependencyModel()); } } }
private void HandleChangesForRule( IProjectChangeDescription projectChange, CrossTargetDependenciesChangesBuilder changesBuilder, ITargetFramework targetFramework, bool resolved, HashSet <string>?unresolvedChanges = null) { Requires.NotNull(targetFramework, nameof(targetFramework)); foreach (string removedItem in projectChange.Difference.RemovedItems) { if (PackageDependencyMetadata.TryGetMetadata( removedItem, resolved, properties: projectChange.Before.GetProjectItemProperties(removedItem) ?? ImmutableDictionary <string, string> .Empty, unresolvedChanges, targetFramework, _targetFrameworkProvider, out PackageDependencyMetadata metadata)) { changesBuilder.Removed(targetFramework, ProviderTypeString, metadata.OriginalItemSpec); } } foreach (string changedItem in projectChange.Difference.ChangedItems) { if (PackageDependencyMetadata.TryGetMetadata( changedItem, resolved, properties: projectChange.After.GetProjectItemProperties(changedItem) ?? ImmutableDictionary <string, string> .Empty, unresolvedChanges, targetFramework, _targetFrameworkProvider, out PackageDependencyMetadata metadata)) { changesBuilder.Removed(targetFramework, ProviderTypeString, metadata.OriginalItemSpec); changesBuilder.Added(targetFramework, metadata.CreateDependencyModel()); } } foreach (string addedItem in projectChange.Difference.AddedItems) { if (PackageDependencyMetadata.TryGetMetadata( addedItem, resolved, properties: projectChange.After.GetProjectItemProperties(addedItem) ?? ImmutableDictionary <string, string> .Empty, unresolvedChanges, targetFramework, _targetFrameworkProvider, out PackageDependencyMetadata metadata)) { changesBuilder.Added(targetFramework, metadata.CreateDependencyModel()); } } }
protected override void HandleRemovedItem( string removedItem, bool resolved, IProjectChangeDescription projectChange, DependenciesChangesBuilder changesBuilder, ITargetFramework targetFramework, Func <string, bool>?isEvaluatedItemSpec) { if (PackageDependencyMetadata.TryGetMetadata( removedItem, resolved, properties: projectChange.Before.GetProjectItemProperties(removedItem) !, isEvaluatedItemSpec, targetFramework, _targetFrameworkProvider, out PackageDependencyMetadata metadata)) { changesBuilder.Removed(ProviderTypeString, metadata.OriginalItemSpec); } }
protected override void HandleAddedItem( string addedItem, bool resolved, IProjectChangeDescription projectChange, DependenciesChangesBuilder changesBuilder, ITargetFramework targetFramework, Func <string, bool>?isEvaluatedItemSpec) { if (PackageDependencyMetadata.TryGetMetadata( addedItem, resolved, properties: projectChange.After.GetProjectItemProperties(addedItem) !, isEvaluatedItemSpec, targetFramework, _targetFrameworkProvider, out PackageDependencyMetadata metadata)) { changesBuilder.Added(metadata.CreateDependencyModel()); } }
public static bool TryGetMetadata( string itemSpec, bool isResolved, IImmutableDictionary <string, string> properties, HashSet <string> unresolvedChanges, ITargetFramework targetFramework, ITargetFrameworkProvider targetFrameworkProvider, out PackageDependencyMetadata metadata) { Requires.NotNull(itemSpec, nameof(itemSpec)); Requires.NotNull(properties, nameof(properties)); // unresolvedChanges can be null Requires.NotNull(targetFramework, nameof(targetFramework)); Requires.NotNull(targetFrameworkProvider, nameof(targetFrameworkProvider)); bool isTopLevel; string target = GetTargetFromDependencyId(itemSpec); DependencyType dependencyType = properties.GetEnumProperty <DependencyType>(ProjectItemMetadata.Type) ?? (isResolved ? DependencyType.Unknown : DependencyType.Package); string name = properties.GetStringProperty(ProjectItemMetadata.Name) ?? itemSpec; bool isImplicitlyDefined = properties.GetBoolProperty(ProjectItemMetadata.IsImplicitlyDefined) ?? false; if (isResolved) { isTopLevel = isImplicitlyDefined || (dependencyType == DependencyType.Package && unresolvedChanges?.Contains(name) == true); bool isTarget = itemSpec.IndexOf('/') == -1; if (isTarget) { metadata = default; return(false); } ITargetFramework packageTargetFramework = targetFrameworkProvider.GetTargetFramework(target); if (packageTargetFramework?.Equals(targetFramework) != true) { metadata = default; return(false); } } else { isTopLevel = true; } string originalItemSpec = isResolved && isTopLevel ? name : itemSpec; metadata = new PackageDependencyMetadata( dependencyType, target, itemSpec, originalItemSpec, name, isResolved, isImplicitlyDefined, isTopLevel, properties); return(true);
private IDependencyModel GetDependencyModel( string itemSpec, bool resolved, IImmutableDictionary <string, string> properties, IProjectChangeDescription projectChange, HashSet <string> unresolvedChanges, ITargetFramework targetFramework) { PackageDependencyMetadata metadata; bool isTopLevel = true; bool isTarget = false; if (resolved) { metadata = new PackageDependencyMetadata(itemSpec, properties); isTopLevel = metadata.IsImplicitlyDefined || (metadata.DependencyType == DependencyType.Package && unresolvedChanges != null && unresolvedChanges.Contains(metadata.Name)); isTarget = metadata.IsTarget; ITargetFramework packageTargetFramework = TargetFrameworkProvider.GetTargetFramework(metadata.Target); if (!(packageTargetFramework?.Equals(targetFramework) == true)) { return(null); } } else { metadata = CreateUnresolvedMetadata(itemSpec, properties); } if (isTarget) { return(null); } string originalItemSpec = itemSpec; if (resolved && isTopLevel) { originalItemSpec = metadata.Name; } IDependencyModel dependencyModel = null; switch (metadata.DependencyType) { case DependencyType.Package: dependencyModel = new PackageDependencyModel( ProviderType, itemSpec, originalItemSpec, metadata.Name, DependencyTreeFlags.NuGetSubTreeNodeFlags, metadata.Version, resolved, metadata.IsImplicitlyDefined, isTopLevel, !metadata.IsImplicitlyDefined /*visible*/, properties, metadata.DependenciesItemSpecs); break; case DependencyType.Assembly: case DependencyType.FrameworkAssembly: dependencyModel = new PackageAssemblyDependencyModel( ProviderType, itemSpec, originalItemSpec, metadata.Name, DependencyTreeFlags.NuGetSubTreeNodeFlags, resolved, properties, metadata.DependenciesItemSpecs); break; case DependencyType.AnalyzerAssembly: dependencyModel = new PackageAnalyzerAssemblyDependencyModel( ProviderType, itemSpec, originalItemSpec, metadata.Name, DependencyTreeFlags.NuGetSubTreeNodeFlags, resolved, properties, metadata.DependenciesItemSpecs); break; case DependencyType.Diagnostic: dependencyModel = new DiagnosticDependencyModel( ProviderType, itemSpec, metadata.Severity, metadata.DiagnosticCode, metadata.Name, DependencyTreeFlags.NuGetSubTreeNodeFlags, isVisible: true, properties: properties); break; default: dependencyModel = new PackageUnknownDependencyModel( ProviderType, itemSpec, originalItemSpec, metadata.Name, DependencyTreeFlags.NuGetSubTreeNodeFlags, resolved, properties, metadata.DependenciesItemSpecs); break; } return(dependencyModel); }
public static bool TryGetMetadata( string itemSpec, bool isResolved, IImmutableDictionary <string, string> properties, Func <string, bool>?isEvaluatedItemSpec, ITargetFramework targetFramework, ITargetFrameworkProvider targetFrameworkProvider, out PackageDependencyMetadata metadata) { Requires.NotNullOrEmpty(itemSpec, nameof(itemSpec)); Requires.NotNull(properties, nameof(properties)); bool isImplicitlyDefined = properties.GetBoolProperty(ProjectItemMetadata.IsImplicitlyDefined) ?? false; if (isResolved) { // We have design-time build data Requires.NotNull(targetFramework, nameof(targetFramework)); Requires.NotNull(targetFrameworkProvider, nameof(targetFrameworkProvider)); Requires.NotNull(isEvaluatedItemSpec !, nameof(isEvaluatedItemSpec)); DependencyType dependencyType = properties.GetEnumProperty <DependencyType>(ProjectItemMetadata.Type) ?? DependencyType.Unknown; if (dependencyType == DependencyType.Target) { // Disregard items of type 'Target' from design-time build metadata = default; return(false); } int slashIndex = itemSpec.IndexOf('/'); string?targetFrameworkName = slashIndex == -1 ? null : s_targetFrameworkInternPool.Intern(itemSpec.Substring(0, slashIndex)); if (targetFrameworkName == null || targetFrameworkProvider.GetTargetFramework(targetFrameworkName)?.Equals(targetFramework) != true) { metadata = default; return(false); } string name = properties.GetStringProperty(ProjectItemMetadata.Name) ?? itemSpec; bool isTopLevel = isImplicitlyDefined || (dependencyType == DependencyType.Package && isEvaluatedItemSpec(name)); string originalItemSpec = isTopLevel ? name : itemSpec; metadata = new PackageDependencyMetadata( dependencyType, targetFrameworkName, itemSpec, originalItemSpec, name, isResolved: true, isImplicitlyDefined, isTopLevel, properties); } else { // We only have evaluation data System.Diagnostics.Debug.Assert(itemSpec.IndexOf('/') == -1); metadata = new PackageDependencyMetadata( dependencyType: DependencyType.Package, targetFrameworkName: null, itemSpec, originalItemSpec: itemSpec, name: itemSpec, isResolved: false, isImplicitlyDefined, isTopLevel: true, properties); } return(true); }