diff --git a/lldb/source/API/SBLaunchInfo.cpp b/lldb/source/API/SBLaunchInfo.cpp
index 54bed87..5f5afcc 100644
--- a/lldb/source/API/SBLaunchInfo.cpp
+++ b/lldb/source/API/SBLaunchInfo.cpp
@@ -16,279 +16,175 @@
 using namespace lldb;
 using namespace lldb_private;
 
-SBLaunchInfo::SBLaunchInfo (const char **argv) :
-    m_opaque_sp(new ProcessLaunchInfo())
-{
-    m_opaque_sp->GetFlags().Reset (eLaunchFlagDebug | eLaunchFlagDisableASLR);
-    if (argv && argv[0])
-        m_opaque_sp->GetArguments().SetArguments(argv);
+SBLaunchInfo::SBLaunchInfo(const char **argv)
+    : m_opaque_sp(new ProcessLaunchInfo()) {
+  m_opaque_sp->GetFlags().Reset(eLaunchFlagDebug | eLaunchFlagDisableASLR);
+  if (argv && argv[0])
+    m_opaque_sp->GetArguments().SetArguments(argv);
 }
 
-SBLaunchInfo::~SBLaunchInfo()
-{
+SBLaunchInfo::~SBLaunchInfo() {}
+
+lldb_private::ProcessLaunchInfo &SBLaunchInfo::ref() { return *m_opaque_sp; }
+
+const lldb_private::ProcessLaunchInfo &SBLaunchInfo::ref() const {
+  return *m_opaque_sp;
 }
 
-lldb_private::ProcessLaunchInfo &
-SBLaunchInfo::ref ()
-{
-    return *m_opaque_sp;
+lldb::pid_t SBLaunchInfo::GetProcessID() { return m_opaque_sp->GetProcessID(); }
+
+uint32_t SBLaunchInfo::GetUserID() { return m_opaque_sp->GetUserID(); }
+
+uint32_t SBLaunchInfo::GetGroupID() { return m_opaque_sp->GetGroupID(); }
+
+bool SBLaunchInfo::UserIDIsValid() { return m_opaque_sp->UserIDIsValid(); }
+
+bool SBLaunchInfo::GroupIDIsValid() { return m_opaque_sp->GroupIDIsValid(); }
+
+void SBLaunchInfo::SetUserID(uint32_t uid) { m_opaque_sp->SetUserID(uid); }
+
+void SBLaunchInfo::SetGroupID(uint32_t gid) { m_opaque_sp->SetGroupID(gid); }
+
+SBFileSpec SBLaunchInfo::GetExecutableFile() {
+  return SBFileSpec(m_opaque_sp->GetExecutableFile());
 }
 
-const lldb_private::ProcessLaunchInfo &
-SBLaunchInfo::ref () const
-{
-    return *m_opaque_sp;
+void SBLaunchInfo::SetExecutableFile(SBFileSpec exe_file,
+                                     bool add_as_first_arg) {
+  m_opaque_sp->SetExecutableFile(exe_file.ref(), add_as_first_arg);
 }
 
-lldb::pid_t
-SBLaunchInfo::GetProcessID()
-{
-    return m_opaque_sp->GetProcessID();
+SBListener SBLaunchInfo::GetListener() {
+  return SBListener(m_opaque_sp->GetListener());
 }
 
-uint32_t
-SBLaunchInfo::GetUserID()
-{
-    return m_opaque_sp->GetUserID();
+void SBLaunchInfo::SetListener(SBListener &listener) {
+  m_opaque_sp->SetListener(listener.GetSP());
 }
 
-uint32_t
-SBLaunchInfo::GetGroupID()
-{
-    return m_opaque_sp->GetGroupID();
+uint32_t SBLaunchInfo::GetNumArguments() {
+  return m_opaque_sp->GetArguments().GetArgumentCount();
 }
 
-bool
-SBLaunchInfo::UserIDIsValid ()
-{
-    return m_opaque_sp->UserIDIsValid();
+const char *SBLaunchInfo::GetArgumentAtIndex(uint32_t idx) {
+  return m_opaque_sp->GetArguments().GetArgumentAtIndex(idx);
 }
 
-bool
-SBLaunchInfo::GroupIDIsValid ()
-{
-    return m_opaque_sp->GroupIDIsValid();
-}
-
-void
-SBLaunchInfo::SetUserID (uint32_t uid)
-{
-    m_opaque_sp->SetUserID (uid);
-}
-
-void
-SBLaunchInfo::SetGroupID (uint32_t gid)
-{
-    m_opaque_sp->SetGroupID (gid);
-}
-
-SBFileSpec
-SBLaunchInfo::GetExecutableFile ()
-{
-    return SBFileSpec (m_opaque_sp->GetExecutableFile());
-}
-
-void
-SBLaunchInfo::SetExecutableFile (SBFileSpec exe_file, bool add_as_first_arg)
-{
-    m_opaque_sp->SetExecutableFile(exe_file.ref(), add_as_first_arg);
-}
-
-SBListener
-SBLaunchInfo::GetListener ()
-{
-    return SBListener(m_opaque_sp->GetListener());
-}
-
-void
-SBLaunchInfo::SetListener (SBListener &listener)
-{
-    m_opaque_sp->SetListener(listener.GetSP());
-}
-
-uint32_t
-SBLaunchInfo::GetNumArguments ()
-{
-    return m_opaque_sp->GetArguments().GetArgumentCount();
-}
-
-const char *
-SBLaunchInfo::GetArgumentAtIndex (uint32_t idx)
-{
-    return m_opaque_sp->GetArguments().GetArgumentAtIndex(idx);
-}
-
-void
-SBLaunchInfo::SetArguments (const char **argv, bool append)
-{
-    if (append)
-    {
-        if (argv)
-            m_opaque_sp->GetArguments().AppendArguments(argv);
-    }
+void SBLaunchInfo::SetArguments(const char **argv, bool append) {
+  if (append) {
+    if (argv)
+      m_opaque_sp->GetArguments().AppendArguments(argv);
+  } else {
+    if (argv)
+      m_opaque_sp->GetArguments().SetArguments(argv);
     else
-    {
-        if (argv)
-            m_opaque_sp->GetArguments().SetArguments(argv);
-        else
-            m_opaque_sp->GetArguments().Clear();
-    }
+      m_opaque_sp->GetArguments().Clear();
+  }
 }
 
-uint32_t
-SBLaunchInfo::GetNumEnvironmentEntries ()
-{
-    return m_opaque_sp->GetEnvironmentEntries().GetArgumentCount();
+uint32_t SBLaunchInfo::GetNumEnvironmentEntries() {
+  return m_opaque_sp->GetEnvironmentEntries().GetArgumentCount();
 }
 
-const char *
-SBLaunchInfo::GetEnvironmentEntryAtIndex (uint32_t idx)
-{
-    return m_opaque_sp->GetEnvironmentEntries().GetArgumentAtIndex(idx);
+const char *SBLaunchInfo::GetEnvironmentEntryAtIndex(uint32_t idx) {
+  return m_opaque_sp->GetEnvironmentEntries().GetArgumentAtIndex(idx);
 }
 
-void
-SBLaunchInfo::SetEnvironmentEntries (const char **envp, bool append)
-{
-    if (append)
-    {
-        if (envp)
-            m_opaque_sp->GetEnvironmentEntries().AppendArguments(envp);
-    }
+void SBLaunchInfo::SetEnvironmentEntries(const char **envp, bool append) {
+  if (append) {
+    if (envp)
+      m_opaque_sp->GetEnvironmentEntries().AppendArguments(envp);
+  } else {
+    if (envp)
+      m_opaque_sp->GetEnvironmentEntries().SetArguments(envp);
     else
-    {
-        if (envp)
-            m_opaque_sp->GetEnvironmentEntries().SetArguments(envp);
-        else
-            m_opaque_sp->GetEnvironmentEntries().Clear();
-    }
+      m_opaque_sp->GetEnvironmentEntries().Clear();
+  }
 }
 
-void
-SBLaunchInfo::Clear ()
-{
-    m_opaque_sp->Clear();
+void SBLaunchInfo::Clear() { m_opaque_sp->Clear(); }
+
+const char *SBLaunchInfo::GetWorkingDirectory() const {
+  return m_opaque_sp->GetWorkingDirectory().GetCString();
 }
 
-const char *
-SBLaunchInfo::GetWorkingDirectory () const
-{
-    return m_opaque_sp->GetWorkingDirectory().GetCString();
+void SBLaunchInfo::SetWorkingDirectory(const char *working_dir) {
+  m_opaque_sp->SetWorkingDirectory(FileSpec{working_dir, false});
 }
 
-void
-SBLaunchInfo::SetWorkingDirectory (const char *working_dir)
-{
-    m_opaque_sp->SetWorkingDirectory(FileSpec{working_dir, false});
+uint32_t SBLaunchInfo::GetLaunchFlags() {
+  return m_opaque_sp->GetFlags().Get();
 }
 
-uint32_t
-SBLaunchInfo::GetLaunchFlags ()
-{
-    return m_opaque_sp->GetFlags().Get();
+void SBLaunchInfo::SetLaunchFlags(uint32_t flags) {
+  m_opaque_sp->GetFlags().Reset(flags);
 }
 
-void
-SBLaunchInfo::SetLaunchFlags (uint32_t flags)
-{
-    m_opaque_sp->GetFlags().Reset(flags);
+const char *SBLaunchInfo::GetProcessPluginName() {
+  return m_opaque_sp->GetProcessPluginName();
 }
 
-const char *
-SBLaunchInfo::GetProcessPluginName ()
-{
-    return m_opaque_sp->GetProcessPluginName();
+void SBLaunchInfo::SetProcessPluginName(const char *plugin_name) {
+  return m_opaque_sp->SetProcessPluginName(plugin_name);
 }
 
-void
-SBLaunchInfo::SetProcessPluginName (const char *plugin_name)
-{
-    return m_opaque_sp->SetProcessPluginName (plugin_name);
+const char *SBLaunchInfo::GetShell() {
+  // Constify this string so that it is saved in the string pool.  Otherwise
+  // it would be freed when this function goes out of scope.
+  ConstString shell(m_opaque_sp->GetShell().GetPath().c_str());
+  return shell.AsCString();
 }
 
-const char *
-SBLaunchInfo::GetShell ()
-{
-    // Constify this string so that it is saved in the string pool.  Otherwise
-    // it would be freed when this function goes out of scope.
-    ConstString shell(m_opaque_sp->GetShell().GetPath().c_str());
-    return shell.AsCString();
+void SBLaunchInfo::SetShell(const char *path) {
+  m_opaque_sp->SetShell(FileSpec(path, false));
 }
 
-void
-SBLaunchInfo::SetShell (const char * path)
-{
-    m_opaque_sp->SetShell (FileSpec(path, false));
+bool SBLaunchInfo::GetShellExpandArguments() {
+  return m_opaque_sp->GetShellExpandArguments();
 }
 
-bool
-SBLaunchInfo::GetShellExpandArguments ()
-{
-    return m_opaque_sp->GetShellExpandArguments();
+void SBLaunchInfo::SetShellExpandArguments(bool expand) {
+  m_opaque_sp->SetShellExpandArguments(expand);
 }
 
-void
-SBLaunchInfo::SetShellExpandArguments (bool expand)
-{
-    m_opaque_sp->SetShellExpandArguments(expand);
+uint32_t SBLaunchInfo::GetResumeCount() {
+  return m_opaque_sp->GetResumeCount();
 }
 
-uint32_t
-SBLaunchInfo::GetResumeCount ()
-{
-    return m_opaque_sp->GetResumeCount();
+void SBLaunchInfo::SetResumeCount(uint32_t c) {
+  m_opaque_sp->SetResumeCount(c);
 }
 
-void
-SBLaunchInfo::SetResumeCount (uint32_t c)
-{
-    m_opaque_sp->SetResumeCount (c);
+bool SBLaunchInfo::AddCloseFileAction(int fd) {
+  return m_opaque_sp->AppendCloseFileAction(fd);
 }
 
-bool
-SBLaunchInfo::AddCloseFileAction (int fd)
-{
-    return m_opaque_sp->AppendCloseFileAction(fd);
+bool SBLaunchInfo::AddDuplicateFileAction(int fd, int dup_fd) {
+  return m_opaque_sp->AppendDuplicateFileAction(fd, dup_fd);
 }
 
-bool
-SBLaunchInfo::AddDuplicateFileAction (int fd, int dup_fd)
-{
-    return m_opaque_sp->AppendDuplicateFileAction(fd, dup_fd);
+bool SBLaunchInfo::AddOpenFileAction(int fd, const char *path, bool read,
+                                     bool write) {
+  return m_opaque_sp->AppendOpenFileAction(fd, FileSpec{path, false}, read,
+                                           write);
 }
 
-bool
-SBLaunchInfo::AddOpenFileAction (int fd, const char *path, bool read, bool write)
-{
-    return m_opaque_sp->AppendOpenFileAction(fd, FileSpec{path, false}, read, write);
+bool SBLaunchInfo::AddSuppressFileAction(int fd, bool read, bool write) {
+  return m_opaque_sp->AppendSuppressFileAction(fd, read, write);
 }
 
-bool
-SBLaunchInfo::AddSuppressFileAction (int fd, bool read, bool write)
-{
-    return m_opaque_sp->AppendSuppressFileAction(fd, read, write);
+void SBLaunchInfo::SetLaunchEventData(const char *data) {
+  m_opaque_sp->SetLaunchEventData(data);
 }
 
-void
-SBLaunchInfo::SetLaunchEventData (const char *data)
-{
-    m_opaque_sp->SetLaunchEventData (data);
+const char *SBLaunchInfo::GetLaunchEventData() const {
+  return m_opaque_sp->GetLaunchEventData();
 }
 
-const char *
-SBLaunchInfo::GetLaunchEventData () const
-{
-    return m_opaque_sp->GetLaunchEventData ();
+void SBLaunchInfo::SetDetachOnError(bool enable) {
+  m_opaque_sp->SetDetachOnError(enable);
 }
 
-void
-SBLaunchInfo::SetDetachOnError (bool enable)
-{
-    m_opaque_sp->SetDetachOnError (enable);
-}
-
-bool
-SBLaunchInfo::GetDetachOnError () const
-{
-    return m_opaque_sp->GetDetachOnError ();
+bool SBLaunchInfo::GetDetachOnError() const {
+  return m_opaque_sp->GetDetachOnError();
 }
