Example #1
0
        private IIntellisenseResult Finalize(IIntellisenseContext context, IntellisenseData.IntellisenseData intellisenseData)
        {
            Contracts.AssertValue(context);
            Contracts.AssertValue(intellisenseData);

            DType expectedType = intellisenseData.ExpectedType;

            TypeMatchPriority(expectedType, intellisenseData.Suggestions);
            TypeMatchPriority(expectedType, intellisenseData.SubstringSuggestions);
            intellisenseData.Suggestions.Sort();
            intellisenseData.SubstringSuggestions.Sort();
            List <IntellisenseSuggestion>        resultSuggestions          = intellisenseData.Suggestions.Distinct().ToList();
            IEnumerable <IntellisenseSuggestion> resultSubstringSuggestions = intellisenseData.SubstringSuggestions.Distinct();

            resultSuggestions.AddRange(resultSubstringSuggestions);

            TypeFilter(expectedType, intellisenseData.MatchingStr, ref resultSuggestions);

            foreach (var handler in intellisenseData.CleanupHandlers)
            {
                handler.Run(context, intellisenseData, resultSuggestions);
            }

            return(new IntellisenseResult(intellisenseData, resultSuggestions));
        }
Example #2
0
        private void GetFunctionAndTypeInformation(IIntellisenseContext context, TexlNode curNode, TexlBinding binding, out TexlFunction curFunc, out int argIndex, out int argCount, out DType expectedType, out IsValidSuggestion isValidSuggestionFunc)
        {
            Contracts.AssertValue(context);
            Contracts.AssertValue(curNode);
            Contracts.AssertValue(binding);

            if (!FindCurFuncAndArgs(curNode, context.CursorPosition, binding, out curFunc, out argIndex, out argCount, out expectedType))
            {
                curFunc      = null;
                argIndex     = 0;
                argCount     = 0;
                expectedType = DType.Unknown;
            }

            DType binaryOpExpectedType;

            if (TryGetExpectedTypeForBinaryOp(binding, curNode, context.CursorPosition, out binaryOpExpectedType))
            {
                expectedType = binaryOpExpectedType;
            }

            if (curFunc != null)
            {
                isValidSuggestionFunc = (intellisenseData, suggestion) => intellisenseData.CurFunc.IsSuggestionTypeValid(intellisenseData.ArgIndex, suggestion.Type);
            }
            else
            {
                isValidSuggestionFunc = Helper.DefaultIsValidSuggestionFunc;
            }
        }
Example #3
0
        public IntellisenseData(IIntellisenseContext context, DType expectedType, TexlBinding binding, TexlFunction curFunc, TexlNode curNode, int argIndex, int argCount, IsValidSuggestion isValidSuggestionFunc, IList <DType> missingTypes, List <CommentToken> comments)
        {
            Contracts.AssertValue(context);
            Contracts.AssertValid(expectedType);
            Contracts.AssertValue(binding);
            Contracts.AssertValue(curNode);
            Contracts.Assert(0 <= context.CursorPosition && context.CursorPosition <= context.InputText.Length);
            Contracts.AssertValue(isValidSuggestionFunc);
            Contracts.AssertValueOrNull(missingTypes);
            Contracts.AssertValueOrNull(comments);

            _expectedType         = expectedType;
            _suggestions          = new IntellisenseSuggestionList();
            _substringSuggestions = new IntellisenseSuggestionList();
            _binding               = binding;
            _comments              = comments;
            _curFunc               = curFunc;
            _curNode               = curNode;
            _script                = context.InputText;
            _cursorPos             = context.CursorPosition;
            _argIndex              = argIndex;
            _argCount              = argCount;
            _isValidSuggestionFunc = isValidSuggestionFunc;
            _matchingStr           = string.Empty;
            _matchingLength        = 0;
            _replacementStartIndex = context.CursorPosition;
            _missingTypes          = missingTypes;
            BoundTo                = string.Empty;
            _cleanupHandlers       = new List <ISpecialCaseHandler>();
        }
Example #4
0
        private bool TryInitializeIntellisenseContext(IIntellisenseContext context, TexlBinding binding, Formula formula, out IntellisenseData.IntellisenseData data)
        {
            Contracts.AssertValue(context);

            TexlNode          currentNode = TexlNode.FindNode(formula.ParseTree, context.CursorPosition);
            TexlFunction      curFunc;
            int               argIndex, argCount;
            DType             expectedType;
            IsValidSuggestion isValidSuggestionFunc;

            GetFunctionAndTypeInformation(context, currentNode, binding, out curFunc, out argIndex, out argCount, out expectedType, out isValidSuggestionFunc);
            data = CreateData(context, expectedType, binding, curFunc, currentNode, argIndex, argCount, isValidSuggestionFunc, binding.GetExpandEntitiesMissingMetadata(), formula.Comments);
            return(true);
        }
Example #5
0
 protected internal virtual IntellisenseData.IntellisenseData CreateData(IIntellisenseContext context, DType expectedType, TexlBinding binding, TexlFunction curFunc, TexlNode curNode, int argIndex, int argCount, IsValidSuggestion isValidSuggestionFunc, IList <DType> missingTypes, List <CommentToken> comments)
 {
     return(new IntellisenseData.IntellisenseData(context, expectedType, binding, curFunc, curNode, argIndex, argCount, isValidSuggestionFunc, missingTypes, comments));
 }
        public bool Run(IIntellisenseContext context, IntellisenseData.IntellisenseData intellisenseData, List <IntellisenseSuggestion> suggestions)
        {
            Contracts.AssertValue(context);
            Contracts.AssertValue(context.InputText);
            Contracts.AssertValue(intellisenseData);
            Contracts.AssertValue(suggestions);

            string script = context.InputText;

            Contracts.Assert(_tokenStartIndex < script.Length);

            if (_requireTokenStartWithQuote && script[_tokenStartIndex] != '"')
            {
                return(false);
            }

            int  matchEndIndex      = -1;
            bool foundAny           = false;
            var  iterateSuggestions = suggestions.ToArray();

            foreach (var suggestion in iterateSuggestions)
            {
                int  i, j;
                bool found = false;

                for (i = _tokenStartIndex, j = 0; i < script.Length; i++, j++)
                {
                    if (j >= suggestion.Text.Length)
                    {
                        // The input text for this parameter has exceeded the suggestion and we should filter it out
                        found = false;
                        break;
                    }

                    if (script[i] != suggestion.Text[j])
                    {
                        string curChar = script.Substring(i, 1);
                        if (curChar != TexlLexer.PunctuatorParenClose && curChar != TexlLexer.LocalizedInstance.LocalizedPunctuatorListSeparator)
                        {
                            found = false;
                        }
                        break;
                    }

                    found = true;
                }

                foundAny |= found;

                if (found && matchEndIndex < i)
                {
                    matchEndIndex = i;
                }

                if (!found && i != script.Length)
                {
                    suggestions.Remove(suggestion);
                }
            }

            if (!foundAny || matchEndIndex <= _tokenStartIndex)
            {
                return(false);
            }

            intellisenseData.Suggestions.Clear();
            intellisenseData.SubstringSuggestions.Clear();
            intellisenseData.SetMatchArea(_tokenStartIndex, matchEndIndex);
            return(true);
        }