public Task <LineEvaluationResult> HandleAsync(Guid lineId, string text, IReplLogger logger)
        {
            // this line exits the application. The subsequent lines don't run.
            Application.Current.Shutdown();

            return(Task.FromResult(LineEvaluationResult.NoOutput));
        }
        public Task <LineEvaluationResult> HandleAsync(Guid lineId, string text, IReplLogger logger)
        {
            var help = new[]
            {
                new[]
                {
                    "Welcome to Replay! ❤",
                    "",
                    "Keyboard Shortcuts",
                    "==================",
                },
                KeyboardShortcuts.KeyboardShortcutHelp,
                new[]
                {
                    "",
                    "Commands",
                    "========",
                },
                CommandHelp
            };

            string helpText = string.Join(Environment.NewLine, help.SelectMany(linegroups => linegroups));

            return(Task.FromResult(
                       new LineEvaluationResult(null, helpText, null, null)
                       ));
        }
示例#3
0
        public async Task <LineEvaluationResult> HandleAsync(Guid lineId, string input, IReplLogger logger)
        {
            string assemblyFile = input.Substring(CommandPrefix.Length).Trim('"');
            var    assemblies   = DotNetAssemblyLocator
                                  .GroupDirectoryContentsIntoAssemblies(ReadAssembly(assemblyFile))
                                  .Select(assembly => io.CreateMetadataReferenceWithDocumentation(assembly));

            foreach (var assembly in assemblies)
            {
                logger.LogOutput("Referencing " + assembly.Display);
                await scriptEvaluator.AddReferences(assembly);

                workspaceManager.CreateOrUpdateSubmission(lineId, assemblyReferences: assembly);
                logger.LogOutput("Assembly successfully referenced");
            }
            return(LineEvaluationResult.NoOutput);
        }
示例#4
0
        public async Task <LineEvaluationResult> HandleAsync(Guid lineId, string text, IReplLogger logger)
        {
            string package    = text.Substring(CommandPrefix.Length).Trim('"');
            var    assemblies = (await nugetInstaller.Install(package, logger)).ToArray();

            if (assemblies.Any())
            {
                await scriptEvaluator.AddReferences(assemblies);

                workspaceManager.CreateOrUpdateSubmission(lineId, assemblyReferences: assemblies);
            }
            return(LineEvaluationResult.NoOutput);
        }
示例#5
0
 public NugetErrorLoggerTest()
 {
     this.replLogger = Substitute.For <IReplLogger>();
     this.logger     = new NugetErrorLogger(replLogger);
 }
        public async Task <IReadOnlyCollection <MetadataReference> > Install(string packageSearchTerm, IReplLogger logger)
        {
            var nugetLogger = new NugetErrorLogger(logger);

            logger.LogOutput($"Searching for {packageSearchTerm}");
            var package = await FindPackageAsync(packageSearchTerm, repositories, nugetLogger);

            if (package == null)
            {
                logger.LogError($"Could not find package '{packageSearchTerm}'");
                return(Array.Empty <MetadataReference>());
            }
            logger.LogOutput("Found " + Display(package));
            logger.LogOutput("Determining dependences...");

            var dependencies = await GetPackageDependencies(package, nugetFramework, nugetCache, nugetLogger, repositories);

            var packagesToInstall        = ResolvePackages(package, dependencies, nugetLogger);
            var packageExtractionContext = new PackageExtractionContext(
                PackageSaveMode.Defaultv3,
                XmlDocFileSaveMode.None,
                clientPolicy,
                nugetLogger);

            var assemblyPaths = await Task.WhenAll(packagesToInstall
                                                   .Select(async packageToInstall =>
            {
                var installedPath = packagePathResolver.GetInstalledPath(packageToInstall);
                PackageReaderBase packageReader = installedPath == null
                        ? await DownloadPackage(packageToInstall, packageExtractionContext, nugetLogger)
                        : LocalPackageReader(packageToInstall, installedPath, nugetLogger);

                var allResources = await Task.WhenAll(
                    packageReader.GetLibItemsAsync(CancellationToken.None),
                    packageReader.GetFrameworkItemsAsync(CancellationToken.None)
                    );

                installedPath ??= packagePathResolver.GetInstalledPath(packageToInstall);
                var references = DotNetAssemblyLocator.GroupDirectoryContentsIntoAssemblies(
                    FilterByFramework(frameworkReducer, allResources.SelectMany(x => x).ToList())
                    .Select(item => Path.Combine(installedPath, item))
                    )
                                 .Select(assembly => io.CreateMetadataReferenceWithDocumentation(assembly))
                                 .ToList();

                logger.LogOutput("Installation complete for " + Display(packageToInstall));

                return(references);
            })
                                                   );

            return(assemblyPaths
                   .SelectMany(assemblyGroup => assemblyGroup)
                   .ToList());
        }
示例#7
0
        public async Task <LineEvaluationResult> AppendEvaluationAsync(Guid lineId, string code, IReplLogger logger)
        {
            await commandInitialization.ConfigureAwait(false);

            try
            {
                var result = await commandHandlers
                             .First(handler => handler.CanHandle(code))
                             .HandleAsync(lineId, code, logger)
                             .ConfigureAwait(false);

                // Depending on which command was run (e.g. 'help'), we might not have a
                // corresponding entry in our workspace. The following line will create an
                // empty record if that's the case. Everything's easier to reason about if
                // the viewmodel and the workspace have the same number of lines.
                workspaceManager.EnsureRecordForLine(lineId);

                return(result);
            }
            catch (Exception ex)
            {
                return(new LineEvaluationResult(code, null, "Error: " + ex.Message, null));
            }
        }
示例#8
0
        public async Task <LineEvaluationResult> HandleAsync(Guid lineId, string text, IReplLogger logger)
        {
            // bail out if it's not a complete statement, but first try automatic completions
            var(success, newTree) = await scriptEvaluator.TryCompleteStatementAsync(text);

            if (!success)
            {
                return(LineEvaluationResult.IncompleteInput);
            }
            text = (await newTree.GetRootAsync())
                   .ToFullString();

            // track the submission in our workspace. We won't need the
            // result for script evaluation, but other roslyn APIs like
            // code completion and syntax highlighting will need it.
            var submission   = workspaceManager.CreateOrUpdateSubmission(lineId, text);
            var scriptResult = await scriptEvaluator.EvaluateAsync(text);

            var output = await prettyPrinter.FormatAsync(submission.Document, scriptResult);

            return(output);
        }
示例#9
0
 public NugetErrorLogger(IReplLogger logger)
 {
     this.logger = logger;
 }