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;
 }