[cfe-dev] [clang] declspec(property...) advice
Eric Niebler
eric at boostpro.com
Wed Dec 8 11:53:59 PST 2010
On 12/8/2010 1:16 PM, Douglas Gregor wrote:
>
> On Dec 8, 2010, at 9:56 AM, Eric Niebler wrote:
>
>> I'm currently working on getting the front-end to eat Microsoft's
>> __declspec(property...) extension.
>>
>> http://msdn.microsoft.com/en-us/library/yhfk0thd%28v=VS.100%29.aspx
>>
>> I've gotten things to the point where I can parse it and generate a
>> PropertyAttr attached to the FieldDecl. The PropertyAttr has two
>> string attributes representing the name of the getter and setter
>> member functions. I am wondering if this is the best way to
>> represent this in the AST. My impression of how the feature is
>> used is that expressions are rewritten:
>>
>> "a = x.foo" becomes "a = x.getFoo()" "x.foo = a" becomes
>> "x.setFoo(a)" "x.foo += 1" becomes "x.setFoo(x.getFoo() + 1)"
>>
>> Also, when generating the layout for the class and the
>> constructors/destructors/assign methods, these pseudo-fields
>> should be ignored. These are all non-trivial rewrites. A few
>> questions:
>>
>> 1) In your opinion, is having a normal FieldDecl in the AST with an
>> attribute the way to go? Or should there be an entirely different
>> kind of Decl for these pseudo-fields?
>
> There should be an entirely different kind of Decl for these
> properties, because they really have nothing to do with fields once
> we've gotten past their syntax. It'll be a subclass of ValueDecl,
> much like IndirectFieldDecl or ObjCPropertyDecl.
OK, makes sense.
>> 2) If the attribute is the right approach, is storing the getters
>> and setters as strings sensible? FWIW, Microsoft doesn't catch
>> typos in the getter/setter declaration until the property is
>> actually referenced, which seems to suggest that its doing a
>> fairly primitive rewrite at the point of use. So strings would
>> work, IIUC. It does not eagerly perform name lookup of the getters
>> and setters within the class definition.
>
> It makes sense to delay the lookup of the get/put names until after
> the class is defined (like we do with default arguments and inline
> member function bodies), but I find it really gross that name lookup
> doesn't occur until the property is actually referenced.
I agree, it's a bit gross. I can't think of a case where performing
name-lookup at the end of the class definition would produce different
results, but I'm a bit wary of trying to be smarter than the MS compiler
when the ultimate goal is feature parity with MS.
>> 3) Where should the rewrite happen? Is it OK to leave in
>> references to the pseudo-field in the AST, or should the AST
>> reflect what will actually be executed -- invocations of the
>> getters and setters? My instinct tells me that the AST should have
>> the pseudo-field, not the getters and setters. Anything else might
>> confuse things like IDEs.
>
> The AST should have the pseudo-field (possibly with a special
> "MSPropertyRefExpr" expression type to reference them), and we
> should introduce implicit AST nodes (e.g., an ImplicitCastExpr
> wrapping a call) to handle the get and put calls.
I'm afraid I didn't follow that.
> You're in luck,
> though: Objective-C has properties, and John McCall is currently
> refactoring lvalue-to-rvalue conversions to make properties (and
> other constructs) more explicit and cleaner. You should be able to
> use the Objective-C property implementation as a guide and follow
> what John is currently doing to implement this feature.
OK, then I might just put off further work on this feature until the
refactorization is done and I have John's work to crib from.
John, can you please alert me when your work in this area is done?
Thanks,
--
Eric Niebler
BoostPro Computing
http://www.boostpro.com
More information about the cfe-dev
mailing list