-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathRename.cpp
More file actions
763 lines (681 loc) · 16.4 KB
/
Rename.cpp
File metadata and controls
763 lines (681 loc) · 16.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
#include "Rename.h"
#include "Require.h"
#include <stdexcept>
#include <string>
// Renames a local variable, function, method, field, property, parameter,
// type, namespace, active CSS style, C++ global variable or C++ macro and
// updates all references to the modified element.
// #TEST#: R1 Rename this macro
#define MACRO_NO_ARGS 3.14159f
// #TEST#: R2 Rename the macro argument x_ from declaration
// #TEST#: R3 =R2 Rename the macro argument x_ from usage
// #TEST#: R4 Rename this macro
#define MACRO_ONE_ARG(x_) (2.0f * x_)
class Operations
{
public:
int Operation1()
{
return 1;
}
int Operation2()
{
return 2;
}
};
// #TEST#: R5 Rename this class, but class in Rename2.cpp shouldn't be renamed
class Rename1
{
public:
// #TEST#: R6 =R5 Rename this class via its c'tor
Rename1() : x()
{
}
// #TEST#: R7 =R5 Rename this class via its d'tor
~Rename1()
{
}
// #TEST#: R8 =R5 Rename this class via typedef
// #TEST#: R9 Rename typedef MyClass
typedef Rename1 MyClass;
// #TEST#: R10 Rename this method
void Operation()
{
}
int x;
};
// #TEST#: R11 Rename this namespace
namespace X
{
// #TEST#: R12 rename this variable
int x = 0;
// #TEST#: R13 rename this variable
static int y = 1;
// #TEST#: R14 rename this class
class Rename1
{
public:
Rename1() : _y(0)
{
}
// #TEST#: R15 rename this method
int Operation()
{
return 0;
}
private:
void Method()
{
int _y = -4;
// #TEST#: R16 rename _y, which shadows member _y
_y = 6;
}
int _y;
};
} // namespace X
// #TEST#: R17 rename this namespace
namespace Y
{
// #TEST#: R18 rename this variable
int x = 0;
class X
{
public:
X()
{
}
~X()
{
}
void Operation()
{
}
};
} // namespace Y
union U
{
int x;
float f;
double d;
const char *s;
void member(int x_)
{
x = x_;
}
float member() const
{
// #TEST#: R19 Rename data member f
return f;
}
};
struct SU
{
int kind;
union
{
int x;
float f;
double d;
const char *s;
};
float member() const
{
return f;
}
void member(int x_)
{
x = x_;
}
};
// #TEST#: R20 Rename class Operations
// #TEST#: R21 Rename function GetOperation
// #TEST#: R22 Rename parameter flag
static int (Operations::*GetOperation(bool flag))()
{
// #TEST#: R23 Rename class Operations
// #TEST#: R24 Rename variable result
// #TEST#: R25 Rename member Operation1
int (Operations::*result)() = &Operations::Operation1;
// #TEST#: R26 Rename variable flag
if (flag)
{
// #TEST#: R27 Rename variable result
// #TEST#: R28 Rename class Operations
// #TEST#: R29 Rename method Operation2
result = &Operations::Operation2;
}
// #TEST#: R30 Rename variable result
return result;
}
// #TEST#: R31 Rename namespace RenameNamespace
namespace RenameNamespace
{
// #TEST#: R32 Rename scoped member Renamed.
int Renamed = 0;
class Base
{
public:
virtual ~Base()
{
}
// #TEST#: R33 Rename virtual method
virtual Base *Operation() = 0;
};
class Derived1 : public virtual Base
{
public:
virtual ~Derived1()
{
}
// #TEST#: R34 Rename virtual method
virtual Base *Operation()
{
return this;
}
};
class Derived2 : public virtual Derived1
{
public:
virtual ~Derived2()
{
}
// #TEST#: R35 Rename virtual method
virtual Base *Operation()
{
return this;
}
};
void TestDerived()
{
Derived2 d;
// #TEST#: R36 Rename virtual method
d.Operation();
}
} // namespace RenameNamespace
// #TEST#: R37 Rename macro MACRO1
#define MACRO1 -20
// #TEST#: R38 Rename macro MACRO1
#if defined(MACRO1)
// #TEST#: R39 Rename macro MACRO1
static int s_macro_value = MACRO1;
#else
static int s_macro_value = -20;
#endif
// #TEST#: R40 Rename macro MACRO1
#undef MACRO1
// #TEST#: R41 Rename macro MACRO2
#define MACRO2(x_) (-20 * x_)
// #TEST#: R42 Rename macro MACRO2
#ifdef MACRO2
// #TEST#: R43 Rename macro MACRO2
static int s_macro_value2 = MACRO2(2);
#else
static int s_macro_value2 = -40;
#endif
// #TEST#: R44 Rename macro MACRO2
#undef MACRO2
// #TEST#: R45 Rename namespace RenameNamespace
using namespace RenameNamespace;
namespace
{
// #TEST#: R46 Rename T
template <typename T>
// #TEST#: R47 Rename T return type
// #TEST#: R48 Rename f1_aux
// #TEST#: R49 Rename T first parameter type
// #TEST#: R50 Rename value
// #TEST#: R51 Rename T second parameter type
// #TEST#: R52 Rename x
T f1_aux(T value, T x = 1)
{
// #TEST#: R53 Rename value
// #TEST#: R54 Rename x
return value + x;
}
void f1()
{
// #TEST#: R55 Rename f1_aux
require_equal(1, f1_aux(0));
// #TEST#: R56 Rename f1_aux
require_equal(std::string{"hello world!"}, f1_aux(std::string{"hello "}, std::string{"world!"}));
// #TEST#: R57 Rename f1_aux
require_equal(2.0, f1_aux(1.0));
// #TEST#: R58 Rename f1_aux
require_equal(7.0f, f1_aux<float>(6));
}
// #TEST#: R59 Rename namespace F2Outer
namespace F2Outer
{
// #TEST#: R60 Rename namespace F2Inner
namespace F2Inner
{
// #TEST#: R61 Rename function f2_aux
int f2_aux()
{
return 1;
}
} // namespace F2Inner
} // namespace F2Outer
void f2_aux2()
{
// #TEST#: R62 Rename namespace F2Outer
// #TEST#: R63 Rename namespace F2Inner
// #TEST#: R64 Rename function f2_aux
require_equal(1, F2Outer::F2Inner::f2_aux());
}
void f2_aux3()
{
// #TEST#: R65 Rename namespace F2Outer
using namespace F2Outer;
// #TEST#: R66 Rename namespace F2Inner
// #TEST#: R67 Rename function f2_aux
require_equal(1, F2Inner::f2_aux());
}
void f2_aux4()
{
// #TEST#: R68 Rename namespace F2Outer
// #TEST#: R69 Rename namespace F2Inner
using namespace F2Outer::F2Inner;
// #TEST#: R70 Rename function f2_aux
require_equal(1, f2_aux());
}
void f2_aux5()
{
// #TEST#: R71 Rename namespace A
// #TEST#: R72 Rename namespace F2Outer
namespace A = F2Outer;
// #TEST#: R73 Rename namespace A
// #TEST#: R74 Rename namespace F2Inner
// #TEST#: R75 Rename function f2_aux
require_equal(1, A::F2Inner::f2_aux());
}
void f2_aux6()
{
// #TEST#: R76 Rename namespace A
// #TEST#: R77 Rename namespace F2Outer
// #TEST#: R78 Rename namespace F2Inner
namespace A = F2Outer::F2Inner;
// #TEST#: R79 Rename namespace A
// #TEST#: R80 Rename function f2_aux
require_equal(1, A::f2_aux());
}
void f2_aux7()
{
// #TEST#: R81 Rename namespace A
// #TEST#: R82 Rename namespace F2Outer
// #TEST#: R83 Rename namespace F2Inner
namespace A = F2Outer::F2Inner;
// #TEST#: R84 Rename namespace A
using namespace A;
// #TEST#: R85 Rename function f2_aux
require_equal(1, f2_aux());
}
void f2()
{
f2_aux2();
f2_aux3();
f2_aux4();
f2_aux5();
f2_aux6();
f2_aux7();
}
// #TEST#: R86 Rename T3
class T3
{
public:
// #TEST#: R87 Rename T3
// #TEST#: R88 Rename i3
T3(int i) : i3(i)
{
}
// #TEST#: R89 Rename i3
int i3;
};
// #TEST#: R90 Rename i3
int i3 = 3;
// #TEST#: R91 Rename T3
// #TEST#: R92 Rename i3
template <class T3, int i3>
// #TEST#: R93 Rename f3_aux
// #TEST#: R94 Rename T3
// #TEST#: R95 Rename t
int f3_aux(T3 t)
{
// #TEST#: R96 Rename T3
// #TEST#: R97 Rename t1
// #TEST#: R98 Rename t
T3 t1 = t;
// #TEST#: R99 Rename i3
require_equal(2, t1.i3);
// #TEST#: R100 Rename i3
require_equal(1, i3);
// #TEST#: R101 Rename T3
// #TEST#: R102 Rename t2
// #TEST#: R103 Rename i3
::T3 t2 = ::i3;
// #TEST#: R104 Rename i3
require_equal(3, ::i3);
// #TEST#: R105 Rename t2
// #TEST#: R106 Rename i3
return t2.i3;
}
void f3()
{
// #TEST#: R107 Rename f3_aux
// #TEST#: R108 Rename T3 template argument
// #TEST#: R109 Rename T3 function argument expression
require_equal(3, f3_aux<T3, 1>(T3{2}));
}
// #TEST#: R110 Rename T
template <class T>
// #TEST#: R111 Rename F4
class F4;
template <>
// #TEST#: R112 Rename F4
class F4<int>
{
public:
// #TEST#: R113 Rename type
using type = unsigned int;
// #TEST#: R114 Rename x
unsigned int x = 4;
};
template <>
// #TEST#: R115 Rename F4
class F4<float>
{
public:
// #TEST#: R116 Rename type
using type = double;
// #TEST#: R117 Rename x
double x = 10.5;
};
void f4()
{
// #TEST#: R118 Rename F4
// #TEST#: R119 Rename x
require_equal(4U, F4<int>().x);
// #TEST#: R120 Rename F4
// #TEST#: R121 Rename type
require_equal(true, std::is_same<F4<int>::type, unsigned int>::value);
// #TEST#: R122 Rename F4
// #TEST#: R123 Rename x
require_equal(10.5, F4<float>().x);
// #TEST#: R124 Rename F4
// #TEST#: R125 Rename type
require_equal(true, std::is_same<F4<float>::type, double>::value);
}
// #TEST#: R126 Rename T
template <typename T>
// #TEST#: R127 Rename F5
class F5
{
public:
// #TEST#: R128 Rename type
// #TEST#: R129 Rename T
using type = T;
// #TEST#: R130 Rename T in declaration
// #TEST#: R131 Rename x
// #TEST#: R132 Rename T in initializer
T x = T(3);
};
template <>
// #TEST#: R133 Rename F5
class F5<int>
{
public:
// #TEST#: R134 Rename type
using type = unsigned int;
// #TEST#: R135 Rename x
unsigned int x = 4;
};
void f5()
{
// #TEST#: R136 Rename F5
// #TEST#: R137 Rename x
require_equal('\3', F5<char>().x);
// #TEST#: R138 Rename F5
// #TEST#: R139 Rename type
require_equal(true, std::is_same<char, F5<char>::type>::value);
// #TEST#: R140 Rename F5
// #TEST#: R141 Rename x
require_equal(4U, F5<int>().x);
// #TEST#: R142 Rename F5
// #TEST#: R143 Rename type
require_equal(true, std::is_same<F5<int>::type, unsigned int>::value);
}
struct F6
{
// #TEST#: R144 Rename T
// #TEST#: R145 Rename U
template <typename T, typename U>
// #TEST#: R146 Rename f
// #TEST#: R147 Rename T parameter x type
// #TEST#: R148 Rename x parameter
// #TEST#: R149 Rename U parameter y type
// #TEST#: R150 Rename y parameter
// #TEST#: R151 Rename x in decltype expression
// #TEST#: R152 Rename y in decltype expression
auto f(T x, U y) -> decltype(x + y)
{
// #TEST#: R153 Rename count
++count;
// #TEST#: R154 Rename x
// #TEST#: R155 Rename y
return x + y;
}
// #TEST#: R156 Rename T
// #TEST#: R157 Rename U
template <typename T, typename U>
// #TEST#: R158 Rename g
// #TEST#: R159 Rename T in decltype expression
// #TEST#: R160 Rename U in decltype expression
// #TEST#: R161 Rename T parameter x type
// #TEST#: R162 Rename x parameter
// #TEST#: R163 Rename U parameter y type
// #TEST#: R164 Rename y parameter
decltype(T() + U()) g(T x, U y)
{
// #TEST#: R165 Rename count
++count;
// #TEST#: R166 Rename x
// #TEST#: R167 Rename y
return x + y;
}
// #TEST#: R168 Rename count
int count = 0;
};
void f6()
{
F6 x;
// #TEST#: R169 Rename method f
require_equal(3.0, x.f(1, 2.0));
// #TEST#: R170 Rename method f
require_equal(std::string{"foobar"}, x.f(std::string{"foo"}, "bar"));
// #TEST#: R171 Rename count
require_equal(2, x.count);
// #TEST#: R172 Rename method g
require_equal(3.0, x.g(1.0, 2));
// #TEST#: R173 Rename method g
require_equal(std::string{"foobar"}, x.g("foo", std::string{"bar"}));
// #TEST#: R174 Rename count
require_equal(4, x.count);
}
// #TEST#: R175 Rename F7Base
struct F7Base
{
// #TEST#: R176 Rename x
static int x;
};
// #TEST#: R177 Rename F7Base
// #TEST#: R178 Rename x
int F7Base::x = 7;
// #TEST#: R179 Rename F7Derived
// #TEST#: R180 Rename F7Base
struct F7Derived : F7Base
{
};
void f7()
{
// #TEST#: R181 Rename p
// #TEST#: R182 Rename F7Base
// #TEST#: R183 Rename x
int &p = F7Base::x;
// #TEST#: R184 Rename q
// #TEST#: R185 Rename F7Derived
// #TEST#: R186 Rename x
int &q = F7Derived::x;
// #TEST#: R187 Rename p
require_equal(7, p);
// #TEST#: R188 Rename q
require_equal(7, q);
}
} // namespace
void TestRename()
{
U u;
u.x = 1;
u.f = 1.0f;
u.d = 1.0;
u.s = "Foo";
u.member(2);
float uf = u.member();
SU su;
// #TEST#: R189 Rename anonymous union member
su.x = 1;
su.f = 1.0f;
su.d = 1.0;
su.s = "Bar";
su.member(2);
uf = su.member();
// #TEST#: R190 Rename MyClass
// #TEST#: R191 =R5 Rename Rename1 from scope qualifier
Rename1::MyClass myClass;
myClass.Operation();
// #TEST#: R192 Rename this variable
Rename1 test;
// #TEST#: R193 Rename this method
test.Operation();
// #TEST#: R194 Rename this function
TestRename1();
{
using Y::X;
X xFoo;
xFoo.Operation();
}
// #TEST#: R195 Rename the namespace X
// #TEST#: R196 Rename the class Rename1
// #TEST#: R197 Rename the variable test2
X::Rename1 test2;
// #TEST#: R198 rename the variable y
// #TEST#: R199 rename the variable test2
// #TEST#: R200 rename the method Operation
// #TEST#: R201 rename the namespace X
// #TEST#: R202 rename the variable X::x
// #TEST#: R203 rename the variable X::y
// #TEST#: R204 rename the variable Y::x
int y = test2.Operation() + X::x + X::y + Y::x;
float x = MACRO_NO_ARGS;
x = MACRO_ONE_ARG(2.0f);
{
// #TEST#: R205 Rename the namespace X
// #TEST#: R206 Rename the variable X::y
using X::y;
// #TEST#: R207 Rename y, which is really X::y
y = -1;
}
y = 3;
{
int y = 3;
// #TEST#: R208 Rename y, which shadows outer scope y
y = 4;
if (y != 4)
{
throw std::runtime_error("R30 may have failed");
}
}
if (y != 3)
{
throw std::runtime_error("R30 may have failed");
}
// #TEST#: R209 Rename the variable y
y++;
using X::Rename1;
Rename1 fromX;
fromX.Operation();
// #TEST#: R210 Rename class Operations
// #TEST#: R211 Rename variable member
// #TEST#: R212 Rename function GetOperation
int (Operations::*member)() = GetOperation(true);
// #TEST#: R213 Rename variable member
// #TEST#: R214 Rename class Operations
// #TEST#: R215 Rename method Operation2
member = &Operations::Operation2;
// #TEST#: R216 Rename class Operations
// #TEST#: R217 Rename variable ops
Operations ops;
// #TEST#: R218 Rename variable ops
// #TEST#: R219 Rename variable member
(ops.*member)();
// #TEST#: R220 Rename variable ops2
Operations *ops2 = new Operations();
// #TEST#: R221 Rename variable ops2
// #TEST#: R222 Rename variable member
(ops2->*member)();
// #TEST#: R223 Rename variable ops2
delete ops2;
// #TEST#: R224 Rename variable ops3
Operations &ops3 = ops;
// #TEST#: R225 Rename variable ops3
// #TEST#: R226 Rename variable member
((&ops3)->*member)();
int x1 = Renamed;
TestDerived();
int loop = 0;
// #TEST#: R227 Rename label
restart:
loop++;
if (loop < 5)
{
// #TEST#: R228 Rename label
goto restart;
}
REQUIRE_EQUAL(5, loop);
{
// #TEST#: R229 Rename variable abstract
int abstract = 1;
// #TEST#: R230 Rename variable array
int array = abstract + 1;
// #TEST#: R231 Rename variable delegate
int delegate = array + 1;
// #TEST#: R232 Rename variable event
int event = delegate + 1;
// #TEST#: R233 Rename variable gcnew
int gcnew = event + 1;
// #TEST#: R234 Rename variable interface
int interface = gcnew + 1;
// #TEST#: R235 Rename variable internal
int internal = interface + 1;
// #TEST#: R236 Rename variable override
int override = internal + 1;
// #TEST#: R237 Rename variable pin_ptr
int pin_ptr = override + 1;
// #TEST#: R238 Rename variable property
int property = pin_ptr + 1;
// #TEST#: R239 Rename variable safe_cast
int safe_cast = property + 1;
// #TEST#: R240 Rename variable sealed
int sealed = safe_cast + 1;
int x = sealed + 1;
std::string dashes;
dashes.append(x, '-');
REQUIRE_EQUAL(std::string("-------------"), dashes);
}
f1();
f2();
f3();
f4();
f5();
f6();
f7();
}