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() : m_flagField(~0), m_fieldMentioningHTTPAndHTTPS(1), m_shouldRename(0) {}
14 
method()15   int method() {
16     // Test that references to fields are updated correctly.
17     return instanceCount + m_flagField + m_fieldMentioningHTTPAndHTTPS;
18   }
19 
20   // Test that a field without a m_ prefix is correctly renamed.
21   static int instanceCount;
22 
23  protected:
24   // Test that a field with a m_ prefix is correctly renamed.
25   const int m_flagField;
26   // Statics should be named with s_, but make sure s_ and m_ are both correctly
27   // stripped.
28   static int s_staticCount;
29   static int m_staticCountWithBadName;
30   // Make sure that acronyms don't confuse the underscore inserter.
31   int m_fieldMentioningHTTPAndHTTPS;
32   // Already Google style, should not change.
33   int already_google_style_;
34 
35   union {
36     // Anonymous union members should be renamed, as should contructor
37     // initializers of them.
38     char* m_shouldRename;
39     int* m_doesRename;
40   };
41 };
42 
43 struct Derived : public C {
44   using C::m_flagField;
45   using C::m_fieldMentioningHTTPAndHTTPS;
46 };
47 
48 int C::instanceCount = 0;
49 
50 // Structs are like classes.
51 struct S {
52   int m_integerField;
53   int wantsRename;
54   int google_style_already;
55 };
56 
57 // Unions also use struct-style naming.
58 union U {
59   char fourChars[4];
60   short twoShorts[2];
61   int one_hopefully_four_byte_int;
62   int m_hasPrefix;
63 };
64 
65 // https://crbug.com/640749#c1: Some type traits are inside blink namespace.
66 struct IsGarbageCollectedMixin {
67   static const bool value = true;
68 };
69 
70 }  // namespace blink
71 
72 namespace WTF {
73 
74 // We don't want to capitalize fields in type traits
75 // (i.e. the |value| -> |kValue| rename is undesirable below).
76 struct TypeTrait1 {
77   static const bool value = true;
78 };
79 
80 // Some type traits are implemented as classes, not structs
81 // (e.g. WTF::IsGarbageCollectedType or WTF::IsAssignable).
82 // We should not perform a |value| -> |kValue| rename in the type trait below.
83 template <typename T>
84 class TypeTrait2 {
85  public:
86   static const bool value = false;
87 };
88 template <>
89 class TypeTrait2<void> {
90  public:
91   static const bool value = false;
92 };
93 
94 // Some type traits have static methods.  We should not perform
95 // a |value| -> |kValue| rename in the type trait below.
96 template <typename T, typename U>
97 struct IsSubclass {
98  private:
99   typedef char YesType;
100   struct NoType {
101     char padding[8];
102   };
103 
104   static YesType subclassCheck(U*);
105   static NoType subclassCheck(...);
106   static T* t;
107 
108  public:
109   static const bool value = sizeof(subclassCheck(t)) == sizeof(YesType);
110 };
111 
112 // Some type traits have deleted instance methods.  We should not perform
113 // a |value| -> |kValue| rename in the type trait below.
114 template <typename U = void>
115 struct IsTraceableInCollection {
116   // Expanded from STATIC_ONLY(IsTraceableInCollection) macro:
117  private:
118   IsTraceableInCollection() = delete;
119   IsTraceableInCollection(const IsTraceableInCollection&) = delete;
120   IsTraceableInCollection& operator=(const IsTraceableInCollection&) = delete;
121   void* operator new(unsigned long) = delete;
122   void* operator new(unsigned long, void*) = delete;
123 
124  public:
125   static const bool value = true;
126 };
127 
128 // Some type traits have a non-boolean value.
129 enum LifetimeManagementType {
130   RefCountedLifetime,
131   GarbageCollectedLifetime,
132 };
133 template <typename T>
134 struct LifetimeOf {
135  private:
136   // Okay to rename |isGarbageCollected| to |kIsGarbageCollected|.
137   static const bool isGarbageCollected = true;
138 
139  public:
140   // Expecting no rename of |value|.
141   static const LifetimeManagementType value =
142       !isGarbageCollected ? RefCountedLifetime : GarbageCollectedLifetime;
143 };
144 
145 };  // namespace WTF
146 
F()147 void F() {
148   // Test that references to a static field are correctly rewritten.
149   blink::C::instanceCount++;
150   // Force instantiation of a copy constructor for blink::C to make sure field
151   // initializers for synthesized functions don't cause weird rewrites.
152   blink::C c;
153   blink::C c2 = c;
154 
155   bool b1 = WTF::TypeTrait1::value;
156   bool b2 = WTF::TypeTrait2<void>::value;
157 }
158