1f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Copyright 2015 The Chromium Authors. All rights reserved. 2f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// found in the LICENSE file. 4f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 5f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochnamespace blink { 6f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 7f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Note: do not add any copy or move constructors to this class: doing so will 8f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// break test coverage that we don't clobber the class name by trying to emit 9f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// replacements for synthesized functions. 10f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass C { 11f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 12f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Make sure initializers are updated to use the new names. 13f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch C() 14f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch : flag_field_(~0), 15f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch field_mentioning_http_and_https_(1), 16f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch should_rename_(0) {} 17f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 18f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int Method() { 19f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Test that references to fields are updated correctly. 20f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return instance_count_ + flag_field_ + field_mentioning_http_and_https_; 21f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 22f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 23f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Test that a field without a m_ prefix is correctly renamed. 24f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static int instance_count_; 25f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 26f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch protected: 27f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Test that a field with a m_ prefix is correctly renamed. 28f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch const int flag_field_; 29f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Statics should be named with s_, but make sure s_ and m_ are both correctly 30f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // stripped. 31f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static int static_count_; 32f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static int static_count_with_bad_name_; 33f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Make sure that acronyms don't confuse the underscore inserter. 34f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int field_mentioning_http_and_https_; 35f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Already Google style, should not change. 36f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int already_google_style_; 37f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 38f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch union { 39f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Anonymous union members should be renamed, as should contructor 40f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // initializers of them. 41f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch char* should_rename_; 42f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int* does_rename_; 43f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch }; 44f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 45f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 46f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstruct Derived : public C { 47f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch using C::flag_field_; 48f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch using C::field_mentioning_http_and_https_; 49f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 50f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 51f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochint C::instance_count_ = 0; 52f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 53f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Structs are like classes. 54f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstruct S { 55f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int integer_field_; 56f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int wants_rename; 57f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int google_style_already; 58f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 59f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 60f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Unions also use struct-style naming. 61f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochunion U { 62f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch char four_chars[4]; 63f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch short two_shorts[2]; 64f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int one_hopefully_four_byte_int; 65f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int has_prefix_; 66f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 67f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 68f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// https://crbug.com/640749#c1: Some type traits are inside blink namespace. 69f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstruct IsGarbageCollectedMixin { 70f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const bool value = true; 71f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 72f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 73f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} // namespace blink 74f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 75f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochnamespace WTF { 76f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 77f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// We don't want to capitalize fields in type traits 78f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// (i.e. the |value| -> |kValue| rename is undesirable below). 79f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstruct TypeTrait1 { 80f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const bool value = true; 81f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 82f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 83f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Some type traits are implemented as classes, not structs 84f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// (e.g. WTF::IsGarbageCollectedType or WTF::IsAssignable). 85f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// We should not perform a |value| -> |kValue| rename in the type trait below. 86f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtemplate <typename T> 87f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass TypeTrait2 { 88f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 89f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const bool value = false; 90f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 91f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtemplate <> 92f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass TypeTrait2<void> { 93f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 94f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const bool value = false; 95f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 96f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 97f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Some type traits have static methods. We should not perform 98f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// a |value| -> |kValue| rename in the type trait below. 99f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtemplate <typename T, typename U> 100f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstruct IsSubclass { 101f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch private: 102f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch typedef char YesType; 103f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch struct NoType { 104f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch char padding[8]; 105f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch }; 106f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 107f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static YesType SubclassCheck(U*); 108f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static NoType SubclassCheck(...); 109f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static T* t_; 110f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 111f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 112f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const bool value = sizeof(SubclassCheck(t_)) == sizeof(YesType); 113f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 114f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 115f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Some type traits have deleted instance methods. We should not perform 116f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// a |value| -> |kValue| rename in the type trait below. 117f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtemplate <typename U = void> 118f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstruct IsTraceableInCollection { 119f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Expanded from STATIC_ONLY(IsTraceableInCollection) macro: 120f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch private: 121f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IsTraceableInCollection() = delete; 122f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IsTraceableInCollection(const IsTraceableInCollection&) = delete; 123f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IsTraceableInCollection& operator=(const IsTraceableInCollection&) = delete; 124f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void* operator new(unsigned long) = delete; 125f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void* operator new(unsigned long, void*) = delete; 126f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 127f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 128f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const bool value = true; 129f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 130f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 131f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Some type traits have a non-boolean value. 132f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochenum LifetimeManagementType { 133f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kRefCountedLifetime, 134f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kGarbageCollectedLifetime, 135f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 136f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtemplate <typename T> 137f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstruct LifetimeOf { 138f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch private: 139f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Okay to rename |isGarbageCollected| to |kIsGarbageCollected|. 140f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const bool kIsGarbageCollected = true; 141f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 142f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 143f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Expecting no rename of |value|. 144f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const LifetimeManagementType value = 145f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch !kIsGarbageCollected ? kRefCountedLifetime : kGarbageCollectedLifetime; 146f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 147f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 14862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate <typename T> 14962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochstruct GenericHashTraitsBase { 15062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // We don't want to capitalize fields in type traits 15162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // (i.e. the |value| -> |kValue| rename is undesirable below). 15262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // This problem is prevented by IsCallee heuristic. 15362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kWeakHandlingFlag = TypeTrait2<T>::value ? 123 : 456; 15462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 15562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 15662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate <int Format> 15762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochstruct IntermediateFormat { 15862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Some type traits have int type. Example below is loosely based on 15962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // third_party/WebKit/Source/platform/graphics/gpu/WebGLImageConversion.cpp 16062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int value = (Format == 123) ? 456 : 789; 16162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 16262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 163f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; // namespace WTF 164f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 165f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid F() { 166f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Test that references to a static field are correctly rewritten. 167f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch blink::C::instance_count_++; 168f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Force instantiation of a copy constructor for blink::C to make sure field 169f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // initializers for synthesized functions don't cause weird rewrites. 170f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch blink::C c; 171f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch blink::C c2 = c; 172f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 173f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool b1 = WTF::TypeTrait1::value; 174f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool b2 = WTF::TypeTrait2<void>::value; 175f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 176