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
                    }
                }")));
        }
Beispiel #2
0
        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();
        }
Beispiel #3
0
        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
                    }
                }")));
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        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);
        }