[PATCH] D34947: [clangd] Add support for per-file extra flags

2017-07-06 Thread Krasimir Georgiev via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rL307241: [clangd] Add support for per-file extra flags 
(authored by krasimir).

Repository:
  rL LLVM

https://reviews.llvm.org/D34947

Files:
  clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp
  clang-tools-extra/trunk/clangd/ClangdUnitStore.cpp
  clang-tools-extra/trunk/clangd/GlobalCompilationDatabase.cpp
  clang-tools-extra/trunk/clangd/GlobalCompilationDatabase.h
  clang-tools-extra/trunk/clangd/Protocol.cpp
  clang-tools-extra/trunk/clangd/Protocol.h
  clang-tools-extra/trunk/test/clangd/extra-flags.test

Index: clang-tools-extra/trunk/clangd/Protocol.h
===
--- clang-tools-extra/trunk/clangd/Protocol.h
+++ clang-tools-extra/trunk/clangd/Protocol.h
@@ -118,6 +118,12 @@
   static std::string unparse(const Location );
 };
 
+struct Metadata {
+  std::vector extraFlags;
+
+  static llvm::Optional parse(llvm::yaml::MappingNode *Params);
+};
+
 struct TextEdit {
   /// The range of the text document to be manipulated. To insert
   /// text into a document create a range where start === end.
@@ -152,6 +158,9 @@
   /// The document that was opened.
   TextDocumentItem textDocument;
 
+  /// Extension storing per-file metadata, such as compilation flags.
+  llvm::Optional metadata;
+
   static llvm::Optional
   parse(llvm::yaml::MappingNode *Params);
 };
Index: clang-tools-extra/trunk/clangd/ClangdUnitStore.cpp
===
--- clang-tools-extra/trunk/clangd/ClangdUnitStore.cpp
+++ clang-tools-extra/trunk/clangd/ClangdUnitStore.cpp
@@ -22,13 +22,12 @@
   OpenedFiles.erase(It);
 }
 
-std::vector ClangdUnitStore::getCompileCommands(GlobalCompilationDatabase , PathRef File) {
+std::vector
+ClangdUnitStore::getCompileCommands(GlobalCompilationDatabase ,
+PathRef File) {
   std::vector Commands = CDB.getCompileCommands(File);
-  if (Commands.empty()) {
+  if (Commands.empty())
 // Add a fake command line if we know nothing.
-Commands.push_back(tooling::CompileCommand(
-llvm::sys::path::parent_path(File), llvm::sys::path::filename(File),
-{"clang", "-fsyntax-only", File.str()}, ""));
-  }
+Commands.push_back(getDefaultCompileCommand(File));
   return Commands;
 }
Index: clang-tools-extra/trunk/clangd/Protocol.cpp
===
--- clang-tools-extra/trunk/clangd/Protocol.cpp
+++ clang-tools-extra/trunk/clangd/Protocol.cpp
@@ -204,6 +204,33 @@
   return Result;
 }
 
+llvm::Optional Metadata::parse(llvm::yaml::MappingNode *Params) {
+  Metadata Result;
+  for (auto  : *Params) {
+auto *KeyString = dyn_cast(NextKeyValue.getKey());
+if (!KeyString)
+  return llvm::None;
+
+llvm::SmallString<10> KeyStorage;
+StringRef KeyValue = KeyString->getValue(KeyStorage);
+auto *Value = NextKeyValue.getValue();
+
+llvm::SmallString<10> Storage;
+if (KeyValue == "extraFlags") {
+  auto *Seq = dyn_cast(Value);
+  if (!Seq)
+return llvm::None;
+  for (auto  : *Seq) {
+auto *Node = dyn_cast();
+if (!Node)
+  return llvm::None;
+Result.extraFlags.push_back(Node->getValue(Storage));
+  }
+}
+  }
+  return Result;
+}
+
 llvm::Optional TextEdit::parse(llvm::yaml::MappingNode *Params) {
   TextEdit Result;
   for (auto  : *Params) {
@@ -265,6 +292,11 @@
   if (!Parsed)
 return llvm::None;
   Result.textDocument = std::move(*Parsed);
+} else if (KeyValue == "metadata") {
+  auto Parsed = Metadata::parse(Value);
+  if (!Parsed)
+return llvm::None;
+  Result.metadata = std::move(*Parsed);
 } else {
   return llvm::None;
 }
Index: clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp
===
--- clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp
+++ clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp
@@ -97,6 +97,9 @@
 
 void ClangdLSPServer::LSPProtocolCallbacks::onDocumentDidOpen(
 DidOpenTextDocumentParams Params, JSONOutput ) {
+  if (Params.metadata && !Params.metadata->extraFlags.empty())
+LangServer.CDB.setExtraFlagsForFile(Params.textDocument.uri.file,
+std::move(Params.metadata->extraFlags));
   LangServer.Server.addDocument(Params.textDocument.uri.file,
 Params.textDocument.text);
 }
Index: clang-tools-extra/trunk/clangd/GlobalCompilationDatabase.h
===
--- clang-tools-extra/trunk/clangd/GlobalCompilationDatabase.h
+++ clang-tools-extra/trunk/clangd/GlobalCompilationDatabase.h
@@ -25,6 +25,9 @@
 
 namespace clangd {
 
+/// Returns a default compile command to use for \p File.
+tooling::CompileCommand getDefaultCompileCommand(PathRef File);
+
 /// Provides compilation 

[PATCH] D34947: [clangd] Add support for per-file extra flags

2017-07-05 Thread Ilya Biryukov via Phabricator via cfe-commits
ilya-biryukov accepted this revision.
ilya-biryukov added a comment.
This revision is now accepted and ready to land.

LGTM


https://reviews.llvm.org/D34947



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D34947: [clangd] Add support for per-file extra flags

2017-07-05 Thread Krasimir Georgiev via Phabricator via cfe-commits
krasimir updated this revision to Diff 105274.
krasimir added a comment.

- Address review comment


https://reviews.llvm.org/D34947

Files:
  clangd/ClangdLSPServer.cpp
  clangd/ClangdUnitStore.cpp
  clangd/GlobalCompilationDatabase.cpp
  clangd/GlobalCompilationDatabase.h
  clangd/Protocol.cpp
  clangd/Protocol.h
  test/clangd/extra-flags.test

Index: test/clangd/extra-flags.test
===
--- /dev/null
+++ test/clangd/extra-flags.test
@@ -0,0 +1,22 @@
+# RUN: clangd -run-synchronously < %s | FileCheck %s
+# It is absolutely vital that this file has CRLF line endings.
+#
+Content-Length: 125
+
+{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":123,"rootPath":"clangd","capabilities":{},"trace":"off"}}
+#
+Content-Length: 205
+
+{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"file:///foo.c","languageId":"c","version":1,"text":"int main() { int i; return i; }"},"metadata":{"extraFlags":["-Wall"]}}}
+# CHECK: {"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:///foo.c","diagnostics":[{"range":{"start": {"line": 0, "character": 28}, "end": {"line": 0, "character": 28}},"severity":2,"message":"variable 'i' is uninitialized when used here"},{"range":{"start": {"line": 0, "character": 19}, "end": {"line": 0, "character": 19}},"severity":3,"message":"initialize the variable 'i' to silence this warning"}]}}
+#
+Content-Length: 175
+
+{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocument":{"uri":"file:///foo.c","version":2},"contentChanges":[{"text":"int main() { int i; return i; }"}]}}
+# CHECK: {"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:///foo.c","diagnostics":[{"range":{"start": {"line": 0, "character": 28}, "end": {"line": 0, "character": 28}},"severity":2,"message":"variable 'i' is uninitialized when used here"},{"range":{"start": {"line": 0, "character": 19}, "end": {"line": 0, "character": 19}},"severity":3,"message":"initialize the variable 'i' to silence this warning"}]}}
+#
+Content-Length: 44
+
+{"jsonrpc":"2.0","id":5,"method":"shutdown"}
+
+
Index: clangd/Protocol.h
===
--- clangd/Protocol.h
+++ clangd/Protocol.h
@@ -118,6 +118,12 @@
   static std::string unparse(const Location );
 };
 
+struct Metadata {
+  std::vector extraFlags;
+
+  static llvm::Optional parse(llvm::yaml::MappingNode *Params);
+};
+
 struct TextEdit {
   /// The range of the text document to be manipulated. To insert
   /// text into a document create a range where start === end.
@@ -152,6 +158,9 @@
   /// The document that was opened.
   TextDocumentItem textDocument;
 
+  /// Extension storing per-file metadata, such as compilation flags.
+  llvm::Optional metadata;
+
   static llvm::Optional
   parse(llvm::yaml::MappingNode *Params);
 };
Index: clangd/Protocol.cpp
===
--- clangd/Protocol.cpp
+++ clangd/Protocol.cpp
@@ -204,6 +204,33 @@
   return Result;
 }
 
+llvm::Optional Metadata::parse(llvm::yaml::MappingNode *Params) {
+  Metadata Result;
+  for (auto  : *Params) {
+auto *KeyString = dyn_cast(NextKeyValue.getKey());
+if (!KeyString)
+  return llvm::None;
+
+llvm::SmallString<10> KeyStorage;
+StringRef KeyValue = KeyString->getValue(KeyStorage);
+auto *Value = NextKeyValue.getValue();
+
+llvm::SmallString<10> Storage;
+if (KeyValue == "extraFlags") {
+  auto *Seq = dyn_cast(Value);
+  if (!Seq)
+return llvm::None;
+  for (auto  : *Seq) {
+auto *Node = dyn_cast();
+if (!Node)
+  return llvm::None;
+Result.extraFlags.push_back(Node->getValue(Storage));
+  }
+}
+  }
+  return Result;
+}
+
 llvm::Optional TextEdit::parse(llvm::yaml::MappingNode *Params) {
   TextEdit Result;
   for (auto  : *Params) {
@@ -265,6 +292,11 @@
   if (!Parsed)
 return llvm::None;
   Result.textDocument = std::move(*Parsed);
+} else if (KeyValue == "metadata") {
+  auto Parsed = Metadata::parse(Value);
+  if (!Parsed)
+return llvm::None;
+  Result.metadata = std::move(*Parsed);
 } else {
   return llvm::None;
 }
Index: clangd/GlobalCompilationDatabase.h
===
--- clangd/GlobalCompilationDatabase.h
+++ clangd/GlobalCompilationDatabase.h
@@ -25,6 +25,9 @@
 
 namespace clangd {
 
+/// Returns a default compile command to use for \p File.
+tooling::CompileCommand getDefaultCompileCommand(PathRef File);
+
 /// Provides compilation arguments used for building ClangdUnit.
 class GlobalCompilationDatabase {
 public:
@@ -45,14 +48,19 @@
   std::vector
   getCompileCommands(PathRef File) override;
 
+  void setExtraFlagsForFile(PathRef File, std::vector ExtraFlags);
+
 private:
   tooling::CompilationDatabase 

[PATCH] D34947: [clangd] Add support for per-file extra flags

2017-07-05 Thread Ilya Biryukov via Phabricator via cfe-commits
ilya-biryukov added a comment.

I forgot to submit this last comment yesterday, sorry about that.




Comment at: clangd/GlobalCompilationDatabase.h:51
 
+  void addExtraFlagsForFile(PathRef File, std::vector ExtraFlags);
+

Maybe rename to `setExtraFlagsForFile`?
The name `addExtraFlags...` sounds like it appends to the existing list, but we 
actually replace the flags there.


https://reviews.llvm.org/D34947



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D34947: [clangd] Add support for per-file extra flags

2017-07-05 Thread Krasimir Georgiev via Phabricator via cfe-commits
krasimir updated this revision to Diff 105257.
krasimir marked 2 inline comments as done.
krasimir added a comment.

- Addess review comments


https://reviews.llvm.org/D34947

Files:
  clangd/ClangdLSPServer.cpp
  clangd/ClangdUnitStore.cpp
  clangd/GlobalCompilationDatabase.cpp
  clangd/GlobalCompilationDatabase.h
  clangd/Protocol.cpp
  clangd/Protocol.h
  test/clangd/extra-flags.test

Index: test/clangd/extra-flags.test
===
--- /dev/null
+++ test/clangd/extra-flags.test
@@ -0,0 +1,22 @@
+# RUN: clangd -run-synchronously < %s | FileCheck %s
+# It is absolutely vital that this file has CRLF line endings.
+#
+Content-Length: 125
+
+{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":123,"rootPath":"clangd","capabilities":{},"trace":"off"}}
+#
+Content-Length: 205
+
+{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"file:///foo.c","languageId":"c","version":1,"text":"int main() { int i; return i; }"},"metadata":{"extraFlags":["-Wall"]}}}
+# CHECK: {"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:///foo.c","diagnostics":[{"range":{"start": {"line": 0, "character": 28}, "end": {"line": 0, "character": 28}},"severity":2,"message":"variable 'i' is uninitialized when used here"},{"range":{"start": {"line": 0, "character": 19}, "end": {"line": 0, "character": 19}},"severity":3,"message":"initialize the variable 'i' to silence this warning"}]}}
+#
+Content-Length: 175
+
+{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocument":{"uri":"file:///foo.c","version":2},"contentChanges":[{"text":"int main() { int i; return i; }"}]}}
+# CHECK: {"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:///foo.c","diagnostics":[{"range":{"start": {"line": 0, "character": 28}, "end": {"line": 0, "character": 28}},"severity":2,"message":"variable 'i' is uninitialized when used here"},{"range":{"start": {"line": 0, "character": 19}, "end": {"line": 0, "character": 19}},"severity":3,"message":"initialize the variable 'i' to silence this warning"}]}}
+#
+Content-Length: 44
+
+{"jsonrpc":"2.0","id":5,"method":"shutdown"}
+
+
Index: clangd/Protocol.h
===
--- clangd/Protocol.h
+++ clangd/Protocol.h
@@ -118,6 +118,12 @@
   static std::string unparse(const Location );
 };
 
+struct Metadata {
+  std::vector extraFlags;
+
+  static llvm::Optional parse(llvm::yaml::MappingNode *Params);
+};
+
 struct TextEdit {
   /// The range of the text document to be manipulated. To insert
   /// text into a document create a range where start === end.
@@ -152,6 +158,9 @@
   /// The document that was opened.
   TextDocumentItem textDocument;
 
+  /// Extension storing per-file metadata, such as compilation flags.
+  llvm::Optional metadata;
+
   static llvm::Optional
   parse(llvm::yaml::MappingNode *Params);
 };
Index: clangd/Protocol.cpp
===
--- clangd/Protocol.cpp
+++ clangd/Protocol.cpp
@@ -204,6 +204,33 @@
   return Result;
 }
 
+llvm::Optional Metadata::parse(llvm::yaml::MappingNode *Params) {
+  Metadata Result;
+  for (auto  : *Params) {
+auto *KeyString = dyn_cast(NextKeyValue.getKey());
+if (!KeyString)
+  return llvm::None;
+
+llvm::SmallString<10> KeyStorage;
+StringRef KeyValue = KeyString->getValue(KeyStorage);
+auto *Value = NextKeyValue.getValue();
+
+llvm::SmallString<10> Storage;
+if (KeyValue == "extraFlags") {
+  auto *Seq = dyn_cast(Value);
+  if (!Seq)
+return llvm::None;
+  for (auto  : *Seq) {
+auto *Node = dyn_cast();
+if (!Node)
+  return llvm::None;
+Result.extraFlags.push_back(Node->getValue(Storage));
+  }
+}
+  }
+  return Result;
+}
+
 llvm::Optional TextEdit::parse(llvm::yaml::MappingNode *Params) {
   TextEdit Result;
   for (auto  : *Params) {
@@ -265,6 +292,11 @@
   if (!Parsed)
 return llvm::None;
   Result.textDocument = std::move(*Parsed);
+} else if (KeyValue == "metadata") {
+  auto Parsed = Metadata::parse(Value);
+  if (!Parsed)
+return llvm::None;
+  Result.metadata = std::move(*Parsed);
 } else {
   return llvm::None;
 }
Index: clangd/GlobalCompilationDatabase.h
===
--- clangd/GlobalCompilationDatabase.h
+++ clangd/GlobalCompilationDatabase.h
@@ -25,6 +25,9 @@
 
 namespace clangd {
 
+/// Returns a default compile command to use for \p File.
+tooling::CompileCommand getDefaultCompileCommand(PathRef File);
+
 /// Provides compilation arguments used for building ClangdUnit.
 class GlobalCompilationDatabase {
 public:
@@ -45,14 +48,19 @@
   std::vector
   getCompileCommands(PathRef File) override;
 
+  void addExtraFlagsForFile(PathRef File, std::vector ExtraFlags);
+
 private:
   

[PATCH] D34947: [clangd] Add support for per-file extra flags

2017-07-05 Thread Krasimir Georgiev via Phabricator via cfe-commits
krasimir updated this revision to Diff 105147.
krasimir marked 7 inline comments as done.
krasimir added a comment.

- Addess review comments


https://reviews.llvm.org/D34947

Files:
  clangd/ClangdLSPServer.cpp
  clangd/ClangdUnitStore.cpp
  clangd/GlobalCompilationDatabase.cpp
  clangd/GlobalCompilationDatabase.h
  clangd/Protocol.cpp
  clangd/Protocol.h
  test/clangd/extra-flags.test

Index: test/clangd/extra-flags.test
===
--- /dev/null
+++ test/clangd/extra-flags.test
@@ -0,0 +1,22 @@
+# RUN: clangd -run-synchronously < %s | FileCheck %s
+# It is absolutely vital that this file has CRLF line endings.
+#
+Content-Length: 125
+
+{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":123,"rootPath":"clangd","capabilities":{},"trace":"off"}}
+#
+Content-Length: 205
+
+{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"file:///foo.c","languageId":"c","version":1,"text":"int main() { int i; return i; }"},"metadata":{"extraFlags":["-Wall"]}}}
+# CHECK: {"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:///foo.c","diagnostics":[{"range":{"start": {"line": 0, "character": 28}, "end": {"line": 0, "character": 28}},"severity":2,"message":"variable 'i' is uninitialized when used here"},{"range":{"start": {"line": 0, "character": 19}, "end": {"line": 0, "character": 19}},"severity":3,"message":"initialize the variable 'i' to silence this warning"}]}}
+#
+Content-Length: 175
+
+{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocument":{"uri":"file:///foo.c","version":2},"contentChanges":[{"text":"int main() { int i; return i; }"}]}}
+# CHECK: {"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:///foo.c","diagnostics":[{"range":{"start": {"line": 0, "character": 28}, "end": {"line": 0, "character": 28}},"severity":2,"message":"variable 'i' is uninitialized when used here"},{"range":{"start": {"line": 0, "character": 19}, "end": {"line": 0, "character": 19}},"severity":3,"message":"initialize the variable 'i' to silence this warning"}]}}
+#
+Content-Length: 44
+
+{"jsonrpc":"2.0","id":5,"method":"shutdown"}
+
+
Index: clangd/Protocol.h
===
--- clangd/Protocol.h
+++ clangd/Protocol.h
@@ -118,6 +118,12 @@
   static std::string unparse(const Location );
 };
 
+struct Metadata {
+  std::vector extraFlags;
+
+  static llvm::Optional parse(llvm::yaml::MappingNode *Params);
+};
+
 struct TextEdit {
   /// The range of the text document to be manipulated. To insert
   /// text into a document create a range where start === end.
@@ -152,6 +158,9 @@
   /// The document that was opened.
   TextDocumentItem textDocument;
 
+  /// Extension storing per-file metadata, such as compilation flags.
+  llvm::Optional metadata;
+
   static llvm::Optional
   parse(llvm::yaml::MappingNode *Params);
 };
Index: clangd/Protocol.cpp
===
--- clangd/Protocol.cpp
+++ clangd/Protocol.cpp
@@ -204,6 +204,33 @@
   return Result;
 }
 
+llvm::Optional Metadata::parse(llvm::yaml::MappingNode *Params) {
+  Metadata Result;
+  for (auto  : *Params) {
+auto *KeyString = dyn_cast(NextKeyValue.getKey());
+if (!KeyString)
+  return llvm::None;
+
+llvm::SmallString<10> KeyStorage;
+StringRef KeyValue = KeyString->getValue(KeyStorage);
+auto *Value = NextKeyValue.getValue();
+
+llvm::SmallString<10> Storage;
+if (KeyValue == "extraFlags") {
+  auto *Seq = dyn_cast(Value);
+  if (!Seq)
+return llvm::None;
+  for (auto  : *Seq) {
+auto *Node = dyn_cast();
+if (!Node)
+  return llvm::None;
+Result.extraFlags.push_back(Node->getValue(Storage));
+  }
+}
+  }
+  return Result;
+}
+
 llvm::Optional TextEdit::parse(llvm::yaml::MappingNode *Params) {
   TextEdit Result;
   for (auto  : *Params) {
@@ -265,6 +292,11 @@
   if (!Parsed)
 return llvm::None;
   Result.textDocument = std::move(*Parsed);
+} else if (KeyValue == "metadata") {
+  auto Parsed = Metadata::parse(Value);
+  if (!Parsed)
+return llvm::None;
+  Result.metadata = std::move(*Parsed);
 } else {
   return llvm::None;
 }
Index: clangd/GlobalCompilationDatabase.h
===
--- clangd/GlobalCompilationDatabase.h
+++ clangd/GlobalCompilationDatabase.h
@@ -25,6 +25,9 @@
 
 namespace clangd {
 
+/// Returns a default compile command to use for \p File.
+tooling::CompileCommand getDefaultCompileCommand(PathRef File);
+
 /// Provides compilation arguments used for building ClangdUnit.
 class GlobalCompilationDatabase {
 public:
@@ -45,14 +48,19 @@
   std::vector
   getCompileCommands(PathRef File) override;
 
+  void addExtraFlagsForFile(PathRef File, std::vector ExtraFlags);
+
 private:
   

[PATCH] D34947: [clangd] Add support for per-file extra flags

2017-07-05 Thread Krasimir Georgiev via Phabricator via cfe-commits
krasimir added inline comments.



Comment at: clangd/GlobalCompilationDatabase.cpp:20
+  const SmallVectorImpl ) {
+  assert(Command && !Command->CommandLine.empty());
+  if (!Command || ExtraFlags.empty())

ilya-biryukov wrote:
> Maybe pass `Command` by reference to avoid checking for null?
> Is there a guideline to use pointers to make things more explicit that I've 
> missed?
There's a guideline to use pointers for google style, but I'm not aware for 
such for llvm style.


https://reviews.llvm.org/D34947



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D34947: [clangd] Add support for per-file extra flags

2017-07-05 Thread Ilya Biryukov via Phabricator via cfe-commits
ilya-biryukov added inline comments.



Comment at: clangd/GlobalCompilationDatabase.cpp:20
+  const SmallVectorImpl ) {
+  assert(Command && !Command->CommandLine.empty());
+  if (!Command || ExtraFlags.empty())

Maybe pass `Command` by reference to avoid checking for null?
Is there a guideline to use pointers to make things more explicit that I've 
missed?



Comment at: clangd/GlobalCompilationDatabase.cpp:21
+  assert(Command && !Command->CommandLine.empty());
+  if (!Command || ExtraFlags.empty())
+return;

There's an assert that `Command` is always non-null, so `!Command` is always 
`false`.
Maybe remove this check?



Comment at: clangd/GlobalCompilationDatabase.cpp:23
+return;
+  if (Command->CommandLine.empty())
+Command->CommandLine.push_back("clang");

There's an assert that checks that `CommandLine` is never empty.
Maybe remove this if statement?



Comment at: clangd/GlobalCompilationDatabase.cpp:27
+  ++It;
+  Command->CommandLine.insert(It, ExtraFlags.begin(), ExtraFlags.end());
+}

This way extra flags won't override flags from compilation database, we should 
put `ExtraFlags` right before the input files.

clangd will break if it receives CommandLine with more than one input file, so 
it should be safe to assume that the last arg is the name of the input file, 
i.e. always add `ExtraFlags` right before the last arg.



Comment at: clangd/GlobalCompilationDatabase.cpp:38
+  if (Commands.empty()) {
+std::vector CommandLine{"clang", "-fsyntax-only", File.str()};
+Commands.push_back(tooling::CompileCommand(

Maybe extract a small helper function to get default `CompileCommand` and use 
it both in `ClangdUnitStore` and here?
Just in case we'll ever want to change the defaults at some point.




Comment at: clangd/GlobalCompilationDatabase.cpp:47
+SmallVector UserFlags;
+StringRef(It->second).split(UserFlags, " ");
+// Append the user-specified flags to the compile commands.

This will break for options, containing spaces (e.g. `-I"/home/user/my dir with 
spaces"`). 
There should a function parsing command-line args somewhere in LLVM? Can we 
avoid splitting command-line args altogether (see next comment)?



Comment at: clangd/GlobalCompilationDatabase.cpp:58
+PathRef File, llvm::StringRef ExtraFlags) {
+  ExtraFlagsForFile[File] = ExtraFlags;
 }

Maybe store splitted command-line args in `ExtraFlagsForFile`?
`ycm_extra_conf.py` seems to pass splited command-line arguments, maybe change 
our extension to receive a list of arguments to avoid doing command-line arg 
splitting?


https://reviews.llvm.org/D34947



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D34947: [clangd] Add support for per-file extra flags

2017-07-05 Thread Ilya Biryukov via Phabricator via cfe-commits
ilya-biryukov added inline comments.



Comment at: clangd/GlobalCompilationDatabase.cpp:22
+return;
+  if (Command.CommandLine.empty())
+Command.CommandLine.push_back("clang");

If `Command.CommandLine.empty()` is true, extra flags will be added **before** 
'clang' in the command-line.
Maybe restore `assert(Command.CommandLine.size() >= 2)` (i.e. at least a 
compiler binary and input file should be in the commandline) and remove this if?



Comment at: clangd/GlobalCompilationDatabase.cpp:60
+PathRef File, std::vector ExtraFlags) {
+  ExtraFlagsForFile[File] = ExtraFlags;
 }

Maybe `std::move` the vector before assignment to avoid copying?


https://reviews.llvm.org/D34947



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits