Chromium Code Reviews| Index: tools/gn/input_file_manager.cc |
| diff --git a/tools/gn/input_file_manager.cc b/tools/gn/input_file_manager.cc |
| index 0b6159c92a507e601800fa472f1db88ae76ad6b9..3ac1d272797fb80427d634b8def573652966e5c9 100644 |
| --- a/tools/gn/input_file_manager.cc |
| +++ b/tools/gn/input_file_manager.cc |
| @@ -215,19 +215,12 @@ const ParseNode* InputFileManager::SyncLoadFile( |
| } |
| } |
| - // The other load could have failed. In this case that error was probably |
| - // printed to the console, but we need to return something here, so make up a |
| - // dummy error. |
| - // |
| - // There is a race condition. The other load could have failed, but if the |
| - // other thread is delayed for some reason, this thread could end up |
| - // reporting the error to the scheduler first (since first error report |
| - // wins). The user will see this one and the "real" one will be discarded. |
| + // The other load could have failed. It is possible that this thread's error |
| + // will be reported to the scheduler before the other thread's (and the first |
| + // error reported "wins"). Forward the parse error from the other load for |
| + // this thread so that the error message is useful. |
| if (!data->parsed_root) { |
|
brettw
2014/10/14 17:13:09
Remove {}
cjhopman
2014/10/16 18:26:02
Done.
|
| - *err = Err(origin, "File parse failed.", |
| - "If you see this, I'm really sorry, but a race condition has caused\n" |
| - "me to eat your error message. It was crunchy. If the parse error\n" |
| - "in your imported file isn't obvious, try re-running GN."); |
| + *err = *data->parse_error; |
| } |
| return data->parsed_root.get(); |
| } |
| @@ -296,6 +289,8 @@ bool InputFileManager::LoadFile(const LocationRange& origin, |
| if (success) { |
| data->tokens.swap(tokens); |
| data->parsed_root = root.Pass(); |
| + } else { |
| + data->parse_error.reset(new Err(*err)); |
| } |
| // Unblock waiters on this event. |