• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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