private static TestHostProject CreateProject( XElement workspaceElement, XElement projectElement, ExportProvider exportProvider, TestWorkspace workspace, IDocumentServiceProvider documentServiceProvider, ref int projectId, ref int documentId) { AssertNoChildText(projectElement); var language = GetLanguage(workspace, projectElement); var assemblyName = GetAssemblyName(workspace, projectElement, ref projectId); string filePath; var projectName = projectElement.Attribute(ProjectNameAttribute)?.Value ?? assemblyName; if (projectElement.Attribute(FilePathAttributeName) != null) { filePath = projectElement.Attribute(FilePathAttributeName).Value; if (string.Compare(filePath, NullFilePath, StringComparison.Ordinal) == 0) { // allow explicit null file path filePath = null; } } else { filePath = projectName + (language == LanguageNames.CSharp ? ".csproj" : language == LanguageNames.VisualBasic ? ".vbproj" : ("." + language)); } var languageServices = workspace.Services.GetLanguageServices(language); var parseOptions = GetParseOptions(projectElement, language, languageServices); var compilationOptions = CreateCompilationOptions(workspace, projectElement, language, parseOptions); var rootNamespace = GetRootNamespace(workspace, compilationOptions, projectElement); var references = CreateReferenceList(workspace, projectElement); var analyzers = CreateAnalyzerList(projectElement); var documents = new List <TestHostDocument>(); var documentElements = projectElement.Elements(DocumentElementName).ToList(); foreach (var documentElement in documentElements) { var document = CreateDocument( workspace, workspaceElement, documentElement, exportProvider, languageServices, documentServiceProvider, ref documentId); documents.Add(document); } var additionalDocuments = new List <TestHostDocument>(); var additionalDocumentElements = projectElement.Elements(AdditionalDocumentElementName).ToList(); foreach (var additionalDocumentElement in additionalDocumentElements) { var document = CreateDocument( workspace, workspaceElement, additionalDocumentElement, exportProvider, languageServices, documentServiceProvider, ref documentId); additionalDocuments.Add(document); } var analyzerConfigDocuments = new List <TestHostDocument>(); var analyzerConfigElements = projectElement.Elements(AnalyzerConfigDocumentElementName).ToList(); foreach (var analyzerConfigElement in analyzerConfigElements) { var document = CreateDocument( workspace, workspaceElement, analyzerConfigElement, exportProvider, languageServices, documentServiceProvider, ref documentId); analyzerConfigDocuments.Add(document); } return(new TestHostProject(languageServices, compilationOptions, parseOptions, assemblyName, projectName, references, documents, additionalDocuments, analyzerConfigDocuments, filePath: filePath, analyzerReferences: analyzers, defaultNamespace: rootNamespace)); }
private static TestHostDocument CreateDocument( TestWorkspace workspace, XElement workspaceElement, XElement documentElement, ExportProvider exportProvider, HostLanguageServices languageServiceProvider, IDocumentServiceProvider documentServiceProvider, ref int documentId) { string markupCode; string filePath; var isLinkFileAttribute = documentElement.Attribute(IsLinkFileAttributeName); var isLinkFile = isLinkFileAttribute != null && ((bool?)isLinkFileAttribute).HasValue && ((bool?)isLinkFileAttribute).Value; if (isLinkFile) { // This is a linked file. Use the filePath and markup from the referenced document. var originalAssemblyName = documentElement.Attribute(LinkAssemblyNameAttributeName)?.Value; var originalProjectName = documentElement.Attribute(LinkProjectNameAttributeName)?.Value; if (originalAssemblyName == null && originalProjectName == null) { throw new ArgumentException($"Linked files must specify either a {LinkAssemblyNameAttributeName} or {LinkProjectNameAttributeName}"); } var originalProject = workspaceElement.Elements(ProjectElementName).FirstOrDefault(p => { if (originalAssemblyName != null) { return(p.Attribute(AssemblyNameAttributeName)?.Value == originalAssemblyName); } else { return(p.Attribute(ProjectNameAttribute)?.Value == originalProjectName); } }); if (originalProject == null) { if (originalProjectName != null) { throw new ArgumentException($"Linked file's {LinkProjectNameAttributeName} '{originalProjectName}' project not found."); } else { throw new ArgumentException($"Linked file's {LinkAssemblyNameAttributeName} '{originalAssemblyName}' project not found."); } } var originalDocumentPath = documentElement.Attribute(LinkFilePathAttributeName)?.Value; if (originalDocumentPath == null) { throw new ArgumentException($"Linked files must specify a {LinkFilePathAttributeName}"); } documentElement = originalProject.Elements(DocumentElementName).FirstOrDefault(d => { return(d.Attribute(FilePathAttributeName)?.Value == originalDocumentPath); }); if (documentElement == null) { throw new ArgumentException($"Linked file's LinkFilePath '{originalDocumentPath}' file not found."); } } markupCode = documentElement.NormalizedValue(); filePath = GetFilePath(workspace, documentElement, ref documentId); var folders = GetFolders(documentElement); var optionsElement = documentElement.Element(ParseOptionsElementName); // TODO: Allow these to be specified. var codeKind = SourceCodeKind.Regular; if (optionsElement != null) { var attr = optionsElement.Attribute(KindAttributeName); codeKind = attr == null ? SourceCodeKind.Regular : (SourceCodeKind)Enum.Parse(typeof(SourceCodeKind), attr.Value); } TestFileMarkupParser.GetPositionAndSpans(markupCode, out var code, out int?cursorPosition, out ImmutableDictionary <string, ImmutableArray <TextSpan> > spans); var testDocumentServiceProvider = GetDocumentServiceProvider(documentElement); if (documentServiceProvider == null) { documentServiceProvider = testDocumentServiceProvider; } else if (testDocumentServiceProvider != null) { AssertEx.Fail($"The document attributes on file {filePath} conflicted"); } return(new TestHostDocument( exportProvider, languageServiceProvider, code, filePath, cursorPosition, spans, codeKind, folders, isLinkFile, documentServiceProvider)); }
public DynamicFileInfo(string filePath, SourceCodeKind sourceCodeKind, TextLoader textLoader, IDocumentServiceProvider documentServiceProvider) { FilePath = filePath; SourceCodeKind = SourceCodeKind; TextLoader = textLoader; DocumentServiceProvider = documentServiceProvider; }
internal void InitializeDocuments( XElement workspaceElement, bool openDocuments = true, IDocumentServiceProvider documentServiceProvider = null) { if (workspaceElement.Name != WorkspaceElementName) { throw new ArgumentException(); } var projectNameToTestHostProject = new Dictionary <string, TestHostProject>(); var projectElementToProjectName = new Dictionary <XElement, string>(); var projectIdentifier = 0; var documentIdentifier = 0; foreach (var projectElement in workspaceElement.Elements(ProjectElementName)) { var project = CreateProject( workspaceElement, projectElement, ExportProvider, this, documentServiceProvider, ref projectIdentifier, ref documentIdentifier); Assert.False(projectNameToTestHostProject.ContainsKey(project.Name), $"The workspace XML already contains a project with name {project.Name}"); projectNameToTestHostProject.Add(project.Name, project); projectElementToProjectName.Add(projectElement, project.Name); Projects.Add(project); } var documentFilePaths = new HashSet <string>(); foreach (var project in projectNameToTestHostProject.Values) { foreach (var document in project.Documents) { Assert.True(document.IsLinkFile || documentFilePaths.Add(document.FilePath)); Documents.Add(document); } } var submissions = CreateSubmissions(workspaceElement.Elements(SubmissionElementName), ExportProvider); foreach (var submission in submissions) { projectNameToTestHostProject.Add(submission.Name, submission); Documents.Add(submission.Documents.Single()); } var solution = new TestHostSolution(projectNameToTestHostProject.Values.ToArray()); AddTestSolution(solution); foreach (var projectElement in workspaceElement.Elements(ProjectElementName)) { foreach (var projectReference in projectElement.Elements(ProjectReferenceElementName)) { var fromName = projectElementToProjectName[projectElement]; var toName = projectReference.Value; var fromProject = projectNameToTestHostProject[fromName]; var toProject = projectNameToTestHostProject[toName]; var aliases = projectReference.Attributes(AliasAttributeName).Select(a => a.Value).ToImmutableArray(); OnProjectReferenceAdded(fromProject.Id, new ProjectReference(toProject.Id, aliases.Any() ? aliases : default)); } } for (var i = 1; i < submissions.Count; i++) { if (submissions[i].CompilationOptions == null) { continue; } for (var j = i - 1; j >= 0; j--) { if (submissions[j].CompilationOptions != null) { OnProjectReferenceAdded(submissions[i].Id, new ProjectReference(submissions[j].Id)); break; } } } foreach (var project in projectNameToTestHostProject.Values) { foreach (var document in project.Documents) { if (openDocuments) { // This implicitly opens the document in the workspace by fetching the container. document.GetOpenTextContainer(); } } } }
private static TestHostDocument CreateDocument( TestWorkspace workspace, XElement workspaceElement, XElement documentElement, string language, ExportProvider exportProvider, HostLanguageServices languageServiceProvider, Dictionary <string, ITextBuffer> filePathToTextBufferMap, IDocumentServiceProvider documentServiceProvider, ref int documentId) { string markupCode; string filePath; var isLinkFileAttribute = documentElement.Attribute(IsLinkFileAttributeName); bool isLinkFile = isLinkFileAttribute != null && ((bool?)isLinkFileAttribute).HasValue && ((bool?)isLinkFileAttribute).Value; if (isLinkFile) { // This is a linked file. Use the filePath and markup from the referenced document. var originalAssemblyName = documentElement.Attribute(LinkAssemblyNameAttributeName)?.Value; var originalProjectName = documentElement.Attribute(LinkProjectNameAttributeName)?.Value; if (originalAssemblyName == null && originalProjectName == null) { throw new ArgumentException($"Linked files must specify either a {LinkAssemblyNameAttributeName} or {LinkProjectNameAttributeName}"); } var originalProject = workspaceElement.Elements(ProjectElementName).FirstOrDefault(p => { if (originalAssemblyName != null) { return(p.Attribute(AssemblyNameAttributeName)?.Value == originalAssemblyName); } else { return(p.Attribute(ProjectNameAttribute)?.Value == originalProjectName); } }); if (originalProject == null) { if (originalProjectName != null) { throw new ArgumentException($"Linked file's {LinkProjectNameAttributeName} '{originalProjectName}' project not found."); } else { throw new ArgumentException($"Linked file's {LinkAssemblyNameAttributeName} '{originalAssemblyName}' project not found."); } } var originalDocumentPath = documentElement.Attribute(LinkFilePathAttributeName)?.Value; if (originalDocumentPath == null) { throw new ArgumentException($"Linked files must specify a {LinkFilePathAttributeName}"); } documentElement = originalProject.Elements(DocumentElementName).FirstOrDefault(d => { return(d.Attribute(FilePathAttributeName)?.Value == originalDocumentPath); }); if (documentElement == null) { throw new ArgumentException($"Linked file's LinkFilePath '{originalDocumentPath}' file not found."); } } markupCode = documentElement.NormalizedValue(); filePath = GetFilePath(workspace, documentElement, ref documentId); var folders = GetFolders(documentElement); var optionsElement = documentElement.Element(ParseOptionsElementName); // TODO: Allow these to be specified. var codeKind = SourceCodeKind.Regular; if (optionsElement != null) { var attr = optionsElement.Attribute(KindAttributeName); codeKind = attr == null ? SourceCodeKind.Regular : (SourceCodeKind)Enum.Parse(typeof(SourceCodeKind), attr.Value); } var contentTypeLanguageService = languageServiceProvider.GetService <IContentTypeLanguageService>(); var contentType = contentTypeLanguageService.GetDefaultContentType(); MarkupTestFile.GetPositionAndSpans(markupCode, out var code, out var cursorPosition, out IDictionary <string, ImmutableArray <TextSpan> > spans); // For linked files, use the same ITextBuffer for all linked documents if (!filePathToTextBufferMap.TryGetValue(filePath, out var textBuffer)) { textBuffer = EditorFactory.CreateBuffer(contentType.TypeName, exportProvider, code); filePathToTextBufferMap.Add(filePath, textBuffer); } return(new TestHostDocument( exportProvider, languageServiceProvider, textBuffer, filePath, cursorPosition, spans, codeKind, folders, isLinkFile, documentServiceProvider)); }
internal static TestWorkspace Create( XElement workspaceElement, bool completed = true, bool openDocuments = true, ExportProvider exportProvider = null, string workspaceKind = null, IDocumentServiceProvider documentServiceProvider = null) { if (workspaceElement.Name != WorkspaceElementName) { throw new ArgumentException(); } exportProvider = exportProvider ?? TestExportProvider.ExportProviderWithCSharpAndVisualBasic; var workspace = new TestWorkspace(exportProvider, workspaceKind); var projectNameToTestHostProject = new Dictionary <string, TestHostProject>(); var documentElementToFilePath = new Dictionary <XElement, string>(); var projectElementToProjectName = new Dictionary <XElement, string>(); var filePathToTextBufferMap = new Dictionary <string, ITextBuffer>(); int projectIdentifier = 0; int documentIdentifier = 0; foreach (var projectElement in workspaceElement.Elements(ProjectElementName)) { var project = CreateProject( workspaceElement, projectElement, exportProvider, workspace, documentElementToFilePath, filePathToTextBufferMap, documentServiceProvider, ref projectIdentifier, ref documentIdentifier); Assert.False(projectNameToTestHostProject.ContainsKey(project.Name), $"The workspace XML already contains a project with name {project.Name}"); projectNameToTestHostProject.Add(project.Name, project); projectElementToProjectName.Add(projectElement, project.Name); workspace.Projects.Add(project); } var documentFilePaths = new HashSet <string>(); foreach (var project in projectNameToTestHostProject.Values) { foreach (var document in project.Documents) { Assert.True(document.IsLinkFile || documentFilePaths.Add(document.FilePath)); } } var submissions = CreateSubmissions(workspace, workspaceElement.Elements(SubmissionElementName), exportProvider); foreach (var submission in submissions) { projectNameToTestHostProject.Add(submission.Name, submission); } var solution = new TestHostSolution(projectNameToTestHostProject.Values.ToArray()); workspace.AddTestSolution(solution); foreach (var projectElement in workspaceElement.Elements(ProjectElementName)) { foreach (var projectReference in projectElement.Elements(ProjectReferenceElementName)) { var fromName = projectElementToProjectName[projectElement]; var toName = projectReference.Value; var fromProject = projectNameToTestHostProject[fromName]; var toProject = projectNameToTestHostProject[toName]; var aliases = projectReference.Attributes(AliasAttributeName).Select(a => a.Value).ToImmutableArray(); workspace.OnProjectReferenceAdded(fromProject.Id, new ProjectReference(toProject.Id, aliases.Any() ? aliases : default(ImmutableArray <string>))); } } for (int i = 1; i < submissions.Count; i++) { if (submissions[i].CompilationOptions == null) { continue; } for (int j = i - 1; j >= 0; j--) { if (submissions[j].CompilationOptions != null) { workspace.OnProjectReferenceAdded(submissions[i].Id, new ProjectReference(submissions[j].Id)); break; } } } foreach (var project in projectNameToTestHostProject.Values) { foreach (var document in project.Documents) { if (openDocuments) { workspace.OnDocumentOpened(document.Id, document.GetOpenTextContainer(), isCurrentContext: !document.IsLinkFile); } workspace.Documents.Add(document); } } return(workspace); }
public DynamicFileInfo(string filePath, SourceCodeKind sourceCodeKind, TextLoader textLoader, bool designTimeOnly, IDocumentServiceProvider documentServiceProvider) { FilePath = filePath; SourceCodeKind = sourceCodeKind; TextLoader = textLoader; DocumentServiceProvider = documentServiceProvider; DesignTimeOnly = designTimeOnly; }
/// <summary> /// Create a new instance of a <see cref="DocumentInfo"/>. /// </summary> internal DocumentInfo(DocumentAttributes attributes, TextLoader loader, IDocumentServiceProvider documentServiceProvider) { Attributes = attributes; TextLoader = loader; DocumentServiceProvider = documentServiceProvider; }
private static TestHostProject CreateProject( XElement workspaceElement, XElement projectElement, ExportProvider exportProvider, TestWorkspace workspace, IDocumentServiceProvider documentServiceProvider, ref int projectId, ref int documentId) { AssertNoChildText(projectElement); var language = GetLanguage(workspace, projectElement); var assemblyName = GetAssemblyName(workspace, projectElement, ref projectId); string filePath; var projectName = projectElement.Attribute(ProjectNameAttribute)?.Value ?? assemblyName; if (projectElement.Attribute(FilePathAttributeName) != null) { filePath = projectElement.Attribute(FilePathAttributeName).Value; if (string.Compare(filePath, NullFilePath, StringComparison.Ordinal) == 0) { // allow explicit null file path filePath = null; } } else { filePath = projectName + (language == LanguageNames.CSharp ? ".csproj" : language == LanguageNames.VisualBasic ? ".vbproj" : ("." + language)); } var languageServices = workspace.Services.GetLanguageServices(language); var parseOptions = GetParseOptions(projectElement, language, languageServices); var compilationOptions = CreateCompilationOptions(workspace, projectElement, language, parseOptions); var rootNamespace = GetRootNamespace(workspace, compilationOptions, projectElement); var references = CreateReferenceList(workspace, projectElement); var analyzers = CreateAnalyzerList(projectElement); var documents = new List <TestHostDocument>(); var documentElements = projectElement.Elements(DocumentElementName).ToList(); foreach (var documentElement in documentElements) { var document = CreateDocument( workspace, workspaceElement, documentElement, exportProvider, languageServices, documentServiceProvider, ref documentId); documents.Add(document); } SingleFileTestGenerator testGenerator = null; foreach (var sourceGeneratedDocumentElement in projectElement.Elements(DocumentFromSourceGeneratorElementName)) { if (testGenerator is null) { testGenerator = new SingleFileTestGenerator(); analyzers.Add(new TestGeneratorReference(testGenerator)); } var name = GetFileName(workspace, sourceGeneratedDocumentElement, ref documentId); var markupCode = sourceGeneratedDocumentElement.NormalizedValue(); MarkupTestFile.GetPositionAndSpans(markupCode, out var code, out var cursorPosition, out IDictionary <string, ImmutableArray <TextSpan> > spans); var documentFilePath = typeof(SingleFileTestGenerator).Assembly.GetName().Name + '\\' + typeof(SingleFileTestGenerator).FullName + '\\' + name; var document = new TestHostDocument(exportProvider, languageServices, code, name, documentFilePath, cursorPosition, spans, isSourceGenerated: true); documents.Add(document); testGenerator.AddSource(code, name); } var additionalDocuments = new List <TestHostDocument>(); var additionalDocumentElements = projectElement.Elements(AdditionalDocumentElementName).ToList(); foreach (var additionalDocumentElement in additionalDocumentElements) { var document = CreateDocument( workspace, workspaceElement, additionalDocumentElement, exportProvider, languageServices, documentServiceProvider, ref documentId); additionalDocuments.Add(document); } var analyzerConfigDocuments = new List <TestHostDocument>(); var analyzerConfigElements = projectElement.Elements(AnalyzerConfigDocumentElementName).ToList(); foreach (var analyzerConfigElement in analyzerConfigElements) { var document = CreateDocument( workspace, workspaceElement, analyzerConfigElement, exportProvider, languageServices, documentServiceProvider, ref documentId); analyzerConfigDocuments.Add(document); } return(new TestHostProject(languageServices, compilationOptions, parseOptions, assemblyName, projectName, references, documents, additionalDocuments, analyzerConfigDocuments, filePath: filePath, analyzerReferences: analyzers, defaultNamespace: rootNamespace)); }
public void SetUp() { mockedClient = new Mock <IRestClient>(); provider = new DocumentServiceProvider(mockedClient.Object); }
private static TestHostProject CreateProject( XElement workspaceElement, XElement projectElement, ExportProvider exportProvider, TestWorkspace workspace, Dictionary <XElement, string> documentElementToFilePath, Dictionary <string, ITextBuffer> filePathToTextBufferMap, IDocumentServiceProvider documentServiceProvider, ref int projectId, ref int documentId) { var language = GetLanguage(workspace, projectElement); var assemblyName = GetAssemblyName(workspace, projectElement, ref projectId); var defaultNamespace = GetDefaultNamespace(workspace, projectElement); string filePath; string projectName = projectElement.Attribute(ProjectNameAttribute)?.Value ?? assemblyName; if (projectElement.Attribute(FilePathAttributeName) != null) { filePath = projectElement.Attribute(FilePathAttributeName).Value; if (string.Compare(filePath, NullFilePath, StringComparison.Ordinal) == 0) { // allow explicit null file path filePath = null; } } else { filePath = projectName + (language == LanguageNames.CSharp ? ".csproj" : language == LanguageNames.VisualBasic ? ".vbproj" : ("." + language)); } var contentTypeRegistryService = exportProvider.GetExportedValue <IContentTypeRegistryService>(); var languageServices = workspace.Services.GetLanguageServices(language); var parseOptions = GetParseOptions(projectElement, language, languageServices); var compilationOptions = CreateCompilationOptions(workspace, projectElement, language, parseOptions); var references = CreateReferenceList(workspace, projectElement); var analyzers = CreateAnalyzerList(workspace, projectElement); var documents = new List <TestHostDocument>(); var documentElements = projectElement.Elements(DocumentElementName).ToList(); foreach (var documentElement in documentElements) { var document = CreateDocument( workspace, workspaceElement, documentElement, language, exportProvider, languageServices, filePathToTextBufferMap, documentServiceProvider, ref documentId); documents.Add(document); documentElementToFilePath.Add(documentElement, document.FilePath); } return(new TestHostProject(languageServices, compilationOptions, parseOptions, assemblyName, projectName, references, documents, filePath: filePath, analyzerReferences: analyzers, defaultNamespace: defaultNamespace)); }