Skip to content

Commit

Permalink
implement CCDB based DCD imports and linting
Browse files Browse the repository at this point in the history
two new settings are added:
 - d.ccdbPath:          user specified path to `compile_commands.json` to consider as input
 - d.enableCcdbLinting: whether to activate linting of CCDB files

Linting works by actually compiling the file using command specified in
CCDB and scanning for compiler error.
  • Loading branch information
rtbo committed Jun 5, 2023
1 parent 94f0291 commit 245e24d
Show file tree
Hide file tree
Showing 11 changed files with 630 additions and 180 deletions.
84 changes: 84 additions & 0 deletions source/served/commands/ccdb.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
/// Clang compilation database (aka. compile_commands.json) related functions
module served.commands.ccdb;

import served.io.nothrow_fs;
import served.lsp.protocol;
import served.lsp.uri;
import served.types;
import served.utils.events;

import std.experimental.logger;
import fs = std.file;
import std.path;

import workspaced.api;
import workspaced.coms;

string discoverCcdb(string root)
{
import std.algorithm : count, map, sort;
import std.array : array;

trace("discovering CCDB in ", root);

if (fs.exists(chainPath(root, "compile_commands.json")))
return buildNormalizedPath(root, "compile_commands.json");

string[] dbs = tryDirEntries(root, "compile_commands.json", fs.SpanMode.breadth)
.map!(e => buildNormalizedPath(e.name))
.array;

// using in priority:
// - those which have fewer directory depth
// - lexical order
dbs.sort!((a, b) {
const depthA = count(a, dirSeparator);
const depthB = count(b, dirSeparator);
if (depthA != depthB)
return depthA < depthB;
return a < b;
});

tracef("discovered following CCDB:%-(\n - %s%)", dbs);

return dbs.length ? dbs[0] : null;
}

@protocolNotification("workspace/didChangeWatchedFiles")
void onCcdbFileChange(DidChangeWatchedFilesParams params)
{
import std.algorithm : endsWith, map;

foreach (c; params.changes)
{
trace("watched file did change: ", c);

if (!c.uri.endsWith("compile_commands.json"))
continue;

string filename = c.uri.uriToFile;

auto inst = backend.getBestInstance!ClangCompilationDatabaseComponent(filename);
if (!inst)
continue;

string ccdbPath = inst.get!ClangCompilationDatabaseComponent.getDbPath();
if (!ccdbPath)
continue;

filename = filename.buildNormalizedPath();

if (filename == ccdbPath)
{
if (c.type == FileChangeType.deleted)
{
filename = discoverCcdb(inst.cwd);
tracef("CCDB file deleted. Switching from %s to %s", ccdbPath, filename ? filename
: "(null)");
}

tracef("will (re)load %s", filename);
inst.get!ClangCompilationDatabaseComponent.setDbPath(filename);
}
}
}
1 change: 1 addition & 0 deletions source/served/commands/format.d
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import workspaced.com.snippets : SnippetLevel;
import workspaced.coms;

import std.conv : to;
import std.experimental.logger;
import std.json;
import std.string;

Expand Down
Loading

0 comments on commit 245e24d

Please sign in to comment.