private void AttachToDocument(uint docCookie, string moniker) { _foregroundThreadAffinitization.AssertIsForeground(); var vsTextBuffer = (IVsTextBuffer)_runningDocumentTable.GetDocumentData(docCookie); var textBuffer = _editorAdaptersFactoryService.GetDocumentBuffer(vsTextBuffer); if (_fileTrackingMetadataAsSourceService.TryAddDocumentToWorkspace(moniker, textBuffer)) { // We already added it, so we will keep it excluded from the misc files workspace return; } // This should always succeed since we only got here if we already confirmed the moniker is acceptable var languageInformation = TryGetLanguageInformation(moniker); Contract.ThrowIfNull(languageInformation); var parseOptions = languageInformation.ParseOptions; if (Path.GetExtension(moniker) == languageInformation.ScriptExtension) { parseOptions = parseOptions.WithKind(SourceCodeKind.Script); } // First, create the project var hostProject = new HostProject(this, CurrentSolution.Id, languageInformation.LanguageName, parseOptions, _metadataReferences); // Now try to find the document. We accept any text buffer, since we've already verified it's an appropriate file in ShouldIncludeFile. var document = _documentProvider.TryGetDocumentForFile( hostProject, moniker, parseOptions.Kind, getFolderNames: _ => SpecializedCollections.EmptyReadOnlyList <string>(), canUseTextBuffer: _ => true); // If the buffer has not yet been initialized, we won't get a document. if (document == null) { return; } // Since we have a document, we can do the rest of the project setup. _hostProjects.Add(hostProject.Id, hostProject); OnProjectAdded(hostProject.CreateProjectInfoForCurrentState()); OnDocumentAdded(document.GetInitialState()); hostProject.Document = document; // Notify the document provider, so it knows the document is now open and a part of // the project _documentProvider.NotifyDocumentRegisteredToProjectAndStartToRaiseEvents(document); Contract.ThrowIfFalse(document.IsOpen); var buffer = document.GetOpenTextBuffer(); OnDocumentOpened(document.Id, document.GetOpenTextContainer()); _docCookiesToHostProject.Add(docCookie, hostProject); }
private void AddDocumentToMiscellaneousOrMetadataAsSourceWorkspace(uint docCookie, string moniker) { var languageInformation = TryGetLanguageInformation(moniker); if (languageInformation != null && !_filesInProjects.Any(d => StringComparer.OrdinalIgnoreCase.Equals(d.Moniker, moniker)) && !_docCookiesToHostProject.ContainsKey(docCookie)) { // See if we should push to this to the metadata-to-source workspace instead. if (_runningDocumentTable.IsDocumentInitialized(docCookie)) { var vsTextBuffer = (IVsTextBuffer)_runningDocumentTable.GetDocumentData(docCookie); var textBuffer = _editorAdaptersFactoryService.GetDocumentBuffer(vsTextBuffer); if (_fileTrackingMetadataAsSourceService.TryAddDocumentToWorkspace(moniker, textBuffer)) { // We already added it, so we will keep it excluded from the misc files workspace return; } } var parseOptions = languageInformation.ParseOptions; if (Path.GetExtension(moniker) == languageInformation.ScriptExtension) { parseOptions = parseOptions.WithKind(SourceCodeKind.Script); } // First, create the project var hostProject = new HostProject(this, CurrentSolution.Id, languageInformation.LanguageName, parseOptions, _metadataReferences); // Now try to find the document. We accept any text buffer, since we've already verified it's an appropriate file in ShouldIncludeFile. var document = _documentProvider.TryGetDocumentForFile(hostProject, (uint)VSConstants.VSITEMID.Nil, moniker, parseOptions.Kind, t => true); // If the buffer has not yet been initialized, we won't get a document. if (document == null) { return; } // Since we have a document, we can do the rest of the project setup. _hostProjects.Add(hostProject.Id, hostProject); OnProjectAdded(hostProject.CreateProjectInfoForCurrentState()); OnDocumentAdded(document.GetInitialState()); hostProject.Document = document; // Notify the document provider, so it knows the document is now open and a part of // the project _documentProvider.NotifyDocumentRegisteredToProject(document); Contract.ThrowIfFalse(document.IsOpen); var buffer = document.GetOpenTextBuffer(); OnDocumentOpened(document.Id, document.GetOpenTextContainer()); _docCookiesToHostProject.Add(docCookie, hostProject); } }
private void AttachToDocument(uint docCookie, string moniker) { var vsTextBuffer = (IVsTextBuffer)_runningDocumentTable.GetDocumentData(docCookie); var textBuffer = _editorAdaptersFactoryService.GetDocumentBuffer(vsTextBuffer); if (_fileTrackingMetadataAsSourceService.TryAddDocumentToWorkspace(moniker, textBuffer)) { // We already added it, so we will keep it excluded from the misc files workspace return; } // This should always succeed since we only got here if we already confirmed the moniker is acceptable var languageInformation = TryGetLanguageInformation(moniker); Contract.ThrowIfNull(languageInformation); var parseOptions = languageInformation.ParseOptions; if (Path.GetExtension(moniker) == languageInformation.ScriptExtension) { parseOptions = parseOptions.WithKind(SourceCodeKind.Script); } // First, create the project var hostProject = new HostProject(this, CurrentSolution.Id, languageInformation.LanguageName, parseOptions, _metadataReferences); // Now try to find the document. We accept any text buffer, since we've already verified it's an appropriate file in ShouldIncludeFile. var document = _documentProvider.TryGetDocumentForFile( hostProject, (uint)VSConstants.VSITEMID.Nil, moniker, parseOptions.Kind, canUseTextBuffer: _ => true); // If the buffer has not yet been initialized, we won't get a document. if (document == null) { return; } // Since we have a document, we can do the rest of the project setup. _hostProjects.Add(hostProject.Id, hostProject); OnProjectAdded(hostProject.CreateProjectInfoForCurrentState()); OnDocumentAdded(document.GetInitialState()); hostProject.Document = document; // Notify the document provider, so it knows the document is now open and a part of // the project _documentProvider.NotifyDocumentRegisteredToProject(document); Contract.ThrowIfFalse(document.IsOpen); var buffer = document.GetOpenTextBuffer(); OnDocumentOpened(document.Id, document.GetOpenTextContainer()); _docCookiesToHostProject.Add(docCookie, hostProject); }
private void AttachToDocument(uint docCookie, string moniker) { _foregroundThreadAffinitization.AssertIsForeground(); var vsTextBuffer = (IVsTextBuffer)_runningDocumentTable.GetDocumentData(docCookie); var textBuffer = _editorAdaptersFactoryService.GetDocumentBuffer(vsTextBuffer); if (_fileTrackingMetadataAsSourceService.TryAddDocumentToWorkspace(moniker, textBuffer)) { // We already added it, so we will keep it excluded from the misc files workspace return; } // This should always succeed since we only got here if we already confirmed the moniker is acceptable var languageInformation = TryGetLanguageInformation(moniker); Contract.ThrowIfNull(languageInformation); var languageServices = Services.GetLanguageServices(languageInformation.LanguageName); var compilationOptionsOpt = languageServices.GetService <ICompilationFactoryService>()?.GetDefaultCompilationOptions(); var parseOptionsOpt = languageServices.GetService <ISyntaxTreeFactoryService>()?.GetDefaultParseOptions(); if (parseOptionsOpt != null && compilationOptionsOpt != null && PathUtilities.GetExtension(moniker) == languageInformation.ScriptExtension) { parseOptionsOpt = parseOptionsOpt.WithKind(SourceCodeKind.Script); var metadataService = Services.GetService <IMetadataService>(); var directory = PathUtilities.GetDirectoryName(moniker); // TODO (https://github.com/dotnet/roslyn/issues/5325, https://github.com/dotnet/roslyn/issues/13886): // - Need to have a way to specify these somewhere in VS options. // - Use RuntimeMetadataReferenceResolver like in InteractiveEvaluator.CreateMetadataReferenceResolver // - Add default namespace imports // - Add default script globals available in 'csi goo.csx' environment: CommandLineScriptGlobals var referenceSearchPaths = ImmutableArray <string> .Empty; var sourceSearchPaths = ImmutableArray <string> .Empty; var referenceResolver = new WorkspaceMetadataFileReferenceResolver( metadataService, new RelativePathResolver(referenceSearchPaths, directory)); compilationOptionsOpt = compilationOptionsOpt. WithMetadataReferenceResolver(referenceResolver). WithSourceReferenceResolver(new SourceFileResolver(sourceSearchPaths, directory)); } // First, create the project var hostProject = new HostProject(this, CurrentSolution.Id, languageInformation.LanguageName, parseOptionsOpt, compilationOptionsOpt, _metadataReferences); // Now try to find the document. We accept any text buffer, since we've already verified it's an appropriate file in ShouldIncludeFile. var document = _documentProvider.TryGetDocumentForFile( hostProject, moniker, parseOptionsOpt?.Kind ?? SourceCodeKind.Regular, getFolderNames: _ => SpecializedCollections.EmptyReadOnlyList <string>(), canUseTextBuffer: _ => true); // If the buffer has not yet been initialized, we won't get a document. if (document == null) { return; } // Since we have a document, we can do the rest of the project setup. _hostProjects.Add(hostProject.Id, hostProject); OnProjectAdded(hostProject.CreateProjectInfoForCurrentState()); OnDocumentAdded(document.GetInitialState()); hostProject.Document = document; // Notify the document provider, so it knows the document is now open and a part of // the project _documentProvider.NotifyDocumentRegisteredToProjectAndStartToRaiseEvents(document); Contract.ThrowIfFalse(document.IsOpen); var buffer = document.GetOpenTextBuffer(); OnDocumentOpened(document.Id, document.GetOpenTextContainer()); _docCookiesToHostProject.Add(docCookie, hostProject); }