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); }
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"); } }
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); }
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); }
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, ...)"); }
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, ...)"); }
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); }
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); }
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, ...)"); }
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, ...)"); }