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