[squeak-dev] The Trunk: ShoutCore-mt.82.mcz

commits at source.squeak.org commits at source.squeak.org
Mon Jun 15 17:12:43 UTC 2020


Marcel Taeumel uploaded a new version of ShoutCore to project The Trunk:
http://source.squeak.org/trunk/ShoutCore-mt.82.mcz

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

Name: ShoutCore-mt.82
Author: mt
Time: 15 June 2020, 7:12:43.61019 pm
UUID: 4354ca0d-a509-b247-8ee1-4a05fb6bc5b3
Ancestors: ShoutCore-mt.81

Improve readability of code for dispatching to custom pragma parsers.

=============== Diff against ShoutCore-mt.81 ===============

Item was added:
+ ----- Method: SHParserST80>>parsePragmaDefault (in category 'parse pragma') -----
+ parsePragmaDefault
+ 	"Parse unary, binary, and keyword pragmas."
+ 			
+ 	self currentTokenType
+ 		caseOf: {
+ 			[ #name ] -> [ 
+ 				self scanPast: #pragmaUnary.
+ 				self failUnless: currentToken = '>'.
+ 				self scanPast: #primitiveOrExternalCallEnd ].
+ 			[ #binary ] -> [ self parsePragmaBinary ].
+ 			[ #keyword ] -> [ self parsePragmaKeyword ] }
+ 		otherwise: [ self fail ": 'Invalid External Function Calling convention'" ]. !

Item was changed:
  ----- Method: SHParserST80>>parsePragmaStatement (in category 'parse pragma') -----
  parsePragmaStatement
+ 	"Parse a pragma statement. The leading '<' has already been consumed. The currentToken is the first one in the pragma. Use that token to dispatch to a custom pragma-parsing method if one can be found with a selector that matches it.
- 
- 	| parserSelector |
- 	(currentToken last == $:
- 		and: [(parserSelector := Symbol lookup: currentToken allButLast) notNil])
- 			ifFalse: ["Quick exit to not break one-word pragmas such as <primitive> and <foobar>; also avoid interning new symbols for made-up pragmas such as for <my: 1 new: 2 pragma: 3> not interning #my."
- 				^ self parsePragmaStatementKeywords].
  	
+ 	Note that custom pragma parsers need to fulfill two requirements:
+ 		- method selector must match the current token as simple getter,
+ 				e.g., <apicall: ...> matches #apicall or <primitive: ...> matches #primitive
+ 		- method must have pragma <pragmaParser> to be called."
- 	SHParserST80 methodDict
- 		at: parserSelector
- 		ifPresent: [:parserMethod |
- 			(parserMethod pragmas
- 				anySatisfy: [:pragma | pragma keyword == #pragmaParser])
- 					ifTrue: [^ self executeMethod: parserMethod]].
  
+ 	"1) Do not consider one-word pragmas such as <primitive> and <foobar>. Only keyword pragmas."
+ 	currentToken last == $: ifTrue: [
+ 		"2) Avoid interning new symbols for made-up pragmas such as #my for <my: 1 pragma: 2>."
+ 		(Symbol lookup: currentToken allButLast) ifNotNil: [:parserSelector |
+ 			SHParserST80 methodDict at: parserSelector ifPresent: [:parserMethod |
+ 				"3) Only call methods that claim to be a custom pragma parser via <pragmaParser>."
+ 				(parserMethod hasPragma: #pragmaParser)
+ 					ifTrue: [^ self executeMethod: parserMethod]]]].	
+ 
+ 	"X) No custom pragma parser found. Use the default one."
+ 	^ self parsePragmaDefault!
- 	^ self parsePragmaStatementKeywords!

Item was removed:
- ----- Method: SHParserST80>>parsePragmaStatementKeywords (in category 'parse pragma') -----
- parsePragmaStatementKeywords
- 			
- 	self currentTokenType
- 		caseOf: {
- 			[ #name ] -> [ 
- 				self scanPast: #pragmaUnary.
- 				self failUnless: currentToken = '>'.
- 				self scanPast: #primitiveOrExternalCallEnd ].
- 			[ #binary ] -> [ self parsePragmaBinary ].
- 			[ #keyword ] -> [ self parsePragmaKeyword ] }
- 		otherwise: [ self fail ": 'Invalid External Function Calling convention'" ]. !



More information about the Squeak-dev mailing list