public void Initalize() { _context.RuntimePath = _dotNetCorePaths.DotNet; if (!ScanForProjects()) { // No DNX projects found so do nothing _logger.LogInformation("No project.json based projects found"); return; } var wh = new ManualResetEventSlim(); _designTimeHostManager.Start(_context.HostId, port => { var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Connect(new IPEndPoint(IPAddress.Loopback, port)); var networkStream = new NetworkStream(socket); _logger.LogInformation("Connected"); _context.DesignTimeHostPort = port; _context.Connection = new ProcessingQueue(networkStream, _logger); _context.Connection.OnReceive += m => { var project = _context.Projects[m.ContextId]; if (m.MessageType == "ProjectInformation") { var val = m.Payload.ToObject <ProjectInformationMessage>(); project.Name = val.Name; project.GlobalJsonPath = val.GlobalJsonPath; project.Configurations = val.Configurations; project.Commands = val.Commands; project.ProjectSearchPaths = val.ProjectSearchPaths; this._emitter.Emit(EventTypes.ProjectChanged, new ProjectInformationResponse() { DnxProject = new DnxProject(project) }); var unprocessed = project.ProjectsByFramework.Keys.ToList(); foreach (var frameworkData in val.Frameworks) { unprocessed.Remove(frameworkData.FrameworkName); var frameworkProject = project.ProjectsByFramework.GetOrAdd(frameworkData.FrameworkName, framework => { return(new FrameworkProject(project, frameworkData)); }); var id = frameworkProject.ProjectId; if (_workspace.CurrentSolution.ContainsProject(id)) { continue; } else { var projectInfo = ProjectInfo.Create( id, VersionStamp.Create(), val.Name + "+" + frameworkData.ShortName, val.Name, LanguageNames.CSharp, project.Path); _workspace.AddProject(projectInfo); _context.WorkspaceMapping[id] = frameworkProject; } lock (frameworkProject.PendingProjectReferences) { var reference = new Microsoft.CodeAnalysis.ProjectReference(id); foreach (var referenceId in frameworkProject.PendingProjectReferences) { _workspace.AddProjectReference(referenceId, reference); } frameworkProject.PendingProjectReferences.Clear(); } } // Remove old projects foreach (var frameworkName in unprocessed) { FrameworkProject frameworkProject; project.ProjectsByFramework.TryRemove(frameworkName, out frameworkProject); _workspace.RemoveProject(frameworkProject.ProjectId); } this._emitter.Emit(EventTypes.ProjectChanged, new ProjectInformationResponse() { DnxProject = new DnxProject(project) }); } // This is where we can handle messages and update the // language service else if (m.MessageType == "References") { // References as well as the dependency graph information var val = m.Payload.ToObject <ReferencesMessage>(); var frameworkProject = project.ProjectsByFramework[val.Framework.FrameworkName]; var projectId = frameworkProject.ProjectId; var metadataReferences = new List <MetadataReference>(); var projectReferences = new List <Microsoft.CodeAnalysis.ProjectReference>(); var removedFileReferences = frameworkProject.FileReferences.ToDictionary(p => p.Key, p => p.Value); // var removedRawReferences = frameworkProject.RawReferences.ToDictionary(p => p.Key, p => p.Value); var removedProjectReferences = frameworkProject.ProjectReferences.ToDictionary(p => p.Key, p => p.Value); foreach (var file in val.FileReferences) { if (removedFileReferences.Remove(file)) { continue; } var metadataReference = _metadataFileReferenceCache.GetMetadataReference(file); frameworkProject.FileReferences[file] = metadataReference; metadataReferences.Add(metadataReference); } // foreach (var rawReference in val.RawReferences) // { // if (removedRawReferences.Remove(rawReference.Key)) // { // continue; // } // var metadataReference = MetadataReference.CreateFromImage(rawReference.Value); // frameworkProject.RawReferences[rawReference.Key] = metadataReference; // metadataReferences.Add(metadataReference); // } foreach (var projectReference in val.ProjectReferences) { if (removedProjectReferences.Remove(projectReference.Path)) { continue; } int projectReferenceContextId; if (!_context.ProjectContextMapping.TryGetValue(projectReference.Path, out projectReferenceContextId)) { projectReferenceContextId = AddProject(projectReference.Path); } var referencedProject = _context.Projects[projectReferenceContextId]; var referencedFrameworkProject = referencedProject.ProjectsByFramework.GetOrAdd(projectReference.Framework.FrameworkName, framework => { return(new FrameworkProject(referencedProject, projectReference.Framework)); }); var projectReferenceId = referencedFrameworkProject.ProjectId; if (_workspace.CurrentSolution.ContainsProject(projectReferenceId)) { projectReferences.Add(new Microsoft.CodeAnalysis.ProjectReference(projectReferenceId)); } else { lock (referencedFrameworkProject.PendingProjectReferences) { referencedFrameworkProject.PendingProjectReferences.Add(projectId); } } referencedFrameworkProject.ProjectDependeees[project.Path] = projectId; frameworkProject.ProjectReferences[projectReference.Path] = projectReferenceId; } foreach (var reference in metadataReferences) { _workspace.AddMetadataReference(projectId, reference); } foreach (var projectReference in projectReferences) { _workspace.AddProjectReference(projectId, projectReference); } foreach (var pair in removedProjectReferences) { _workspace.RemoveProjectReference(projectId, new Microsoft.CodeAnalysis.ProjectReference(pair.Value)); frameworkProject.ProjectReferences.Remove(pair.Key); // TODO: Update the dependee's list } foreach (var pair in removedFileReferences) { _workspace.RemoveMetadataReference(projectId, pair.Value); frameworkProject.FileReferences.Remove(pair.Key); } // foreach (var pair in removedRawReferences) // { // _workspace.RemoveMetadataReference(projectId, pair.Value); // frameworkProject.RawReferences.Remove(pair.Key); // } _workspace.ReferencesUpdated(projectId, frameworkProject); } else if (m.MessageType == "Dependencies") { var val = m.Payload.ToObject <DependenciesMessage>(); var unresolvedDependencies = val.Dependencies.Values .Where(dep => !dep.Resolved); if (unresolvedDependencies.Any()) { _logger.LogInformation("Project {0} has these unresolved references: {1}", project.Path, string.Join(", ", unresolvedDependencies.Select(d => d.Name))); _emitter.Emit(EventTypes.UnresolvedDependencies, new UnresolvedDependenciesMessage() { FileName = project.Path, UnresolvedDependencies = unresolvedDependencies.Select(d => new PackageDependency() { Name = d.Name, Version = d.Version }) }); } _workspace.DependenciesUpdated(project, val); } else if (m.MessageType == "CompilerOptions") { // Configuration and compiler options var val = m.Payload.ToObject <CompilationOptionsMessage>(); var projectId = project.ProjectsByFramework[val.Framework.FrameworkName].ProjectId; var csharpOptions = CompilerOptionsConverter.GetCompilationOptions(val.Options); var parseOptions = new CSharpParseOptions(CompilerOptionsConverter.GetLanguageVersion(val.Options.LanguageVersion), preprocessorSymbols: val.Options.Defines); _workspace.SetCompilationOptions(projectId, csharpOptions); _workspace.SetParseOptions(projectId, parseOptions); _workspace.CompilationOptionsChanged(projectId, csharpOptions, parseOptions); } else if (m.MessageType == "Sources") { // The sources to feed to the language service var val = m.Payload.ToObject <SourcesMessage>(); project.SourceFiles = val.Files .Where(fileName => Path.GetExtension(fileName) == ".cs") .ToList(); var frameworkProject = project.ProjectsByFramework[val.Framework.FrameworkName]; // var projectId = frameworkProject.ProjectId; // // var unprocessed = new HashSet<string>(frameworkProject.Documents.Keys); // // foreach (var file in project.SourceFiles) // { // if (unprocessed.Remove(file)) // { // continue; // } // // using (var stream = File.OpenRead(file)) // { // var sourceText = SourceText.From(stream, encoding: Encoding.UTF8); // var id = DocumentId.CreateNewId(projectId); // var version = VersionStamp.Create(); // // frameworkProject.Documents[file] = id; // // var loader = TextLoader.From(TextAndVersion.Create(sourceText, version)); // _workspace.AddDocument(DocumentInfo.Create(id, file, filePath: file, loader: loader)); // } // } // // foreach (var file in unprocessed) // { // var docId = frameworkProject.Documents[file]; // frameworkProject.Documents.Remove(file); // _workspace.RemoveDocument(docId); // } frameworkProject.Loaded = true; } else if (m.MessageType == "Error") { var val = m.Payload.ToObject <Microsoft.DotNet.ProjectModel.Server.Models.ErrorMessage>(); if (val.Message != null) { _logger.LogError(val.Message); } } else if (m.MessageType == "DependencyDiagnostics") { var val = m.Payload.ToObject <DiagnosticsListMessage>(); _workspace.ReportDiagnostics(project, val); } if (project.ProjectsByFramework.Values.All(p => p.Loaded)) { wh.Set(); } }; // Start the message channel _context.Connection.Start(); // Initialize the DNX projects Initialize(); }); //wh.Wait(); }