Пример #1
0
        bool SuggestionsBasedOnSyntax(GetCodeSuggestionsRequest codeCompletion, out IList <SuggestItem> suggestItems)
        {
            suggestItems = new List <SuggestItem>();

            if (!ValidateData(codeCompletion))
            {
                return(false);
            }

            var textPosition = new TextPosition(
                new LineNumber(codeCompletion.CaretPosition.Line),
                new CharacterNumber(codeCompletion.CaretPosition.Character));

            var syntax         = SyntaxLanguage.FromString(codeCompletion.SyntaxType).Syntax;
            var normalizedText = codeCompletion.Text.NormalizeLineEndings();
            var success        = _suggestionFactory.SuggestionsBasedOnSyntax(
                syntax,
                new SuggestionDependentData(
                    _engine.MainPackage,
                    _engine.Compiler,
                    AbsoluteFilePath.Parse(codeCompletion.Path),
                    normalizedText,
                    textPosition.ToOffset(normalizedText)),
                out suggestItems);

            if (success)
            {
                return(true);
            }

            _errors.OnNext(new Error(ErrorCode.InvalidData, string.Format("Tried to create suggestions for unknown syntax type {0}", new[] { codeCompletion.SyntaxType })));

            return(false);
        }
Пример #2
0
        public GetCodeSuggestionsResponse HandleGetCodeSuggestions(GetCodeSuggestionsRequest request)
        {
            // TODO: Refactor away this type of error handling...
            var errors = new Subject <Error>();

            errors.Subscribe(e => { throw new Exception(e.Message); });

            var suggestItems = ProcessCodeCompletion(request, errors);
            var response     = new GetCodeSuggestionsResponse()
            {
                IsUpdatingCache = _engine.Compiler == null,
                CodeSuggestions =
                    Enumerable.ToList <CodeSuggestion>(suggestItems.Select(
                                                           s => new CodeSuggestion()
                {
                    Suggestion      = s.Text,
                    PreText         = s.AutoCompletePreText == null ? "" : s.AutoCompletePreText(),
                    PostText        = s.AutoCompletePostText == null ? "" : s.AutoCompletePostText(),
                    Type            = s.Type.ToString(),
                    ReturnType      = s.AutoCompleteDescriptionText == null ? "" : s.AutoCompleteDescriptionText(),
                    AccessModifiers = s.AutoCompleteAccessModifiers ?? new string[0],
                    FieldModifiers  = s.AutoCompleteFieldModifiers ?? new string[0],
                    MethodArguments = s.AutoCompleteMethodArguments ?? new MethodArgument[0]
                }))
            };

            return(response);
        }
Пример #3
0
        IEnumerable <SuggestItem> ProcessCodeCompletion(GetCodeSuggestionsRequest request, IObserver <Error> errors)
        {
            IList <SuggestItem> suggestItems = new List <SuggestItem>();
            var path = TryCatchWithError(errors, ErrorCode.InvalidData, "Failed to parse path.", () => AbsoluteFilePath.Parse(request.Path));

            if (!path.HasValue)
            {
                return(suggestItems);
            }

            try
            {
                Compile(request.Text, path.Value);

                SuggestionsFeature.TryGetSuggestions(
                    errors,
                    _engine,
                    _suggestionsFactory,
                    request,
                    out suggestItems);
            }
            catch (Exception e)
            {
                errors.OnNext(new Error(ErrorCode.InvalidOperation, e.Message));
            }

            return(suggestItems);
        }
Пример #4
0
        bool ValidateData(GetCodeSuggestionsRequest codeCompletion)
        {
            var valid = true;

            if (codeCompletion.CaretPosition.Line <= 0 || codeCompletion.CaretPosition.Character <= 0)
            {
                _errors.OnNext(new Error(ErrorCode.InvalidData, "The caret offset was invalid in code completion request."));
                valid = false;
            }
            else if (string.IsNullOrEmpty(codeCompletion.Text))
            {
                _errors.OnNext(new Error(ErrorCode.InvalidData, "Text was empty or null in code completion request."));
                valid = false;
            }

            return(valid);
        }
Пример #5
0
 public static bool TryGetSuggestions(IObserver <Error> errors, IEngine engine, ISuggestionsFactory suggestionFactory, GetCodeSuggestionsRequest codeCompletion, out IList <SuggestItem> suggestItems)
 {
     return(new SuggestionsFeature(errors, engine, suggestionFactory).SuggestionsBasedOnSyntax(codeCompletion, out suggestItems));
 }