Example #1
0
        public DefaultRazorProjectChangePublisher(
            LSPEditorFeatureDetector lSPEditorFeatureDetector,
            ProjectConfigurationFilePathStore projectConfigurationFilePathStore,
            RazorLogger logger)
        {
            if (lSPEditorFeatureDetector is null)
            {
                throw new ArgumentNullException(nameof(lSPEditorFeatureDetector));
            }

            if (projectConfigurationFilePathStore is null)
            {
                throw new ArgumentNullException(nameof(projectConfigurationFilePathStore));
            }

            if (logger is null)
            {
                throw new ArgumentNullException(nameof(logger));
            }

            _deferredPublishTasks    = new Dictionary <string, Task>(FilePathComparer.Instance);
            _pendingProjectPublishes = new Dictionary <string, ProjectSnapshot>(FilePathComparer.Instance);
            _publishLock             = new object();

            _lspEditorFeatureDetector          = lSPEditorFeatureDetector;
            _projectConfigurationFilePathStore = projectConfigurationFilePathStore;
            _logger = logger;

            _serializer.Converters.Add(TagHelperDescriptorJsonConverter.Instance);
            _serializer.Converters.Add(RazorConfigurationJsonConverter.Instance);
            _serializer.Converters.Add(CodeAnalysis.Razor.Workspaces.Serialization.ProjectSnapshotJsonConverter.Instance);
        }
        protected override async Task OnProjectChangedAsync()
        {
            await ExecuteWithLockAsync(async() =>
            {
                var referencedAssemblies = await DotNetProject.GetReferencedAssemblies(ConfigurationSelector.Default);
                var mvcReference         = referencedAssemblies.FirstOrDefault(IsMvcAssembly);
                var projectProperties    = DotNetProject.MSBuildProject.EvaluatedProperties;

                if (TryGetIntermediateOutputPath(projectProperties, out var intermediatePath))
                {
                    var projectConfigurationFile = Path.Combine(intermediatePath, _languageServerFeatureOptions.ProjectConfigurationFileName);
                    ProjectConfigurationFilePathStore.Set(DotNetProject.FileName.FullPath, projectConfigurationFile);
                }

                if (mvcReference is null)
                {
                    // Ok we can't find an MVC version. Let's assume this project isn't using Razor then.
                    await UpdateHostProjectUnsafeAsync(null).ConfigureAwait(false);
                    return;
                }

                var version = GetAssemblyVersion(mvcReference.FilePath);
                if (version is null)
                {
                    // Ok we can't find an MVC version. Let's assume this project isn't using Razor then.
                    await UpdateHostProjectUnsafeAsync(null).ConfigureAwait(false);
                    return;
                }

                var configuration = FallbackRazorConfiguration.SelectConfiguration(version);
                var hostProject   = new HostProject(DotNetProject.FileName.FullPath, configuration, rootNamespace: null);
                await UpdateHostProjectUnsafeAsync(hostProject).ConfigureAwait(false);
            });
        }
Example #3
0
        public RazorLanguageServerClient(
            RazorLanguageServerCustomMessageTarget customTarget,
            RazorLanguageClientMiddleLayer middleLayer,
            LSPRequestInvoker requestInvoker,
            ProjectConfigurationFilePathStore projectConfigurationFilePathStore)
        {
            if (customTarget is null)
            {
                throw new ArgumentNullException(nameof(customTarget));
            }

            if (middleLayer is null)
            {
                throw new ArgumentNullException(nameof(middleLayer));
            }

            if (requestInvoker is null)
            {
                throw new ArgumentNullException(nameof(requestInvoker));
            }

            if (projectConfigurationFilePathStore is null)
            {
                throw new ArgumentNullException(nameof(projectConfigurationFilePathStore));
            }

            _customMessageTarget = customTarget;
            _middleLayer         = middleLayer;
            _requestInvoker      = requestInvoker;
            _projectConfigurationFilePathStore = projectConfigurationFilePathStore;
            _shutdownLock = new object();
        }
        protected override async Task OnProjectChangedAsync()
        {
            await ExecuteWithLockAsync(async() =>
            {
                var projectProperties = DotNetProject.MSBuildProject.EvaluatedProperties;
                var projectItems      = DotNetProject.MSBuildProject.EvaluatedItems;

                if (TryGetIntermediateOutputPath(projectProperties, out var intermediatePath))
                {
                    var projectConfigurationFile = Path.Combine(intermediatePath, _languageServerFeatureOptions.ProjectConfigurationFileName);
                    ProjectConfigurationFilePathStore.Set(DotNetProject.FileName.FullPath, projectConfigurationFile);
                }

                if (TryGetConfiguration(projectProperties, projectItems, out var configuration))
                {
                    TryGetRootNamespace(projectProperties, out var rootNamespace);
                    var hostProject = new HostProject(DotNetProject.FileName.FullPath, configuration, rootNamespace);
                    await UpdateHostProjectUnsafeAsync(hostProject).ConfigureAwait(false);
                    UpdateDocuments(hostProject, projectItems);
                }
                else
                {
                    // Ok we can't find a configuration. Let's assume this project isn't using Razor then.
                    await UpdateHostProjectUnsafeAsync(null).ConfigureAwait(false);
                }
            });
        }
Example #5
0
 public TestDefaultRazorProjectChangePublisher(
     ProjectConfigurationFilePathStore projectStatePublishFilePathStore,
     RazorLogger logger,
     Action <ProjectSnapshot, string> onSerializeToFile = null)
     : base(_lspEditorFeatureDetector.Object, projectStatePublishFilePathStore, logger)
 {
     _onSerializeToFile = onSerializeToFile ?? ((_, __) => throw new XunitException("SerializeToFile should not have been called."));
 }
 public FallbackMacRazorProjectHost(
     DotNetProject project,
     ProjectSnapshotManagerDispatcher projectSnapshotManagerDispatcher,
     ProjectSnapshotManagerBase projectSnapshotManager,
     ProjectConfigurationFilePathStore projectConfigurationFilePathStore,
     VSLanguageServerFeatureOptions languageServerFeatureOptions)
     : base(project, projectSnapshotManagerDispatcher, projectSnapshotManager, projectConfigurationFilePathStore)
 {
     _languageServerFeatureOptions = languageServerFeatureOptions;
 }
Example #7
0
 public TestProjectRazorJsonPublisher(
     ProjectConfigurationFilePathStore projectStatePublishFilePathStore,
     Action <ProjectSnapshot, string> onSerializeToFile = null,
     bool shouldSerialize        = true,
     bool useRealShouldSerialize = false)
     : base(s_lspEditorFeatureDetector.Object, projectStatePublishFilePathStore, TestRazorLogger.Instance)
 {
     _onSerializeToFile      = onSerializeToFile ?? ((_1, _2) => throw new XunitException("SerializeToFile should not have been called."));
     _shouldSerialize        = shouldSerialize;
     _useRealShouldSerialize = useRealShouldSerialize;
 }
Example #8
0
 public TestDefaultRazorProjectChangePublisher(
     ProjectConfigurationFilePathStore projectStatePublishFilePathStore,
     RazorLogger logger,
     Action <ProjectSnapshot, string> onSerializeToFile = null,
     bool shouldSerialize        = true,
     bool useRealShouldSerialize = false)
     : base(s_lspEditorFeatureDetector.Object, projectStatePublishFilePathStore, new TestServiceProvider(), logger)
 {
     _onSerializeToFile      = onSerializeToFile ?? ((_1, _2) => throw new XunitException("SerializeToFile should not have been called."));
     _shouldSerialize        = shouldSerialize;
     _useRealShouldSerialize = useRealShouldSerialize;
 }
        public RazorLanguageServerClient(
            RazorLanguageServerCustomMessageTarget customTarget,
            RazorLanguageClientMiddleLayer middleLayer,
            LSPRequestInvoker requestInvoker,
            ProjectConfigurationFilePathStore projectConfigurationFilePathStore,
            RazorLanguageServerLogHubLoggerProviderFactory logHubLoggerProviderFactory,
            VSLanguageServerFeatureOptions vsLanguageServerFeatureOptions,
            VSHostServicesProvider vsHostWorkspaceServicesProvider)
        {
            if (customTarget is null)
            {
                throw new ArgumentNullException(nameof(customTarget));
            }

            if (middleLayer is null)
            {
                throw new ArgumentNullException(nameof(middleLayer));
            }

            if (requestInvoker is null)
            {
                throw new ArgumentNullException(nameof(requestInvoker));
            }

            if (projectConfigurationFilePathStore is null)
            {
                throw new ArgumentNullException(nameof(projectConfigurationFilePathStore));
            }

            if (logHubLoggerProviderFactory is null)
            {
                throw new ArgumentNullException(nameof(logHubLoggerProviderFactory));
            }

            if (vsLanguageServerFeatureOptions is null)
            {
                throw new ArgumentNullException(nameof(vsLanguageServerFeatureOptions));
            }

            if (vsHostWorkspaceServicesProvider is null)
            {
                throw new ArgumentNullException(nameof(vsHostWorkspaceServicesProvider));
            }

            _customMessageTarget = customTarget;
            _middleLayer         = middleLayer;
            _requestInvoker      = requestInvoker;
            _projectConfigurationFilePathStore = projectConfigurationFilePathStore;
            _logHubLoggerProviderFactory       = logHubLoggerProviderFactory;
            _vsLanguageServerFeatureOptions    = vsLanguageServerFeatureOptions;
            _vsHostWorkspaceServicesProvider   = vsHostWorkspaceServicesProvider;
            _shutdownLock = new object();
        }
        public DefaultDotNetProjectHost(
            DotNetProject project,
            ProjectSnapshotManagerDispatcher projectSnapshotManagerDispatcher,
            VisualStudioMacWorkspaceAccessor workspaceAccessor,
            TextBufferProjectService projectService,
            ProjectConfigurationFilePathStore projectConfigurationFilePathStore,
            VSLanguageServerFeatureOptions languageServerFeatureOptions)
        {
            if (project is null)
            {
                throw new ArgumentNullException(nameof(project));
            }

            if (projectSnapshotManagerDispatcher is null)
            {
                throw new ArgumentNullException(nameof(projectSnapshotManagerDispatcher));
            }

            if (workspaceAccessor is null)
            {
                throw new ArgumentNullException(nameof(workspaceAccessor));
            }

            if (projectService is null)
            {
                throw new ArgumentNullException(nameof(projectService));
            }

            if (projectConfigurationFilePathStore is null)
            {
                throw new ArgumentNullException(nameof(projectConfigurationFilePathStore));
            }

            if (languageServerFeatureOptions is null)
            {
                throw new ArgumentNullException(nameof(languageServerFeatureOptions));
            }

            _project = project;
            _projectSnapshotManagerDispatcher = projectSnapshotManagerDispatcher;
            _workspaceAccessor = workspaceAccessor;
            _projectService    = projectService;
            _projectConfigurationFilePathStore = projectConfigurationFilePathStore;
            _languageServerFeatureOptions      = languageServerFeatureOptions;
        }
        public MacRazorProjectHostBase(
            DotNetProject project,
            ProjectSnapshotManagerDispatcher projectSnapshotManagerDispatcher,
            ProjectSnapshotManagerBase projectSnapshotManager,
            ProjectConfigurationFilePathStore projectConfigurationFilePathStore)
        {
            if (project is null)
            {
                throw new ArgumentNullException(nameof(project));
            }

            if (projectSnapshotManagerDispatcher is null)
            {
                throw new ArgumentNullException(nameof(projectSnapshotManagerDispatcher));
            }

            if (projectSnapshotManager is null)
            {
                throw new ArgumentNullException(nameof(projectSnapshotManager));
            }

            if (projectConfigurationFilePathStore is null)
            {
                throw new ArgumentNullException(nameof(projectConfigurationFilePathStore));
            }

            DotNetProject = project;
            ProjectSnapshotManagerDispatcher  = projectSnapshotManagerDispatcher;
            _projectSnapshotManager           = projectSnapshotManager;
            ProjectConfigurationFilePathStore = projectConfigurationFilePathStore;
            _onProjectChangedInnerSemaphore   = new AsyncSemaphore(initialCount: 1);
            _projectChangedSemaphore          = new AsyncSemaphore(initialCount: 1);
            _currentDocuments = new Dictionary <string, HostDocument>(FilePathComparer.Instance);

            AttachToProject();
        }