private DocumentId AddDocument(RoslynWorkspace workspace, DocumentCreationArgs args, Document previousDocument = null) { var project = CreateProject(workspace.CurrentSolution, args, CreateCompilationOptions(args, previousDocument == null), previousDocument?.Project); var document = CreateDocument(project, args); var documentId = document.Id; workspace.SetCurrentSolution(document.Project.Solution); workspace.OpenDocument(documentId, args.SourceTextContainer); _workspaces.TryAdd(documentId, workspace); if (args.OnDiagnosticsUpdated != null) { _diagnosticsUpdatedNotifiers.TryAdd(documentId, args.OnDiagnosticsUpdated); } if (args.OnTextUpdated != null) { workspace.ApplyingTextChange += (d, s) => { if (documentId == d) { args.OnTextUpdated(s); } }; } return(documentId); }
public DocumentId AddDocument(DocumentCreationArgs args) { if (args == null) { throw new ArgumentNullException(nameof(args)); } if (args.SourceTextContainer == null) { throw new ArgumentNullException(nameof(args.SourceTextContainer)); } if (!args.IsCSharpScript) { var workspace = GetProjectWorkspace(); //check workspace is already created for project if (workspace == null) { //create workspace workspace = new WorkspaceImpl(HostServices, WorkspaceImpl.WorkspaceType.Project); lock (workspaces) workspaces.Add(workspace); //create project var project = CreateProject(workspace, args); workspace.SetCurrentSolutionPublic(project.Solution); workspace.project = project.Id; //create project file documents if (NeoAxisCoreExchange.Instance.GetProjectData(out var csFiles, out var references)) { foreach (var csFile in csFiles) { OnAddCsFileToProject(csFile); } } } //open document editor { if (workspace.documentByFileName.TryGetValue(args.CsFileProjectPath, out var documentId)) { //project contains the file //open document workspace.CallDocumentOpenedAndContextUpdated(documentId, args.SourceTextContainer); //configure editor _diagnosticsUpdatedNotifiers.TryAdd(documentId, args.OnDiagnosticsUpdated); workspace.ApplyingTextChange += (d, s) => { if (documentId == d) { args.OnTextUpdated(s); } }; workspace.openedDocuments[documentId] = 1; return(documentId); } else { //project not contains the file //create workspace workspace = new WorkspaceImpl(HostServices, WorkspaceImpl.WorkspaceType.FreeCsFile); lock (workspaces) workspaces.Add(workspace); //create project var project = CreateProject(workspace, args); workspace.SetCurrentSolutionPublic(project.Solution); workspace.project = project.Id; //create document documentId = DocumentId.CreateNewId(project.Id); var solution = project.Solution.AddDocument(documentId, args.Name ?? project.Name, args.SourceTextContainer.CurrentText); var document = solution.GetDocument(documentId); workspace.SetCurrentSolutionPublic(document.Project.Solution); workspace.documents.Add(documentId); //open document workspace.CallDocumentOpenedAndContextUpdated(documentId, args.SourceTextContainer); //configure editor _diagnosticsUpdatedNotifiers.TryAdd(documentId, args.OnDiagnosticsUpdated); workspace.ApplyingTextChange += (d, s) => { if (documentId == d) { args.OnTextUpdated(s); } }; workspace.openedDocuments[documentId] = 1; return(documentId); } } } else { //create workspace var workspace = new WorkspaceImpl(HostServices, WorkspaceImpl.WorkspaceType.CSharpScript); lock (workspaces) workspaces.Add(workspace); //create project var project = CreateProject(workspace, args); workspace.SetCurrentSolutionPublic(project.Solution); workspace.project = project.Id; //create document var documentId = DocumentId.CreateNewId(project.Id); var solution = project.Solution.AddDocument(documentId, args.Name ?? project.Name, args.SourceTextContainer.CurrentText); var document = solution.GetDocument(documentId); workspace.SetCurrentSolutionPublic(document.Project.Solution); workspace.documents.Add(documentId); //open document workspace.CallDocumentOpenedAndContextUpdated(documentId, args.SourceTextContainer); //configure editor _diagnosticsUpdatedNotifiers.TryAdd(documentId, args.OnDiagnosticsUpdated); workspace.ApplyingTextChange += (d, s) => { if (documentId == d) { args.OnTextUpdated(s); } }; workspace.openedDocuments[documentId] = 1; return(documentId); } }