コード例 #1
0
        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());
                }
            }
        }
コード例 #2
0
        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());
                }
            }
        }
コード例 #3
0
 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);
     }
 }
コード例 #4
0
 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());
     }
 }
コード例 #5
0
            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);
コード例 #6
0
        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);
        }
コード例 #7
0
            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);
            }