mirror of
https://github.com/MaskRay/ccls.git
synced 2025-02-19 15:10:47 +00:00
Log if a file was reparsed due to timestamp or argument change.
This commit is contained in:
parent
c80697a8d8
commit
13e56ac16f
@ -111,6 +111,8 @@ enum class ShouldParse { Yes, No, NoSuchFile };
|
|||||||
// Checks if |path| needs to be reparsed. This will modify cached state
|
// Checks if |path| needs to be reparsed. This will modify cached state
|
||||||
// such that calling this function twice with the same path may return true
|
// such that calling this function twice with the same path may return true
|
||||||
// the first time but will return false the second.
|
// the first time but will return false the second.
|
||||||
|
//
|
||||||
|
// |from|: The file which generated the parse request for this file.
|
||||||
ShouldParse FileNeedsParse(
|
ShouldParse FileNeedsParse(
|
||||||
bool is_interactive,
|
bool is_interactive,
|
||||||
TimestampManager* timestamp_manager,
|
TimestampManager* timestamp_manager,
|
||||||
@ -121,10 +123,16 @@ ShouldParse FileNeedsParse(
|
|||||||
IndexFile* opt_previous_index,
|
IndexFile* opt_previous_index,
|
||||||
const std::string& path,
|
const std::string& path,
|
||||||
const std::vector<std::string>& args,
|
const std::vector<std::string>& args,
|
||||||
bool is_dependency) {
|
const optional<std::string>& from) {
|
||||||
|
auto unwrap_opt = [](const optional<std::string>& opt) -> std::string {
|
||||||
|
if (opt)
|
||||||
|
return " (via " + *opt + ")";
|
||||||
|
return "";
|
||||||
|
};
|
||||||
|
|
||||||
// If the file is a dependency but another file as already imported it,
|
// If the file is a dependency but another file as already imported it,
|
||||||
// don't bother.
|
// don't bother.
|
||||||
if (!is_interactive && is_dependency &&
|
if (!is_interactive && from &&
|
||||||
!import_manager->TryMarkDependencyImported(path)) {
|
!import_manager->TryMarkDependencyImported(path)) {
|
||||||
return ShouldParse::No;
|
return ShouldParse::No;
|
||||||
}
|
}
|
||||||
@ -143,12 +151,15 @@ ShouldParse FileNeedsParse(
|
|||||||
if (!last_cached_modification ||
|
if (!last_cached_modification ||
|
||||||
modification_timestamp != *last_cached_modification) {
|
modification_timestamp != *last_cached_modification) {
|
||||||
file_consumer_shared->Reset(path);
|
file_consumer_shared->Reset(path);
|
||||||
|
LOG_S(INFO) << "Timestamp has changed for " << path << unwrap_opt(from);
|
||||||
return ShouldParse::Yes;
|
return ShouldParse::Yes;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Command-line arguments changed.
|
// Command-line arguments changed.
|
||||||
if (opt_previous_index && opt_previous_index->args != args)
|
if (opt_previous_index && opt_previous_index->args != args) {
|
||||||
|
LOG_S(INFO) << "Arguments have changed for " << path << unwrap_opt(from);
|
||||||
return ShouldParse::Yes;
|
return ShouldParse::Yes;
|
||||||
|
}
|
||||||
|
|
||||||
// File has not changed, do not parse it.
|
// File has not changed, do not parse it.
|
||||||
return ShouldParse::No;
|
return ShouldParse::No;
|
||||||
@ -192,7 +203,7 @@ std::vector<Index_DoIdMap> ParseFile(
|
|||||||
ShouldParse path_state = FileNeedsParse(
|
ShouldParse path_state = FileNeedsParse(
|
||||||
is_interactive, timestamp_manager, modification_timestamp_fetcher,
|
is_interactive, timestamp_manager, modification_timestamp_fetcher,
|
||||||
import_manager, cache_manager, file_consumer_shared, previous_index,
|
import_manager, cache_manager, file_consumer_shared, previous_index,
|
||||||
path, entry.args, false /*is_dependency*/);
|
path, entry.args, nullopt);
|
||||||
|
|
||||||
// Target file does not exist on disk, do not emit any indexes.
|
// Target file does not exist on disk, do not emit any indexes.
|
||||||
// TODO: Dependencies should be reassigned to other files. We can do this by
|
// TODO: Dependencies should be reassigned to other files. We can do this by
|
||||||
@ -211,9 +222,7 @@ std::vector<Index_DoIdMap> ParseFile(
|
|||||||
modification_timestamp_fetcher, import_manager,
|
modification_timestamp_fetcher, import_manager,
|
||||||
cache_manager, file_consumer_shared, previous_index,
|
cache_manager, file_consumer_shared, previous_index,
|
||||||
dependency, entry.args,
|
dependency, entry.args,
|
||||||
true /*is_dependency*/) != ShouldParse::No) {
|
previous_index->path) != ShouldParse::No) {
|
||||||
LOG_S(INFO) << "Timestamp has changed for " << dependency << " (via "
|
|
||||||
<< previous_index->path << ")";
|
|
||||||
needs_reparse = true;
|
needs_reparse = true;
|
||||||
// SUBTLE: Do not break here, as |file_consumer_shared| is updated
|
// SUBTLE: Do not break here, as |file_consumer_shared| is updated
|
||||||
// inside of |file_needs_parse|.
|
// inside of |file_needs_parse|.
|
||||||
@ -723,11 +732,14 @@ TEST_SUITE("ImportPipeline") {
|
|||||||
opt_previous_index = MakeUnique<IndexFile>("---.cc", nullopt);
|
opt_previous_index = MakeUnique<IndexFile>("---.cc", nullopt);
|
||||||
opt_previous_index->args = old_args;
|
opt_previous_index->args = old_args;
|
||||||
}
|
}
|
||||||
|
optional<std::string> from;
|
||||||
|
if (is_dependency)
|
||||||
|
from = std::string("---.cc");
|
||||||
return FileNeedsParse(is_interactive /*is_interactive*/,
|
return FileNeedsParse(is_interactive /*is_interactive*/,
|
||||||
×tamp_manager, &modification_timestamp_fetcher,
|
×tamp_manager, &modification_timestamp_fetcher,
|
||||||
&import_manager, cache_manager.get(),
|
&import_manager, cache_manager.get(),
|
||||||
&file_consumer_shared, opt_previous_index.get(),
|
&file_consumer_shared, opt_previous_index.get(),
|
||||||
file, new_args, is_dependency);
|
file, new_args, from);
|
||||||
};
|
};
|
||||||
|
|
||||||
// A file with no timestamp is not imported, since this implies the file no
|
// A file with no timestamp is not imported, since this implies the file no
|
||||||
|
Loading…
Reference in New Issue
Block a user