using ExtractMethod.Tooling; // CLIs are boring on purpose: argument parsing and printing live here, all // Roslyn logic lives in Tooling/ so the tests can drive it directly. string usage = "usage: ExtractMethod (1-based, inclusive)"; if (args.Length != 3) { Console.Error.WriteLine(usage); return 2; } string file = Path.GetFullPath(args[0]); if (!File.Exists(file)) { Console.Error.WriteLine($"error: file not found: {file}"); Console.Error.WriteLine(usage); return 2; } if (!int.TryParse(args[1], out int startLine) || !int.TryParse(args[2], out int endLine)) { Console.Error.WriteLine($"error: line numbers must be integers"); Console.Error.WriteLine(usage); return 2; } // 1. parse the file var tree = CompilationLoader.ParseFile(file); // 2. build the scratch compilation (refs from TRUSTED_PLATFORM_ASSEMBLIES) var compilation = CompilationLoader.CreateCompilation(tree, Path.GetFileNameWithoutExtension(file)); if (compilation.GetDiagnostics().Any(d => d.Severity == Microsoft.CodeAnalysis.DiagnosticSeverity.Error)) { Console.Error.WriteLine("warning: the file does not compile cleanly under a plain Roslyn compilation; reporting syntax-level resolution only"); } // 3. snap the range to whole statements, report cleanly otherwise var report = SelectionResolver.Resolve(tree, startLine, endLine); if (!report.Succeeded) { Console.Error.WriteLine($"error: {report.Error}"); return SelectionResolver.ExitError; } Console.WriteLine( $"{report.Count} statement(s) selected, lines {report.StartLine}..{report.EndLine} " + $"in {report.Method?.Identifier.ValueText}(): " + string.Join(", ", report.Kinds)); return 0;