<div>I had been trying to advance the phase to the next.</div><div>Now, an experimental pull request is here.</div><div><a href="https://github.com/D-Programming-Language/dmd/pull/1311">https://github.com/D-Programming-Language/dmd/pull/1311</a></div>
<div><br></div><div>----</div><div>This change can distinguish almost usages between property and non-property syntax </div><div><br></div><div>int func() { return 1; }</div><div>void func(int n) { }</div><div>@property int prop() { return 2; }</div>
<div>@property void prop(int n) { }</div><div>void main() {</div><div>  // Without -property switch, all lines can compile.</div><div>  // With -property switch:</div><div>  func();     // OK -> OK</div><div>  func(1);    // OK -> OK</div>
<div>  func;       // OK -> OK [*]</div><div>  func = 1;   // OK -> NG (fixed!)</div><div>  prop();     // OK -> NG (fixed!)</div><div>  prop(1);    // OK -> NG (fixed!)</div><div>  prop;       // OK -> OK</div>
<div>  prop = 1;   // OK -> OK</div><div>}</div><div><br></div><div>First exception is [*], keeping the line is necessary to allow UFCS chain without redundant parentheses (e.g. r.map!(a=>a*2).array). It is acceptable to me, at least.</div>
<div><br></div><div class="gmail_extra">----</div><div class="gmail_extra"><div class="gmail_extra">I also implemented that calling function pointer which returned by property function.</div><div class="gmail_extra"><br></div>
<div class="gmail_extra">@property foo(){ return (int n) => n * 2; }</div><div class="gmail_extra">auto n = foo(10);  // `foo` is resolved to property function call in advance</div><div class="gmail_extra">assert(n == 20);</div>
<div class="gmail_extra"><br></div><div class="gmail_extra">But, we cannot support it immediately, because it will *always* introduce breaking of existing code.</div><div class="gmail_extra"><br></div><div class="gmail_extra">
- If enable always this feature, propfunc() is implicitly translated to (propfunc())(),</div><div class="gmail_extra">  then much existing correct code without "-property" switch will break.</div><div class="gmail_extra">
- If enable this only when -property switch is specified, a code propfunc() will have</div><div class="gmail_extra">  _two_ meanings. When propfunc returns a function pointer,</div><div class="gmail_extra">  * If -property is on, propfunc() is translated to propfunc()(), then</div>
<div class="gmail_extra">    call returned function pointer and returns its result.</div><div class="gmail_extra">  * If -property is off, propfunc() is jsut call property function, then</div><div class="gmail_extra">    returns function pointer.</div>
<div><br></div><div>Changing compilation behavior by compile switch is bad.</div><div>Then it is the second exception.<br></div><div><br></div><div>----</div><div>The third exception is in AddressExpression (&exp).</div>
<div><br></div><div>In current, both &func and &propfunc return their function pointers. Some peoples argues</div><div>that the latter should return an address of the returned value of propfunc after implementing more property enforcement, but I'm difficult to accept that.</div>
<div><br></div><div>The root cause is: AddressExpression is just only one built-in feature for getting an exact type of property function (Note that typeof(propfunc) returns the type of propfunc result).</div><div><br></div>
<div><div>If compiler will always translate the code &propfunc to &(propfunc()), </div><div>we will lost a way to get an exact type of propfunc, and then std.traits.FunctionTypeOf will never work for propfunc.</div>
</div><div><br></div><div>To resolve the issue, I have proposed a small enhancement for AddressExpression.</div><div><a href="http://d.puremagic.com/issues/show_bug.cgi?id=9062">http://d.puremagic.com/issues/show_bug.cgi?id=9062</a> <br>
</div><div><br></div><div>It will distinguish &propfunc and &(propfunc), the former returns a function poiinter of propfunc, and the latter returns an address of propfunc result.</div><div><br></div><div>The real example about that is here.</div>
<div><a href="https://github.com/D-Programming-Language/phobos/pull/968/files#L0L1136">https://github.com/D-Programming-Language/phobos/pull/968/files#L0L1136</a> <br></div><div><br></div><div>----</div><div>How about that?<br>
</div><div><br></div><div>Kenji Hara</div></div>