private static string FormatSignature(IOverloadResult sig)
 {
     return(sig.Name +
            "(" +
            String.Join(", ", sig.Parameters.Select(param => param.Name + ": " + param.Type)) +
            ")");
 }
Example #2
0
        private SignatureInformation ToSignatureInformation(IOverloadResult overload)
        {
            var si = new SignatureInformation();

            if (_clientCaps?.textDocument?.signatureHelp?.signatureInformation?._shortLabel ?? false)
            {
                si.label = overload.Name;
            }
            else
            {
                si.label = "{0}({1})".FormatInvariant(
                    overload.Name,
                    string.Join(", ", overload.Parameters.Select(FormatParameter))
                    );
            }

            si.documentation = string.IsNullOrEmpty(overload.Documentation) ? null : overload.Documentation;
            si.parameters    = overload.Parameters.MaybeEnumerate().Select(p => new ParameterInformation {
                label         = p.Name,
                documentation = string.IsNullOrEmpty(p.Documentation) ? null : p.Documentation,
                _type         = p.Type,
                _defaultValue = p.DefaultValue
            }).ToArray();

            var formatSetting = _clientCaps.textDocument?.signatureHelp?.signatureInformation?.documentationFormat;

            si.documentation = GetMarkupContent(si.documentation.value, formatSetting);
            foreach (var p in si.parameters)
            {
                p.documentation = GetMarkupContent(p.documentation.value, formatSetting);
            }

            si._returnTypes = (overload as IOverloadResult2)?.ReturnType.OrderBy(k => k).ToArray();
            return(si);
        }
        private List <IAnalysisVariable> GetKeywordParameters(Expression expr, string originalName)
        {
            List <IAnalysisVariable> paramVars = new List <IAnalysisVariable>();

            if (expr is NameExpression)
            {
                // let's check if we'r re-naming a keyword argument...
                ITrackingSpan span = _view.GetCaretSpan();
                var           sigs = _view.TextBuffer.CurrentSnapshot.GetSignatures(_serviceProvider, span);

                foreach (var sig in sigs.Signatures)
                {
                    IOverloadResult overloadRes = sig as IOverloadResult;
                    if (overloadRes != null)
                    {
                        foreach (var param in overloadRes.Parameters)
                        {
                            if (param.Name == originalName && param.Variables != null)
                            {
                                paramVars.AddRange(param.Variables);
                            }
                        }
                    }
                }
            }
            return(paramVars);
        }
 private CompletionItem ToOverrideCompletionItem(IOverloadResult o, ClassDefinition cd, string indent)
 {
     return(new CompletionItem {
         label = o.Name,
         insertText = MakeOverrideCompletionString(indent, o, cd.Name),
         kind = CompletionItemKind.Method
     });
 }
Example #5
0
        public JSignature(ITrackingSpan span, IOverloadResult overload, int paramIndex, string lastKeywordArg = null)
        {
            _span = span;
            _overload = overload;
            if (lastKeywordArg != null) {
                paramIndex = Int32.MaxValue;
            }

            var content = new StringBuilder(overload.Name);
            content.Append('(');
            int start = content.Length;
            var parameters = new IParameter[overload.Parameters.Length];
            for (int i = 0; i < overload.Parameters.Length; i++) {
                var param = overload.Parameters[i];
                if (param.IsOptional) {
                    content.Append("[");
                }
                if (i > 0) {
                    content.Append(", ");
                    start = content.Length;
                }

                content.Append(param.Name);
                if (param.Type != null && param.Type != "object") {
                    content.Append(": ");
                    content.Append(param.Type);
                }

                if (!String.IsNullOrWhiteSpace(param.DefaultValue)) {
                    content.Append(" = ");
                    content.Append(param.DefaultValue);
                }

                var paramSpan = new Span(start, content.Length - start);

                if (param.IsOptional) {
                    content.Append("]");
                }

                if (lastKeywordArg != null && param.Name == lastKeywordArg) {
                    paramIndex = i;
                }

                parameters[i] = new JParameter(this, param, paramSpan);
            }
            content.Append(')');
            _content = content.ToString();

            _parameters = new ReadOnlyCollection<IParameter>(parameters);
            if (paramIndex < parameters.Length) {
                _currentParameter = parameters[paramIndex];
            } else {
                _currentParameter = null;
            }
        }
        public PythonSignature(ITrackingSpan span, IOverloadResult overload, int paramIndex)
        {
            _span     = span;
            _overload = overload;

            var content = new StringBuilder(overload.Name);

            content.Append('(');
            int start      = content.Length;
            var parameters = new IParameter[overload.Parameters.Length];

            for (int i = 0; i < overload.Parameters.Length; i++)
            {
                var param = overload.Parameters[i];
                if (param.IsOptional)
                {
                    content.Append("[");
                }
                if (i > 0)
                {
                    content.Append(", ");
                    start = content.Length;
                }

                content.Append(param.Name);
                if (param.Type != null && param.Type != "object")
                {
                    content.Append(": ");
                    content.Append(param.Type);
                }

                var paramSpan = new Span(start, content.Length - start);

                if (param.IsOptional)
                {
                    content.Append("]");
                }

                parameters[i] = new PythonParameter(this, param, paramSpan);
            }
            content.Append(')');
            _content = content.ToString();

            _parameters = new ReadOnlyCollection <IParameter>(parameters);
            if (paramIndex < parameters.Length)
            {
                _currentParameter = parameters[paramIndex];
            }
            else
            {
                _currentParameter = null;
            }
        }
Example #7
0
        private string MakeCompletionString(IOverloadResult result, string className)
        {
            var sb = new StringBuilder();

            sb.AppendLine(result.Name + "(" + string.Join(", ", result.Parameters.Select((p, i) => GetSafeParameterName(p, i))) + "):");

            var span      = Span.GetSpan(TextBuffer.CurrentSnapshot);
            int defIndent = span.Start.GetContainingLine().GetText().IndexOf("def");

            if (_options.ConvertTabsToSpaces)
            {
                sb.Append(' ', defIndent + _options.IndentSize);
            }
            else
            {
                sb.Append('\t', defIndent / 8 + 1);
            }

            if (result.Parameters.Length > 0)
            {
                var parameterString = string.Join(", ", result.Parameters.Skip(1).Select((p, i) => GetSafeArgumentName(p, i + 1)));

                var analysis = GetAnalysisEntry();
                if (analysis != null && analysis.ProjectState.LanguageVersion.Is3x())
                {
                    sb.AppendFormat("return super().{0}({1})",
                                    result.Name,
                                    parameterString);
                }
                else if (!string.IsNullOrEmpty(className))
                {
                    sb.AppendFormat("return super({0}, {1}).{2}({3})",
                                    className,
                                    result.Parameters.First().Name,
                                    result.Name,
                                    parameterString);
                }
                else
                {
                    sb.Append("pass");
                }
            }
            else
            {
                sb.Append("pass");
            }

            return(sb.ToString());
        }
Example #8
0
        private SignatureInformation ToSignatureInformation(IOverloadResult overload)
        {
            var si = new SignatureInformation();

            si.parameters = overload.Parameters.MaybeEnumerate().Select(p => new ParameterInformation {
                label         = p.Name,
                documentation = string.IsNullOrEmpty(p.Documentation) ? null : p.Documentation,
                _type         = p.Type,
                _defaultValue = p.DefaultValue
            }).ToArray();

            si._returnTypes = (overload as IOverloadResult2)?.ReturnType.OrderBy(k => k).ToArray();

            if (_clientCaps?.textDocument?.signatureHelp?.signatureInformation?._shortLabel ?? false)
            {
                si.label = overload.Name;
            }
            else
            {
                var doc = overload.Documentation;
                // Some function contain signature in the documentation. Example: print.
                // We want to use that signature in VS Code since it contains all arguments.
                if (si.parameters.Length == 0 && !string.IsNullOrEmpty(doc) && doc.StartsWithOrdinal($"{overload.Name}("))
                {
                    return(GetSignatureFromDoc(doc));
                }
                si.label = "{0}({1})".FormatInvariant(
                    overload.Name,
                    string.Join(", ", overload.Parameters.Select(FormatParameter))
                    );
            }

            si.documentation = string.IsNullOrEmpty(overload.Documentation) ? null : overload.Documentation;
            var formatSetting = _clientCaps?.textDocument?.signatureHelp?.signatureInformation?.documentationFormat;

            si.documentation = GetMarkupContent(si.documentation.value, formatSetting);
            foreach (var p in si.parameters)
            {
                p.documentation = GetMarkupContent(p.documentation.value, formatSetting);
            }

            return(si);
        }
Example #9
0
        private string MakeOverrideCompletionString(string indentation, IOverloadResult result, string className)
        {
            var sb = new StringBuilder();

            sb.AppendLine(result.Name + "(" + string.Join(", ", result.Parameters.Select((p, i) => GetSafeParameterName(p, i))) + "):");

            sb.Append(indentation);
            sb.Append('\t');

            if (result.Parameters.Length > 0)
            {
                var parameterString = string.Join(", ", result.Parameters.Skip(1).Select((p, i) => GetSafeArgumentName(p, i + 1)));

                if (Tree.LanguageVersion.Is3x())
                {
                    sb.AppendFormat("return super().{0}({1})",
                                    result.Name,
                                    parameterString);
                }
                else if (!string.IsNullOrEmpty(className))
                {
                    sb.AppendFormat("return super({0}, {1}).{2}({3})",
                                    className,
                                    result.Parameters.First().Name,
                                    result.Name,
                                    parameterString);
                }
                else
                {
                    sb.Append("pass");
                }
            }
            else
            {
                sb.Append("pass");
            }

            return(sb.ToString());
        }
        private string MakeCompletionString(IOverloadResult result, string className) {
            var sb = new StringBuilder();

            sb.AppendLine(result.Name + "(" + string.Join(", ", result.Parameters.Select((p, i) => GetSafeParameterName(p, i))) + "):");

            var span = Span.GetSpan(TextBuffer.CurrentSnapshot);
            int defIndent = span.Start.GetContainingLine().GetText().IndexOf("def");
            
            if (_options.ConvertTabsToSpaces) {
                sb.Append(' ', defIndent + _options.IndentSize);
            } else {
                sb.Append('\t', defIndent / 8 + 1);
            }

            if (result.Parameters.Length > 0) {
                var parameterString = string.Join(", ", result.Parameters.Skip(1).Select((p, i) => GetSafeArgumentName(p, i + 1)));

                var analysis = GetAnalysisEntry();
                if (analysis != null && analysis.ProjectState.LanguageVersion.Is3x()) {
                    sb.AppendFormat("return super().{0}({1})",
                        result.Name,
                        parameterString);
                } else if (!string.IsNullOrEmpty(className)) {
                    sb.AppendFormat("return super({0}, {1}).{2}({3})",
                        className,
                        result.Parameters.First().Name,
                        result.Name,
                        parameterString);
                } else {
                    sb.Append("pass");
                }
            } else {
                sb.Append("pass");
            }

            return sb.ToString();
        }
Example #11
0
        public PythonSignature(ITrackingSpan span, IOverloadResult overload, int paramIndex, string lastKeywordArg = null) {
            _span = span;
            _overload = overload;
            if (lastKeywordArg != null) {
                paramIndex = Int32.MaxValue;
            }

            var content = new StringBuilder(overload.Name);
            var ppContent = new StringBuilder(overload.Name);
            content.Append('(');
            ppContent.AppendLine("(");
            int start = content.Length, ppStart = ppContent.Length;
            var parameters = new IParameter[overload.Parameters.Length];
            for (int i = 0; i < overload.Parameters.Length; i++) {
                ppContent.Append("    ");
                ppStart = ppContent.Length;
                
                var param = overload.Parameters[i];
                if (param.IsOptional) {
                    content.Append('[');
                    ppContent.Append('[');
                }
                if (i > 0) {
                    content.Append(", ");
                    start = content.Length;
                }

                content.Append(param.Name);
                ppContent.Append(param.Name);
                if (!string.IsNullOrEmpty(param.Type) && param.Type != "object") {
                    content.Append(": ");
                    content.Append(param.Type);
                    ppContent.Append(": ");
                    ppContent.Append(param.Type);
                }
                
                if (!String.IsNullOrWhiteSpace(param.DefaultValue)) {
                    content.Append(" = ");
                    content.Append(param.DefaultValue);
                    ppContent.Append(" = ");
                    ppContent.Append(param.DefaultValue);
                }

                var paramSpan = new Span(start, content.Length - start);
                var ppParamSpan = new Span(ppStart, ppContent.Length - ppStart);

                if (param.IsOptional) {
                    content.Append(']');
                    ppContent.Append(']');
                }

                ppContent.AppendLine(",");

                if (lastKeywordArg != null && param.Name == lastKeywordArg) {
                    paramIndex = i;
                }

                parameters[i] = new PythonParameter(this, param, paramSpan, ppParamSpan);
            }
            content.Append(')');
            ppContent.Append(')');

            _content = content.ToString();
            _ppContent = ppContent.ToString();
            _documentation = overload.Documentation.LimitLines(15, stopAtFirstBlankLine: true);

            _parameters = new ReadOnlyCollection<IParameter>(parameters);
            if (lastKeywordArg == null) {
                for (int i = 0; i < parameters.Length; ++i) {
                    if (i == paramIndex || IsParamArray(parameters[i].Name)) {
                        _currentParameter = parameters[i];
                        break;
                    }
                }
            } else if (paramIndex < parameters.Length) {
                _currentParameter = parameters[paramIndex];
            }
        }
Example #12
0
        public NodejsSignature(ITrackingSpan span, IOverloadResult overload, int paramIndex, string lastKeywordArg = null)
        {
            _span     = span;
            _overload = overload;
            if (lastKeywordArg != null)
            {
                paramIndex = Int32.MaxValue;
            }

            string documentation = overload.Documentation;

            var content   = new StringBuilder(overload.Name);
            var ppContent = new StringBuilder(overload.Name);

            content.Append('(');
            ppContent.AppendLine("(");
            int start = content.Length, ppStart = ppContent.Length;
            var parameters = new IParameter[overload.Parameters.Length];

            for (int i = 0; i < overload.Parameters.Length; i++)
            {
                ppContent.Append("    ");
                ppStart = ppContent.Length;

                var param = overload.Parameters[i];
                if (i > 0)
                {
                    content.Append(", ");
                    start = content.Length;
                }

                // Try to locate and parse the corresponding @param in the doclet.
                string docRegex =
                    // @param, @arg or @argument, and optional {type}
                    (@"@(param|arg|argument) (\s+|\s*\{(?<Type>[^}]*?)\}\s*)" +
                     // Either just name by itself, or [name] if it's optional, or [name=value] if defaulted.
                     @"(?<IsOptional>\[\s*)? {{VariableName}} (?(IsOptional)\s*(=\s*(?<DefaultValue>.*?)\s*)?\])" +
                     // Associated docstring. Ends at the end of doclet, or at the next non-inline @tag, or at the next empty line (paragraph break).
                     @"\s* (?<Documentation>.*?) \s* ($|\r\n\r\n|(?<!\{)@)"
                    ).Replace("{{VariableName}}", param.Name);
                var m = Regex.Match(documentation, docRegex, RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline | RegexOptions.ExplicitCapture);

                content.Append(param.Name);
                ppContent.Append(param.Name);
                if (param.IsOptional || m.Groups["IsOptional"].Success)
                {
                    content.Append("?");
                    ppContent.Append("?");
                }

                string type = null;
                if (!string.IsNullOrEmpty(param.Type) && param.Type != "object")
                {
                    type = param.Type;
                }
                else if (m.Groups["Type"].Success)
                {
                    type = m.Groups["Type"].Value;
                }
                if (type != null)
                {
                    content.Append(": ");
                    content.Append(type);
                    ppContent.Append(": ");
                    ppContent.Append(type);
                }

                if (m.Groups["DefaultValue"].Success && m.Groups["DefaultValue"].Length > 0)
                {
                    content.Append(" = ");
                    content.Append(m.Groups["DefaultValue"].Value);
                }

                var paramSpan   = new Span(start, content.Length - start);
                var ppParamSpan = new Span(ppStart, ppContent.Length - ppStart);

                ppContent.AppendLine(",");

                if (lastKeywordArg != null && param.Name == lastKeywordArg)
                {
                    paramIndex = i;
                }

                string paramDoc = null;
                if (m.Groups["Documentation"].Success)
                {
                    paramDoc = m.Groups["Documentation"].Value.Replace("\r\n", " ");
                }

                parameters[i] = new NodejsParameter(this, param, paramSpan, ppParamSpan, paramDoc);
            }
            content.Append(')');
            ppContent.Append(')');

            _content       = content.ToString();
            _ppContent     = ppContent.ToString();
            _documentation = overload.Documentation.LimitLines(15, stopAtFirstBlankLine: true);

            _parameters = new ReadOnlyCollection <IParameter>(parameters);
            if (paramIndex < parameters.Length)
            {
                _currentParameter = parameters[paramIndex];
            }
            else
            {
                _currentParameter = null;
            }
        }
Example #13
0
 public OverloadResultTestInfo(IOverloadResult value, string name)
 {
     Value = value;
     Name  = name;
 }
        public NodejsSignature(ITrackingSpan span, IOverloadResult overload, int paramIndex, string lastKeywordArg = null) {
            _span = span;
            _overload = overload;
            if (lastKeywordArg != null) {
                paramIndex = Int32.MaxValue;
            }

            string documentation = overload.Documentation;

            var content = new StringBuilder(overload.Name);
            var ppContent = new StringBuilder(overload.Name);
            content.Append('(');
            ppContent.AppendLine("(");
            int start = content.Length, ppStart = ppContent.Length;
            var parameters = new IParameter[overload.Parameters.Length];
            for (int i = 0; i < overload.Parameters.Length; i++) {
                ppContent.Append("    ");
                ppStart = ppContent.Length;

                var param = overload.Parameters[i];
                if (i > 0) {
                    content.Append(", ");
                    start = content.Length;
                }

                // Try to locate and parse the corresponding @param in the doclet.
                string docRegex =
                    // @param, @arg or @argument, and optional {type}
                    (@"@(param|arg|argument) (\s+|\s*\{(?<Type>[^}]*?)\}\s*)" + 
                    // Either just name by itself, or [name] if it's optional, or [name=value] if defaulted.
                     @"(?<IsOptional>\[\s*)? {{VariableName}} (?(IsOptional)\s*(=\s*(?<DefaultValue>.*?)\s*)?\])" +
                    // Associated docstring. Ends at the end of doclet, or at the next non-inline @tag, or at the next empty line (paragraph break).
                     @"\s* (?<Documentation>.*?) \s* ($|\r\n\r\n|(?<!\{)@)" 
                    ).Replace("{{VariableName}}", param.Name);
                var m = Regex.Match(documentation, docRegex, RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline | RegexOptions.ExplicitCapture);

                content.Append(param.Name);
                ppContent.Append(param.Name);
                if (param.IsOptional || m.Groups["IsOptional"].Success) {
                    content.Append("?");
                    ppContent.Append("?");
                }

                string type = null;
                if (!string.IsNullOrEmpty(param.Type) && param.Type != "object") {
                    type = param.Type;
                } else if (m.Groups["Type"].Success) {
                    type = m.Groups["Type"].Value;
                }
                if (type != null) {
                    content.Append(": ");
                    content.Append(type);
                    ppContent.Append(": ");
                    ppContent.Append(type);
                }

                if (m.Groups["DefaultValue"].Success && m.Groups["DefaultValue"].Length > 0) {
                    content.Append(" = ");
                    content.Append(m.Groups["DefaultValue"].Value);
                }

                var paramSpan = new Span(start, content.Length - start);
                var ppParamSpan = new Span(ppStart, ppContent.Length - ppStart);

                ppContent.AppendLine(",");

                if (lastKeywordArg != null && param.Name == lastKeywordArg) {
                    paramIndex = i;
                }

                string paramDoc = null;
                if (m.Groups["Documentation"].Success) {
                    paramDoc = m.Groups["Documentation"].Value.Replace("\r\n", " ");
                }

                parameters[i] = new NodejsParameter(this, param, paramSpan, ppParamSpan, paramDoc);
            }
            content.Append(')');
            ppContent.Append(')');

            _content = content.ToString();
            _ppContent = ppContent.ToString();
            _documentation = overload.Documentation.LimitLines(15, stopAtFirstBlankLine: true);

            _parameters = new ReadOnlyCollection<IParameter>(parameters);
            if (paramIndex < parameters.Length) {
                _currentParameter = parameters[paramIndex];
            } else {
                _currentParameter = null;
            }
        }
        public PythonSignature(ITrackingSpan span, IOverloadResult overload, int paramIndex, string lastKeywordArg = null)
        {
            _span     = span;
            _overload = overload;
            if (lastKeywordArg != null)
            {
                paramIndex = Int32.MaxValue;
            }

            var content   = new StringBuilder(overload.Name);
            var ppContent = new StringBuilder(overload.Name);

            content.Append('(');
            ppContent.AppendLine("(");
            int start = content.Length, ppStart = ppContent.Length;
            var parameters = new IParameter[overload.Parameters.Length];

            for (int i = 0; i < overload.Parameters.Length; i++)
            {
                ppContent.Append("    ");
                ppStart = ppContent.Length;

                var param = overload.Parameters[i];
                if (param.IsOptional)
                {
                    content.Append('[');
                    ppContent.Append('[');
                }
                if (i > 0)
                {
                    content.Append(", ");
                    start = content.Length;
                }

                content.Append(param.Name);
                ppContent.Append(param.Name);
                if (!string.IsNullOrEmpty(param.Type) && param.Type != "object")
                {
                    content.Append(": ");
                    content.Append(param.Type);
                    ppContent.Append(": ");
                    ppContent.Append(param.Type);
                }

                if (!String.IsNullOrWhiteSpace(param.DefaultValue))
                {
                    content.Append(" = ");
                    content.Append(param.DefaultValue);
                    ppContent.Append(" = ");
                    ppContent.Append(param.DefaultValue);
                }

                var paramSpan   = new Span(start, content.Length - start);
                var ppParamSpan = new Span(ppStart, ppContent.Length - ppStart);

                if (param.IsOptional)
                {
                    content.Append(']');
                    ppContent.Append(']');
                }

                ppContent.AppendLine(",");

                if (lastKeywordArg != null && param.Name == lastKeywordArg)
                {
                    paramIndex = i;
                }

                parameters[i] = new PythonParameter(this, param, paramSpan, ppParamSpan);
            }
            content.Append(')');
            ppContent.Append(')');

            _content       = content.ToString();
            _ppContent     = ppContent.ToString();
            _documentation = overload.Documentation.LimitLines(15, stopAtFirstBlankLine: true);

            _parameters = new ReadOnlyCollection <IParameter>(parameters);
            if (lastKeywordArg == null)
            {
                for (int i = 0; i < parameters.Length; ++i)
                {
                    if (i == paramIndex || IsParamArray(parameters[i].Name))
                    {
                        _currentParameter = parameters[i];
                        break;
                    }
                }
            }
            else if (paramIndex < parameters.Length)
            {
                _currentParameter = parameters[paramIndex];
            }
        }
Example #16
0
 private static string FormatSignature(IOverloadResult sig)
 {
     return sig.Name +
         "(" +
         String.Join(", ", sig.Parameters.Select(param => param.Name + ": " + param.Type)) +
         ")";
 }
Example #17
0
        private string MakeCompletionString(AP.OverridesCompletionRequest request, IOverloadResult result, string className) {
            var sb = new StringBuilder();

            sb.AppendLine(result.Name + "(" + string.Join(", ", result.Parameters.Select((p, i) => GetSafeParameterName(p, i))) + "):");

            sb.Append(request.indentation);

            if (result.Parameters.Length > 0) {
                var parameterString = string.Join(", ", result.Parameters.Skip(1).Select((p, i) => GetSafeArgumentName(p, i + 1)));

                if (InterpreterFactory.GetLanguageVersion().Is3x()) {
                    sb.AppendFormat("return super().{0}({1})",
                        result.Name,
                        parameterString);
                } else if (!string.IsNullOrEmpty(className)) {
                    sb.AppendFormat("return super({0}, {1}).{2}({3})",
                        className,
                        result.Parameters.First().Name,
                        result.Name,
                        parameterString);
                } else {
                    sb.Append("pass");
                }
            } else {
                sb.Append("pass");
            }

            return sb.ToString();
        }