<html><head><meta http-equiv="Content-Type" content="text/html; charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">I'm trying to use libclang to extract some code, and I hit a case that is really irking me.</div><div class=""><br class=""></div><div class="">Look at the Foo::foo definition on lines 7 through 11:</div><div class=""><br class=""></div><div class=""><div class=""><div class=""><font face="Courier" class="">     1<span class="Apple-tab-span" style="white-space: pre;">     </span>template <typename ClassType></font></div><div class=""><font face="Courier" class="">     2<span class="Apple-tab-span" style="white-space: pre;">   </span>struct Foo {</font></div><div class=""><font face="Courier" class="">     3<span class="Apple-tab-span" style="white-space: pre;">  </span>    template <typename T></font></div><div class=""><font face="Courier" class="">     4<span class="Apple-tab-span" style="white-space: pre;">        </span>    int foo();</font></div><div class=""><font face="Courier" class="">     5<span class="Apple-tab-span" style="white-space: pre;"> </span>};</font></div><div class=""><font face="Courier" class="">     6</font></div><div class=""><font face="Courier" class="">     <font color="#ff2600" class="">7<span class="Apple-tab-span" style="white-space: pre;">       </span>template <typename ClassType></font></font></div><div class=""><font face="Courier" class="">     <font color="#0433ff" class="">8<span class="Apple-tab-span" style="white-space: pre;">     </span>template <typename T></font></font></div><div class=""><font face="Courier" class="">     9<span class="Apple-tab-span" style="white-space: pre;">      </span>int Foo<ClassType>::foo() {</font></div><div class=""><font face="Courier" class="">    10<span class="Apple-tab-span" style="white-space: pre;">  </span>    return 42;</font></div><div class=""><font face="Courier" class="">    11<span class="Apple-tab-span" style="white-space: pre;">      </span>}</font></div><div class=""><font face="Courier" class="">    </font></div></div></div><div class="">The reported extent of the definition <span style="font-family: Courier;" class="">FunctionTemplateDecl</span> is <font color="#0433ff" class="">lines <b class="">8</b></font> to 11, when I was expecting it to start at line 7. Therefore, when I use that extent in order to extract the function definition, it leaves behind the class template line on line 7.</div><div class=""><br class=""></div><div class="">Note that when you look the second child element, the <span style="font-family: Courier;" class="">CXXMethodDecl,</span> that one has the full extent from <font color="#ff2600" class="">lines 7</font> to 11, which is what I really want.</div><div class=""><br class=""></div><div class="">Is this a bug? It seems odd that the children would have an extent not strictly inside the parent element.</div><div class=""><br class=""></div><div class="">If this is not a bug, what's the best way to find the full extent of the entire definition? I tried a hack to use the min/max extent of the node <i class="">and</i> its children, but libclang does not happen to return that child.</div><div class=""><br class=""></div><div class="">Thanks!</div><div class="">Jared</div><div class=""><br class=""></div><div class="">===== clang AST dump =====</div><div class=""><br class=""></div><div class=""><font face="Courier" class="">|-ClassTemplateDecl 0x7fa70d058da8 <temp.cpp:1:1, line:5:1> line:2:8 Foo</font></div><div class=""><font face="Courier" class="">| |-TemplateTypeParmDecl 0x7fa70d058c58 <line:1:11, col:20> col:20 typename ClassType</font></div><div class=""><font face="Courier" class="">| `-CXXRecordDecl 0x7fa70d058d10 <line:2:1, line:5:1> line:2:8 struct Foo definition</font></div><div class=""><font face="Courier" class="">|   |-CXXRecordDecl 0x7fa70d059018 <col:1, col:8> col:8 implicit struct Foo</font></div><div class=""><font face="Courier" class="">|   `-FunctionTemplateDecl 0x7fa70d059280 <line:3:5, line:4:13> col:9 foo</font></div><div class=""><font face="Courier" class="">|     |-TemplateTypeParmDecl 0x7fa70d0590b0 <line:3:15, col:24> col:24 typename T</font></div><div class=""><font face="Courier" class="">|     `-CXXMethodDecl 0x7fa70d0591e8 <line:4:5, col:13> col:9 foo 'int (void)'</font></div><div class=""><font face="Courier" class="">|-FunctionTemplateDecl 0x7fa70d059648 parent 0x7fa70d058d10 prev 0x7fa70d059280 <<font color="#0433ff" class=""><b class="">line:8:1</b></font>, line:11:1> line:9:21 foo</font></div><div class=""><font face="Courier" class="">  |-TemplateTypeParmDecl 0x7fa70d059370 <line:8:11, col:20> col:20 typename T</font></div><div class=""><font face="Courier" class="">  `-CXXMethodDecl 0x7fa70d059578 parent 0x7fa70d058d10 prev 0x7fa70d0591e8 <<font color="#ff2600" class=""><b class="">line:7:1</b></font>, line:11:1> line:9:21 foo 'int (void)'</font></div><div class=""><font face="Courier" class="">    `-CompoundStmt 0x7fa70d0596e8 <col:27, line:11:1></font></div><div class=""><font face="Courier" class="">      `-ReturnStmt 0x7fa70d0596d0 <line:10:5, col:12></font></div><div class=""><font face="Courier" class="">        `-IntegerLiteral 0x7fa70d0596b0 <col:12> 'int' 42</font></div><div class=""><br class=""></div></div></div></body></html>