[unused vars] Improve error messages in templates This adds the location of the invocation that encountered the unused var to the stack of 'whence it was called' lines. Change-Id: I3185372750d15171aa7650d1bf4618d3d6e076eb
diff --git a/src/gn/scope.cc b/src/gn/scope.cc index 24888cf..d07426a 100644 --- a/src/gn/scope.cc +++ b/src/gn/scope.cc
@@ -259,6 +259,17 @@ "You set the variable \"" + std::string(pair.first) + "\" here and it was unused before it went\nout of scope."; + + // Gather the template invocations that led up to this scope. + auto entries = GetTemplateInvocationEntries(); + if (entries.size() != 0) { + + help.append("\n\nVia these template invocations:\n"); + for (const auto& entry : entries) { + help.append(" " + entry.Describe() + "\n"); + } + } + const BinaryOpNode* binary = pair.second.value.origin()->AsBinaryOp(); if (binary && binary->op().type() == Token::EQUAL) { // Make a nicer error message for normal var sets.
diff --git a/src/gn/template.cc b/src/gn/template.cc index deafa33..d2c6fc6 100644 --- a/src/gn/template.cc +++ b/src/gn/template.cc
@@ -116,13 +116,21 @@ invoker_value = template_scope.GetMutableValue(variables::kInvoker, Scope::SEARCH_NESTED, false); if (invoker_value && invoker_value->type() == Value::SCOPE) { - if (!invoker_value->scope_value()->CheckForUnusedVars(err)) + if (!invoker_value->scope_value()->CheckForUnusedVars(err)) { + // If there was an error, append the caller location so the error message + // displays a stack trace of how it got here. + err->AppendSubErr(Err(invocation, "whence it was called.")); return Value(); + } } // Check for unused variables in the template itself. - if (!template_scope.CheckForUnusedVars(err)) + if (!template_scope.CheckForUnusedVars(err)) { + // If there was an error, append the caller location so the error message + // displays a stack trace of how it got here. + err->AppendSubErr(Err(invocation, "whence it was called.")); return Value(); + } return result; }