Ejemplo n.º 1
0
 public Worker(
     HostWorkspaceServices services,
     DiagnosticReporter diagnosticReporter,
     PathResolver pathResolver,
     ProjectFileLoaderRegistry projectFileLoaderRegistry,
     ProjectBuildManager buildManager,
     ImmutableArray <string> requestedProjectPaths,
     string baseDirectory,
     ImmutableDictionary <string, string> globalProperties,
     ProjectMap projectMap,
     IProgress <ProjectLoadProgress> progress,
     DiagnosticReportingOptions requestedProjectOptions,
     DiagnosticReportingOptions discoveredProjectOptions,
     bool preferMetadataForReferencesOfDiscoveredProjects)
 {
     _workspaceServices         = services;
     _diagnosticReporter        = diagnosticReporter;
     _pathResolver              = pathResolver;
     _projectFileLoaderRegistry = projectFileLoaderRegistry;
     _buildManager              = buildManager;
     _baseDirectory             = baseDirectory;
     _requestedProjectPaths     = requestedProjectPaths;
     _globalProperties          = globalProperties;
     _projectMap = projectMap ?? ProjectMap.Create();
     _progress   = progress;
     _requestedProjectOptions  = requestedProjectOptions;
     _discoveredProjectOptions = discoveredProjectOptions;
     _preferMetadataForReferencesOfDiscoveredProjects = preferMetadataForReferencesOfDiscoveredProjects;
     _projectIdToFileInfoMap          = new Dictionary <ProjectId, ProjectFileInfo>();
     _pathToDiscoveredProjectInfosMap = new Dictionary <string, ImmutableArray <ProjectInfo> >(PathUtilities.Comparer);
     _projectIdToProjectReferencesMap = new Dictionary <ProjectId, List <ProjectReference> >();
 }
Ejemplo n.º 2
0
 protected override ProjectFile CreateProjectFile(
     MSB.Evaluation.Project?project,
     ProjectBuildManager buildManager,
     DiagnosticLog log
     )
 {
     return(new VisualBasicProjectFile(this, project, buildManager, log));
 }
Ejemplo n.º 3
0
 public VisualBasicProjectFile(
     VisualBasicProjectFileLoader loader,
     MSB.Evaluation.Project?loadedProject,
     ProjectBuildManager buildManager,
     DiagnosticLog log
     ) : base(loader, loadedProject, buildManager, log)
 {
 }
Ejemplo n.º 4
0
 public CSharpProjectFile(
     CSharpProjectFileLoader loader,
     MSB.Evaluation.Project?project,
     ProjectBuildManager buildManager,
     DiagnosticLog log
     ) : base(loader, project, buildManager, log)
 {
 }
Ejemplo n.º 5
0
        protected ProjectFile(ProjectFileLoader loader, MSB.Evaluation.Project?loadedProject, ProjectBuildManager buildManager, DiagnosticLog log)
        {
            _loader        = loader;
            _loadedProject = loadedProject;
            _buildManager  = buildManager;
            var directory = loadedProject?.DirectoryPath ?? string.Empty;

            _projectDirectory = PathUtilities.EnsureTrailingSeparator(directory);
            Log = log;
        }
Ejemplo n.º 6
0
        public async Task <IProjectFile> LoadProjectFileAsync(string path, ProjectBuildManager buildManager, CancellationToken cancellationToken)
        {
            if (path == null)
            {
                throw new ArgumentNullException(nameof(path));
            }

            // load project file async
            var(project, log) = await buildManager.LoadProjectAsync(path, cancellationToken).ConfigureAwait(false);

            return(this.CreateProjectFile(project, buildManager, log));
        }
Ejemplo n.º 7
0
        protected ProjectFile(ProjectFileLoader loader, MSB.Evaluation.Project loadedProject, ProjectBuildManager buildManager, DiagnosticLog log)
        {
            _loader        = loader;
            _loadedProject = loadedProject;
            _buildManager  = buildManager;

            _projectDirectory = loadedProject != null
                ? PathUtilities.EnsureTrailingSeparator(loadedProject.DirectoryPath)
                : null;

            Log = log;
        }
Ejemplo n.º 8
0
        internal MSBuildProjectLoader(
            Workspace workspace,
            DiagnosticReporter diagnosticReporter,
            ProjectFileLoaderRegistry projectFileLoaderRegistry,
            ImmutableDictionary <string, string> properties)
        {
            _workspace                 = workspace;
            _diagnosticReporter        = diagnosticReporter ?? new DiagnosticReporter(workspace);
            _pathResolver              = new PathResolver(_diagnosticReporter);
            _projectFileLoaderRegistry = projectFileLoaderRegistry ?? new ProjectFileLoaderRegistry(workspace, _diagnosticReporter);

            _properties = ImmutableDictionary.Create <string, string>(StringComparer.OrdinalIgnoreCase);

            if (properties != null)
            {
                _properties = _properties.AddRange(properties);
            }

            BuildManager = new ProjectBuildManager();
        }
Ejemplo n.º 9
0
        /// <summary>
        /// Loads the <see cref="ProjectInfo"/> from the specified project file and all referenced projects.
        /// The first <see cref="ProjectInfo"/> in the result corresponds to the specified project file.
        /// </summary>
        /// <param name="projectFilePath">The path to the project file to be loaded. This may be an absolute path or a path relative to the
        /// current working directory.</param>
        /// <param name="projectMap">An optional <see cref="ProjectMap"/> that will be used to resolve project references to existing projects.
        /// This is useful when populating a custom <see cref="Workspace"/>.</param>
        /// <param name="progress">An optional <see cref="IProgress{T}"/> that will receive updates as the project is loaded.</param>
        /// <param name="cancellationToken">An optional <see cref="CancellationToken"/> to allow cancellation of this operation.</param>
        public async Task <ImmutableArray <ProjectInfo> > LoadProjectInfoAsync(
            string projectFilePath,
            ProjectMap projectMap = null,
            IProgress <ProjectLoadProgress> progress = null,
            CancellationToken cancellationToken      = default)
        {
            if (projectFilePath == null)
            {
                throw new ArgumentNullException(nameof(projectFilePath));
            }

            var requestedProjectOptions = DiagnosticReportingOptions.ThrowForAll;

            var reportingMode = GetReportingModeForUnrecognizedProjects();

            var discoveredProjectOptions = new DiagnosticReportingOptions(
                onPathFailure: reportingMode,
                onLoaderFailure: reportingMode);

            var buildManager = new ProjectBuildManager(_properties);

            var worker = new Worker(
                _workspace,
                _diagnosticReporter,
                _pathResolver,
                _projectFileLoaderRegistry,
                buildManager,
                requestedProjectPaths: ImmutableArray.Create(projectFilePath),
                baseDirectory: Directory.GetCurrentDirectory(),
                globalProperties: _properties,
                projectMap,
                progress,
                requestedProjectOptions,
                discoveredProjectOptions,
                this.LoadMetadataForReferencedProjects);

            return(await worker.LoadAsync(cancellationToken).ConfigureAwait(false));
        }
Ejemplo n.º 10
0
 public ErgonProjectFile(ErgonProjectFileLoader loader, ErgonProject project, ProjectBuildManager buildManager, DiagnosticLog log)
     : base(loader, project, buildManager, log)
 {
 }
Ejemplo n.º 11
0
 protected abstract ProjectFile CreateProjectFile(MSB.Evaluation.Project project, ProjectBuildManager buildManager, DiagnosticLog log);
Ejemplo n.º 12
0
        /// <summary>
        /// Loads the <see cref="SolutionInfo"/> for the specified solution file, including all projects referenced by the solution file and
        /// all the projects referenced by the project files.
        /// </summary>
        /// <param name="solutionFilePath">The path to the solution file to be loaded. This may be an absolute path or a path relative to the
        /// current working directory.</param>
        /// <param name="progress">An optional <see cref="IProgress{T}"/> that will receive updates as the solution is loaded.</param>
        /// <param name="cancellationToken">An optional <see cref="CancellationToken"/> to allow cancellation of this operation.</param>
        public async Task <SolutionInfo> LoadSolutionInfoAsync(
            string solutionFilePath,
            IProgress <ProjectLoadProgress> progress = null,
            CancellationToken cancellationToken      = default)
        {
            if (solutionFilePath == null)
            {
                throw new ArgumentNullException(nameof(solutionFilePath));
            }

            if (!_pathResolver.TryGetAbsoluteSolutionPath(solutionFilePath, baseDirectory: Directory.GetCurrentDirectory(), DiagnosticReportingMode.Throw, out var absoluteSolutionPath))
            {
                // TryGetAbsoluteSolutionPath should throw before we get here.
                return(null);
            }

            using (_dataGuard.DisposableWait(cancellationToken))
            {
                this.SetSolutionProperties(absoluteSolutionPath);
            }

            var solutionFile = MSB.Construction.SolutionFile.Parse(absoluteSolutionPath);

            var reportingMode = GetReportingModeForUnrecognizedProjects();

            var reportingOptions = new DiagnosticReportingOptions(
                onPathFailure: reportingMode,
                onLoaderFailure: reportingMode);

            var projectPaths = ImmutableArray.CreateBuilder <string>();

            // load all the projects
            foreach (var project in solutionFile.ProjectsInOrder)
            {
                cancellationToken.ThrowIfCancellationRequested();

                if (project.ProjectType != MSB.Construction.SolutionProjectType.SolutionFolder)
                {
                    projectPaths.Add(project.RelativePath);
                }
            }

            var buildManager = new ProjectBuildManager(_properties);

            var worker = new Worker(
                _workspaceServices,
                _diagnosticReporter,
                _pathResolver,
                _projectFileLoaderRegistry,
                buildManager,
                projectPaths.ToImmutable(),
                baseDirectory: Path.GetDirectoryName(absoluteSolutionPath),
                _properties,
                projectMap: null,
                progress,
                requestedProjectOptions: reportingOptions,
                discoveredProjectOptions: reportingOptions,
                preferMetadataForReferencesOfDiscoveredProjects: false);

            var projects = await worker.LoadAsync(cancellationToken).ConfigureAwait(false);

            // construct workspace from loaded project infos
            return(SolutionInfo.Create(
                       SolutionId.CreateNewId(debugName: absoluteSolutionPath),
                       version: default,
Ejemplo n.º 13
0
 protected override ProjectFile.ProjectFile CreateProjectFile(ErgonProject project, ProjectBuildManager buildManager, DiagnosticLog log)
 {
     return(new ErgonProjectFile(this, project, buildManager, log));
 }
Ejemplo n.º 14
0
 protected abstract ProjectFile CreateProjectFile(ErgonProject project, ProjectBuildManager buildManager, DiagnosticLog log);