/// <summary> /// Attempts to insert Roxygen documentation block based /// on the user function signature. /// </summary> public static bool TryInsertBlock(IEditorBuffer editorBuffer, AstRoot ast, int position) { // First determine if position is right before the function declaration var snapshot = editorBuffer.CurrentSnapshot; IEditorLine line = null; var lineNumber = snapshot.GetLineNumberFromPosition(position); for (int i = lineNumber; i < snapshot.LineCount; i++) { line = snapshot.GetLineFromLineNumber(i); if (line.Length > 0) { break; } } if (line == null || line.Length == 0) { return(false); } Variable v; int offset = line.Length - line.GetText().TrimStart().Length + 1; if (line.Start + offset >= snapshot.Length) { return(false); } var fd = ast.FindFunctionDefinition(line.Start + offset, out v); if (fd != null && v != null && !string.IsNullOrEmpty(v.Name)) { int definitionStart = Math.Min(v.Start, fd.Start); var insertionSpan = GetRoxygenBlockPosition(snapshot, definitionStart); if (insertionSpan != null) { string lineBreak = snapshot.GetLineFromPosition(position).LineBreak; if (string.IsNullOrEmpty(lineBreak)) { lineBreak = "\n"; } string block = GenerateRoxygenBlock(v.Name, fd, lineBreak); if (block.Length > 0) { if (insertionSpan.Length == 0) { editorBuffer.Insert(insertionSpan.Start, block + lineBreak); } else { editorBuffer.Replace(insertionSpan, block); } return(true); } } } return(false); }
private static bool DetermineFunction(AstRoot ast, int position, out IFunctionDefinition fd, out IVariable v, out FunctionCall fc) { fd = ast.FindFunctionDefinition(position, out v); fc = null; if (fd == null) { fc = ast.GetNodeOfTypeFromPosition <FunctionCall>(position); var name = fc.GetFunctionName(); if (string.IsNullOrEmpty(name) || !_s4FunctionNames.Contains(name)) { fc = null; } } return(fd != null || fc != null); }