Completed
Push — feature/Wsystem-headers ( a5aaa2...3038ff )
by srz
255:51 queued 210:01
created

iuwandbox_pp.WandboxPreprocessor.rename_macros()   D

Complexity

Conditions 13

Size

Total Lines 33
Code Lines 32

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 13
eloc 32
nop 2
dl 0
loc 33
rs 4.2
c 0
b 0
f 0

How to fix   Complexity   

Complexity

Complex classes like iuwandbox_pp.WandboxPreprocessor.rename_macros() often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
#!/usr/bin/env python
2
#
3
# iuwandbox_pp.py
4
#
5
# Copyright (C) 2018, Takazumi Shirayanagi
6
# This software is released under the new BSD License,
7
# see LICENSE
8
#
9
10
import os
11
import sys
12
import codecs
13
import re
14
import collections
15
from iutest_pp_strip import IutestPreprocessor
16
17
predefined_macros = {
18
    '__WANDBOX__': '1',
19
    'NULL': '0',
20
    'IUTEST_USE_GTEST': None,
21
    'IUTEST_BUILD_DOXYGEN': None,
22
    '_IUTEST_DEBUG': None,
23
    '__CYGWIN__': None,
24
    'IUTEST_OS_CYGWIN': None,
25
    '__MINGW__': None,
26
    '__MINGW32__': None,
27
    '__MINGW64__': None,
28
    '__linux__': '1',
29
    '__arm__': None,
30
    'IUTEST_OS_ARM': None,
31
    '__ARMCC_VERSION': None,
32
    '__AVR32__': None,
33
    '__avr32__': None,
34
    'IUTEST_OS_AVR32': None,
35
    'ANDROID': None,
36
    '__ANDROID__': None,
37
    'IUTEST_OS_LINUX_ANDROID': None,
38
    '__APPLE__': None,
39
    'IUTEST_OS_IOS': None,
40
    'IUTEST_OS_MAC': None,
41
    '__INTEL_COMPILER': None,
42
    '__BORLANDC__': None,
43
    '__CUDACC__': None,
44
    '__IBMCPP__': None,
45
    'COMPILER_ICC': None,
46
    '_MSC_VER': None,
47
    '_MSC_FULL_VER': None,
48
    '_MSVC_LANG': None,
49
    '_WIN32': None,
50
    'WIN32': None,
51
    '__WIN32__': None,
52
    'UNICODE': None,
53
    'WINAPI_FAMILY': None,
54
    '__AFX_H__': None,
55
    '__MWERKS__': None,
56
    '__FreeBSD__': None,
57
    'sun': None,
58
    '__sun': None,
59
    '__MAC_OS_X_VERSION_MIN_REQUIRED': None,
60
    '_STLPORT_VERSION': None,
61
    '_BSD_SOURCE': None,
62
    '__USE_MINGW_ANSI_STDIO': None,
63
    'MAX_PATH': None,
64
    'PATH_MAX': None,
65
    'IUTEST_OS_WINDOWS': None,
66
    'IUTEST_OS_WINDOWS_MINGW': None,
67
    'IUTEST_OS_WINDOWS_MOBILE': None,
68
    'IUTEST_OS_WINDOWS_PHONE': None,
69
    'IUTEST_OS_WINDOWS_RT': None,
70
    'IUTEST_OS_WINDOWS_WINE': None,
71
    'IUTEST_NO_UTIL_ASSERTION_GTEST_COMPATIBLE': '1',
72
    'IUTEST_NO_TWO_PHASE_NAME_LOOKUP': None,
73
    'IUTEST_NO_FUNCTION_TEMPLATE_ORDERING': None,
74
    'IUTEST_NO_INCLASS_MEMBER_INITIALIZATION': None,
75
    'IUTEST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS': None,
76
    'IUTEST_NO_SFINAE': None,
77
    'IUTEST_NO_TEMPLATE_PARTIAL_SPECIALIZATION': None,
78
    'IUTEST_NO_TEMPLATE_TEMPLATES': None,
79
    'IUTEST_NO_VOID_RETURNS': None,
80
    'IUTEST_NO_ARGUMENT_DEPENDENT_LOOKUP': None,
81
    'IUTEST_NO_PRIVATE_IN_AGGREGATE': None,
82
    'IUTEST_NO_VARIADIC_MACROS': None,
83
    'IUTEST_NO_UNITEST_AD_HOC_TEST_RESULT_ACCESSOR': None,
84
    'IUTEST_NO_TESTCASE_AD_HOC_TEST_RESULT_ACCESSOR': None,
85
    'IUTEST_NO_LAMBDA_SCOPE_RESOLUTION': None,
86
    'IUTEST_NO_GETENV': None,
87
    'IUTEST_NO_PUTENV': None,
88
    'IUTEST_NO_SETENV': None,
89
    'IUTEST_NO_GETCWD': None,
90
    'IUTEST_NOT_SUPPORT_STOPWATCH': None,
91
    'IUTEST_HAS_CXX_HDR_CHARCONV': '0',
92
    'IUTEST_HAS_WANT_SECURE_LIB': '0',
93
    'IUTEST_HAS_MS_EXTENSIONS': '0',
94
    'IUTEST_HAS_MS_CXX_MODULE': '0',
95
    'IUTEST_HAS_CATCH_SEH_EXCEPTION_ASSERTION': '0',
96
    'MS_CPP_UNITTESTFRAMEWORK': None,
97
    'IUTEST_EXPLICIT_INSTANTIATION_ACCESS_PRIVATE_MEMBER_FUNCTION': '1',
98
    'IUTEST_EXPLICIT_INSTANTIATION_ACCESS_PRIVATE_STATIC_MEMBER_FUNCTION': '1',
99
    '__native_client__': None,
100
    'IUTEST_OS_NACL': None,
101
    'IUTEST_HAS_INVALID_PARAMETER_HANDLER': '0',
102
    '__clang_analyzer__': None,
103
    'IUTEST_ANALYSIS_ASSUME_DELEGATE': None,
104
    'IUTEST_MBS_CODE': '0',
105
    'IUTEST_USE_EXTERNAL_STD_TUPLE': '0',
106
    'IUTEST_USE_EXTERNAL_TR1_TUPLE': '0',
107
    'IUTEST_USE_CXX_FILESYSTEM': '0',
108
    'IUTEST_CXX_NOEXCEPT': 'unused',
109
    'IUTEST_CXX_NOEXCEPT_AS': 'unused',
110
    'IUTEST_CXX_NOTHROW': 'unused',
111
    'IUTEST_PRAGMA_WARN_DISABLE_EMPTY_BODY': 'unused',
112
    'IUTEST_PRAGMA_WARN_FORMAT_NONLITERAL': 'unused',
113
    'IUTEST_PRAGMA_WARN_CXX14_CONSTEXPR_NOT_IMPLY_CONST': 'unused',
114
    'IUTEST_MAKE_ASSERTIONRESULT_': 'unused',
115
    # no overridable
116
    'IUTEST_SUCCEED': None,
117
    'IUTEST_FAIL': None,
118
    'IUTEST_ADD_FAILURE': None,
119
    'IUTEST_ADD_FAILURE_AT': None,
120
    'IUTEST_SKIP': None,
121
    'IUTEST_ASSERT': None,
122
    'IUTEST_ASSERT_NOT': None,
123
    'IUTEST_ASSERT_THAT': None,
124
    'IUTEST_ASSERT_EQ': None,
125
    'IUTEST_ASSERT_ALMOST_EQ': None,
126
    'IUTEST_ASSERT_NE': None,
127
    'IUTEST_ASSERT_LT': None,
128
    'IUTEST_ASSERT_LE': None,
129
    'IUTEST_ASSERT_GT': None,
130
    'IUTEST_ASSERT_GE': None,
131
    'IUTEST_ASSERT_TRUE': None,
132
    'IUTEST_ASSERT_FALSE': None,
133
    'IUTEST_ASSERT_NULL': None,
134
    'IUTEST_ASSERT_NOTNULL': None,
135
    'IUTEST_ASSERT_SAME': None,
136
    'IUTEST_ASSERT_FLOAT_EQ': None,
137
    'IUTEST_ASSERT_DOUBLE_EQ': None,
138
    'IUTEST_ASSERT_LONG_DOUBLE_EQ': None,
139
    'IUTEST_ASSERT_NEAR': None,
140
    'IUTEST_ASSERT_STREQ': None,
141
    'IUTEST_ASSERT_STRNE': None,
142
    'IUTEST_ASSERT_STRCASEEQ': None,
143
    'IUTEST_ASSERT_STRCASENE': None,
144
    'IUTEST_ASSERT_THROW': None,
145
    'IUTEST_ASSERT_THROW_VALUE_EQ': None,
146
    'IUTEST_ASSERT_THROW_VALUE_NE': None,
147
    'IUTEST_ASSERT_THROW_VALUE_STREQ': None,
148
    'IUTEST_ASSERT_THROW_VALUE_STRCASEEQ': None,
149
    'IUTEST_ASSERT_ANY_THROW': None,
150
    'IUTEST_ASSERT_NO_THROW': None,
151
    'IUTEST_ASSERT_NO_FAILURE': None,
152
    'IUTEST_ASSERT_NO_FATAL_FAILURE': None,
153
    'IUTEST_ASSERT_FAIL': None,
154
    'IUTEST_ASSERT_EQ_COLLECTIONS': None,
155
    'IUTEST_ASSERT_NE_COLLECTIONS': None,
156
    'IUTEST_ASSERT_EQ_RANGE': None,
157
    'IUTEST_ASSERT_NE_RANGE': None,
158
    'IUTEST_ASSERT_STRLNEQ': None,
159
    'IUTEST_ASSERT_STRIN': None,
160
    'IUTEST_ASSERT_STRNOTIN': None,
161
    'IUTEST_ASSERT_MATCHES_REGEXEQ': None,
162
    'IUTEST_ASSERT_MATCHES_REGEXNE': None,
163
    'IUTEST_ASSERT_CONTAINS_REGEXEQ': None,
164
    'IUTEST_ASSERT_CONTAINS_REGEXNE': None,
165
    'IUTEST_EXPECT': None,
166
    'IUTEST_EXPECT_NOT': None,
167
    'IUTEST_EXPECT_THAT': None,
168
    'IUTEST_EXPECT_EQ': None,
169
    'IUTEST_EXPECT_ALMOST_EQ': None,
170
    'IUTEST_EXPECT_NE': None,
171
    'IUTEST_EXPECT_LT': None,
172
    'IUTEST_EXPECT_LE': None,
173
    'IUTEST_EXPECT_GT': None,
174
    'IUTEST_EXPECT_GE': None,
175
    'IUTEST_EXPECT_TRUE': None,
176
    'IUTEST_EXPECT_FALSE': None,
177
    'IUTEST_EXPECT_NULL': None,
178
    'IUTEST_EXPECT_NOTNULL': None,
179
    'IUTEST_EXPECT_SAME': None,
180
    'IUTEST_EXPECT_FLOAT_EQ': None,
181
    'IUTEST_EXPECT_DOUBLE_EQ': None,
182
    'IUTEST_EXPECT_LONG_DOUBLE_EQ': None,
183
    'IUTEST_EXPECT_NEAR': None,
184
    'IUTEST_EXPECT_STREQ': None,
185
    'IUTEST_EXPECT_STRNE': None,
186
    'IUTEST_EXPECT_STRCASEEQ': None,
187
    'IUTEST_EXPECT_STRCASENE': None,
188
    'IUTEST_EXPECT_THROW': None,
189
    'IUTEST_EXPECT_THROW_VALUE_EQ': None,
190
    'IUTEST_EXPECT_THROW_VALUE_NE': None,
191
    'IUTEST_EXPECT_THROW_VALUE_STREQ': None,
192
    'IUTEST_EXPECT_THROW_VALUE_STRCASEEQ': None,
193
    'IUTEST_EXPECT_ANY_THROW': None,
194
    'IUTEST_EXPECT_NO_THROW': None,
195
    'IUTEST_EXPECT_NO_FAILURE': None,
196
    'IUTEST_EXPECT_NO_FATAL_FAILURE': None,
197
    'IUTEST_EXPECT_FAIL': None,
198
    'IUTEST_EXPECT_EQ_COLLECTIONS': None,
199
    'IUTEST_EXPECT_NE_COLLECTIONS': None,
200
    'IUTEST_EXPECT_EQ_RANGE': None,
201
    'IUTEST_EXPECT_NE_RANGE': None,
202
    'IUTEST_EXPECT_STRLNEQ': None,
203
    'IUTEST_EXPECT_STRIN': None,
204
    'IUTEST_EXPECT_STRNOTIN': None,
205
    'IUTEST_EXPECT_MATCHES_REGEXEQ': None,
206
    'IUTEST_EXPECT_MATCHES_REGEXNE': None,
207
    'IUTEST_EXPECT_CONTAINS_REGEXEQ': None,
208
    'IUTEST_EXPECT_CONTAINS_REGEXNE': None,
209
    'IUTEST_INFORM': None,
210
    'IUTEST_INFORM_NOT': None,
211
    'IUTEST_INFORM_THAT': None,
212
    'IUTEST_INFORM_EQ': None,
213
    'IUTEST_INFORM_ALMOST_EQ': None,
214
    'IUTEST_INFORM_NE': None,
215
    'IUTEST_INFORM_LT': None,
216
    'IUTEST_INFORM_LE': None,
217
    'IUTEST_INFORM_GT': None,
218
    'IUTEST_INFORM_GE': None,
219
    'IUTEST_INFORM_TRUE': None,
220
    'IUTEST_INFORM_FALSE': None,
221
    'IUTEST_INFORM_NULL': None,
222
    'IUTEST_INFORM_NOTNULL': None,
223
    'IUTEST_INFORM_SAME': None,
224
    'IUTEST_INFORM_FLOAT_EQ': None,
225
    'IUTEST_INFORM_DOUBLE_EQ': None,
226
    'IUTEST_INFORM_LONG_DOUBLE_EQ': None,
227
    'IUTEST_INFORM_NEAR': None,
228
    'IUTEST_INFORM_STREQ': None,
229
    'IUTEST_INFORM_STRNE': None,
230
    'IUTEST_INFORM_STRCASEEQ': None,
231
    'IUTEST_INFORM_STRCASENE': None,
232
    'IUTEST_INFORM_THROW': None,
233
    'IUTEST_INFORM_THROW_VALUE_EQ': None,
234
    'IUTEST_INFORM_THROW_VALUE_NE': None,
235
    'IUTEST_INFORM_THROW_VALUE_STREQ': None,
236
    'IUTEST_INFORM_THROW_VALUE_STRCASEEQ': None,
237
    'IUTEST_INFORM_ANY_THROW': None,
238
    'IUTEST_INFORM_NO_THROW': None,
239
    'IUTEST_INFORM_NO_FAILURE': None,
240
    'IUTEST_INFORM_NO_FATAL_FAILURE': None,
241
    'IUTEST_INFORM_FAIL': None,
242
    'IUTEST_INFORM_EQ_COLLECTIONS': None,
243
    'IUTEST_INFORM_NE_COLLECTIONS': None,
244
    'IUTEST_INFORM_EQ_RANGE': None,
245
    'IUTEST_INFORM_NE_RANGE': None,
246
    'IUTEST_INFORM_STRLNEQ': None,
247
    'IUTEST_INFORM_STRIN': None,
248
    'IUTEST_INFORM_STRNOTIN': None,
249
    'IUTEST_INFORM_MATCHES_REGEXEQ': None,
250
    'IUTEST_INFORM_MATCHES_REGEXNE': None,
251
    'IUTEST_INFORM_CONTAINS_REGEXEQ': None,
252
    'IUTEST_INFORM_CONTAINS_REGEXNE': None,
253
    'IUTEST_ASSUME': None,
254
    'IUTEST_ASSUME_NOT': None,
255
    'IUTEST_ASSUME_THAT': None,
256
    'IUTEST_ASSUME_EQ': None,
257
    'IUTEST_ASSUME_ALMOST_EQ': None,
258
    'IUTEST_ASSUME_NE': None,
259
    'IUTEST_ASSUME_LT': None,
260
    'IUTEST_ASSUME_LE': None,
261
    'IUTEST_ASSUME_GT': None,
262
    'IUTEST_ASSUME_GE': None,
263
    'IUTEST_ASSUME_TRUE': None,
264
    'IUTEST_ASSUME_FALSE': None,
265
    'IUTEST_ASSUME_NULL': None,
266
    'IUTEST_ASSUME_NOTNULL': None,
267
    'IUTEST_ASSUME_SAME': None,
268
    'IUTEST_ASSUME_FLOAT_EQ': None,
269
    'IUTEST_ASSUME_DOUBLE_EQ': None,
270
    'IUTEST_ASSUME_LONG_DOUBLE_EQ': None,
271
    'IUTEST_ASSUME_NEAR': None,
272
    'IUTEST_ASSUME_STREQ': None,
273
    'IUTEST_ASSUME_STRNE': None,
274
    'IUTEST_ASSUME_STRCASEEQ': None,
275
    'IUTEST_ASSUME_STRCASENE': None,
276
    'IUTEST_ASSUME_THROW': None,
277
    'IUTEST_ASSUME_THROW_VALUE_EQ': None,
278
    'IUTEST_ASSUME_THROW_VALUE_NE': None,
279
    'IUTEST_ASSUME_THROW_VALUE_STREQ': None,
280
    'IUTEST_ASSUME_THROW_VALUE_STRCASEEQ': None,
281
    'IUTEST_ASSUME_ANY_THROW': None,
282
    'IUTEST_ASSUME_NO_THROW': None,
283
    'IUTEST_ASSUME_NO_FAILURE': None,
284
    'IUTEST_ASSUME_NO_FATAL_FAILURE': None,
285
    'IUTEST_ASSUME_FAIL': None,
286
    'IUTEST_ASSUME_EQ_COLLECTIONS': None,
287
    'IUTEST_ASSUME_NE_COLLECTIONS': None,
288
    'IUTEST_ASSUME_EQ_RANGE': None,
289
    'IUTEST_ASSUME_NE_RANGE': None,
290
    'IUTEST_ASSUME_STRLNEQ': None,
291
    'IUTEST_ASSUME_STRIN': None,
292
    'IUTEST_ASSUME_STRNOTIN': None,
293
    'IUTEST_ASSUME_MATCHES_REGEXEQ': None,
294
    'IUTEST_ASSUME_MATCHES_REGEXNE': None,
295
    'IUTEST_ASSUME_CONTAINS_REGEXEQ': None,
296
    'IUTEST_ASSUME_CONTAINS_REGEXNE': None,
297
}
298
299
iutest_config_macro = {
300
    'IUTEST_HAS_LIB': '0',
301
    'IUTEST_HAS_PARAM_TEST': '1',
302
    'IUTEST_HAS_TYPED_TEST': '1',
303
    'IUTEST_HAS_TYPED_TEST_P': '1',
304
    'IUTEST_TYPED_TEST_P_STRICT': '1',
305
    'IUTEST_HAS_MATCHERS': '1',
306
    'IUTEST_HAS_VALUESGEN': '1',
307
    'IUTEST_HAS_RANDOMVALUES': '1',
308
    'IUTEST_HAS_CONCAT': '1',
309
    'IUTEST_HAS_CSVPARAMS': '1',
310
    'IUTEST_HAS_TESTNAME_ALIAS_JP': '0',
311
    'IUTEST_HAS_TESTFIXTURE_ALIAS_BY_TUPLE': '1',
312
    'IUTEST_HAS_AUTOFIXTURE_PARAM_TEST': '1',
313
    'IUTEST_HAS_ANY_PARAM_TEST': '1',
314
    'IUTEST_HAS_PARAM_TEST_PARAM_NAME_GENERATOR': '1',
315
    'IUTEST_HAS_IF_EXISTS': '0',
316
    'IUTEST_HAS_ANALYSIS_ASSUME': '0',
317
    'IUTEST_HAS_IGNORE_TEST': '0',
318
    'IUTEST_HAS_MINIDUMP': '0',
319
    'IUTEST_HAS_STRSTREAM': '0',
320
    'IUTEST_HAS_STRINGSTREAM': '1',
321
    'IUTEST_HAS_IOMANIP': '1',
322
    'IUTEST_HAS_CTIME': '1',
323
    'IUTEST_HAS_GETTIMEOFDAY': '1',
324
    'IUTEST_HAS_HDR_SYSTIME': '1',
325
    'IUTEST_HAS_FOPEN': '1',
326
    'IUTEST_HAS_FILE_STAT': '1',
327
    'IUTEST_HAS_CLASS_MEMBER_TEMPLATE_SPECIALIZATION': '0',
328
    'IUTEST_HAS_GENERIC': '0',
329
    'IUTEST_HAS_MEMORY_SANITIZER': '0',
330
    'IUTEST_HAS_ADDRESS_SANITIZER': '0',
331
    'IUTEST_HAS_THREAD_SANITIZER': '0',
332
    'IUTEST_HAS_SEH': '0',
333
    'IUTEST_USE_OWN_LIST': '0',
334
    'IUTEST_HAS_MATCHER_FLOATINGPOINT_NEAR': '1',
335
    'IUTEST_HAS_MATCHER_EACH': '1',
336
    'IUTEST_HAS_MATCHER_POINTWISE': '1',
337
    'IUTEST_HAS_GENRAND': '1',
338
    'IUTEST_HAS_PACKAGE': '1',
339
    'IUTEST_HAS_PEEP': '1',
340
    'IUTEST_HAS_SOCKET': '1',
341
    'IUTEST_HAS_PRINT_TO': '1',
342
    'IUTEST_HAS_ARITHMETIC_EXPRESSION_DECOMPOSE': '1',
343
    'IUTEST_HAS_STATIC_ASSERT_TYPEEQ': '1',
344
    'IUTEST_HAS_ASSERTION_RETURN': '1',
345
    'IUTEST_HAS_ASSERTION_NOEQUALTO_OBJECT': '1',
346
    'IUTEST_HAS_TESTNAME_ALIAS': '1',
347
    'IUTEST_HAS_REPORT_SKIPPED': '1',
348
    'IUTEST_HAS_STREAM_BUFFER': '1',
349
    # 'IUTEST_HAS_STREAM_RESULT': '1',
350
    'IUTEST_HAS_BIGGESTINT_OSTREAM': '1',
351
    'IUTEST_CHECK_STRICT': '1',
352
    'IUTEST_HAS_COLORCONSOLE': '0',
353
}
354
355
expands_macros = [
356
    'IUTEST_IPP_INLINE',
357
    'IUTEST_ATTRIBUTE_DEPRECATED_',
358
    'IUTEST_ATTRIBUTE_PURE_',
359
    'IUTEST_ATTRIBUTE_INIT_PRIORITY_',
360
    'IUTEST_HAS_ATTRIBUTE_DEPRECATED',
361
    'IUTEST_CXX_MODULE_EXPORT',
362
    'IUTEST_ATTRIBUTE_NO_SANITIZE_MEMORY',
363
    'IUTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS',
364
    'IUTEST_ATTRIBUTE_NO_SANITIZE_THREAD',
365
    'IUTEST_ATTRIBUTE_NO_SANITIZE_ALL',
366
]
367
368
# expand function macros
369
expand_function_macros = [
370
    'IUTEST_PRAGMA_CRT_SECURE_WARN_DISABLE_BEGIN',
371
    'IUTEST_PRAGMA_CRT_SECURE_WARN_DISABLE_END',
372
    'IUTEST_PRAGMA_EXTERN_TEMPLATE_WARN_DISABLE_BEGIN',
373
    'IUTEST_PRAGMA_EXTERN_TEMPLATE_WARN_DISABLE_END',
374
    'IUTEST_PRAGMA_CONSTEXPR_CALLED_AT_RUNTIME_WARN_DISABLE_BEGIN',
375
    'IUTEST_PRAGMA_CONSTEXPR_CALLED_AT_RUNTIME_WARN_DISABLE_END',
376
    'IUTEST_PRAGMA_MSC_WARN_PUSH',
377
    'IUTEST_PRAGMA_MSC_WARN_DISABLE',
378
    'IUTEST_PRAGMA_MSC_WARN_POP',
379
    'IUTEST_PRAGMA_UNUSED_LOCAL_TYPEDEFS_WARN_DISABLE_BEGIN',
380
    'IUTEST_PRAGMA_UNUSED_LOCAL_TYPEDEFS_WARN_DISABLE_END',
381
    'IUTEST_PRAGMA_UNREACHCODE_WARN_DISABLE_BEGIN',
382
    'IUTEST_PRAGMA_UNREACHCODE_WARN_DISABLE_END',
383
    'IUTEST_PRAGMA_WARN_DISABLE_EMPTY_BODY',
384
    'IUTEST_PRAGMA_WARN_FORMAT_NONLITERAL',
385
    'IUTEST_PRAGMA_WARN_CXX14_CONSTEXPR_NOT_IMPLY_CONST',
386
    'IUTEST_WORKAROUND_MSC_STLSTREAM_C4250',
387
    'IUTEST_EXPLICIT_TEMPLATE_TYPE_',
388
    'IUTEST_IF_EXISTS',
389
    'IUTEST_IF_NOT_EXISTS',
390
    'IUTEST_STATIC_EXISTS',
391
    'IUTEST_STATIC_ASSERT_IF_EXISTS',
392
    'IUTEST_STATIC_ASSERT_IF_NOT_EXISTS',
393
    'IUTEST_ANALYSIS_ASSUME',
394
    'IUTEST_PP_ENUM_CASE_RETURN_STRING',
395
    'IUTEST_CLASS_INITIALIZE',
396
    'IUTEST_CLASS_CLEANUP',
397
    'IUTEST_METHOD_INITIALIZE',
398
    'IUTEST_METHOD_CLEANUP',
399
    # 'IUTEST_MAKE_ASSERTIONRESULT_',
400
]
401
402
#
403
has_features = {
404
}
405
406
has_include = {
407
}
408
409
rename_macro = {
410
    'IUTEST_ASSERT_FAILURE': 'II_A_FAIL',
411
    'IUTEST_EXPECT_FAILURE': 'II_E_FAIL',
412
    'IUTEST_INFORM_FAILURE': 'II_I_FAIL',
413
    'IUTEST_ASSUME_FAILURE': 'II_M_FAIL',
414
    'IUTEST_ASSERT_FAILURE_AT': 'II_A_FAIL_AT',
415
    'IUTEST_EXPECT_FAILURE_AT': 'II_E_FAIL_AT',
416
    'IUTEST_INFORM_FAILURE_AT': 'II_I_FAIL_AT',
417
    'IUTEST_ASSUME_FAILURE_AT': 'II_M_FAIL_AT',
418
    'IUTEST_ATTRIBUTE_UNUSED_': 'II_ATR_U',
419
    'IUTEST_ATTRIBUTE_NORETURN_': 'II_ATR_NR',
420
    'IUTEST_ATTRIBUTE_FORMAT_PRINTF': 'II_ATR_F_P',
421
    'IUTEST_ATTRIBUTE_FORMAT': 'II_ATR_F',
422
    'IUTEST_CXX_OVERRIDE': 'II_CXX_O',
423
    'IUTEST_CXX_NOEXCEPT_SPEC': 'II_CXX_NEX_S',
424
    'IUTEST_CXX_DEFAULT_FUNCTION': 'II_CXX_DF_F',
425
    'IUTEST_CXX_DELETED_FUNCTION': 'II_CXX_DL_F',
426
    'IUTEST_CXX_FINAL': 'II_CXX_F',
427
    'IUTEST_CXX_EXPLICIT_CONVERSION': 'II_CXX_E_C',
428
    'IUTEST_CXX_CONSTEXPR': 'II_CXX_CE',
429
    'IUTEST_CXX14_CONSTEXPR': 'II_CXX14_CE',
430
    'IUTEST_CXX_CONSTEXPR_OR_CONST': 'II_CXX_C_O_C',
431
    'IUTEST_AMBIGUOUS_ELSE_BLOCKER_': 'II_AMB_E_B',
432
    'IUTEST_SUPPRESS_UNREACHABLE_CODE_WARNING': 'II_S_UR_C_W',
433
    'IUTEST_APPEND_EXPLICIT_TEMPLATE_TYPE_': 'II_A_E_TT',
434
    'IUTEST_PRAGMA_ASSIGNMENT_OPERATOR_COULD_NOT_GENERATE_WARN_DISABLE_BEGIN': 'II_PGM_A_O_CN_G_W_D_B',
435
    'IUTEST_PRAGMA_ASSIGNMENT_OPERATOR_COULD_NOT_GENERATE_WARN_DISABLE_END': 'II_PGM_A_O_CN_G_W_D_E',
436
    'IUTEST_PRAGMA_WARN_FLOAT_EQUAL': 'II_PGM_W_FE',
437
    'IUTEST_PRAGMA_WARN_CAST_ALIGN': 'II_PGM_W_CA',
438
    'IUTEST_PRAGMA_WARN_DISABLE_NOEXCEPT_TPYE': 'II_PGM_W_D_NE_T',
439
    'IUTEST_PRAGMA_WARN_DISABLE_SIGN_COMPARE': 'II_PGM_W_D_S_C',
440
    'IUTEST_PRAGMA_WARN_DISABLE_DANGLING_ELSE': 'II_PGM_W_D_D_E',
441
    'IUTEST_PRAGMA_CLANG_WARN_PUSH': 'II_PGM_C_W_PU',
442
    'IUTEST_PRAGMA_CLANG_WARN_DISABLE': 'II_PGM_C_W_D',
443
    'IUTEST_PRAGMA_CLANG_WARN_POP': 'II_PGM_C_W_PP',
444
    'IUTEST_PRAGMA_GCC_WARN_PUSH': 'II_PGM_G_W_PU',
445
    'IUTEST_PRAGMA_GCC_WARN_DISABLE': 'II_PGM_G_W_D',
446
    'IUTEST_PRAGMA_GCC_WARN_POP': 'II_PGM_G_W_PP',
447
    'IUTEST_PRAGMA_WARN_PUSH': 'II_PGM_W_PU',
448
    # 'IUTEST_PRAGMA_WARN_DISABLE': 'II_PGM_W_D',
449
    'IUTEST_PRAGMA_WARN_POP': 'II_PGM_W_PP',
450
    'IUTEST_PP_DISALLOW_COPY_AND_ASSIGN': 'IP_DIS_C_A_A',
451
    'IUTEST_PP_DISALLOW_ASSIGN': 'IP_DIS_A',
452
    'IUTEST_PP_DISALLOW_MOVE_AND_COPY_AND_ASSIGN': 'IP_DIS_M_A_C_A_A',
453
    'IUTEST_PP_NAMESPACE_ENUM_CASE_RETURN_STRING': 'IP_NS_E_C_R_S',
454
    'IUTEST_PP_INC': 'IP_INC',
455
    'IUTEST_PP_DEC': 'IP_DEC',
456
    'IUTEST_PP_CAT': 'IP_CAT',
457
    'IUTEST_PP_EMPTY': 'IP_EMPTY',
458
    'IUTEST_PP_IS_BEGIN_PARENS': 'IP_IS_B_PAR',
459
    'IUTEST_LIBSTDCXX_VERSION': 'II_LSTDCXX_V',
460
    'IUTEST_PRED_FORMAT_': 'II_PRD_FMT_',
461
    'IUTEST_PRED_FORMAT1_': 'II_PRD_FMT1_',
462
    'IUTEST_PRED_FORMAT2_': 'II_PRD_FMT2_',
463
    'IUTEST_PRED_FORMAT3_': 'II_PRD_FMT3_',
464
    'IUTEST_PRED_FORMAT4_': 'II_PRD_FMT4_',
465
    'IUTEST_PRED_FORMAT5_': 'II_PRD_FMT5_',
466
    'IUTEST_THROW_PRED_FORMAT2_': 'II_T_PRD_FMT2_',
467
    'IUTEST_PRED_': 'II_PRD_',
468
    'IUTEST_PRED1_': 'II_PRD1_',
469
    'IUTEST_PRED2_': 'II_PRD2_',
470
    'IUTEST_PRED3_': 'II_PRD3_',
471
    'IUTEST_PRED4_': 'II_PRD4_',
472
    'IUTEST_PRED5_': 'II_PRD5_',
473
    'IUTEST_TEST_ASSERT_': 'II_T_ASRT_',
474
    'IUTEST_TEST_CLASS_NAME_': 'II_T_CLS_N_',
475
    'IUTEST_TEST_INSTANCE_NAME_': 'II_T_INST_N_',
476
    'IUTEST_PMZ_TEST_CLASS_NAME_': 'II_P_T_CLS_N_',
477
    'IUTEST_MESSAGE_AT': 'II_MSG_AT',
478
    'IUTEST_MESSAGE': 'II_MSG',
479
    'IUTEST_IS_NULLLITERAL': 'II_IS_NL',
480
    'IUTEST_ALIAS_TESTNAME_F_': 'II_ALS_TN_F_',
481
    'IUTEST_ALIAS_TESTNAME_F': 'II_ALS_TN_F',
482
    'IUTEST_ALIAS_TESTNAME_': 'II_ALS_TN',
483
    'IUTEST_THROUGH_ANALYSIS_ASSUME_': 'II_TRGH_A_A_',
484
    'IUTEST_PP_ENUM_SHIFTED_BINARY_PARAMS': 'IP_ENM_S_B_P',
485
    'IUTEST_PP_ENUM_SHIFTED_BINARY': 'IP_ENM_S_B',
486
    'IUTEST_PP_ENUM_SHIFTED_PARAMS': 'IP_ENM_S_P',
487
    'IUTEST_PP_ENUM_BINARY_PARAMS': 'IP_ENM_B_P',
488
    'IUTEST_PP_ENUM_SHIFTED': 'IP_ENM_S',
489
    'IUTEST_PP_ENUM_BINARY': 'IP_ENM_B',
490
    'IUTEST_PP_ENUM_PARAMS': 'IP_ENM_P',
491
    'IUTEST_PP_ENUM': 'IP_ENM',
492
    'IUTEST_TEST_EQ_COLLECTIONS': 'II_T_EQ_CLCT',
493
    'IUTEST_TEST_NE_COLLECTIONS': 'II_T_NE_CLCT',
494
    'IUTEST_TEST_EQ_RANGE': 'II_T_EQ_RNG',
495
    'IUTEST_TEST_NE_RANGE': 'II_T_NE_RNG',
496
    'IUTEST_TEST_STRLNEQ': 'II_T_SLN',
497
    'IUTEST_TEST_STRIN': 'II_T_SIN',
498
    'IUTEST_TEST_STRNOTIN': 'II_T_SNIN',
499
    'IUTEST_TEST_MATCHES_REGEXEQ': 'II_T_M_RGE',
500
    'IUTEST_TEST_MATCHES_REGEXNE': 'II_T_M_RGN',
501
    'IUTEST_TEST_CONTAINS_REGEXEQ': 'II_T_C_RGE',
502
    'IUTEST_TEST_CONTAINS_REGEXNE': 'II_T_C_RGN',
503
}
504
505
rename_text = {
506
    'backward': 'bkw',
507
    # 'CmpHelper': 'CHlpr',
508
    'IUTEST_MAKE_ASSERTIONRESULT_': '',
509
    'II_DECL_STREQ_COMPARE_HELPER_': 'II_DECL_SE_C_H_',
510
    'II_INSTANTIATE_TEST_CASE_AP_': 'II_INST_TC_AP_',
511
    'II_TEST_AP_FIXTURE_NAME_': 'II_T_AP_FIX_N_',
512
    'II_ALIAS_TESTNAME_AP_': 'II_ALS_TN_AP_',
513
    'IUTEST_GET_PACKAGENAME_': 'II_GET_PKGN_',
514
    'IUTEST_CONCAT_PACKAGE_': 'II_CC_PKG_',
515
}
516
517
debug = False
518
519
class WandboxPreprocessor:
520
    pp = IutestPreprocessor(predefined_macros
521
        , iutest_config_macro
522
        , expand_function_macros
523
        , expands_macros
524
        , has_features
525
        , has_include)
526
527
    def preprocess(self, code, add_macros):
528
        self.pp.set_debug_flag(debug)
529
        return self.pp.preprocess(code, add_macros)
530
531
    def remove_empty_ppif(self, code):
532
        return self.pp.remove_empty_ppif(code)
533
534
    def remove_redudant(self, code):
535
        dst = ""
536
        for line in code.splitlines():
537
            if '#define IP_D_' in line:
538
                v = line.split()
539
                try:
540
                    if int(v[2]) > 50:
541
                        continue
542
                except ValueError:
543
                    pass
544
            elif '#define IP_I_' in line:
545
                v = line.split()
546
                try:
547
                    if int(v[2]) > 51:
548
                        continue
549
                except ValueError:
550
                    pass
551
            elif '#define IP_B_' in line:
552
                v = line.split()
553
                v2 = v[1].split('_')
554
                try:
555
                    if int(v2[2]) > 51:
556
                        continue
557
                except ValueError:
558
                    pass
559
            elif 'IUTEST_MBS_CODE' in line:
560
                continue
561
            line += "\n"
562
            dst += line
563
        return dst
564
565
    def rename_macros(self, code):
566
        dst = ""
567
        global rename_macro
568
        found_macros = {}
569
        for k, v in rename_macro.items():
570
            if collections.Counter(rename_macro.values())[v] > 1:
571
                print('error: duplicated ' + v)
572
                return
573
        RE_DEFINE = re.compile(r'#\s*define\s([\w_]+)(.*)$')
574
        for line in code.splitlines():
575
            m = RE_DEFINE.match(line)
576
            if m:
577
                d = m.group(1)
578
                if d in rename_macro:
579
                    alias = rename_macro[d]
580
                    found_macros[d] = alias
581
                    del rename_macro[d]
582
            if len(rename_macro) == 0:
583
                break
584
        for line in code.splitlines():
585
            for k, v in found_macros.items():
586
                line = re.sub(k + r'(?=[\W]|$)', v, line)
587
                # line = line.replace(k, v)
588
            for k, v in rename_text.items():
589
                line = line.replace(k, v)
590
            for k, v in found_macros.items():
591
                if k in line:
592
                    print(k)
593
            line += "\n"
594
            dst += line
595
        for k, v in found_macros.items():
596
            dst += "#define " + k + " " + v + "\n"
597
        return dst
598
599
600
def default_pp():
601
    output_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "../../fused-src")
602
    output = "iutest.wandbox.min.hpp"
603
    f = codecs.open(os.path.join(output_dir, "iutest.min.hpp"), 'r', 'utf-8-sig')
604
    code = f.read()
605
    f.close()
606
    output_file = codecs.open(os.path.join(output_dir, output), 'w', 'utf-8-sig')
607
    pp = WandboxPreprocessor()
608
    code = pp.preprocess(code, None)
609
    code = pp.remove_empty_ppif(code)
610
    code = pp.remove_redudant(code)
611
    code = pp.rename_macros(code)
612
    output_file.write(code)
613
    output_file.close()
614
615
616
def main():
617
    global debug
618
    argc = len(sys.argv)
619
    if argc == 2:
620
        if sys.argv[1] == 'debug':
621
            debug = True
622
    default_pp()
623
624
if __name__ == '__main__':
625
    main()
626