示例#1
0
        /// <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);
        }
示例#2
0
        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);
        }