Пример #1
0
        public async Task <IEnumerable <JitResult> > Update(Jitter jitter)
        {
            if (doc == null)
            {
                return(empty);
            }

            var offset = doc.Editor.CaretOffset;

            var proj = doc.Project;

            if (proj == null)
            {
                return(empty);
            }

            var roslynDoc = doc.AnalysisDocument;

            if (roslynDoc == null)
            {
                return(empty);
            }

            cancellationTokenSource.Cancel();
            cancellationTokenSource = new CancellationTokenSource();
            var token = cancellationTokenSource.Token;

            return(await Task.Run(async() =>
            {
                var sm = await roslynDoc.GetSemanticModelAsync(token);

                // member
                var memberSymbol = sm.GetEnclosingSymbol(offset, token);
                if (memberSymbol == null)
                {
                    return empty;
                }

                string[] parameterTypeNames = Array.Empty <string>();
                if (memberSymbol is IMethodSymbol methodSymbol)
                {
                    parameterTypeNames = methodSymbol.Parameters.Select(x => x.Type.ToDisplayString(SymbolDisplayFormat.MinimallyQualifiedFormat)).ToArray();
                }
                else if (!(memberSymbol is IPropertySymbol))
                {
                    return empty;
                }

                var compilation = await roslynDoc.Project.GetCompilationAsync(token);

                var tempFile = Path.GetTempFileName();
                try
                {
                    using (var stream = File.OpenWrite(tempFile))
                    {
                        var emitResult = compilation.Emit(stream, options: new Microsoft.CodeAnalysis.Emit.EmitOptions() cancellationToken: token);
                    }
                    if (!emitResult.Success)
                    {
                        return Enumerable.Repeat(JitResult.Error, 1);
                    }
                    var result = new CompileResult(tempFile);

                    // type
                    var typeName = memberSymbol.ContainingType.ToDisplayString(format);
                    return jitter.Jit(result, new MethodDescription(typeName, memberSymbol.MetadataName, parameterTypeNames));
                }
                finally
                {
                    File.Delete(tempFile);
                }
            }, token));
        }