[squeak-dev] The Inbox: Compiler-ct.457.mcz

commits at source.squeak.org commits at source.squeak.org
Tue Apr 13 17:45:02 UTC 2021


A new version of Compiler was added to project The Inbox:
http://source.squeak.org/inbox/Compiler-ct.457.mcz

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

Name: Compiler-ct.457
Author: ct
Time: 13 April 2021, 7:44:59.516492 pm
UUID: 22e7ee9f-1b8a-054c-a950-a742690bc284
Ancestors: Compiler-nice.456

Fixes a long-known bug when parsing a message with multiple repetitions of a colon. See Tests-ct.451 and http://forum.world.st/BUG-Parser-does-not-detect-syntax-error-with-double-colon-tp5112572.html.

Depends on Collections-ct.936.

=============== Diff against Compiler-nice.456 ===============

Item was changed:
  ----- Method: Parser>>expected: (in category 'error handling') -----
  expected: aString 
  	"Notify a problem at token 'here'."
  
+ 	^ self expected: aString at: hereMark + requestorOffset!
- 	^ self notify: aString , ' expected' at: hereMark + requestorOffset!

Item was added:
+ ----- Method: Parser>>expected:at: (in category 'error handling') -----
+ expected: aString at: location
+ 
+ 	^ self
+ 		notify: ('{1} expected' translated format: {aString})
+ 		at: location!

Item was changed:
  ----- Method: Parser>>messagePart:repeat: (in category 'expression types') -----
  messagePart: level repeat: repeat
  
  	| start receiver selector args precedence words keywordStart |
  	[receiver := parseNode.
  	(hereType == #keyword and: [level >= 3])
  		ifTrue: 
  			[start := self startOfNextToken.
  			selector := WriteStream on: (String new: 32).
  			args := OrderedCollection new.
  			words := OrderedCollection new.
  			[hereType == #keyword]
  				whileTrue: 
  					[keywordStart := self startOfNextToken + requestorOffset.
  					selector nextPutAll: self advance.
  					words addLast: (keywordStart to: self endOfLastToken + requestorOffset).
  					self primaryExpression ifFalse: [^self expected: 'Argument'].
  					self messagePart: 2 repeat: true.
  					args addLast: parseNode].
+ 			
+ 			selector := selector readStream.
+ 			words do: [:word |
+ 				(selector next: word size - 1)
+ 					indexOf: $: ifPresent: [:index |
+ 						^self expected: 'Argument' at: word start + index].
+ 				selector skip: 1].
+ 			
  			selector := (Symbol lookup: selector contents)
  				ifNil: [ self correctSelector: selector contents
  							wordIntervals: words
  							exprInterval: (start to: self endOfLastToken)
  							ifAbort: [ ^ self fail ] ].
  			precedence := 3]
  		ifFalse: [
  			(level >= 2 and: [hereType == #verticalBar]) ifTrue: [self transformAVerticalBarIntoABinarySelector].
  			(hereType == #binary and: [level >= 2])
  				ifTrue: 
  					[start := self startOfNextToken.
  					selector := self advance asOctetString asSymbol.
  					self primaryExpression ifFalse: [^self expected: 'Argument'].
  					self messagePart: 1 repeat: true.
  					args := Array with: parseNode.
  					precedence := 2]
  				ifFalse: [hereType == #word
  						ifTrue: 
  							[start := self startOfNextToken.
  							selector := self advance.
  							args := #().
  							words := OrderedCollection with: (start  + requestorOffset to: self endOfLastToken + requestorOffset).
  							selector := (Symbol lookup: selector)
  								ifNil: [ self correctSelector: selector
  											wordIntervals: words
  											exprInterval: (start to: self endOfLastToken)
  											ifAbort: [ ^ self fail ] ].
  							precedence := 1]
  						ifFalse: [^args notNil]]].
  	parseNode := MessageNode new
  				receiver: receiver
  				selector: selector
  				arguments: args
  				precedence: precedence
  				from: encoder
  				sourceRange: (start to: self endOfLastToken).
  	repeat]
  		whileTrue: [].
  	^true!



More information about the Squeak-dev mailing list