示例#1
0
        public void ParameterTest01()
        {
            string  content = @"x <- foo(a,b,c,d)";
            AstRoot ast     = RParser.Parse(content);

            ITextBuffer   textBuffer     = new TextBufferMock(content, RContentTypeDefinition.ContentType);
            ParameterInfo parametersInfo = SignatureHelp.GetParametersInfoFromBuffer(ast, textBuffer.CurrentSnapshot, 10);

            parametersInfo.Should().NotBeNull()
            .And.HaveFunctionCall()
            .And.HaveFunctionName("foo")
            .And.HaveParameterIndex(0)
            .And.HaveSignatureEnd(17);

            parametersInfo = SignatureHelp.GetParametersInfoFromBuffer(ast, textBuffer.CurrentSnapshot, 11);
            parametersInfo.Should().HaveParameterIndex(1);
            parametersInfo = SignatureHelp.GetParametersInfoFromBuffer(ast, textBuffer.CurrentSnapshot, 12);
            parametersInfo.Should().HaveParameterIndex(1);

            parametersInfo = SignatureHelp.GetParametersInfoFromBuffer(ast, textBuffer.CurrentSnapshot, 13);
            parametersInfo.Should().HaveParameterIndex(2);
            parametersInfo = SignatureHelp.GetParametersInfoFromBuffer(ast, textBuffer.CurrentSnapshot, 14);
            parametersInfo.Should().HaveParameterIndex(2);

            parametersInfo = SignatureHelp.GetParametersInfoFromBuffer(ast, textBuffer.CurrentSnapshot, 15);
            parametersInfo.Should().HaveParameterIndex(3);
            parametersInfo = SignatureHelp.GetParametersInfoFromBuffer(ast, textBuffer.CurrentSnapshot, 16);
            parametersInfo.Should().HaveParameterIndex(3);
        }
示例#2
0
        public async Task NonUniqueNameTest()
        {
            string content = @"x <- select()";

            using (var hostScript = new RHostScript(Workflow.RSessions)) {
                //await Workflow.RSession.ExecuteAsync("install.packages('dplyr')");

                var session = await TriggerSessionAsync(content, 12);

                var parametersInfo = SignatureHelp.GetParametersInfoFromBuffer(session.Ast, session.TextBuffer.CurrentSnapshot, 10);

                session.ApplicableSpan.Should().NotBeNull();
                session.QuickInfoContent.Should().BeEmpty();

                await Workflow.RSession.ExecuteAsync("library(MASS)");

                EventsPump.DoEvents(500);
                session = await TriggerSessionAsync(content, 12);

                session.ApplicableSpan.Should().NotBeNull();
                session.QuickInfoContent.Should().ContainSingle().Which.ToString().Should().StartWith("select(formula");

                await Workflow.RSession.ExecuteAsync("library(dplyr)");

                EventsPump.DoEvents(500);
                session = await TriggerSessionAsync(content, 12);

                session.ApplicableSpan.Should().NotBeNull();
                session.QuickInfoContent.Should().ContainSingle().Which.ToString().Should().StartWith("select(.data");
            }
        }
示例#3
0
        public async Task LoadUnloadPackageTest()
        {
            string content = @"do()";

            using (var hostScript = new RHostScript(Workflow.RSessions)) {
                //await Workflow.RSession.ExecuteAsync("install.packages('dplyr')");

                var session = await TriggerSessionAsync(content, 3);

                var parametersInfo = SignatureHelp.GetParametersInfoFromBuffer(session.Ast, session.TextBuffer.CurrentSnapshot, 10);

                session.ApplicableSpan.Should().NotBeNull();
                session.QuickInfoContent.Should().BeEmpty();

                await Workflow.RSession.ExecuteAsync("library(dplyr)");

                session = await TriggerSessionAsync(content, 3);

                session.ApplicableSpan.Should().NotBeNull();
                session.QuickInfoContent.Should().ContainSingle().Which.ToString().Should().StartWith("do(.data");

                await Workflow.RSession.ExecuteAsync("detach(\"package:dplyr\", unload = TRUE)");

                EventsPump.DoEvents(1000);

                session = await TriggerSessionAsync(content, 3);

                session.QuickInfoContent.Should().BeEmpty();
            }
        }
        public IReadOnlyCollection <RCompletion> GetEntries(RCompletionContext context)
        {
            List <RCompletion> completions   = new List <RCompletion>();
            ImageSource        functionGlyph = GlyphService.GetGlyph(StandardGlyphGroup.GlyphGroupValueType, StandardGlyphItem.GlyphItemPublic);

            // Safety checks
            FunctionCall funcCall = context.AstRoot.GetNodeOfTypeFromPosition <FunctionCall>(context.Position);

            if (funcCall == null || funcCall.OpenBrace == null || funcCall.Arguments == null)
            {
                return(completions);
            }

            if (context.Position < funcCall.OpenBrace.End || context.Position >= funcCall.SignatureEnd)
            {
                return(completions);
            }

            // Retrieve parameter positions from the current text buffer snapshot
            ParameterInfo parametersInfo = SignatureHelp.GetParametersInfoFromBuffer(context.AstRoot, context.TextBuffer.CurrentSnapshot, context.Position);

            if (parametersInfo == null)
            {
                return(completions);
            }

            // Get collection of function signatures from documentation (parsed RD file)
            IFunctionInfo functionInfo = FunctionIndex.GetFunctionInfo(parametersInfo.FunctionName, o => { }, context.Session.TextView);

            if (functionInfo == null)
            {
                return(completions);
            }

            // Collect parameter names from all signatures
            IEnumerable <KeyValuePair <string, IArgumentInfo> > arguments = new Dictionary <string, IArgumentInfo>();

            foreach (ISignatureInfo signature in functionInfo.Signatures)
            {
                var args = signature.Arguments.ToDictionary(x => x.Name);
                arguments = arguments.Union(args);
            }

            // Add names of arguments that  are not yet specified to the completion
            // list with '=' sign so user can tell them from function names.
            IEnumerable <string> declaredArguments = funcCall.Arguments.Where(x => x is NamedArgument).Select(x => ((NamedArgument)x).Name);
            IEnumerable <KeyValuePair <string, IArgumentInfo> > possibleArguments = arguments.Where(x => x.Key != "..." && !declaredArguments.Contains(x.Key));

            foreach (KeyValuePair <string, IArgumentInfo> arg in possibleArguments)
            {
                string displayText   = arg.Key + " =";
                string insertionText = arg.Key + " = ";
                completions.Add(new RCompletion(displayText, insertionText, arg.Value.Description, functionGlyph));
            }

            return(completions);
        }
示例#5
0
        public void ParameterTest03()
        {
            string content = @"x <- foo(,,";

            AstRoot     ast        = RParser.Parse(content);
            ITextBuffer textBuffer = new TextBufferMock(content, RContentTypeDefinition.ContentType);

            var parametersInfo = SignatureHelp.GetParametersInfoFromBuffer(ast, textBuffer.CurrentSnapshot, 11);

            parametersInfo.Should().HaveParameterIndex(2);
        }
示例#6
0
        public async Task AliasTest()
        {
            // 'as.Date.character' RD contains no function info for 'as.Date.character', but the one for 'as.Date'
            // and as.Date.character appears as alias. We verify as.Date.character is shown in the signature info.
            string content = @"x <- as.Date.character(x)";

            var session = await TriggerSessionAsync(content, 23);

            var parametersInfo = SignatureHelp.GetParametersInfoFromBuffer(session.Ast, session.TextBuffer.CurrentSnapshot, 10);

            session.ApplicableSpan.Should().NotBeNull();
            session.QuickInfoContent.Should().ContainSingle()
            .Which.ToString().Should().StartWith("as.Date.character(x, ...)");
        }
示例#7
0
        public async Task CacheTest(bool cached)
        {
            if (!cached)
            {
                Support.Help.Packages.PackageIndex.ClearCache();
            }

            string content = @"x <- as.matrix(x)";
            var    session = await TriggerSessionAsync(content, 15);

            var parametersInfo = SignatureHelp.GetParametersInfoFromBuffer(session.Ast, session.TextBuffer.CurrentSnapshot, 10);

            session.ApplicableSpan.Should().NotBeNull();
            session.QuickInfoContent.Should().ContainSingle()
            .Which.ToString().Should().StartWith("as.matrix(x, ...)");
        }
示例#8
0
        public void ParameterTest06()
        {
            string content =
                @"x <- abs(

function(a) {
";
            AstRoot ast = RParser.Parse(content);

            ITextBuffer   textBuffer     = new TextBufferMock(content, RContentTypeDefinition.ContentType);
            ParameterInfo parametersInfo = SignatureHelp.GetParametersInfoFromBuffer(ast, textBuffer.CurrentSnapshot, content.Length - 1);

            parametersInfo.Should().NotBeNull()
            .And.HaveFunctionCall()
            .And.HaveFunctionName("abs")
            .And.HaveParameterIndex(0)
            .And.HaveSignatureEnd(content.Length);
        }
        /// <summary>
        /// Extracts information on the current function in the completion context, if any.
        /// </summary>
        /// <returns></returns>
        private IFunctionInfo GetFunctionInfo(RCompletionContext context)
        {
            // Retrieve parameter positions from the current text buffer snapshot
            IFunctionInfo functionInfo = null;

            ParameterInfo parametersInfo = SignatureHelp.GetParametersInfoFromBuffer(context.AstRoot, context.TextBuffer.CurrentSnapshot, context.Position);

            if (parametersInfo != null)
            {
                // User-declared functions take priority
                functionInfo = context.AstRoot.GetUserFunctionInfo(parametersInfo.FunctionName, context.Position);
                if (functionInfo == null)
                {
                    // Get collection of function signatures from documentation (parsed RD file)
                    functionInfo = _functionIndex.GetFunctionInfo(parametersInfo.FunctionName, null, (o, p) => { }, context.Session.TextView);
                }
            }
            return(functionInfo);
        }
示例#10
0
        public void ParameterTest07()
        {
            string  content = "x <- a(b( ), )";
            AstRoot ast     = RParser.Parse(content);

            ITextBuffer textBuffer     = new TextBufferMock(content, RContentTypeDefinition.ContentType);
            var         parametersInfo = SignatureHelp.GetParametersInfoFromBuffer(ast, textBuffer.CurrentSnapshot, 12);

            parametersInfo.Should().NotBeNull()
            .And.HaveFunctionCall()
            .And.HaveFunctionName("a")
            .And.HaveParameterIndex(1);

            parametersInfo = SignatureHelp.GetParametersInfoFromBuffer(ast, textBuffer.CurrentSnapshot, 13);
            parametersInfo.Should().NotBeNull()
            .And.HaveFunctionCall()
            .And.HaveFunctionName("a")
            .And.HaveParameterIndex(1);
        }
示例#11
0
        public async Task QuickInfoSourceTest01()
        {
            string  content = @"x <- as.matrix(x)";
            AstRoot ast     = RParser.Parse(content);

            int                  caretPosition    = 15; // in arguments
            ITextBuffer          textBuffer       = new TextBufferMock(content, RContentTypeDefinition.ContentType);
            QuickInfoSource      quickInfoSource  = new QuickInfoSource(textBuffer);
            QuickInfoSessionMock quickInfoSession = new QuickInfoSessionMock(textBuffer, caretPosition);
            List <object>        quickInfoContent = new List <object>();

            quickInfoSession.TriggerPoint = new SnapshotPoint(textBuffer.CurrentSnapshot, caretPosition);
            var applicableSpan = await quickInfoSource.AugmentQuickInfoSessionAsync(ast, caretPosition, quickInfoSession, quickInfoContent);

            ParameterInfo parametersInfo = SignatureHelp.GetParametersInfoFromBuffer(ast, textBuffer.CurrentSnapshot, 10);

            applicableSpan.Should().NotBeNull();
            quickInfoContent.Should().ContainSingle()
            .Which.ToString().Should().StartWith("as.matrix(x, data, nrow, ncol, byrow, dimnames, rownames.force, ...)");
        }
示例#12
0
        public async Task QuickInfoSourceTest02()
        {
            // 'as.Date.character' RD contains no function info for 'as.Date.character', but the one for 'as.Date'
            // then, the current code expects to add 'as.Date' quick info, which is the first function info for as.Date.character
            string  content = @"x <- as.Date.character(x)";
            AstRoot ast     = RParser.Parse(content);

            int                  caretPosition    = 23; // in arguments
            ITextBuffer          textBuffer       = new TextBufferMock(content, RContentTypeDefinition.ContentType);
            QuickInfoSource      quickInfoSource  = new QuickInfoSource(textBuffer, EditorShell);
            QuickInfoSessionMock quickInfoSession = new QuickInfoSessionMock(textBuffer, caretPosition);
            List <object>        quickInfoContent = new List <object>();

            quickInfoSession.TriggerPoint = new SnapshotPoint(textBuffer.CurrentSnapshot, caretPosition);
            var applicableSpan = await quickInfoSource.AugmentQuickInfoSessionAsync(ast, caretPosition, quickInfoSession, quickInfoContent);

            ParameterInfo parametersInfo = SignatureHelp.GetParametersInfoFromBuffer(ast, textBuffer.CurrentSnapshot, 10);

            applicableSpan.Should().NotBeNull();
            quickInfoContent.Should().ContainSingle()
            .Which.ToString().Should().StartWith("as.Date(x, ...)");
        }