Пример #1
0
        public override IEnumerable<CompletionInfo> GetCompletions(IDjangoCompletionContext context, int position) {
            // If no argument, show urls
            if (Args.Length == 0) {
                return GetUrlCompletion(context);
            }

            BlockClassification? argBeforePosition = GetArgBeforePosition(position);
            BlockClassification? argPenultimateBeforePosition = GetPenultimateArgBeforePosition(position);
            if (argBeforePosition == null)
                return GetUrlCompletion(context);

            // No completion for the url variable name after the 'as' keyword
            if (IsAfterAsKeyword(argBeforePosition, argPenultimateBeforePosition))
                return Enumerable.Empty<CompletionInfo>();

            // TODO detect completion if completing a named parameters (param=) (and return base.GetCompletions(context, position))

            // Completion proposes unused named parameters, template variables and the 'as' keyword
            DjangoUrl url = FindCurrentDjangoUrl(context);
            return Enumerable.Concat(
                Enumerable.Concat(
                    GetUnusedNamedParameters(url),
                    base.GetCompletions(context, position)
                ),
                new[] {
                    new CompletionInfo("as", StandardGlyphGroup.GlyphKeyword)
                }
            );
        }
Пример #2
0
        protected static IEnumerable <CompletionInfo> GetCompletions(IDjangoCompletionContext context, int position, DjangoVariable[] variables, int max = Int32.MaxValue)
        {
            for (int i = 0; i < variables.Length; i++)
            {
                if (position >= variables[i].ExpressionStart &&
                    (i == variables.Length - 1 || position < variables[i + 1].ExpressionStart))
                {
                    var res = variables[i].GetCompletions(context, position);
                    if (res.Count() != 0)
                    {
                        return(res);
                    }
                }
            }

            if (variables.Length < max)
            {
                var vars = context.Variables;
                if (vars != null)
                {
                    return(CompletionInfo.ToCompletionInfo(vars, StandardGlyphGroup.GlyphGroupField));
                }
            }

            return(new CompletionInfo[0]);
        }
Пример #3
0
 public override IEnumerable<CompletionInfo> GetCompletions(IDjangoCompletionContext context, int position) {
     if (_tagType == null) {
         return GetTagList();
     } else if (position >= _argStart && position < _argStart + _tagType.Length) {
         // filter based upon entered text
         string filter = _tagType.Substring(0, position - _argStart);
         return GetTagList().Where(tag => tag.DisplayText.StartsWith(filter));
     }
     return new CompletionInfo[0];
 }
Пример #4
0
 public override IEnumerable<CompletionInfo> GetCompletions(IDjangoCompletionContext context, int position) {
     if (_tagType == null) {
         return GetTagList();
     } else if (position >= _argStart && position < _argStart + _tagType.Length) {
         // filter based upon entered text
         string filter = _tagType.Substring(0, position - _argStart);
         return GetTagList().Where(tag => tag.DisplayText.StartsWith(filter));
     }
     return new CompletionInfo[0];
 }
Пример #5
0
        public IEnumerable <CompletionInfo> GetCompletions(IDjangoCompletionContext context, int position)
        {
            if (Expression == null)
            {
                return(CompletionInfo.ToCompletionInfo(context.Variables, StandardGlyphGroup.GlyphGroupField));
            }
            else if (position <= Expression.Value.Length + ExpressionStart)
            {
                if (position - ExpressionStart - 1 >= 0 &&
                    Expression.Value[position - ExpressionStart - 1] == '.')
                {
                    // TODO: Handle multiple dots
                    string varName = Expression.Value.Substring(0, Expression.Value.IndexOf('.'));

                    // get the members of this variable
                    return(CompletionInfo.ToCompletionInfo(context.GetMembers(varName)));
                }
                else
                {
                    return(CompletionInfo.ToCompletionInfo(context.Variables, StandardGlyphGroup.GlyphGroupField));
                }
            }
            else if (Filters.Length > 0)
            {
                // we are triggering in the filter or arg area
                foreach (var curFilter in Filters)
                {
                    if (position >= curFilter.FilterStart && position <= curFilter.FilterStart + curFilter.Filter.Length)
                    {
                        // it's in this filter area
                        return(CompletionInfo.ToCompletionInfo(context.Filters, StandardGlyphGroup.GlyphKeyword));
                    }
                    else if (curFilter.Arg != null && position >= curFilter.ArgStart && position < curFilter.ArgStart + curFilter.Arg.Value.Length)
                    {
                        // it's in this argument
                        return(CompletionInfo.ToCompletionInfo(context.Variables, StandardGlyphGroup.GlyphGroupField));
                    }
                }

                if (String.IsNullOrWhiteSpace(Filters.Last().Filter))
                {
                    // last filter was blank, so provide filters
                    return(CompletionInfo.ToCompletionInfo(context.Filters, StandardGlyphGroup.GlyphKeyword));
                }
                else
                {
                    // ... else, provide variables
                    return(CompletionInfo.ToCompletionInfo(context.Variables, StandardGlyphGroup.GlyphGroupField));
                }
            }

            return(Enumerable.Empty <CompletionInfo>());
        }
Пример #6
0
 public override IEnumerable<CompletionInfo> GetCompletions(IDjangoCompletionContext context, int position) {
     if (_argStart == -1) {
         return new[] {
             new CompletionInfo(
                 "on",
                 StandardGlyphGroup.GlyphGroupVariable
             ),
             new CompletionInfo(
                 "off",
                 StandardGlyphGroup.GlyphGroupVariable
             )
         };
     }
     return new CompletionInfo[0];
 }
Пример #7
0
 public override IEnumerable<CompletionInfo> GetCompletions(IDjangoCompletionContext context, int position) {
     if (_argStart == -1) {
         return new[] {
             new CompletionInfo(
                 "on",
                 StandardGlyphGroup.GlyphGroupVariable
             ),
             new CompletionInfo(
                 "off",
                 StandardGlyphGroup.GlyphGroupVariable
             )
         };
     }
     return new CompletionInfo[0];
 }
Пример #8
0
 public override IEnumerable<CompletionInfo> GetCompletions(IDjangoCompletionContext context, int position) {
     // no argument yet, or the last argument was a keyword, then we are completing an identifier
     if (Args.Length == 0 || Args.Last().Classification == Classification.Keyword || position <= Args.Last().Span.End) {
         // get the variables
         return Enumerable.Concat(
             base.GetCompletions(context, position),
             new[] {
                 new CompletionInfo("not", StandardGlyphGroup.GlyphKeyword)
             }
         );
     } else {
         // last word was an identifier, so we'll complete and/or
         return new[] {
             new CompletionInfo("and", StandardGlyphGroup.GlyphKeyword),
             new CompletionInfo("or", StandardGlyphGroup.GlyphKeyword)
         };
     }
 }
Пример #9
0
        public override IEnumerable<CompletionInfo> GetCompletions(IDjangoCompletionContext context, int position) {
            if (InStart == -1 || position < InStart) {
                return new CompletionInfo[0];
            } else if (Variable != null && position > InStart) {
                var res = Variable.GetCompletions(context, position);
                if (position > ArgsEnd &&
                    ReversedStart == -1 &&
                    Variable.Expression != null) {
                    return System.Linq.Enumerable.Concat(
                        res,
                        new[] { new CompletionInfo("reversed", StandardGlyphGroup.GlyphKeyword) }
                    );
                }
                return res;
            }

            return base.GetCompletions(context, position);
        }
Пример #10
0
 public override IEnumerable<CompletionInfo> GetCompletions(IDjangoCompletionContext context, int position) {
     // no argument yet, or the last argument was a keyword, then we are completing an identifier
     if (Args.Length == 0 || Args.Last().Classification == Classification.Keyword || position <= Args.Last().Span.End) {
         // get the variables
         return Enumerable.Concat(
             base.GetCompletions(context, position),
             new[] {
                 new CompletionInfo("not", StandardGlyphGroup.GlyphKeyword)
             }
         );
     } else {
         // last word was an identifier, so we'll complete and/or
         return new[] {
             new CompletionInfo("and", StandardGlyphGroup.GlyphKeyword),
             new CompletionInfo("or", StandardGlyphGroup.GlyphKeyword)
         };
     }
 }
Пример #11
0
        public override IEnumerable <CompletionInfo> GetCompletions(IDjangoCompletionContext context, int position)
        {
            // If no argument, show urls
            if (Args.Length == 0)
            {
                return(GetUrlCompletion(context));
            }

            BlockClassification?argBeforePosition            = GetArgBeforePosition(position);
            BlockClassification?argPenultimateBeforePosition = GetPenultimateArgBeforePosition(position);

            if (argBeforePosition == null)
            {
                return(GetUrlCompletion(context));
            }

            // No completion for the url variable name after the 'as' keyword
            if (IsAfterAsKeyword(argBeforePosition, argPenultimateBeforePosition))
            {
                return(Enumerable.Empty <CompletionInfo>());
            }

            DjangoUrl url = FindCurrentDjangoUrl(context);

            // Too many parameters are already in the statement
            if (_nbDefinedParameters >= url.Parameters.Count)
            {
                return(new[] {
                    new CompletionInfo("as", StandardGlyphGroup.GlyphKeyword),
                });
            }

            // Completion proposes unused named parameters, template variables and the 'as' keyword
            return(Enumerable.Concat(
                       Enumerable.Concat(
                           GetUnusedNamedParameters(url),
                           base.GetCompletions(context, position)
                           ),
                       new[] {
                new CompletionInfo("as", StandardGlyphGroup.GlyphKeyword)
            }
                       ));
        }
Пример #12
0
 private IEnumerable <CompletionInfo> GetUrlCompletion(IDjangoCompletionContext context)
 {
     return(CompletionInfo.ToCompletionInfo(context.Urls.Select(url => string.Format("'{0}'", url.FullName)), StandardGlyphGroup.GlyphGroupField));
 }
Пример #13
0
 private IEnumerable<CompletionInfo> GetUrlCompletion(IDjangoCompletionContext context) {
     return CompletionInfo.ToCompletionInfo(context.Urls.Select(url => string.Format("'{0}'", url.FullUrlName)), StandardGlyphGroup.GlyphGroupField);
 }
Пример #14
0
 public override IEnumerable<CompletionInfo> GetCompletions(IDjangoCompletionContext context, int position) {
     return _variable.GetCompletions(context, position + 4);
 }
Пример #15
0
        protected static IEnumerable<CompletionInfo> GetCompletions(IDjangoCompletionContext context, int position, DjangoVariable[] variables, int max = Int32.MaxValue) {
            for (int i = 0; i < variables.Length; i++) {
                if (position >= variables[i].ExpressionStart &&
                    (i == variables.Length - 1 || position < variables[i + 1].ExpressionStart)) {
                    var res = variables[i].GetCompletions(context, position);
                    if (res.Count() != 0) {
                        return res;
                    }
                }
            }

            if (variables.Length < max) {
                var vars = context.Variables;
                if (vars != null) {
                    return CompletionInfo.ToCompletionInfo(vars.Keys, StandardGlyphGroup.GlyphGroupField);
                }
            }

            return new CompletionInfo[0];
        }
Пример #16
0
 public override IEnumerable <CompletionInfo> GetCompletions(IDjangoCompletionContext context, int position)
 {
     return(GetCompletions(context, position, _variables));
 }
Пример #17
0
 public virtual IEnumerable<CompletionInfo> GetCompletions(IDjangoCompletionContext context, int position) {
     return CompletionInfo.ToCompletionInfo(context.Variables, StandardGlyphGroup.GlyphGroupField);
 }
Пример #18
0
 public override IEnumerable<CompletionInfo> GetCompletions(IDjangoCompletionContext context, int position) {
     return new CompletionInfo[0];
 }
Пример #19
0
 public override IEnumerable<CompletionInfo> GetCompletions(IDjangoCompletionContext context, int position) {
     return GetCompletions(context, position, _args, 2);
 }
Пример #20
0
 private DjangoUrl FindCurrentDjangoUrl(IDjangoCompletionContext context)
 {
     return(context.Urls.Where(url => url.FullName.Equals(_urlName)).FirstOrDefault());
 }
Пример #21
0
 public virtual IEnumerable <CompletionInfo> GetCompletions(IDjangoCompletionContext context, int position)
 {
     return(CompletionInfo.ToCompletionInfo(context.Variables, StandardGlyphGroup.GlyphGroupField));
 }
Пример #22
0
 public override IEnumerable <CompletionInfo> GetCompletions(IDjangoCompletionContext context, int position)
 {
     return(new CompletionInfo[0]);
 }
        public IEnumerable <CompletionInfo> GetCompletions(IDjangoCompletionContext context, int position)
        {
            if (Expression == null)
            {
                return(CompletionInfo.ToCompletionInfo(context.Variables, StandardGlyphGroup.GlyphGroupField));
            }
            else if (position <= Expression.Value.Length + ExpressionStart)
            {
                if (position - ExpressionStart - 1 >= 0 &&
                    Expression.Value[position - ExpressionStart - 1] == '.')
                {
                    // TODO: Handle multiple dots
                    string varName = Expression.Value.Substring(0, Expression.Value.IndexOf('.'));

                    // get the members of this variable
                    HashSet <AnalysisValue> values;
                    if (context.Variables != null && context.Variables.TryGetValue(varName, out values))
                    {
                        var newTags = new Dictionary <string, PythonMemberType>();
                        foreach (var member in values.SelectMany(item => item.GetAllMembers(context.ModuleContext)))
                        {
                            string           name = member.Key;
                            PythonMemberType type, newType = GetMemberType(member.Value);

                            if (!newTags.TryGetValue(name, out type))
                            {
                                newTags[name] = newType;
                            }
                            else if (type != newType && type != PythonMemberType.Unknown && newType != PythonMemberType.Unknown)
                            {
                                newTags[name] = PythonMemberType.Multiple;
                            }
                        }
                        return(CompletionInfo.ToCompletionInfo(newTags));
                    }
                }
                else
                {
                    return(CompletionInfo.ToCompletionInfo(context.Variables, StandardGlyphGroup.GlyphGroupField));
                }
            }
            else if (Filters.Length > 0)
            {
                // we are triggering in the filter or arg area
                foreach (var curFilter in Filters)
                {
                    if (position >= curFilter.FilterStart && position <= curFilter.FilterStart + curFilter.Filter.Length)
                    {
                        // it's in this filter area
                        return(CompletionInfo.ToCompletionInfo(context.Filters, StandardGlyphGroup.GlyphKeyword));
                    }
                    else if (curFilter.Arg != null && position >= curFilter.ArgStart && position < curFilter.ArgStart + curFilter.Arg.Value.Length)
                    {
                        // it's in this argument
                        return(CompletionInfo.ToCompletionInfo(context.Variables, StandardGlyphGroup.GlyphGroupField));
                    }
                }

                if (String.IsNullOrWhiteSpace(Filters.Last().Filter))
                {
                    // last filter was blank, so provide filters
                    return(CompletionInfo.ToCompletionInfo(context.Filters, StandardGlyphGroup.GlyphKeyword));
                }
                else
                {
                    // ... else, provide variables
                    return(CompletionInfo.ToCompletionInfo(context.Variables, StandardGlyphGroup.GlyphGroupField));
                }
            }

            return(Enumerable.Empty <CompletionInfo>());
        }
Пример #24
0
 private DjangoUrl FindCurrentDjangoUrl(IDjangoCompletionContext context) {
     return context.Urls.Where(url => url.FullUrlName.Equals(_urlName)).FirstOrDefault();
 }