<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">Kim recently pointed out that the following program causes a compiler crash, but should be illegal, because it violates the no-shadowing rule, which states "It is an error to declare a constant or variable that shadows a lexically-enclosing<div>constant or variable."</div><div><br></div><div>Program 1:</div><div><br></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><div>class test.with(x:Number) {</div></div><div><div>      def x: Number = 2</div></div><div><div>      print(x)</div></div><div><div>}</div></div><div><br></div></blockquote>What about the similar program<div><br></div><div>Program 2:<br><div><br></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><div>class test.with(x:Number) {</div></div><div><div>      method x -> Number { 2 }</div></div><div><div>      print(x)</div></div><div><div>}</div></div></blockquote><div><br></div><div>This is just as bad (in both programs there is no way to access the parameter <i>x</i>), but it does not violate the rule.   In fact, with the addition of and “is public” annotation to the def of x in the first program, they are pretty much identical.  Which was why program 1 was getting through the existing checks: they treated defs and vars inside classes and objects as equivalent to methods.</div><div><br></div><div>I tried implementing a slightly stricter version of the no shadowing rule, in which it’s illegal to declare a method <i>y</i> inside the scope of a def of <i>y.  </i> This makes the following program illegal:</div><div><br></div><div>Program 3:</div><div><br></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><div>class y.new { … }</div><div><br></div><div>class z.new {</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>method y { … }</div><div>}</div></blockquote><div><br></div><div>Do we want program 3 to be legal?   If you say no, this will break objectdraw, where y = color and z = drawable.   If you say yes, we need a no shadowing rule that allows program 3 but disallows program 2.</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">    </span>Andrew</div><div>  </div></div><div><br></div><div><br></div></body></html>