teemperor created this revision.
teemperor added a reviewer: LLDB.
teemperor added a project: LLDB.
Herald added a subscriber: JDevlieghere.
teemperor requested review of this revision.

The current API for printing errors/warnings/messages from LLDB commands 
sometimes
adds newlines behind the messages for the caller. However, this happens 
unconditionally
so when the caller already specified a trailing newline in the error message 
(or is trying to print
a generated error message that ends in a newline), LLDB ends up printing both 
the automatically
added newline and the one that was in the error message string. This leads to 
all the randomly
appearing new lines in error such as:

  (lldb) command a
  error: 'command alias' requires at least two arguments
  (lldb) apropos a b
  error: 'apropos' must be called with exactly one argument.
  
  (lldb) why is there an empty line behind the second error?

This code adds a check that only appends the new line if the passed message 
doesn't already
contain a trailing new line.


https://reviews.llvm.org/D96947

Files:
  lldb/include/lldb/Interpreter/CommandReturnObject.h
  lldb/source/Commands/CommandObjectMemory.cpp
  lldb/source/Interpreter/CommandReturnObject.cpp
  lldb/test/Shell/Commands/command-disassemble.s


Index: lldb/test/Shell/Commands/command-disassemble.s
===================================================================
--- lldb/test/Shell/Commands/command-disassemble.s
+++ lldb/test/Shell/Commands/command-disassemble.s
@@ -6,16 +6,12 @@
 
 # CHECK:      (lldb) disassemble
 # CHECK-NEXT: error: Cannot disassemble around the current function without a 
selected frame.
-# CHECK-EMPTY:
 # CHECK-NEXT: (lldb) disassemble --line
 # CHECK-NEXT: error: Cannot disassemble around the current line without a 
selected frame.
-# CHECK-EMPTY:
 # CHECK-NEXT: (lldb) disassemble --frame
 # CHECK-NEXT: error: Cannot disassemble around the current function without a 
selected frame.
-# CHECK-EMPTY:
 # CHECK-NEXT: (lldb) disassemble --pc
 # CHECK-NEXT: error: Cannot disassemble around the current PC without a 
selected frame.
-# CHECK-EMPTY:
 # CHECK-NEXT: (lldb) disassemble --start-address 0x0
 # CHECK-NEXT: command-disassemble.s.tmp`foo:
 # CHECK-NEXT: command-disassemble.s.tmp[0x0] <+0>:   int    $0x10
Index: lldb/source/Interpreter/CommandReturnObject.cpp
===================================================================
--- lldb/source/Interpreter/CommandReturnObject.cpp
+++ lldb/source/Interpreter/CommandReturnObject.cpp
@@ -90,28 +90,25 @@
 void CommandReturnObject::AppendMessage(llvm::StringRef in_string) {
   if (in_string.empty())
     return;
-  GetOutputStream() << in_string << "\n";
+  GetOutputStream() << in_string;
+  if (!in_string.endswith("\n"))
+    GetOutputStream() << '\n';
 }
 
 void CommandReturnObject::AppendWarning(llvm::StringRef in_string) {
   if (in_string.empty())
     return;
-  warning(GetErrorStream()) << in_string << '\n';
-}
-
-// Similar to AppendWarning, but do not prepend 'warning: ' to message, and
-// don't append "\n" to the end of it.
-
-void CommandReturnObject::AppendRawWarning(llvm::StringRef in_string) {
-  if (in_string.empty())
-    return;
-  GetErrorStream() << in_string;
+  warning(GetErrorStream()) << in_string;
+  if (!in_string.endswith("\n"))
+    GetErrorStream() << '\n';
 }
 
 void CommandReturnObject::AppendError(llvm::StringRef in_string) {
   if (in_string.empty())
     return;
-  error(GetErrorStream()) << in_string << '\n';
+  error(GetErrorStream()) << in_string;
+  if (!in_string.endswith("\n"))
+    GetErrorStream() << '\n';
 }
 
 void CommandReturnObject::SetError(const Status &error,
Index: lldb/source/Commands/CommandObjectMemory.cpp
===================================================================
--- lldb/source/Commands/CommandObjectMemory.cpp
+++ lldb/source/Commands/CommandObjectMemory.cpp
@@ -356,8 +356,8 @@
       result.AppendErrorWithFormat("%s takes a start address expression with "
                                    "an optional end address expression.\n",
                                    m_cmd_name.c_str());
-      result.AppendRawWarning("Expressions should be quoted if they contain "
-                              "spaces or other special characters.\n");
+      result.AppendWarning("Expressions should be quoted if they contain "
+                           "spaces or other special characters.");
       result.SetStatus(eReturnStatusFailed);
       return false;
     }
Index: lldb/include/lldb/Interpreter/CommandReturnObject.h
===================================================================
--- lldb/include/lldb/Interpreter/CommandReturnObject.h
+++ lldb/include/lldb/Interpreter/CommandReturnObject.h
@@ -95,8 +95,6 @@
   void AppendMessageWithFormat(const char *format, ...)
       __attribute__((format(printf, 2, 3)));
 
-  void AppendRawWarning(llvm::StringRef in_string);
-
   void AppendWarning(llvm::StringRef in_string);
 
   void AppendWarningWithFormat(const char *format, ...)


Index: lldb/test/Shell/Commands/command-disassemble.s
===================================================================
--- lldb/test/Shell/Commands/command-disassemble.s
+++ lldb/test/Shell/Commands/command-disassemble.s
@@ -6,16 +6,12 @@
 
 # CHECK:      (lldb) disassemble
 # CHECK-NEXT: error: Cannot disassemble around the current function without a selected frame.
-# CHECK-EMPTY:
 # CHECK-NEXT: (lldb) disassemble --line
 # CHECK-NEXT: error: Cannot disassemble around the current line without a selected frame.
-# CHECK-EMPTY:
 # CHECK-NEXT: (lldb) disassemble --frame
 # CHECK-NEXT: error: Cannot disassemble around the current function without a selected frame.
-# CHECK-EMPTY:
 # CHECK-NEXT: (lldb) disassemble --pc
 # CHECK-NEXT: error: Cannot disassemble around the current PC without a selected frame.
-# CHECK-EMPTY:
 # CHECK-NEXT: (lldb) disassemble --start-address 0x0
 # CHECK-NEXT: command-disassemble.s.tmp`foo:
 # CHECK-NEXT: command-disassemble.s.tmp[0x0] <+0>:   int    $0x10
Index: lldb/source/Interpreter/CommandReturnObject.cpp
===================================================================
--- lldb/source/Interpreter/CommandReturnObject.cpp
+++ lldb/source/Interpreter/CommandReturnObject.cpp
@@ -90,28 +90,25 @@
 void CommandReturnObject::AppendMessage(llvm::StringRef in_string) {
   if (in_string.empty())
     return;
-  GetOutputStream() << in_string << "\n";
+  GetOutputStream() << in_string;
+  if (!in_string.endswith("\n"))
+    GetOutputStream() << '\n';
 }
 
 void CommandReturnObject::AppendWarning(llvm::StringRef in_string) {
   if (in_string.empty())
     return;
-  warning(GetErrorStream()) << in_string << '\n';
-}
-
-// Similar to AppendWarning, but do not prepend 'warning: ' to message, and
-// don't append "\n" to the end of it.
-
-void CommandReturnObject::AppendRawWarning(llvm::StringRef in_string) {
-  if (in_string.empty())
-    return;
-  GetErrorStream() << in_string;
+  warning(GetErrorStream()) << in_string;
+  if (!in_string.endswith("\n"))
+    GetErrorStream() << '\n';
 }
 
 void CommandReturnObject::AppendError(llvm::StringRef in_string) {
   if (in_string.empty())
     return;
-  error(GetErrorStream()) << in_string << '\n';
+  error(GetErrorStream()) << in_string;
+  if (!in_string.endswith("\n"))
+    GetErrorStream() << '\n';
 }
 
 void CommandReturnObject::SetError(const Status &error,
Index: lldb/source/Commands/CommandObjectMemory.cpp
===================================================================
--- lldb/source/Commands/CommandObjectMemory.cpp
+++ lldb/source/Commands/CommandObjectMemory.cpp
@@ -356,8 +356,8 @@
       result.AppendErrorWithFormat("%s takes a start address expression with "
                                    "an optional end address expression.\n",
                                    m_cmd_name.c_str());
-      result.AppendRawWarning("Expressions should be quoted if they contain "
-                              "spaces or other special characters.\n");
+      result.AppendWarning("Expressions should be quoted if they contain "
+                           "spaces or other special characters.");
       result.SetStatus(eReturnStatusFailed);
       return false;
     }
Index: lldb/include/lldb/Interpreter/CommandReturnObject.h
===================================================================
--- lldb/include/lldb/Interpreter/CommandReturnObject.h
+++ lldb/include/lldb/Interpreter/CommandReturnObject.h
@@ -95,8 +95,6 @@
   void AppendMessageWithFormat(const char *format, ...)
       __attribute__((format(printf, 2, 3)));
 
-  void AppendRawWarning(llvm::StringRef in_string);
-
   void AppendWarning(llvm::StringRef in_string);
 
   void AppendWarningWithFormat(const char *format, ...)
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to