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