var_decl_test.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
  2. // Exceptions. See /LICENSE for license information.
  3. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. #include "migrate_cpp/cpp_refactoring/var_decl.h"
  5. #include "migrate_cpp/cpp_refactoring/matcher_test_base.h"
  6. namespace Carbon::Testing {
  7. namespace {
  8. class VarDeclTest : public MatcherTestBase<VarDeclFactory> {};
  9. TEST_F(VarDeclTest, Declaration) {
  10. constexpr char Before[] = "int i;";
  11. constexpr char After[] = "var i: int;";
  12. ExpectReplacement(Before, After);
  13. }
  14. TEST_F(VarDeclTest, DeclarationArray) {
  15. constexpr char Before[] = "int i[4];";
  16. constexpr char After[] = "var i: int[4];";
  17. ExpectReplacement(Before, After);
  18. }
  19. TEST_F(VarDeclTest, DeclarationConstArray) {
  20. constexpr char Before[] = "const int i[] = {0, 1};";
  21. constexpr char After[] = "let i: const int[] = {0, 1};";
  22. ExpectReplacement(Before, After);
  23. }
  24. TEST_F(VarDeclTest, DeclarationConstPointer) {
  25. // TODO: Fix j replacement location.
  26. constexpr char Before[] = R"cpp(
  27. int i = 0;
  28. int* const j = &i;
  29. const int* k = &i;
  30. )cpp";
  31. constexpr char After[] = R"(
  32. var i: int = 0;
  33. int* const let j: int* const = &i;
  34. var k: const int* = &i;
  35. )";
  36. ExpectReplacement(Before, After);
  37. }
  38. TEST_F(VarDeclTest, DeclarationComma) {
  39. // TODO: Maybe replace the comma with a `;`.
  40. constexpr char Before[] = "int i, j;";
  41. constexpr char After[] = "var i: int, var j: int;";
  42. ExpectReplacement(Before, After);
  43. }
  44. TEST_F(VarDeclTest, DeclarationCommaAssignment) {
  45. // TODO: Maybe replace the comma with a `;`.
  46. constexpr char Before[] = "int i = 0, j = 0;";
  47. constexpr char After[] = "var i: int = 0, var j: int = 0;";
  48. ExpectReplacement(Before, After);
  49. }
  50. TEST_F(VarDeclTest, DeclarationCommaArray) {
  51. // TODO: Maybe replace the comma with a `;`.
  52. // TODO: Need to handle j's array.
  53. constexpr char Before[] = "int i[4], j[4];";
  54. constexpr char After[] = "var i: int[4], j[4];";
  55. ExpectReplacement(Before, After);
  56. }
  57. TEST_F(VarDeclTest, DeclarationCommaArrayAssignment) {
  58. // TODO: Maybe replace the comma with a `;`.
  59. // TODO: Need to handle j's array.
  60. constexpr char Before[] = "int i[] = {0}, j[] = {1};";
  61. constexpr char After[] = "var i: int[] = {0}, j[] = {1};";
  62. ExpectReplacement(Before, After);
  63. }
  64. TEST_F(VarDeclTest, DeclarationCommaPointers) {
  65. // TODO: Maybe replace the comma with a `;`.
  66. // TODO: Need to handle j's pointer.
  67. // constexpr char After[] = "var i: int *, var j: int *;";
  68. constexpr char Before[] = "int *i, *j;";
  69. constexpr char After[] = "var i: int*, *j;";
  70. ExpectReplacement(Before, After);
  71. }
  72. TEST_F(VarDeclTest, DeclarationCommaPointersAssignment) {
  73. // TODO: Maybe replace the comma with a `;`.
  74. // TODO: Need to handle j's pointer.
  75. // constexpr char After[] = "var i: int *, var j: int *;";
  76. constexpr char Before[] = "int *i = nullptr, *j = i;";
  77. constexpr char After[] = "var i: int* = nullptr, *j = i;";
  78. ExpectReplacement(Before, After);
  79. }
  80. TEST_F(VarDeclTest, Assignment) {
  81. constexpr char Before[] = "int i = 0;";
  82. constexpr char After[] = "var i: int = 0;";
  83. ExpectReplacement(Before, After);
  84. }
  85. TEST_F(VarDeclTest, Auto) {
  86. constexpr char Before[] = "auto i = 0;";
  87. constexpr char After[] = "var i: auto = 0;";
  88. ExpectReplacement(Before, After);
  89. }
  90. TEST_F(VarDeclTest, AutoRef) {
  91. constexpr char Before[] = R"cpp(
  92. auto i = 0;
  93. const auto& j = i;
  94. )cpp";
  95. constexpr char After[] = R"(
  96. var i: auto = 0;
  97. var j: const auto& = i;
  98. )";
  99. ExpectReplacement(Before, After);
  100. }
  101. TEST_F(VarDeclTest, Const) {
  102. constexpr char Before[] = "const int i = 0;";
  103. constexpr char After[] = "let i: const int = 0;";
  104. ExpectReplacement(Before, After);
  105. }
  106. TEST_F(VarDeclTest, ConstPointer) {
  107. constexpr char Before[] = "const int* i;";
  108. constexpr char After[] = "var i: const int*;";
  109. ExpectReplacement(Before, After);
  110. }
  111. TEST_F(VarDeclTest, Namespace) {
  112. constexpr char Before[] = R"cpp(
  113. namespace Foo {
  114. typedef int Bar;
  115. }
  116. Foo::Bar x;
  117. )cpp";
  118. constexpr char After[] = R"(
  119. namespace Foo {
  120. typedef int Bar;
  121. }
  122. var x: Foo::Bar;
  123. )";
  124. ExpectReplacement(Before, After);
  125. ExpectReplacement(Before, After);
  126. }
  127. TEST_F(VarDeclTest, Params) {
  128. constexpr char Before[] = "auto Foo(int i) -> int;";
  129. constexpr char After[] = "auto Foo(i: int) -> int;";
  130. ExpectReplacement(Before, After);
  131. }
  132. TEST_F(VarDeclTest, ParamsDefault) {
  133. constexpr char Before[] = "auto Foo(int i = 0) -> int;";
  134. constexpr char After[] = "auto Foo(i: int = 0) -> int;";
  135. ExpectReplacement(Before, After);
  136. }
  137. TEST_F(VarDeclTest, ParamsConst) {
  138. constexpr char Before[] = "auto Foo(const int i) -> int;";
  139. constexpr char After[] = "auto Foo(let i: const int) -> int;";
  140. ExpectReplacement(Before, After);
  141. }
  142. TEST_F(VarDeclTest, ParamStruct) {
  143. // This is to ensure the 'struct' keyword doesn't get added to the qualified
  144. // type.
  145. constexpr char Before[] = R"cpp(
  146. struct Circle {};
  147. auto Draw(int times, const Circle& circle) -> bool;
  148. )cpp";
  149. constexpr char After[] = R"(
  150. struct Circle {};
  151. auto Draw(times: int, circle: const Circle&) -> bool;
  152. )";
  153. ExpectReplacement(Before, After);
  154. }
  155. TEST_F(VarDeclTest, Member) {
  156. // TODO: Handle member variables.
  157. constexpr char Before[] = R"cpp(
  158. struct Circle {
  159. Circle() : x(0), y(0), radius(1) {}
  160. int x;
  161. int y;
  162. int radius;
  163. };
  164. )cpp";
  165. ExpectReplacement(Before, Before);
  166. }
  167. TEST_F(VarDeclTest, Constructor) {
  168. constexpr char Before[] = R"cpp(
  169. struct Index {
  170. Index(int i) : i(i) {}
  171. int i;
  172. };
  173. Index x(0);
  174. )cpp";
  175. constexpr char After[] = R"(
  176. struct Index {
  177. Index(i: int) : i(i) {}
  178. int i;
  179. };
  180. var x: Index(0);
  181. )";
  182. ExpectReplacement(Before, After);
  183. }
  184. TEST_F(VarDeclTest, RangeFor) {
  185. constexpr char Before[] = R"cpp(
  186. void Foo() {
  187. int items[] = {1};
  188. for (int i : items) {
  189. int j;
  190. }
  191. }
  192. )cpp";
  193. constexpr char After[] = R"(
  194. void Foo() {
  195. var items: int[] = {1};
  196. for (int i : items) {
  197. var j: int;
  198. }
  199. }
  200. )";
  201. ExpectReplacement(Before, After);
  202. }
  203. TEST_F(VarDeclTest, Template) {
  204. constexpr char Before[] = R"cpp(
  205. template <typename T>
  206. struct R {};
  207. template <typename T>
  208. struct S {};
  209. R<S<int>> x;
  210. )cpp";
  211. constexpr char After[] = R"(
  212. template <typename T>
  213. struct R {};
  214. template <typename T>
  215. struct S {};
  216. var x: R<S<int>>;
  217. )";
  218. ExpectReplacement(Before, After);
  219. }
  220. } // namespace
  221. } // namespace Carbon::Testing