xref: /llvm-project/clang/test/Refactor/Extract/ExtractExprIntoFunction.cpp (revision cc55754a7917b6ec3058079c8eae965eb1641a04)
1*cc55754aSAlex Lorenz // RUN: clang-refactor extract -selection=test:%s %s -- -std=c++14 2>&1 | grep -v CHECK | FileCheck %s
27fe441b2SAlex Lorenz 
37fe441b2SAlex Lorenz 
simpleExtractNoCaptures()47fe441b2SAlex Lorenz void simpleExtractNoCaptures() {
57fe441b2SAlex Lorenz   int i = /*range=->+0:33*/1 + 2;
67fe441b2SAlex Lorenz }
77fe441b2SAlex Lorenz 
87fe441b2SAlex Lorenz // CHECK: 1 '' results:
97fe441b2SAlex Lorenz // CHECK:      static int extracted() {
107fe441b2SAlex Lorenz // CHECK-NEXT: return 1 + 2;{{$}}
117fe441b2SAlex Lorenz // CHECK-NEXT: }{{[[:space:]].*}}
127fe441b2SAlex Lorenz // CHECK-NEXT: void simpleExtractNoCaptures() {
137fe441b2SAlex Lorenz // CHECK-NEXT:   int i = /*range=->+0:33*/extracted();{{$}}
147fe441b2SAlex Lorenz // CHECK-NEXT: }
157fe441b2SAlex Lorenz 
simpleExtractStmtNoCaptures()167fe441b2SAlex Lorenz void simpleExtractStmtNoCaptures() {
177fe441b2SAlex Lorenz   /*range astatement=->+1:13*/int a = 1;
187fe441b2SAlex Lorenz   int b = 2;
197fe441b2SAlex Lorenz }
207fe441b2SAlex Lorenz // CHECK: 1 'astatement' results:
217fe441b2SAlex Lorenz // CHECK:      static void extracted() {
227fe441b2SAlex Lorenz // CHECK-NEXT: int a = 1;
23ebbbb812SAlex Lorenz // CHECK-NEXT: int b = 2;{{$}}
247fe441b2SAlex Lorenz // CHECK-NEXT: }{{[[:space:]].*}}
257fe441b2SAlex Lorenz // CHECK-NEXT: void simpleExtractStmtNoCaptures() {
26ebbbb812SAlex Lorenz // CHECK-NEXT:   /*range astatement=->+1:13*/extracted();{{$}}
277fe441b2SAlex Lorenz // CHECK-NEXT: }
287fe441b2SAlex Lorenz 
297fe441b2SAlex Lorenz 
blankRangeNoExtraction()307fe441b2SAlex Lorenz void blankRangeNoExtraction() {
317fe441b2SAlex Lorenz   int i = /*range blank=*/1 + 2;
327fe441b2SAlex Lorenz }
337fe441b2SAlex Lorenz 
347fe441b2SAlex Lorenz // CHECK: 1 'blank' results:
357fe441b2SAlex Lorenz // CHECK-NEXT: the provided selection does not overlap with the AST nodes of interest
367fe441b2SAlex Lorenz 
377fe441b2SAlex Lorenz int outOfBodyCodeNoExtraction = /*range out_of_body_expr=->+0:72*/1 + 2;
387fe441b2SAlex Lorenz 
397fe441b2SAlex Lorenz struct OutOfBodyStuff {
407fe441b2SAlex Lorenz   int FieldInit = /*range out_of_body_expr=->+0:58*/1 + 2;
417fe441b2SAlex Lorenz 
427fe441b2SAlex Lorenz   void foo(int x =/*range out_of_body_expr=->+0:58*/1 + 2);
437fe441b2SAlex Lorenz };
447fe441b2SAlex Lorenz 
inFunctionOutOfBody()45*cc55754aSAlex Lorenz auto inFunctionOutOfBody() -> decltype(/*range out_of_body_expr=->+0:79*/1 + 2) {
46*cc55754aSAlex Lorenz   struct OutOfBodyStuff {
47*cc55754aSAlex Lorenz     int FieldInit = /*range out_of_body_expr=->+0:60*/1 + 2;
48*cc55754aSAlex Lorenz 
49*cc55754aSAlex Lorenz     void foo(int x =/*range out_of_body_expr=->+0:60*/1 + 2);
50*cc55754aSAlex Lorenz   };
51*cc55754aSAlex Lorenz   enum E {
52*cc55754aSAlex Lorenz     X = /*range out_of_body_expr=->+0:48*/1 + 2
53*cc55754aSAlex Lorenz   };
54*cc55754aSAlex Lorenz   int x = 0;
55*cc55754aSAlex Lorenz   using T = decltype(/*range out_of_body_expr=->+0:61*/x + 3);
56*cc55754aSAlex Lorenz   return x;
57*cc55754aSAlex Lorenz }
58*cc55754aSAlex Lorenz 
59*cc55754aSAlex Lorenz // CHECK: 8 'out_of_body_expr' results:
607fe441b2SAlex Lorenz // CHECK: the selected code is not a part of a function's / method's body
617fe441b2SAlex Lorenz 
simpleExpressionNoExtraction()627fe441b2SAlex Lorenz void simpleExpressionNoExtraction() {
637fe441b2SAlex Lorenz   int i = /*range simple_expr=->+0:41*/1 + /*range simple_expr=->+0:76*/(2);
647fe441b2SAlex Lorenz   (void) /*range simple_expr=->+0:40*/i;
657fe441b2SAlex Lorenz   (void)/*range simple_expr=->+0:47*/"literal";
667fe441b2SAlex Lorenz   (void)/*range simple_expr=->+0:41*/'c';
677fe441b2SAlex Lorenz }
687fe441b2SAlex Lorenz 
697fe441b2SAlex Lorenz // CHECK: 5 'simple_expr' results:
707fe441b2SAlex Lorenz // CHECK-NEXT: the selected expression is too simple to extract
71