Beispiel #1
0
        public Task ExecuteAsync(AsyncData data, WorkSession session, ICommandResultSender sender, CancellationToken cancellationToken)
        {
            var first     = data.GetFirst();
            var firstByte = first.Array[first.Offset];

            if (firstByte == (byte)'I')
            {
                var infoItemIndex = FastConvert.Utf8ByteArrayToInt32(first.Skip(1));
                return(_completion.SendItemInfoAsync(infoItemIndex, session, sender, cancellationToken));
            }

            if (firstByte == (byte)'X')
            {
                return(_completion.CancelCompletionAsync(session, sender, cancellationToken));
            }

            if (firstByte == (byte)'F')
            {
                return(_completion.ForceCompletionAsync(session, sender, cancellationToken));
            }

            var itemIndex = FastConvert.Utf8ByteArrayToInt32(first);

            return(_completion.SelectCompletionAsync(itemIndex, session, sender, cancellationToken));
        }
Beispiel #2
0
        public async Task ExecuteAsync(AsyncData data, WorkSession session, ICommandResultSender sender, CancellationToken cancellationToken)
        {
            var roslynSession = session.Roslyn;

            var actionId = FastConvert.Utf8ByteArrayToInt32(data.GetFirst());
            var action   = roslynSession.CurrentCodeActions[actionId];

            var operations = await action.GetOperationsAsync(cancellationToken).ConfigureAwait(false);

            foreach (var operation in operations)
            {
                operation.Apply(roslynSession.Workspace, cancellationToken);
            }
            // I rollback the changes since I want to send them to client and get them back as ReplaceText
            // This makes sure any other typing on client merges with these changes properly
            var changes = await roslynSession.RollbackWorkspaceChangesAsync().ConfigureAwait(false);

            var writer = sender.StartJsonMessage("changes");

            writer.WriteProperty("reason", "fix");
            writer.WritePropertyStartArray("changes");
            foreach (var change in changes)
            {
                writer.WriteChange(change);
            }
            writer.WriteEndArray();
            await sender.SendJsonMessageAsync(cancellationToken).ConfigureAwait(false);
        }
Beispiel #3
0
        public void StringToGuidPerf()
        {
            FillGuidSampleCache();
            var t = new Stopwatch();

            t.Restart();
            for (int i = 0; i < PERF_SAMPLE_SIZE; i++)
            {
                FastConvert.ToGuid(_guidSampleStringCache[i]);
            }
            t.Stop();
            TimeSpan fastConvertPerf = t.Elapsed;

            output.WriteLine("[TOUT/PERF] FastConvert_ToGuid: {0}", fastConvertPerf);

            t.Restart();
            for (int i = 0; i < PERF_SAMPLE_SIZE; i++)
            {
                Guid.Parse(_guidSampleStringCache[i]);
            }
            t.Stop();
            TimeSpan guidParsePerf = t.Elapsed;

            output.WriteLine("[TOUT/PERF] Guid_Parse: {0}", guidParsePerf);
            output.WriteLine("[TOUT/PERF] " +
                             ToFriendlyPerfResult(fastConvertPerf.Ticks, guidParsePerf.Ticks).Replace("{#me}", "FastConvert.ToGuid").Replace("{#ref}", "Guid.Parse"));
        }
        public Task ExecuteAsync(AsyncData data, WorkSession session, ICommandResultSender sender, CancellationToken cancellationToken)
        {
            var cursorPosition = FastConvert.Utf8ByteArrayToInt32(data.GetFirst());

            session.CursorPosition = cursorPosition;
            return(_signatureHelp.ApplyCursorPositionChangeAsync(session, sender, cancellationToken));
        }
Beispiel #5
0
        public Task ExecuteAsync(AsyncData data, WorkSession session, ICommandResultSender sender, CancellationToken cancellationToken)
        {
            var @char = FastConvert.Utf8ByteArrayToChar(data.GetFirst());

            session.ReplaceText(FastConvert.CharToString(@char), session.CursorPosition, 0);
            session.CursorPosition += 1;

            return(_effects.ApplyTypedCharAsync(@char, session, sender, cancellationToken));
        }
        public async Task ExecuteAsync(AsyncData data, WorkSession session, ICommandResultSender sender, CancellationToken cancellationToken)
        {
            var first     = data.GetFirst();
            var endOffset = first.Offset + first.Count - 1;
            var partStart = first.Offset;

            int?   start          = null;
            int?   length         = null;
            int?   cursorPosition = null;
            string?reason         = null;

            for (var i = first.Offset; i <= endOffset; i++)
            {
                if (first.Array[i] != (byte)':')
                {
                    continue;
                }

                var part = new ArraySegment <byte>(first.Array, partStart, i - partStart);
                if (start == null)
                {
                    start     = FastConvert.Utf8ByteArrayToInt32(part);
                    partStart = i + 1;
                    continue;
                }

                if (length == null)
                {
                    length    = FastConvert.Utf8ByteArrayToInt32(part);
                    partStart = i + 1;
                    continue;
                }

                if (cursorPosition == null)
                {
                    cursorPosition = FastConvert.Utf8ByteArrayToInt32(part);
                    partStart      = i + 1;
                    continue;
                }

                reason    = part.Count > 0 ? Encoding.UTF8.GetString(part) : string.Empty;
                partStart = i + 1;
                break;
            }
            if (start == null || length == null || cursorPosition == null || reason == null)
            {
                throw new FormatException("Command arguments must be 'start:length:cursor:reason:text'.");
            }

            var text = await AsyncDataConvert.ToUtf8StringAsync(data, partStart - first.Offset, _charArrayPool).ConfigureAwait(false);

            session.ReplaceText(text, start.Value, length.Value);
            session.CursorPosition = cursorPosition.Value;
            await _signatureHelp.ApplyCursorPositionChangeAsync(session, sender, cancellationToken).ConfigureAwait(false);

            await _completion.ApplyReplacedTextAsync(reason, _typedCharEffects, session, sender, cancellationToken).ConfigureAwait(false);
        }
Beispiel #7
0
        public void GuidSerialization()
        {
            Guid g = Guid.NewGuid();

            foreach (string c in new string[] { "d", "n", "p", "b", "x" })
            {
                Assert.Equal(g.ToString(c), FastConvert.ToString(g, c));
            }
        }
Beispiel #8
0
        public void GuidDeserialization()
        {
            Guid g = Guid.NewGuid();

            foreach (string c in new string[] { "d", "n", "p", "b", "x" })
            {
                string gstr = g.ToString(c);
                Assert.True(Guid.Parse(gstr) == FastConvert.ToGuid(gstr, c));
            }
        }
Beispiel #9
0
        public Task ExecuteAsync(AsyncData data, WorkSession session, ICommandResultSender sender, CancellationToken cancellationToken)
        {
            if (!session.IsRoslyn)
            {
                return(Task.CompletedTask);
            }

            var cursorPosition = FastConvert.Utf8ByteArrayToInt32(data.GetFirst());

            return(ExecuteForRoslynAsync(cursorPosition, session, sender, cancellationToken));
        }
Beispiel #10
0
        public Task ExecuteAsync(AsyncData data, WorkSession session, ICommandResultSender sender, CancellationToken cancellationToken)
        {
            var @char = FastConvert.Utf8ByteArrayToChar(data.GetFirst());

            if (@char != 'F')
            {
                // ReSharper disable once HeapView.BoxingAllocation
                throw new FormatException($"Unknown SignatureHelp command '{@char}'.");
            }

            return(_signatureHelp.ForceSignatureHelpAsync(session, sender, cancellationToken));
        }
Beispiel #11
0
        public void ConversionIsValid()
        {
            Guid g1 = Guid.NewGuid();

            byte[] b = g1.ToByteArray();

            string x = FastConvert.ToBase85String(b);

            byte[] y  = FastConvert.FromBase85String(x);
            Guid   g2 = new Guid(y);

            Assert.True(g1 == g2);
        }
Beispiel #12
0
        public void ConvertInt32ToString()
        {
            FillNumberCache();
            int loopCount = _intCache.Count;

            int i = 0;

            while (i < loopCount)
            {
                Assert.Equal(Convert.ToString(_intCache[i]), FastConvert.ToString(_intCache[i]));
                i++;
            }
        }
Beispiel #13
0
        public void ConvertStringToInt64()
        {
            FillNumberCache();
            int loopCount = _longCache.Count;

            int i = 0;

            while (i < loopCount)
            {
                Assert.Equal(_longCache[i], FastConvert.ToInt64(_longCache[i].ToString()));
                i++;
            }
        }
Beispiel #14
0
        public void ConvertStringToUInt64()
        {
            FillNumberCache();
            int loopCount = _longCache.Count;

            int i = 0;

            while (i < loopCount)
            {
                ulong testNum = (ulong)_longCache[i] + 9223372036854775807;
                Assert.Equal(testNum, FastConvert.ToUInt64(testNum.ToString()));
                i++;
            }
        }
Beispiel #15
0
        public void ConvertSingleToString()
        {
            FillNumberCache();

            int loopCount = _doubleCache.Count;

            int i = 0;

            while (i < loopCount)
            {
                Assert.Equal(Convert.ToString((float)_doubleCache[i]), FastConvert.ToString((float)_doubleCache[i]));
                i++;
            }
        }
Beispiel #16
0
        public void ConvertStringToUInt32()
        {
            FillNumberCache();
            int loopCount = _intCache.Count;

            int i = 0;

            while (i < loopCount)
            {
                uint testNum = (uint)_intCache[i] + 2147483647;
                Assert.Equal(testNum, FastConvert.ToUInt32(testNum.ToString()));
                i++;
            }
        }
Beispiel #17
0
        public void ConvertStringToSingle()
        {
            FillNumberCache();
            int loopCount = _doubleCache.Count;

            int i = 0;

            while (i < loopCount)
            {
                Assert.True(
                    ((float)_doubleCache[i] - FastConvert.ToSingle(_doubleCache[i].ToString()) < ZeroTolerance) ||
                    (FastConvert.ToSingle(_doubleCache[i].ToString()) - (float)_doubleCache[i] < ZeroTolerance));
                i++;
            }
        }
        private async Task SendSlowUpdateAsync(IReadOnlyList <Diagnostic> diagnostics, WorkSession session, object extensionResult, ICommandResultSender sender, CancellationToken cancellationToken)
        {
            if (session.IsRoslyn)
            {
                session.Roslyn.CurrentCodeActions.Clear();
            }
            var writer = sender.StartJsonMessage("slowUpdate");

            writer.WritePropertyStartArray("diagnostics");
            foreach (var diagnostic in diagnostics)
            {
                writer.WriteStartObject();
                writer.WriteProperty("id", diagnostic.Id);
                writer.WriteProperty("message", diagnostic.GetMessage());
                writer.WriteProperty("severity", FastConvert.EnumToLowerInvariantString(diagnostic.Severity));
                writer.WritePropertyStartArray("tags");
                foreach (var tag in diagnostic.Descriptor.CustomTags)
                {
                    if (tag != WellKnownDiagnosticTags.Unnecessary)
                    {
                        continue;
                    }
                    writer.WriteValue(tag.ToLowerInvariant());
                }
                writer.WriteEndArray();
                writer.WritePropertyName("span");
                writer.WriteSpan(diagnostic.Location.SourceSpan);

                var actions = await GetCodeActionsAsync(diagnostic, session, cancellationToken).ConfigureAwait(false);

                if (actions.Length > 0)
                {
                    writer.WritePropertyStartArray("actions");
                    WriteActions(writer, actions, session);
                    writer.WriteEndArray();
                }
                writer.WriteEndObject();
            }
            writer.WriteEndArray();
            if (_extension != null)
            {
                writer.WritePropertyName("x");
                _extension.WriteResult(writer, extensionResult, session);
            }
            await sender.SendJsonMessageAsync(cancellationToken).ConfigureAwait(false);
        }
Beispiel #19
0
        public void GuidToStringPerf()
        {
            FillGuidSampleCache();
            var t = new Stopwatch();

            t.Restart();
            for (int i = 0; i < PERF_SAMPLE_SIZE; i++)
            {
                FastConvert.ToString(_guidSampleCache[i]);
            }
            t.Stop();
            TimeSpan fastConvertPerf = t.Elapsed;

            output.WriteLine("[TOUT/PERF] FastConvert_ToString: {0}", fastConvertPerf);

            t.Restart();
            for (int i = 0; i < PERF_SAMPLE_SIZE; i++)
            {
                Convert.ToString(_guidSampleCache[i]);
            }
            t.Stop();
            TimeSpan systemConvertPerf = t.Elapsed;

            output.WriteLine("[TOUT/PERF] Convert_ToString: {0}", systemConvertPerf);
            output.WriteLine("[TOUT/PERF] " +
                             ToFriendlyPerfResult(fastConvertPerf.Ticks, systemConvertPerf.Ticks).Replace("{#me}", "FastConvert.ToString").Replace("{#ref}", "Convert.ToString"));

            t.Restart();
            for (int i = 0; i < PERF_SAMPLE_SIZE; i++)
            {
                _guidSampleCache[i].ToString();
            }
            t.Stop();
            TimeSpan guidSelfPerf = t.Elapsed;

            output.WriteLine("[TOUT/PERF] Guid_ToString: {0}", guidSelfPerf);
            output.WriteLine("[TOUT/PERF] " +
                             ToFriendlyPerfResult(fastConvertPerf.Ticks, guidSelfPerf.Ticks).Replace("{#me}", "FastConvert.ToString").Replace("{#ref}", "Guid.ToString"));
        }
Beispiel #20
0
        private Task SendInfoTipAsync(QuickInfoItem info, ICommandResultSender sender, CancellationToken cancellationToken)
        {
            var writer = sender.StartJsonMessage("infotip");

            if (IsNullOrEmpty(info))
            {
                return(sender.SendJsonMessageAsync(cancellationToken));
            }

            writer.WriteTagsProperty("kinds", info.Tags);
            writer.WritePropertyStartArray("sections");
            foreach (var section in info.Sections)
            {
                writer.WriteStartObject();
                writer.WriteProperty("kind", FastConvert.StringToLowerInvariantString(section.Kind));
                writer.WritePropertyStartArray("parts");
                writer.WriteTaggedTexts(section.TaggedParts);
                writer.WriteEndArray();
                writer.WriteEndObject();
            }
            writer.WriteEndArray();
            writer.WriteSpanProperty("span", info.Span);
            return(sender.SendJsonMessageAsync(cancellationToken));
        }