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