[cfe-dev] SourceRange for a macro-expanded function definition?
Argyrios Kyrtzidis
kyrtzidis at apple.com
Mon Apr 7 10:01:38 PDT 2014
On Apr 7, 2014, at 2:22 AM, Manuel Klimek <klimek at google.com> wrote:
> +argyrios
>
> On Sat, Apr 5, 2014 at 1:40 AM, Michael Bolin <bolinfest at gmail.com> wrote:
> Also, I just tried the following on the FunctionDecl that corresponds to `extern NSString *someFunction1(void) NS_RETURNS_NOT_RETAINED;`:
>
> // const FunctionDecl *decl;
> CharSourceRange range = CharSourceRange::getCharRange(decl->getSourceRange());
> LangOptions *opts = new LangOptions();
> StringRef sourceText = Lexer::getSourceText(range, *sourceManager, *opts);
>
> The sourceText that I get back is an empty string. For other, non-macro FunctionDecl nodes that I tried (specifically ones with bodies), I seem to get the right thing, though the closing curly braces often appears to be missing.
>
> I think if that's true, that's a bug in getSourceText() / makeFileCharRange.
> Argyrios, any ideas?
It should be:
CharSourceRange range = CharSourceRange::getTokenRange(decl->getSourceRange());
Also note that I think we don’t keep track of the semicolon at the end of the FunctionDecl.
-Argyrios
>
> Cheers,
> /Manuel
>
> On Fri, Apr 4, 2014 at 3:28 PM, Michael Bolin <bolinfest at gmail.com> wrote:
> Here is a better example:
>
> https://gist.github.com/bolinfest/9984257
>
> Here are the key lines in the output:
>
>
> |-FunctionDecl 0x10450ca90 <./example.h:15:1, /System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:137:72> someFunction1 'NSString *(void)' extern
>
> |-FunctionDecl 0x10450cc00 <./example.h:16:1, /System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:137:72> someFunction2 'NSString *(void)' extern
>
> Ideally, I would like to be able to get the following instead:
>
>
> |-FunctionDecl 0x10450ca90 <./example.h:15:1, ./example.h:15:61> someFunction1 'NSString *(void)' extern
> |-FunctionDecl 0x10450cc00 <./example.h:16:1, ./example.h:16:61> someFunction2 'NSString *(void)' extern
>
>
>
>
> That is, I would like to be able to extract a SourceRange from a single file that I could delete (or comment out) to remove the definition or someFunction1 or someFunction2. Obviously the existing SourceRange that I get from the AST makes that hard to do.
>
> Is it possible to get my desired SourceRange?
>
> Thank you,
> Michael
>
>
>
> On Wed, Apr 2, 2014 at 1:51 AM, Manuel Klimek <klimek at google.com> wrote:
> On Wed, Apr 2, 2014 at 2:31 AM, Michael Bolin <bolinfest at gmail.com> wrote:
> Hi, I am traversing the AST for an obj-c file using a clang plugin. I have a code snippet like the following:
>
> #define JK_ATTRIBUTES(attr, ...) __attribute__((attr, ##__VA_ARGS__))
> #define JK_STATIC_INLINE static __inline__ JK_ATTRIBUTES(always_inline)
>
> JK_STATIC_INLINE int jk_parse_skip_newline();
>
> @implementation Hello
> - (void)say:(int)i {
> if (i > 0) {
> NSLog(@"Hello, world! (%d)", i);
> }
>
> // Example of selector with unknown method declaration.
> [(id)@"Anything" length];
> }
> @end
>
> JK_STATIC_INLINE int jk_parse_skip_newline() {
> return 0;
> }
>
> so while traversing the AST, I am trying to find the SourceRange of the jk_parse_skip_newline() definition at the bottom of the file. For non-macro expanded functions, this is very straightforward. But due to the macro expansion, I get a SourceRange that spans from the start of the macro to the end of my code snippet.
>
> How do you get that? If you only use functions that handle SourceRanges (and never combine locations you get from getBegin() getEnd()) that should not be possible.
> Take a look at Lexer::makeFileCharRange and Lexer::getSourceText for how to deal with macro-ized ranges.
>
> That means that it also includes the Hello class, which has nothing to do with jk_parse_skip_newline(). This is a problem because I am trying to use the AST to determine where jk_parse_skip_newline is defined so I can comment it out of the source file.
>
> Is it possible for me to get the necessary SourceRange from the clang API? Ideally, I would get a SourceRange that identifies only the last three lines of my code sample.
>
> Thank you,
> Michael
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20140407/785f819e/attachment.html>
More information about the cfe-dev
mailing list