Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(152)

Unified Diff: tools/clang/rewrite_to_chrome_style/RewriteToChromeStyle.cpp

Issue 2612313002: Safe fallback for known "conflicting overrides" during rename. (Closed)
Patch Set: Self-review. Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | tools/clang/scripts/run_tool.py » ('j') | tools/clang/scripts/run_tool.py » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/clang/rewrite_to_chrome_style/RewriteToChromeStyle.cpp
diff --git a/tools/clang/rewrite_to_chrome_style/RewriteToChromeStyle.cpp b/tools/clang/rewrite_to_chrome_style/RewriteToChromeStyle.cpp
index c3d3356d2542a138cf35bdd3f4e086eb357d4983..09fa7e4d01c239ad4dd4aac5c3765a69015e13f0 100644
--- a/tools/clang/rewrite_to_chrome_style/RewriteToChromeStyle.cpp
+++ b/tools/clang/rewrite_to_chrome_style/RewriteToChromeStyle.cpp
@@ -121,6 +121,13 @@ AST_MATCHER_P(clang::OverloadExpr,
return true;
}
+void PrintForDiagnostics(clang::raw_ostream& os,
+ const clang::FunctionDecl& decl) {
+ decl.getLocStart().print(os, decl.getASTContext().getSourceManager());
+ os << ": ";
+ decl.getNameForDiagnostic(os, decl.getASTContext().getPrintingPolicy(), true);
+}
+
template <typename T>
bool MatchAllOverriddenMethods(
const clang::CXXMethodDecl& decl,
@@ -145,13 +152,57 @@ bool MatchAllOverriddenMethods(
// one we did not rename which creates a behaviour change. So assert and
// demand the user to fix the code first (or add the method to our
// blacklist T_T).
- if (override_matches || override_not_matches)
- assert(override_matches != override_not_matches);
+ if (override_matches || override_not_matches) {
+ if (override_matches == override_not_matches) {
danakj 2017/01/05 18:55:19 can you change this to &&, it should be the same b
Łukasz Anforowicz 2017/01/05 19:04:43 Good point. Done.
+ // blink::InternalSettings::trace method overrides
+ // 1) blink::InternalSettingsGenerated::trace
+ // (won't be renamed because it is in generated code)
+ // 2) blink::Supplement<blink::Page>::trace
+ // (will be renamed).
+ // It is safe to rename blink::InternalSettings::trace, because
+ // both 1 and 2 will both be renamed (#1 via manual changes of the code
+ // generator for DOM bindings and #2 via the clang tool).
+ // will only rename method overrides
danakj 2017/01/05 18:55:19 this comment isn't a sentence
Łukasz Anforowicz 2017/01/05 19:04:44 Ooops. Removed this line (leftover from drafting
+ auto internal_settings_class_decl = cxxRecordDecl(
+ hasName("InternalSettings"),
+ hasParent(namespaceDecl(hasName("blink"),
+ hasParent(translationUnitDecl()))));
+ auto is_method_safe_to_rename = cxxMethodDecl(
+ hasName("trace"),
+ anyOf(hasParent(internal_settings_class_decl), // in .h file
+ has(nestedNameSpecifier(specifiesType( // in .cpp file
+ hasDeclaration(internal_settings_class_decl))))));
+ if (IsMatching(is_method_safe_to_rename, decl, decl.getASTContext()))
+ return true;
+
+ // For previously unknown conflicts, errors out and require a human to
+ // analyse the problem (rather than falling back to a potentially unsafe /
+ // code semantics changing rename).
+ llvm::errs() << "ERROR: ";
+ PrintForDiagnostics(llvm::errs(), decl);
+ llvm::errs() << " method overrides "
+ << "some virtual methods that will be automatically renamed "
+ << "and some that won't be renamed.";
+ llvm::errs() << "\n";
+ for (auto it = decl.begin_overridden_methods();
+ it != decl.end_overridden_methods(); ++it) {
+ if (MatchAllOverriddenMethods(**it, inner_matcher, finder, builder))
+ llvm::errs() << "Overriden method that will be renamed: ";
+ else
+ llvm::errs() << "Overriden method that will not be renamed: ";
+ PrintForDiagnostics(llvm::errs(), **it);
+ llvm::errs() << "\n";
+ }
+ llvm::errs() << "\n";
+ assert(0);
Łukasz Anforowicz 2017/01/05 18:45:19 We could also return |true| rather than asserting.
danakj 2017/01/05 18:55:19 assert cuz we want to know about it on the big day
Łukasz Anforowicz 2017/01/05 19:04:44 Done.
+ }
+ }
// If the method overrides something that doesn't match, so the method itself
// doesn't match.
if (override_not_matches)
return false;
+
// If the method overrides something that matches, so the method ifself
// matches.
if (override_matches)
« no previous file with comments | « no previous file | tools/clang/scripts/run_tool.py » ('j') | tools/clang/scripts/run_tool.py » ('J')

Powered by Google App Engine
This is Rietveld 408576698