<div dir="ltr">Hi Marcel, Hi All,<div class="gmail_extra"><br><div class="gmail_quote">On Thu, May 31, 2018 at 3:26 AM, Marcel Taeumel <span dir="ltr"><<a href="mailto:marcel.taeumel@hpi.de" target="_blank">marcel.taeumel@hpi.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div id="gmail-m_444284841358922659__MailbirdStyleContent" style="font-size:12pt;font-family:Calibri;color:rgb(0,0,0)">Hi, there.<div class="gmail-m_444284841358922659mb_sig"></div><div><br></div><div>I cannot browse the senders of #@-.</div></div></blockquote><div><br></div><div>I thought I'd try and look for examples of binary selectors followed by plus or minus signs.  It turned out to be harder than I thought. It did find an issue with Shout.  Shout incorrectly flags a keyword followed by a negative constant with no intervening whitespace as a syntax error.  e.g. this from IntervalTest>>testExtent</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">     </span>self assert: (1 to: 10) extent = 9.</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">    </span>self assert: (1 to: 10 by: 2) extent = 9.</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">      </span>self assert: (1 to:-1) extent = -2</div><div><br></div><div>Shout flags a syntax error from ":-1) extent", but this is legal.</div><div><br></div><div>Anyway, for the browse code I'm able to see just four false positives using the following looking for negative integers:</div><div><br></div><div><div>CurrentReadOnlySourceFiles cacheDuring:</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">    </span>[self systemNavigation browseAllSelect:</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                </span>[:m|</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">           </span>(m scanForInstructionSequence:</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                 </span>[:a :b|</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                        </span> a selector = #pushConstant:</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                   </span> and: [a argument isInteger</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                    </span> and: [a argument negative</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                     </span> and: [b selector = #send:super:numArgs:</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                       </span> and: [b arguments first isBinary]]]]])</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                </span>and: [| sansComments |</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                 </span>sansComments := String streamContents:</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                         </span>[:o| | inComment s |</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                           </span>inComment := false.</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                            </span>s := m getSource asString readStream.</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                          </span>[s atEnd] whileFalse:</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                                  </span>[inComment</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                                             </span>ifTrue: [s next = $" ifTrue: [inComment := false]]</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                                                </span>ifFalse:</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                                                       </span>[s peek = $"</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                                                              </span>ifTrue: [inComment := true. s next]</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                                                            </span>ifFalse: [o nextPut: s next]]].</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                                </span>o contents].</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                   </span>(sansComments piecesCutWhere: [:a :b| b = $-]) allButLast</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                              </span>anySatisfy:</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                                    </span>[:s| s last isSeparator not and: [s last isDigit not and: [('''${[()' includes: s last) not and: [s last asSymbol isBinary]]]]]]].</div></div><div><br></div><div>The scanForInstructionSequence: code looks for binary selectors with negative arguments (e.g. 1@-1).</div><div>sansComments strips the method source of its comments so we're not confused by characters in comments.</div><div>To look for binary selectors followed by '-' I use piecesCutWhere: to cut at the '-', and look at the last character of the preceding piece.</div><div>Alas a separator or a digit as symbol (e.g. #' ' and #'9') answer true to isBinary, so they need filtering out.</div><div>And there are plenty of occurrences of '-1' {-1. (-1 etc that are not examples of binary selectors.</div><div><br></div><div>The above found four false positives and no examples.  The following looks for positive numbers too. It's much slower, but also detects far more false positives.  Can anyone suggest better code?</div><div><br></div><div><div>CurrentReadOnlySourceFiles cacheDuring:</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">       </span>[self systemNavigation browseAllSelect:</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                </span>[:m|</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">           </span>(m scanForInstructionSequence:</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                 </span>[:a :b|</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                        </span> a selector = #pushConstant:</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                   </span> and: [a argument isInteger</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                    </span> and: [b selector = #send:super:numArgs:</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                       </span> and: [b arguments first isBinary]]]])</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">         </span>and: [| sansComments |</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                 </span>sansComments := String streamContents:</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                         </span>[:o| | inComment s |</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                           </span>inComment := false.</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                            </span>s := m getSource asString readStream.</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                          </span>[s atEnd] whileFalse:</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                                  </span>[inComment</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                                             </span>ifTrue: [s next = $" ifTrue: [inComment := false]]</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                                                </span>ifFalse:</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                                                       </span>[s peek = $"</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                                                              </span>ifTrue: [inComment := true. s next]</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                                                            </span>ifFalse: [o nextPut: s next]]].</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                                </span>o contents].</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                   </span>(sansComments piecesCutWhere: [:a :b| '+-' includes: b]) allButLast</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                            </span>anySatisfy:</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                                    </span>[:s| s last isSeparator not and: [s last isDigit not and: [('''${[()' includes: s last) not and: [s last asSymbol isBinary]]]]]]].</div></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div id="gmail-m_444284841358922659__MailbirdStyleContent" style="font-size:12pt;font-family:Calibri;color:rgb(0,0,0)"><div><br></div><div><img src="cid:e3ef1b38-d6c3-4793-acfb-1cf420cf615a" width="auto"></div><div><br></div><div>Best,</div><div>Marcel</div></div></blockquote></div><br><div class="gmail_signature"><div dir="ltr"><div><span style="font-size:small;border-collapse:separate"><div>_,,,^..^,,,_<br></div><div>best, Eliot</div></span></div></div></div>
</div></div>