The Inbox: Collections-cwp.491.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

The Inbox: Collections-cwp.491.mcz

commits-2
A new version of Collections was added to project The Inbox:
http://source.squeak.org/inbox/Collections-cwp.491.mcz

==================== Summary ====================

Name: Collections-cwp.491
Author: cwp
Time: 21 October 2012, 11:37:20.466 pm
UUID: ecb9c37e-309e-43eb-8f24-3d5662da038e
Ancestors: Collections-fbs.490

Cleaned up the behavior of #numArgs with respect to selectors containing underscores.

=============== Diff against Collections-fbs.490 ===============

Item was changed:
  ----- Method: String class>>initialize (in category 'initialization') -----
  initialize   "self initialize"
 
  | order |
  AsciiOrder := (0 to: 255) as: ByteArray.
 
  CaseInsensitiveOrder := AsciiOrder copy.
  ($a to: $z) do:
  [:c | CaseInsensitiveOrder at: c asciiValue + 1
  put: (CaseInsensitiveOrder at: c asUppercase asciiValue +1)].
 
  "Case-sensitive compare sorts space, digits, letters, all the rest..."
  CaseSensitiveOrder := ByteArray new: 256 withAll: 255.
  order := -1.
  ' 0123456789' do:  "0..10"
  [:c | CaseSensitiveOrder at: c asciiValue + 1 put: (order := order+1)].
  ($a to: $z) do:     "11-64"
  [:c | CaseSensitiveOrder at: c asUppercase asciiValue + 1 put: (order := order+1).
  CaseSensitiveOrder at: c asciiValue + 1 put: (order := order+1)].
  1 to: CaseSensitiveOrder size do:
  [:i | (CaseSensitiveOrder at: i) = 255 ifTrue:
  [CaseSensitiveOrder at: i put: (order := order+1)]].
  order = 255 ifFalse: [self error: 'order problem'].
 
  "a table for translating to lower case"
  LowercasingTable := String withAll: (Character allByteCharacters collect: [:c | c asLowercase]).
 
  "a table for translating to upper case"
  UppercasingTable := String withAll: (Character allByteCharacters collect: [:c | c asUppercase]).
 
  "a table for testing tokenish (for fast numArgs)"
+ self initializeTokenish.
- Tokenish := String withAll: (Character allByteCharacters collect:
- [:c | c tokenish ifTrue: [c] ifFalse: [$~]]).
 
  "CR and LF--characters that terminate a line"
  CSLineEnders := CharacterSet crlf.
 
    "separators and non-separators"
  CSSeparators := CharacterSet separators.
  CSNonSeparators := CSSeparators complement.
 
  "% and < for #expandMacros*"
  CSMacroCharacters := CharacterSet newFrom: '%<'.
 
  "a table for exchanging cr with lf and vica versa"
  CrLfExchangeTable := Character allByteCharacters collect: [ :each |
  each
  caseOf: {
  [ Character cr ] -> [ Character lf ].
  [ Character lf ] -> [ Character cr ] }
  otherwise: [ each ] ]!

Item was added:
+ ----- Method: String class>>initializeTokenish (in category 'initialization') -----
+ initializeTokenish
+ Tokenish := String withAll:
+ (Character allByteCharacters collect:
+ [ :c |
+ c tokenish
+ ifTrue: [ c ]
+ ifFalse: [ $~ ]]) !

Item was changed:
  ----- Method: String>>numArgs (in category 'accessing') -----
  numArgs
  "Answer either the number of arguments that the receiver would take if considered a selector.  Answer -1 if it couldn't be a selector.  Note that currently this will answer -1 for anything begining with an uppercase letter even though the system will accept such symbols as selectors.  It is intended mostly for the assistance of spelling correction."
 
  | firstChar numColons excess start ix |
  self size = 0 ifTrue: [^ -1].
  firstChar := self at: 1.
  (firstChar isLetter or: [firstChar = $:]) ifTrue:
  ["Fast reject if any chars are non-alphanumeric
  NOTE: fast only for Byte things - Broken for Wide"
+ self class isBytes
+ ifTrue: [(self findSubstring: '~' in: self startingAt: 1 matchTable: Tokenish) > 0 ifTrue: [^ -1]]
+ ifFalse: [2 to: self size do: [:i | (self at: i) tokenish ifFalse: [^ -1]]].
- Scanner prefAllowUnderscoreSelectors ifFalse:
- [self class isBytes
- ifTrue: [(self findSubstring: '~' in: self startingAt: 1 matchTable: Tokenish) > 0 ifTrue: [^ -1]]
- ifFalse: [2 to: self size do: [:i | (self at: i) tokenish ifFalse: [^ -1]]]].
  "Fast colon count"
  numColons := 0.  start := 1.
  [(ix := self indexOf: $: startingAt: start) > 0]
  whileTrue:
  [numColons := numColons + 1.
  start := ix + 1].
  numColons = 0 ifTrue: [^ 0].
  firstChar = $:
  ifTrue: [excess := 2 "Has an initial keyword, as #:if:then:else:"]
  ifFalse: [excess := 0].
  self last = $:
  ifTrue: [^ numColons - excess]
  ifFalse: [^ numColons - excess - 1 "Has a final keywords as #nextPut::andCR"]].
  firstChar isSpecial ifTrue:
  [self size = 1 ifTrue: [^ 1].
  2 to: self size do: [:i | (self at: i) isSpecial ifFalse: [^ -1]].
  ^ 1].
  ^ -1.!

Item was added:
+ ----- Method: Symbol>>numArgs (in category 'accessing') -----
+ numArgs
+ "Answer either the number of arguments that the receiver would take if considered a selector.  Answer -1 if it couldn't be a selector.  Note that currently this will answer -1 for anything begining with an uppercase letter even though the system will accept such symbols as selectors.  It is intended mostly for the assistance of spelling correction."
+
+ | firstChar numColons excess start ix |
+ self size = 0 ifTrue: [^ -1].
+ firstChar := self at: 1.
+ (firstChar isLetter or: [firstChar = $:]) ifTrue:
+ [2 to: self size do:
+ [:i || c |
+ c := self at: i.
+ (c = $_ or: [c tokenish]) ifFalse: [^ -1]].
+ "Fast colon count"
+ numColons := 0.  start := 1.
+ [(ix := self indexOf: $: startingAt: start) > 0]
+ whileTrue:
+ [numColons := numColons + 1.
+ start := ix + 1].
+ numColons = 0 ifTrue: [^ 0].
+ firstChar = $:
+ ifTrue: [excess := 2 "Has an initial keyword, as #:if:then:else:"]
+ ifFalse: [excess := 0].
+ self last = $:
+ ifTrue: [^ numColons - excess]
+ ifFalse: [^ numColons - excess - 1 "Has a final keywords as #nextPut::andCR"]].
+ firstChar isSpecial ifTrue:
+ [self size = 1 ifTrue: [^ 1].
+ 2 to: self size do: [:i | (self at: i) isSpecial ifFalse: [^ -1]].
+ ^ 1].
+ ^ -1.!