// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. namespace blink { // Note: do not add any copy or move constructors to this class: doing so will // break test coverage that we don't clobber the class name by trying to emit // replacements for synthesized functions. class C { public: // Make sure initializers are updated to use the new names. C() : flag_field_(~0), field_mentioning_http_and_https_(1), should_rename_(0) {} int Method() { // Test that references to fields are updated correctly. return instance_count_ + flag_field_ + field_mentioning_http_and_https_; } // Test that a field without a m_ prefix is correctly renamed. static int instance_count_; protected: // Test that a field with a m_ prefix is correctly renamed. const int flag_field_; // Statics should be named with s_, but make sure s_ and m_ are both correctly // stripped. static int static_count_; static int static_count_with_bad_name_; // Make sure that acronyms don't confuse the underscore inserter. int field_mentioning_http_and_https_; // Already Google style, should not change. int already_google_style_; union { // Anonymous union members should be renamed, as should contructor // initializers of them. char* should_rename_; int* does_rename_; }; }; struct Derived : public C { using C::flag_field_; using C::field_mentioning_http_and_https_; }; int C::instance_count_ = 0; // Structs are like classes. struct S { int integer_field_; int wants_rename; int google_style_already; }; // Unions also use struct-style naming. union U { char four_chars[4]; short two_shorts[2]; int one_hopefully_four_byte_int; int has_prefix_; }; // https://crbug.com/640749#c1: Some type traits are inside blink namespace. struct IsGarbageCollectedMixin { static const bool value = true; static const bool safe_to_compare_to_empty_or_deleted = false; }; } // namespace blink namespace not_blink { // These are traits for WTF types that may be defined outside of blink such // as in mojo. But their names are unique so we can globally treat them as // type traits for renaming. struct GloballyKnownTraits { static const bool safe_to_compare_to_empty_or_deleted = false; }; } // namespace not_blink namespace WTF { void TestForTraits() { bool a = blink::IsGarbageCollectedMixin::safe_to_compare_to_empty_or_deleted; bool b = not_blink::GloballyKnownTraits::safe_to_compare_to_empty_or_deleted; } // We don't want to capitalize fields in type traits // (i.e. the |value| -> |kValue| rename is undesirable below). struct TypeTrait1 { static const bool value = true; }; // Some type traits are implemented as classes, not structs // (e.g. WTF::IsGarbageCollectedType or WTF::IsAssignable). // We should not perform a |value| -> |kValue| rename in the type trait below. template <typename T> class TypeTrait2 { public: static const bool value = false; }; template <> class TypeTrait2<void> { public: static const bool value = false; }; // Some type traits have static methods. We should not perform // a |value| -> |kValue| rename in the type trait below. template <typename T, typename U> struct IsSubclass { private: typedef char YesType; struct NoType { char padding[8]; }; static YesType SubclassCheck(U*); static NoType SubclassCheck(...); static T* t_; public: static const bool value = sizeof(SubclassCheck(t_)) == sizeof(YesType); }; // Some type traits have deleted instance methods. We should not perform // a |value| -> |kValue| rename in the type trait below. template <typename U = void> struct IsTraceableInCollection { // Expanded from STATIC_ONLY(IsTraceableInCollection) macro: private: IsTraceableInCollection() = delete; IsTraceableInCollection(const IsTraceableInCollection&) = delete; IsTraceableInCollection& operator=(const IsTraceableInCollection&) = delete; void* operator new(unsigned long) = delete; void* operator new(unsigned long, void*) = delete; public: static const bool value = true; }; // Some type traits have a non-boolean value. enum LifetimeManagementType { kRefCountedLifetime, kGarbageCollectedLifetime, }; template <typename T> struct LifetimeOf { private: // Okay to rename |isGarbageCollected| to |kIsGarbageCollected|. static const bool kIsGarbageCollected = true; public: // Expecting no rename of |value|. static const LifetimeManagementType value = !kIsGarbageCollected ? kRefCountedLifetime : kGarbageCollectedLifetime; }; template <typename T> struct GenericHashTraitsBase { // We don't want to capitalize fields in type traits // (i.e. the |value| -> |kValue| rename is undesirable below). // This problem is prevented by IsCallee heuristic. static const int kWeakHandlingFlag = TypeTrait2<T>::value ? 123 : 456; }; template <int Format> struct IntermediateFormat { // Some type traits have int type. Example below is loosely based on // third_party/WebKit/Source/platform/graphics/gpu/WebGLImageConversion.cpp static const int value = (Format == 123) ? 456 : 789; }; }; // namespace WTF void F() { // Test that references to a static field are correctly rewritten. blink::C::instance_count_++; // Force instantiation of a copy constructor for blink::C to make sure field // initializers for synthesized functions don't cause weird rewrites. blink::C c; blink::C c2 = c; bool b1 = WTF::TypeTrait1::value; bool b2 = WTF::TypeTrait2<void>::value; }