diff --git a/ChangeLog b/ChangeLog index 6fa47388e..38067e267 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2012-10-02 Holger Freyther + + * tests/stcompiler.st: Add testcase for pragma parsing. + * tests/stcompiler.ok: Update the test result. + 2012-09-29 Holger Freyther * scripts/Convert.st: Collect all rewrite expressions and parse diff --git a/packages/stinst/parser/ChangeLog b/packages/stinst/parser/ChangeLog index 31bb50cc2..58affee2c 100644 --- a/packages/stinst/parser/ChangeLog +++ b/packages/stinst/parser/ChangeLog @@ -1,3 +1,8 @@ +2012-10-02 Holger Freyther + + * GSTParser.st: Change GSTFileInParser>>#parseClassTag to parse + more complicated pragmas. + 2012-09-29 Holger Freyther * RBParser.st: Add RBScanner>>#digitValue:. diff --git a/packages/stinst/parser/GSTParser.st b/packages/stinst/parser/GSTParser.st index c84410aac..9e1d0efdc 100644 --- a/packages/stinst/parser/GSTParser.st +++ b/packages/stinst/parser/GSTParser.st @@ -237,21 +237,28 @@ STInST.STFileInParser subclass: GSTFileInParser [ ] parseClassTag [ - | selector argument stmt | + | selectors arguments stmt | self skipExpectedToken: #<. (currentToken isKeyword) - ifTrue: [selector := currentToken value asSymbol. self step] ifFalse: [self parserError: 'expected keyword']. - - argument := self parsePrimitiveObject. + + selectors := OrderedCollection new. + arguments := OrderedCollection new. + + "Consume all keywords and literals of the pragma" + [currentToken isKeyword] whileTrue: [ + selectors add: currentToken. self step. + arguments add: self parsePrimitiveObject. + ]. + self skipExpectedToken: #>. stmt := RBMessageNode receiver: taggee - selector: selector - arguments: { argument }. + selectorParts: selectors + arguments: arguments. self evaluateStatement: stmt. ] diff --git a/tests/stcompiler.st b/tests/stcompiler.st index 084f5f905..8f67250ad 100644 --- a/tests/stcompiler.st +++ b/tests/stcompiler.st @@ -104,6 +104,13 @@ literalValueFoo12345 Eval [ | classes | + "Attempt to parse a pragma with multiple parameters" + classes := STInST.STClassLoader new + parseSmalltalkStream: 'Object subclass: Bla [ + ]' readStream + with: STInST.GSTFileInParser. + + "Check if the proxy has a proper behavior" classes := STInST.STClassLoader new parseSmalltalkStream: 'Object subclass: Foo []' readStream with: STInST.GSTFileInParser.