private Solution( BranchId branchId, int workspaceVersion, SolutionServices solutionServices, SolutionId id, string filePath, IEnumerable<ProjectId> projectIds, ImmutableDictionary<ProjectId, ProjectState> idToProjectStateMap, ImmutableDictionary<ProjectId, CompilationTracker> projectIdToTrackerMap, ImmutableDictionary<string, ImmutableArray<DocumentId>> linkedFilesMap, ProjectDependencyGraph dependencyGraph, VersionStamp version, Lazy<VersionStamp> lazyLatestProjectVersion) { _branchId = branchId; _workspaceVersion = workspaceVersion; _id = id; _filePath = filePath; _solutionServices = solutionServices; _projectIds = projectIds.ToImmutableReadOnlyListOrEmpty(); _projectIdToProjectStateMap = idToProjectStateMap; _projectIdToTrackerMap = projectIdToTrackerMap; _linkedFilesMap = linkedFilesMap; _dependencyGraph = dependencyGraph; _projectIdToProjectMap = ImmutableHashMap<ProjectId, Project>.Empty; _version = version; _lazyLatestProjectVersion = lazyLatestProjectVersion; CheckInvariants(); }
/// <summary> /// Obtains the value for the specified key from a dictionary, or adds a new value to the dictionary where the key did not previously exist. /// </summary> /// <typeparam name="TKey">The type of key stored by the dictionary.</typeparam> /// <typeparam name="TValue">The type of value stored by the dictionary.</typeparam> /// <typeparam name="TArg">The type of argument supplied to the value factory.</typeparam> /// <param name="location">The variable or field to atomically update if the specified <paramref name="key" /> is not in the dictionary.</param> /// <param name="key">The key for the value to retrieve or add.</param> /// <param name="valueFactory">The function to execute to obtain the value to insert into the dictionary if the key is not found.</param> /// <param name="factoryArgument">The argument to pass to the value factory.</param> /// <returns>The value obtained from the dictionary or <paramref name="valueFactory" /> if it was not present.</returns> public static TValue GetOrAdd <TKey, TValue, TArg>(ref ImmutableHashMap <TKey, TValue> location, TKey key, Func <TKey, TArg, TValue> valueFactory, TArg factoryArgument) { Contract.ThrowIfNull(valueFactory); var map = Volatile.Read(ref location); Contract.ThrowIfNull(map); if (map.TryGetValue(key, out var existingValue)) { return(existingValue); } var newValue = valueFactory(key, factoryArgument); do { var augmentedMap = map.Add(key, newValue); var replacedMap = Interlocked.CompareExchange(ref location, augmentedMap, map); if (replacedMap == map) { return(newValue); } map = replacedMap; }while (!map.TryGetValue(key, out existingValue)); return(existingValue); }
private Solution( BranchId branchId, int workspaceVersion, SolutionServices solutionServices, SolutionId id, string filePath, ImmutableList<ProjectId> projectIds, ImmutableDictionary<ProjectId, ProjectState> idToProjectStateMap, ImmutableDictionary<ProjectId, CompilationTracker> projectIdToTrackerMap, ProjectDependencyGraph dependencyGraph, VersionStamp version, Lazy<VersionStamp> lazyLatestProjectVersion) { this.branchId = branchId; this.workspaceVersion = workspaceVersion; this.id = id; this.filePath = filePath; this.solutionServices = solutionServices; this.projectIds = projectIds; this.projectIdToProjectStateMap = idToProjectStateMap; this.projectIdToTrackerMap = projectIdToTrackerMap; this.dependencyGraph = dependencyGraph; this.projectIdToProjectMap = ImmutableHashMap<ProjectId, Project>.Empty; this.version = version; this.lazyLatestProjectVersion = lazyLatestProjectVersion; CheckInvariants(); }
private Solution(SolutionState state) { _projectIdToProjectMap = ImmutableHashMap <ProjectId, Project> .Empty; _state = state; }
private Solution(SolutionState state) { _projectIdToProjectMap = ImmutableHashMap<ProjectId, Project>.Empty; _state = state; }