Skip to content

Commit

Permalink
This PR provides multiple fixes to failing CAST tests, due to changes…
Browse files Browse the repository at this point in the history
… in the SmaCC parse results.

It also add a missing method #plusPlusToken: which was called when testing an expression like a++.
  • Loading branch information
Hernán Morales Durand committed Jul 31, 2023
1 parent 9f10e99 commit c4dacc6
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 49 deletions.
110 changes: 62 additions & 48 deletions smalltalksrc/CAST/CASTParserTests.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -190,36 +190,39 @@ CASTParserTests >> testParseAdressOf [
{ #category : #'tests-declarators' }
CASTParserTests >> testParseArrayDeclarationWithInitializer [

| declaration declarator |
| declaration initDeclarator smaCCToken arrayDeclarator |
declaration := self parseDeclaration: 'int a[] = foo()'.

self assert: (declaration specifiers includes: 'int').
self assert: declaration declarators size equals: 1.

declarator := declaration declarators first.
self assert: declarator isInitializerDeclarator.
self assert: declarator initializer isFunctionCall.
initDeclarator := declaration declarators first.
smaCCToken := declaration specifiers first.

self assert: smaCCToken value equals: 'int'.
self assert: initDeclarator isInitializerDeclarator.
self assert: initDeclarator initializer isFunctionCall.

"Inside the initializer declarator is the array declarator"
declarator := declarator declarator.
self assert: declarator isArrayDeclarator.
self assert: declarator size equals: nil.
self assert: declarator declarator name equals: 'a'.
arrayDeclarator := initDeclarator declarator.
self assert: arrayDeclarator isArrayDeclarator.
self assert: arrayDeclarator size equals: nil.
self assert: arrayDeclarator declarator name equals: 'a'.
]

{ #category : #'tests-declarators' }
CASTParserTests >> testParseArrayDeclarationWithSize [

| declaration declarator |
| declaration arrayDeclarator smaCCToken |
declaration := self parseDeclaration: 'int a[17]'.

self assert: (declaration specifiers includes: 'int').
self assert: declaration declarators size equals: 1.

declarator := declaration declarators first.
self assert: declarator isArrayDeclarator.
self assert: declarator size value equals: '17'.
self assert: declarator declarator name equals: 'a'.
self assert: declaration specifiers size value equals: 1.

arrayDeclarator := declaration declarators first.
smaCCToken := declaration specifiers first.

self assert: smaCCToken value equals: 'int'.
self assert: arrayDeclarator isArrayDeclarator.

self assert: arrayDeclarator size value equals: '17'.
self assert: arrayDeclarator declarator name equals: 'a'.
]

{ #category : #'tests-basic expressions' }
Expand Down Expand Up @@ -274,11 +277,12 @@ CASTParserTests >> testParseCallWithArguments [
{ #category : #'tests-control flow' }
CASTParserTests >> testParseCastExpression [

| statement |
statement := self parseStatement: '(int)2.1'.
| statement typeSpecifiers |
statement := self parseStatement: '(int)2.1;'.
typeSpecifiers := statement type specifiers.

self assert: statement isCastExpression.
self assert: statement type equals: 'int'
self assert: typeSpecifiers first value equals: 'int'
]

{ #category : #'tests-basic expressions' }
Expand Down Expand Up @@ -369,10 +373,11 @@ CASTParserTests >> testParseFloatingPointConstant [
{ #category : #'tests-declarators' }
CASTParserTests >> testParseFunctionDeclarator [

| declaration declarator |
| declaration declarator declarationSpecifiers |
declaration := self parseDeclaration: 'int f(void)'.
declarationSpecifiers := declaration specifiers.

self assert: (declaration specifiers includes: 'int').
self assert: declarationSpecifiers first value equals: 'int'.
self assert: declaration declarators size equals: 1.

declarator := declaration declarators first.
Expand All @@ -384,10 +389,11 @@ CASTParserTests >> testParseFunctionDeclarator [
{ #category : #'tests-declarators' }
CASTParserTests >> testParseFunctionPointerDeclarator [

| declaration declarator |
| declaration declarator declarationSpecifiers |
declaration := self parseDeclaration: 'int (*pf)(void)'.
declarationSpecifiers := declaration specifiers.

self assert: (declaration specifiers includes: 'int').
self assert: declarationSpecifiers first value equals: 'int'.
self assert: declaration declarators size equals: 1.

declarator := declaration declarators first.
Expand Down Expand Up @@ -623,10 +629,11 @@ CASTParserTests >> testParseParenthesizedExpression [
{ #category : #'tests-declarators' }
CASTParserTests >> testParsePointerDeclarator [

| declaration declarator |
| declaration declarator declarationSpecifiers |
declaration := self parseDeclaration: 'int *a'.
declarationSpecifiers := declaration specifiers.

self assert: (declaration specifiers includes: 'int').
self assert: declarationSpecifiers first value equals: 'int'.
self assert: declaration declarators size equals: 1.

declarator := declaration declarators first.
Expand Down Expand Up @@ -666,10 +673,11 @@ CASTParserTests >> testParseReturnWithoutExpression [
{ #category : #'tests-declarators' }
CASTParserTests >> testParseSequenceOfDeclarators [

| declaration declarator |
| declaration declarator declarationSpecifiers |
declaration := self parseDeclaration: 'int a=1, b=2'.

self assert: (declaration specifiers includes: 'int').
declarationSpecifiers := declaration specifiers.

self assert: declarationSpecifiers first value equals: 'int'.
self assert: declaration declarators size equals: 2.

declarator := declaration declarators first.
Expand All @@ -686,10 +694,11 @@ CASTParserTests >> testParseSequenceOfDeclarators [
{ #category : #'tests-declarators' }
CASTParserTests >> testParseSimpleArrayDeclaration [

| declaration declarator |
| declaration declarator declarationSpecifiers |
declaration := self parseDeclaration: 'int a[]'.

self assert: (declaration specifiers includes: 'int').
declarationSpecifiers := declaration specifiers.

self assert: declarationSpecifiers first value equals: 'int'.
self assert: declaration declarators size equals: 1.

declarator := declaration declarators first.
Expand Down Expand Up @@ -724,16 +733,22 @@ CASTParserTests >> testParseSizeofTypeInt [
{ #category : #'tests-declarators' }
CASTParserTests >> testParseStructDeclarator [

| declaration declarator |
| declaration structDeclaratorNode smaCCToken specifier structDeclarationNode declarators |
declaration := (CASTParser parse: 'struct C { int member; } obj;') declarations first.

self assert: (declaration specifiers includes: 'int').
self assert: declaration declarators size equals: 1.
specifier := declaration specifiers first.
structDeclarationNode := specifier members first.
smaCCToken := structDeclarationNode specifiers first.
declarators := structDeclarationNode declarators.

declarator := declaration declarators first.
self assert: declarator isFunctionDeclarator.
self assert: declarator declarator name equals: 'f'.
self assert: declarator parameters size equals: 1.
self assert: smaCCToken value equals: 'int'.
self assert: declarators size equals: 1.

structDeclaratorNode := declarators first.

self assert: structDeclaratorNode declarator hasValidName.
self assert: structDeclaratorNode declarator name equals: 'member'.
self assert: structDeclaratorNode declarator isIdentifier.
]

{ #category : #'tests-structures' }
Expand Down Expand Up @@ -809,7 +824,7 @@ CASTParserTests >> testParseSwitchWithDefaultCase [
CASTParserTests >> testParseTernary [

| statement |
statement := self parseStatement: '(a ? 0 : 1)'.
statement := self parseStatement: '(a ? 0 : 1);'.

self assert: statement isTernary.
self assert: statement then isConstant.
Expand All @@ -819,16 +834,15 @@ CASTParserTests >> testParseTernary [
{ #category : #'tests-declarators' }
CASTParserTests >> testParseUnionDeclarator [

| declaration declarator |
| smaCCToken declaration specifier declarationNode |
declaration := (CASTParser parse: 'union C { int member; } obj;') declarations first.

self assert: (declaration specifiers includes: 'int').
specifier := declaration specifiers first.
declarationNode := specifier members first.
smaCCToken := declarationNode specifiers first.
self assert: smaCCToken value equals: 'int'.
self assert: declaration declarators size equals: 1.

declarator := declaration declarators first.
self assert: declarator isFunctionDeclarator.
self assert: declarator declarator name equals: 'f'.
self assert: declarator parameters size equals: 1.
]

{ #category : #'tests-numbers' }
Expand Down
9 changes: 8 additions & 1 deletion smalltalksrc/CAST/CIncrementNode.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ Class {
#superclass : #CExpressionNode,
#instVars : [
'object',
'prefix'
'prefix',
'plusPlusToken'
],
#category : #'CAST-Nodes'
}
Expand Down Expand Up @@ -46,6 +47,12 @@ CIncrementNode >> object: aCGLRAbstractNode [
ifTrue: [ self object parent: self ]
]

{ #category : #accessing }
CIncrementNode >> plusPlusToken: aSmaCCToken [

plusPlusToken := aSmaCCToken
]

{ #category : #accessing }
CIncrementNode >> prefix [

Expand Down

0 comments on commit c4dacc6

Please sign in to comment.