Example #1
0
        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);
        }
Example #2
0
        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);
            }
        }