public static async Task <(Document, Compilation)> CreateInMemoryProject(string projectName, string code) { var references = ReferenceAssemblies.Net50.ToList(); references.AddRange(new[] { MetadataReference.CreateFromFile(typeof(Throw).Assembly.Location), MetadataReference.CreateFromFile(typeof(BaseMigration).Assembly.Location), }); var projectId = ProjectId.CreateNewId(projectName); var codeFileName = $"{projectName}Source.cs"; var codeFileId = DocumentId.CreateNewId(projectId, codeFileName); var project = new AdhocWorkspace().CurrentSolution .AddProject(projectId, projectName, projectName, LanguageNames.CSharp) .AddMetadataReferences(projectId, references) .AddDocument(codeFileId, codeFileName, SourceText.From(code)) .AddBaseMigrationClass(projectId) .GetProject(projectId) ! .WithCompilationOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); var document = project.GetDocument(codeFileId) !; var compilation = (await project.GetCompilationAsync()) !; return(document, compilation); }
static ImplementationFactoryTestsBase() { var thisAssembly = typeof(ImplementationFactoryTestsBase).Assembly; string dotNetDir = Path.GetDirectoryName(typeof(object).GetTypeInfo().Assembly.Location); // For actually executing code, we need to reference the compiled test assembly, so that the types we're seeing at the same // types as the ones the unit tests are seeing. // However, this doesn't give us source locations, which we need in order to test diagnostics. So for testing these, we include // the test project's files as source, rather than referencing the test project. var executionProject = new AdhocWorkspace() .AddProject("Execution", LanguageNames.CSharp) .WithCompilationOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary) .WithSpecificDiagnosticOptions(new KeyValuePair <string, ReportDiagnostic>[] { KeyValuePair.Create("CS1701", ReportDiagnostic.Suppress), KeyValuePair.Create("CS1702", ReportDiagnostic.Suppress), }) .WithNullableContextOptions(NullableContextOptions.Enable)) .AddMetadataReference(MetadataReference.CreateFromFile(typeof(object).Assembly.Location)) .AddMetadataReference(MetadataReference.CreateFromFile(Path.Join(dotNetDir, "netstandard.dll"))) .AddMetadataReference(MetadataReference.CreateFromFile(Path.Join(dotNetDir, "System.Runtime.dll"))) .AddMetadataReference(MetadataReference.CreateFromFile(Path.Join(dotNetDir, "System.Net.Http.dll"))) .AddMetadataReference(MetadataReference.CreateFromFile(Path.Join(dotNetDir, "System.Collections.dll"))) .AddMetadataReference(MetadataReference.CreateFromFile(Path.Join(dotNetDir, "System.Linq.Expressions.dll"))) .AddMetadataReference(MetadataReference.CreateFromFile(typeof(RestClient).Assembly.Location)) .AddMetadataReference(MetadataReference.CreateFromFile(thisAssembly.Location)); executionCompilation = executionProject.GetCompilationAsync().Result; var diagnosticsProject = new AdhocWorkspace() .AddProject("Diagnostics", LanguageNames.CSharp) .WithCompilationOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary) .WithNullableContextOptions(NullableContextOptions.Enable)) .AddMetadataReference(MetadataReference.CreateFromFile(typeof(object).Assembly.Location)) .AddMetadataReference(MetadataReference.CreateFromFile(Path.Join(dotNetDir, "netstandard.dll"))) .AddMetadataReference(MetadataReference.CreateFromFile(Path.Join(dotNetDir, "System.Runtime.dll"))) .AddMetadataReference(MetadataReference.CreateFromFile(Path.Join(dotNetDir, "System.Net.Http.dll"))) .AddMetadataReference(MetadataReference.CreateFromFile(Path.Join(dotNetDir, "System.Linq.Expressions.dll"))) .AddMetadataReference(MetadataReference.CreateFromFile(typeof(RestClient).Assembly.Location)); diagnosticsCompilation = diagnosticsProject.GetCompilationAsync().Result; var syntaxTrees = new List <SyntaxTree>(); foreach (string resourceName in thisAssembly.GetManifestResourceNames()) { if (resourceName.EndsWith(".cs")) { using (var reader = new StreamReader(thisAssembly.GetManifestResourceStream(resourceName))) { syntaxTrees.Add(SyntaxFactory.ParseSyntaxTree(reader.ReadToEnd())); } } } diagnosticsCompilation = diagnosticsCompilation.AddSyntaxTrees(syntaxTrees); }
public void Test1() { var file = $"{TestContext.CurrentContext.TestDirectory}/../../../TestRoslyn.cs"; var assemblies = new[] { typeof(object), typeof(Enumerable), typeof(TestAttribute) }.Select(x => x.Assembly.Location).ToArray(); var project = new AdhocWorkspace().AddProject("test", LanguageNames.CSharp); project = project.AddDocument(Path.GetFileName(file), File.ReadAllText(file)).Project; project = project.AddMetadataReferences(assemblies.Select(x => MetadataReference.CreateFromFile(x))); var compilation = project.GetCompilationAsync().GetAwaiter().GetResult(); var c = compilation.WithAnalyzers(ImmutableArray.Create((DiagnosticAnalyzer) new AssertEqualsAnalyzer())); var diagnostics = c.GetAnalyzerDiagnosticsAsync().GetAwaiter().GetResult(); }
public static async Task <(Document, Compilation)> CreateLightGuardClausesDllInMemory(string projectName, string code) { var projectId = ProjectId.CreateNewId(projectName); var codeFileName = $"{projectName}Source.cs"; var codeFileId = DocumentId.CreateNewId(projectId, codeFileName); var project = new AdhocWorkspace().CurrentSolution .AddProject(projectId, projectName, projectName, LanguageNames.CSharp) .AddMetadataReferences(projectId, AllReferences) .AddDocument(codeFileId, codeFileName, SourceText.From(code)) .AddThrowClass(projectId) .GetProject(projectId) .WithCompilationOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); var document = project.GetDocument(codeFileId); var compilation = await project.GetCompilationAsync(); return(document, compilation); }