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