[squeak-dev] The Trunk: Compiler-nice.96.mcz
commits at source.squeak.org
commits at source.squeak.org
Tue Oct 27 14:25:49 UTC 2009
Nicolas Cellier uploaded a new version of Compiler to project The Trunk:
http://source.squeak.org/trunk/Compiler-nice.96.mcz
==================== Summary ====================
Name: Compiler-nice.96
Author: nice
Time: 27 October 2009, 3:25:48 am
UUID: bfe3f3dc-3f22-c04f-974e-90cb4725b53e
Ancestors: Compiler-nice.95
Test and minimal change to isLiteralSymbol: to make the test pass.
This is related to http://bugs.squeak.org/view.php?id=7211
I did not apply change proposed above, though it might be a good idea to restrict unquoted notation to explicitely documented valid Smalltalk literals.
There are pending decisions about wide characters and binary selectors to be resolved first.
=============== Diff against Compiler-nice.95 ===============
Item was changed:
----- Method: Scanner class>>isLiteralSymbol: (in category 'testing') -----
isLiteralSymbol: aSymbol
"Test whether a symbol can be stored as # followed by its characters.
Symbols created internally with asSymbol may not have this property,
e.g. '3' asSymbol."
+ | i ascii type next |
- | i ascii type |
i := aSymbol size.
i = 0 ifTrue: [^ false].
+ i = 1 ifTrue: [^('$''"()#0123456789_' includes: (aSymbol at: 1)) not
+ and: ["should be (TypeTable at: (aSymbol at: 1) charCode ifAbsent: [#xLetter]) ~~ #xDelimiter"
+ (aSymbol at: 1) isSeparator not]].
- i = 1 ifTrue: [^('$''"()#0123456789_' includes: (aSymbol at: 1)) not].
ascii := (aSymbol at: 1) charCode.
"TypeTable should have been origined at 0 rather than 1 ..."
ascii = 0 ifTrue: [^ false].
type := TypeTable at: ascii ifAbsent: [#xLetter].
(type == #xColon or: [type == #verticalBar or: [type == #xBinary]]) ifTrue:
[^i = 1].
type == #xLetter ifTrue:
+ [next := nil.
+ [i > 1] whileTrue:
- [[i > 1] whileTrue:
[ascii := (aSymbol at: i) charCode.
ascii = 0 ifTrue: [^false].
type := TypeTable at: ascii ifAbsent: [#xLetter].
(type == #xLetter or: [type == #xDigit or: [type == #xColon]]) ifFalse:
[^false].
+ (next == #xDigit and: [type == #xColon]) ifTrue: [^false].
+ next := type.
i := i - 1].
^true].
^false!
Item was added:
+ TestCase subclass: #ScannerTest
+ instanceVariableNames: ''
+ classVariableNames: ''
+ poolDictionaries: ''
+ category: 'Compiler-Tests'!
Item was added:
+ ----- Method: ScannerTest>>testLiteralSymbols (in category 'testing') -----
+ testLiteralSymbols
+
+ self assert: ('*+-/\~=<>&@%,|' allSatisfy: [:char | Scanner isLiteralSymbol: (Symbol with: char)])
+ description: 'single letter binary symbols can be printed without string quotes'.
+
+ self assert: (#('x' 'x:' 'x:y:' 'from:to:by:' 'yourself') allSatisfy: [:str | Scanner isLiteralSymbol: str asSymbol])
+ description: 'valid ascii selector symbols can be printed without string quotes'.
+
+ ((32 to: 126) collect: [:ascii | Character value: ascii]) ,
+ #(':x:yourself' '::' 'x:yourself' '123' 'x0:1:2:' 'x.y.z' '1abc' 'a1b0c2' ' x' 'x ' '+x-y' '||' '--' '++' '+-' '+/-' '-/+' '<|>' '#x' '()' '[]' '{}' '')
+ do: [:str |
+ self assert: (Compiler evaluate: str asSymbol printString) = str asSymbol
+ description: 'in all case, a Symbol must be printed in an interpretable fashion']!
More information about the Squeak-dev
mailing list
|