jamesfredley commented on code in PR #15367:
URL: https://github.com/apache/grails-core/pull/15367#discussion_r2748594021


##########
grails-bootstrap/src/main/groovy/grails/build/logging/GrailsConsole.java:
##########
@@ -251,51 +234,54 @@ private boolean readPropOrTrue(String prop) {
         return property == null ? true : Boolean.valueOf(property);
     }
 
-    protected ConsoleReader createConsoleReader(InputStream systemIn) throws 
IOException {
-        // need to swap out the output to avoid logging during init
-        final PrintStream nullOutput = new PrintStream(new 
ByteArrayOutputStream());
-        final PrintStream originalOut = Log.getOutput();
-        try {
-            Log.setOutput(nullOutput);
-            ConsoleReader consoleReader = new ConsoleReader(systemIn, out);
-            consoleReader.setExpandEvents(false);
-            return consoleReader;
-        } finally {
-            Log.setOutput(originalOut);
+    protected LineReader createLineReader(Terminal terminal, History history) 
throws IOException {
+        LineReaderBuilder builder = LineReaderBuilder.builder()
+                .terminal(terminal)
+                .option(LineReader.Option.DISABLE_EVENT_EXPANSION, true);
+        if (history != null) {
+            builder.variable(LineReader.HISTORY_FILE, new 
File(System.getProperty("user.home"), HISTORYFILE).toPath());
+            builder.history(history);
         }
+        return builder.build();
     }
 
     /**
-     * Creates the instance of Terminal used directly in GrailsConsole. Note 
that there is also
-     * another terminal instance created implicitly inside of ConsoleReader. 
That instance
-     * is controlled by the jline.terminal system property.
+     * Creates the instance of Terminal used directly in GrailsConsole.
      */
-    protected Terminal createTerminal() {
-        terminal = TerminalFactory.create();
-        if (isWindows()) {
-            terminal.setEchoEnabled(true);
-        }
+    protected Terminal createTerminal() throws IOException {
+        Terminal terminal = TerminalBuilder.builder()
+                .system(true)
+                .build();
         return terminal;
     }
 
     public void resetCompleters() {
-        final ConsoleReader reader = getReader();
-        if (reader != null) {
-            Collection<Completer> completers = reader.getCompleters();
-            for (Completer completer : completers) {
-                reader.removeCompleter(completer);
-            }
+        // In JLine 3, completers are set at LineReader creation time or via 
setCompleter
+        // We'll handle this differently - completers are managed via the 
LineReader
+    }
 
-            // for some unknown reason / bug in JLine you have to iterate over 
twice to clear the completers (WTF)
-            completers = reader.getCompleters();
-            for (Completer completer : completers) {
-                reader.removeCompleter(completer);
+    public void addCompleter(Completer completer) {
+        // In JLine 3, we need to recreate the LineReader with the new 
completer
+        // or use an AggregateCompleter. For now, this is a simplified 
implementation.
+        if (terminal != null) {
+            try {
+                LineReaderBuilder builder = LineReaderBuilder.builder()
+                        .terminal(terminal)
+                        .completer(completer)
+                        .option(LineReader.Option.DISABLE_EVENT_EXPANSION, 
true);
+                if (history != null) {
+                    builder.variable(LineReader.HISTORY_FILE, new 
File(System.getProperty("user.home"), HISTORYFILE).toPath());
+                    builder.history(history);
+                }
+                reader = builder.build();
+            } catch (Exception e) {
+                // ignore
             }
         }
     }

Review Comment:
   Fixed: Implemented AggregateCompleter to support multiple completers. The 
addCompleter method now collects completers and rebuilds the LineReader with an 
AggregateCompleter containing all registered completers.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to