public async Task ShouldAddUsingOnCommit() { const string source = @" public class Test { public void Method() { var list = new } }"; var document = GetTestDocument(source); var listCompletion = (await GetCompletionsAsync(Provider, document, "var list = new ")) .First(c => Matches(c, "List<>", "System.Collections.Generic")); listCompletion = CompletionList .Create(new TextSpan(source.IndexOf("var list = new "), 0), ImmutableArray.Create(listCompletion)) .Items[0]; var changes = await Provider.GetChangeAsync(document, listCompletion, ' ', CancellationToken.None); var textWithChanges = (await document.GetTextAsync()).WithChanges(changes.TextChange).ToString(); Assert.That(NormSpaces(textWithChanges), Is.EqualTo(NormSpaces(@" using System.Collections.Generic; public class Test { public void Method() { var list = new List } }"))); }
public async Task GetCompletions_Should_Return_Expected() { // arrange var code = "test code"; // roslyn provider var roslyn = new Mock <IRoslynCompletionsProvider>(); var completionItems = Enumerable .Range(1, 3) .Select(i => CompletionItem.Create($"displayText {i}")) .ToImmutableArray(); var completionList = CompletionList.Create(TextSpan.FromBounds(0, 10), completionItems); roslyn .Setup(r => r.GetCompletions(code, It.IsAny <IEnumerable <string> >())) .ReturnsAsync(completionList); // parser var parser = new Mock <ICompletionsParser>(); var lastToken = "test-incomplete-text"; parser .Setup(p => p.ParseLastToken(code)) .Returns(lastToken); // filter var filter = new Mock <ICompletionsFilter>(); var filtered = Enumerable .Range(1, 3) .Select(i => $"filtered item {i}"); filter .Setup(f => f.Apply(It.IsAny <IEnumerable <string> >(), lastToken)) .Returns(filtered); var builder = new Mock <IScriptOptionsBuilder>(); builder .Setup(b => b.Build()) .Returns(ScriptOptions.Default.AddImports("test.import")); var provider = new CompletionsProvider(roslyn.Object, parser.Object, filter.Object, builder.Object); // act var completions = (await provider.GetCompletions(code)).ToArray(); // assert Assert.That(completions, Is.Not.Null); roslyn.VerifyAll(); parser.VerifyAll(); filter.VerifyAll(); }
internal static async Task <CompletionList> GetCompletionListAsync(CompletionProvider provider, Document document, int position, CompletionTrigger triggerInfo, OptionSet options = null) { var service = GetCompletionService(document); var context = await GetCompletionListContextAsync(provider, document, position, triggerInfo, options); var text = await document.GetTextAsync(); var span = service.GetDefaultItemSpan(text, position); return(CompletionList.Create(span, context.Items.ToImmutableArray(), service.GetRules(), context.SuggestionModeItem)); }
public async Task ShouldAddUsingOnCommit() { const string source = @" public class Test { public void Method() { var list = new } }"; const string classFile = @" namespace NM { public class ContainingClass { public class NestedClass { } } }"; var document = GetTestDocument(source, classFile); var listCompletion = (await GetCompletionsAsync(Provider_WithOptions(o => o.SuggestNestedTypes = true), document, "var list = new ")) .First(c => Matches(c, "ContainingClass.NestedClass", "NM")); listCompletion = CompletionList .Create(new TextSpan(source.IndexOf("var list = new "), 0), ImmutableArray.Create(listCompletion)) .Items[0]; var changes = await Provider.GetChangeAsync(document, listCompletion, ' ', CancellationToken.None); var textWithChanges = (await document.GetTextAsync()).WithChanges(changes.TextChange).ToString(); Assert.That(NormSpaces(textWithChanges), Is.EqualTo(NormSpaces(@" using NM; public class Test { public void Method() { var list = new ContainingClass.NestedClass } }"))); }
public static dynamic CompileRos(SourceInfo sourceInfo) { var usings = new List <string>(); var allusingsInCode = sourceInfo.SourceCode.Split(new string[] { "using " }, StringSplitOptions.None); foreach (var item in allusingsInCode) { if (!String.IsNullOrWhiteSpace(item)) { usings.Add(item.Split(';')[0]); } } List <Assembly> assemblies = new List <Assembly> { Assembly.Load("Microsoft.CodeAnalysis"), Assembly.Load("Microsoft.CodeAnalysis.CSharp"), Assembly.Load("Microsoft.CodeAnalysis.Features"), Assembly.Load("Microsoft.CodeAnalysis.CSharp.Features"), }; var assembliesList = DownloadNugetPackages.LoadPackages(sourceInfo.Nuget); foreach (var item in assembliesList) { var fname = item.FullName.Split(',')[0]; if (assemblies.Where(x => x.FullName.Split(',')[0] == fname).FirstOrDefault() == null) { try { var asm = item.FullName.Split(',')[0]; var loadAssembly = Assembly.Load(asm); assemblies.Add(loadAssembly); } catch (Exception) { //assemblies.Add(item); } } } var assembliest = AppDomain.CurrentDomain.GetAssemblies() .Where(a => !a.IsDynamic && File.Exists(a.Location)); //MefHostServices.DefaultAssemblies.AddRange (assembliest); var partTypes = MefHostServices.DefaultAssemblies.Concat(assemblies) .Distinct()? .SelectMany(x => x?.GetTypes())? .ToArray(); var compositionContext = new ContainerConfiguration() .WithParts(partTypes) //.WithAssemblies(assemblies) //.WithAssemblies(assembliest) .CreateContainer(); var host = MefHostServices.Create(compositionContext); var workspace = new AdhocWorkspace(host); var scriptCode = sourceInfo.SourceCode;// "Guid.N"; var _ = typeof(Microsoft.CodeAnalysis.CSharp.Formatting.CSharpFormattingOptions); var compilationOptions = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary, usings: usings); if (_ref == null || _ref.Length == 0) { //.GroupBy(a => a.GetName().Name) //.Select(grp => // grp.First(y => y.GetName().Version == grp.Max(x => x.GetName().Version))) //.Select(a => MetadataReference.CreateFromFile(a.Location)); MetadataReference[] _refs2 = assembliest .Select(asm => MetadataReference.CreateFromFile(asm.Location)) .ToArray(); MetadataReference[] _refs = assembliesList .Select(asm => MetadataReference.CreateFromFile(asm.Location)) .ToArray(); _ref = new MetadataReference[0]; try { try { foreach (var item in DependencyContext.Default.CompileLibraries) { try { var arr = item.ResolveReferencePaths().Select(asm => MetadataReference.CreateFromFile(asm))? .ToArray(); _ref = _ref.Concatenate(arr); } catch (Exception) { } } } catch (Exception) { } } catch (Exception) { } _ref = _ref.Concatenate(_refs); _ref = _ref.Concatenate(_refs2); } if (_ref != null && _ref.Length > 0) { _ref = _ref.Concatenate(new[] { MetadataReference.CreateFromFile(typeof(object).Assembly.Location) }); var scriptProjectInfo = ProjectInfo.Create(ProjectId.CreateNewId(), VersionStamp.Create(), "Script", "Script", LanguageNames.CSharp, isSubmission: true) .WithMetadataReferences(_ref) .WithCompilationOptions(compilationOptions); var scriptProject = workspace.AddProject(scriptProjectInfo); var scriptDocumentInfo = DocumentInfo.Create( DocumentId.CreateNewId(scriptProject.Id), "Script", sourceCodeKind: SourceCodeKind.Script, loader: TextLoader.From(TextAndVersion.Create(SourceText.From(scriptCode), VersionStamp.Create()))); var scriptDocument = workspace.AddDocument(scriptDocumentInfo); // cursor position is at the end var position = sourceInfo.LineNumberOffsetFromTemplate;// scriptCode.Length - 1; var completionService = CompletionService.GetService(scriptDocument); var results = completionService.GetCompletionsAsync(scriptDocument, position).Result; if (results == null && sourceInfo.LineNumberOffsetFromTemplate < sourceInfo.SourceCode.Length) { sourceInfo.LineNumberOffsetFromTemplate++; CompileRos(sourceInfo); } if (sourceInfo.SourceCode[sourceInfo.LineNumberOffsetFromTemplate - 1].ToString() == "(") { sourceInfo.LineNumberOffsetFromTemplate--; //CompileRos(sourceInfo); results = completionService.GetCompletionsAsync(scriptDocument, sourceInfo.LineNumberOffsetFromTemplate).Result; } //Method parameters List <string> overloads = GetMethodParams(scriptCode, position); if (overloads != null && overloads.Count > 0) { ImmutableArray <CompletionItem> .Builder builder = ImmutableArray.CreateBuilder <CompletionItem>(); foreach (var item in overloads) { string DisplayText = item; string insertText = item.Split('(')[1].Split(')')[0]; CompletionItem ci = CompletionItem.Create(insertText, insertText, insertText); builder.Add(ci); } if (builder.Count > 0) { ImmutableArray <CompletionItem> itemlist = builder.ToImmutable(); return(CompletionList.Create(new Microsoft.CodeAnalysis.Text.TextSpan(), itemlist)); } } return(results); } return(null); }
public static dynamic CompileRos2(SourceInfo sourceInfo) { List <Assembly> assemblies = new List <Assembly> { Assembly.Load("Microsoft.CodeAnalysis"), Assembly.Load("Microsoft.CodeAnalysis.CSharp"), Assembly.Load("Microsoft.CodeAnalysis.Features"), Assembly.Load("Microsoft.CodeAnalysis.CSharp.Features"), }; var assembliesList = DownloadNugetPackages.LoadPackages(sourceInfo.Nuget); foreach (var item in assembliesList) { var fname = item.FullName.Split(',')[0]; if (assemblies.Where(x => x.FullName.Split(',')[0] == fname).FirstOrDefault() == null) { var loadAssembly = Assembly.Load(item.FullName.Split(',')[0]); assemblies.Add(loadAssembly); } } var partTypes = MefHostServices.DefaultAssemblies.Concat(assemblies) .Distinct() .SelectMany(x => x.GetTypes()) .ToArray(); var compositionContext = new ContainerConfiguration() .WithParts(partTypes) //.WithAssemblies(assemblies) .CreateContainer(); var host = MefHostServices.Create(compositionContext); var workspace = new AdhocWorkspace(host); var scriptCode = sourceInfo.SourceCode;// "Guid.N"; var _ = typeof(Microsoft.CodeAnalysis.CSharp.Formatting.CSharpFormattingOptions); var usings = new List <string>(); var allusingsInCode = sourceInfo.SourceCode.Split(new string[] { "using " }, StringSplitOptions.None); foreach (var item in allusingsInCode) { if (!String.IsNullOrWhiteSpace(item)) { usings.Add(item.Split(';')[0]); } } var compilationOptions = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary, usings: usings); MetadataReference[] _ref = DependencyContext.Default.CompileLibraries .First(cl => cl.Name == "mssqlrestapi") .ResolveReferencePaths() .Select(asm => MetadataReference.CreateFromFile(asm)) .ToArray(); MetadataReference[] _refs = assembliesList .Select(asm => MetadataReference.CreateFromFile(asm.Location)) .ToArray(); MetadataReference[] newArray = new MetadataReference[_ref.Length + _refs.Length]; Array.Copy(_ref, newArray, _ref.Length); Array.Copy(_refs, 0, newArray, _ref.Length, _refs.Length); //assembliesList //IMethodSymbol methodWithGenericTypeArgsSymbol = simpleClassToAnalyze.GetMembers("MySimpleMethod").FirstOrDefault() as IMethodSymbol; //var genericMethodSignature = methodWithGenericTypeArgsSymbol.Parameters; var scriptProjectInfo = ProjectInfo.Create(ProjectId.CreateNewId(), VersionStamp.Create(), "Script", "Script", LanguageNames.CSharp, isSubmission: true) .WithMetadataReferences(newArray) .WithCompilationOptions(compilationOptions); // without .net asseblies // .WithMetadataReferences(new[] // { // MetadataReference.CreateFromFile(typeof(object).Assembly.Location) // }) var scriptProject = workspace.AddProject(scriptProjectInfo); var scriptDocumentInfo = DocumentInfo.Create( DocumentId.CreateNewId(scriptProject.Id), "Script", sourceCodeKind: SourceCodeKind.Script, loader: TextLoader.From(TextAndVersion.Create(SourceText.From(scriptCode), VersionStamp.Create()))); var scriptDocument = workspace.AddDocument(scriptDocumentInfo); // cursor position is at the end var position = sourceInfo.LineNumberOffsetFromTemplate;// scriptCode.Length - 1; var completionService = CompletionService.GetService(scriptDocument); var results = completionService.GetCompletionsAsync(scriptDocument, position).Result; if (results == null && sourceInfo.LineNumberOffsetFromTemplate < sourceInfo.SourceCode.Length) { sourceInfo.LineNumberOffsetFromTemplate++; CompileRos2(sourceInfo); } //Method parameters List <string> overloads = GetMethodParams(scriptCode, position); if (overloads != null && overloads.Count > 0) { ImmutableArray <CompletionItem> .Builder builder = ImmutableArray.CreateBuilder <CompletionItem>(); foreach (var item in overloads) { string DisplayText = item; string insertText = item.Split('(')[1].Split(')')[0]; CompletionItem ci = CompletionItem.Create(insertText, insertText, insertText); builder.Add(ci); } if (builder.Count > 0) { ImmutableArray <CompletionItem> itemlist = builder.ToImmutable(); return(CompletionList.Create(new Microsoft.CodeAnalysis.Text.TextSpan(), itemlist)); } } return(results);// JsonConvert.SerializeObject(results); }
public static async Task <dynamic> GetCodeCompletion(SourceInfo sourceInfo, ILogger log) { var thisAssembly = typeof(CompleteCode).Assembly; var loadContext = AssemblyLoadContext.GetLoadContext(thisAssembly); var refs = CompileResources.PortableExecutableCompletionReferences; var usings = new List <string>(); var allusingsInCode = sourceInfo.SourceCode.Split(new string[] { "using " }, StringSplitOptions.None); foreach (var item in allusingsInCode) { if (!string.IsNullOrWhiteSpace(item)) { usings.Add(item.Split(';')[0]); } } List <Assembly> assemblies = loadContext.Assemblies.Where(a => !a.IsDynamic && File.Exists(a.Location)).ToList(); var partTypes = MefHostServices.DefaultAssemblies.Concat(assemblies) .Distinct()? .SelectMany(x => x?.GetTypes())? .ToArray(); var compositionContext = new ContainerConfiguration() .WithParts(partTypes) .CreateContainer(); var host = MefHostServices.Create(compositionContext); var workspace = new AdhocWorkspace(host); var scriptCode = sourceInfo.SourceCode; var _ = typeof(Microsoft.CodeAnalysis.CSharp.Formatting.CSharpFormattingOptions); var compilationOptions = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary, usings: usings); if (_ref == null || !_ref.Any()) { var _refs = assemblies .Select(asm => MetadataReference.CreateFromFile(asm.Location)) .ToArray(); _ref = new PortableExecutableReference[0]; _ref = _refs.Concatenate(_refs); } if (_ref?.Count() > 0) { var _ref = refs.Concatenate(new[] { MetadataReference.CreateFromFile(typeof(object).Assembly.Location) }); var scriptProjectInfo = ProjectInfo.Create(ProjectId.CreateNewId(), VersionStamp.Create(), "Script", "Script", LanguageNames.CSharp, isSubmission: true) .WithMetadataReferences(refs) .WithCompilationOptions(compilationOptions); var scriptProject = workspace.AddProject(scriptProjectInfo); var scriptDocumentInfo = DocumentInfo.Create( DocumentId.CreateNewId(scriptProject.Id), "Script", sourceCodeKind: SourceCodeKind.Script, loader: TextLoader.From(TextAndVersion.Create(SourceText.From(scriptCode), VersionStamp.Create()))); var scriptDocument = workspace.AddDocument(scriptDocumentInfo); // cursor position is at the end var position = sourceInfo.LineNumberOffsetFromTemplate; var completionService = CompletionService.GetService(scriptDocument); var results = await completionService.GetCompletionsAsync(scriptDocument, position); if (results == null && sourceInfo.LineNumberOffsetFromTemplate < sourceInfo.SourceCode.Length) { sourceInfo.LineNumberOffsetFromTemplate++; await GetCodeCompletion(sourceInfo, log); } if (sourceInfo.SourceCode[sourceInfo.LineNumberOffsetFromTemplate - 1].ToString() == "(") { sourceInfo.LineNumberOffsetFromTemplate--; results = completionService.GetCompletionsAsync(scriptDocument, sourceInfo.LineNumberOffsetFromTemplate).Result; } //Method parameters List <string> overloads = GetMethodParams(scriptCode, position, log); if (overloads?.Count > 0) { ImmutableArray <CompletionItem> .Builder builder = ImmutableArray.CreateBuilder <CompletionItem>(); foreach (var item in overloads) { string DisplayText = item; string insertText = item.Split('(')[1].Split(')')[0]; CompletionItem ci = CompletionItem.Create(insertText, insertText, insertText); builder.Add(ci); } if (builder.Count > 0) { ImmutableArray <CompletionItem> itemlist = builder.ToImmutable(); return(CompletionList.Create(new TextSpan(), itemlist)); } } return(results); } return(null); }