private CodeCompletionSettings GetCodeCompletionSettingsForPosition(string source, int position, Configuration codeAssistanceConfiguration) { var parser = new Parser(); var parseResult = parser.Parse(source); var filter = GetFilterSegment(parseResult.Tokens, position); var settings = new CodeCompletionSettings { CompletionData = GetCodeCompletionForExpression(parseResult.Tree.FindExpressionAt(position), codeAssistanceConfiguration, source.Substring(filter.Offset, filter.Length)), IdentifierSegment = filter }; return settings; }
private IEnumerable<ICompletionData> GetCodeCompletionForContext(IList<string> currentContext, Configuration codeAssistanceConfiguration, string filter) { var completion = new List<ICompletionData>(); var matches = GetMatches(currentContext, codeAssistanceConfiguration); if (matches != null) { foreach (var match in matches) { completion.AddRange(GetFunctionCompletionData(match.IntrinsicFunctions)); completion.AddRange(GetKeywordCompletionData(match.Keywords)); } var result = completion.AsQueryable(); if (!string.IsNullOrWhiteSpace(filter)) result = result.Where(c => c.Text.StartsWith(filter)); return result.OrderBy(c => c.Text); } return completion; }
private IEnumerable<ICompletionData> GetCodeCompletionForExpression(Expression expression, Configuration codeAssistanceConfiguration, string filter) { var context = GetExpressionContext(expression); return GetCodeCompletionForContext(context, codeAssistanceConfiguration, filter); }
/// <summary> /// Finds all codecompletions from the configuration that match the current context. multiple matches with the same score are all returned. /// </summary> /// <param name="currentContext"></param> /// <param name="codeAssistanceConfiguration"></param> /// <returns></returns> private List<Context> GetMatches(IList<string> currentContext, Configuration codeAssistanceConfiguration) { var currentScore = int.MaxValue; List<Context> matches = null; foreach (var context in codeAssistanceConfiguration.Contexts) { var score = GetMatchScore(currentContext, context.ContextExpression.ToLower().Split('.')); if (score.HasValue) { if (score.Value < currentScore) { matches = new List<Context> { context }; currentScore = score.Value; } else if (score.Value == currentScore) { matches.Add(context); } } } return matches; }