Skip to content

Commit

Permalink
Merge pull request OpenSmalltalk#216 from LABSARI/cast
Browse files Browse the repository at this point in the history
Cast
  • Loading branch information
guillep committed Apr 22, 2021
2 parents cb9bcdc + 2cbc243 commit 2ba4de9
Show file tree
Hide file tree
Showing 7 changed files with 511 additions and 38 deletions.
16 changes: 15 additions & 1 deletion smalltalksrc/CAST/CCompoundStatementNode.class.st
Expand Up @@ -4,7 +4,8 @@ Class {
#instVars : [
'declarations',
'statements',
'needsBrackets'
'needsBrackets',
'needsCarriageReturn'
],
#category : #'CAST-Nodes'
}
Expand Down Expand Up @@ -66,6 +67,7 @@ CCompoundStatementNode >> initialize [
statements := OrderedCollection new: 2.
declarations := OrderedCollection new: 2.
needsBrackets := true.
needsCarriageReturn := true
]

{ #category : #testing }
Expand All @@ -86,6 +88,18 @@ CCompoundStatementNode >> needsBrackets: anObject [
needsBrackets := anObject
]

{ #category : #accessing }
CCompoundStatementNode >> needsCarriageReturn [

^ needsCarriageReturn
]

{ #category : #accessing }
CCompoundStatementNode >> needsCarriageReturn: aBoolean [

needsCarriageReturn := aBoolean
]

{ #category : #generated }
CCompoundStatementNode >> statements [
^ statements
Expand Down
17 changes: 16 additions & 1 deletion smalltalksrc/Slang-Tests/CSlangPrettyPrinterTest.class.st
Expand Up @@ -91,6 +91,21 @@ CSlangPrettyPrinterTest >> testVisitCastExpression [
self assert: print equals: '(int)(1 + x)'
]

{ #category : #'tests-visitor' }
CSlangPrettyPrinterTest >> testVisitCastExpressionDouble [

| print |
print := self prettyPrint: (CBinaryOperatorNode
operator: #/
left: (CCastExpressionNode
type: (CTypeNameNode symbol: 'double')
expression: (CIdentifierNode name: 'a'))
right: (CIdentifierNode name: 'b')).


self assert: print equals: '(double)a / b'
]

{ #category : #'tests-visitor' }
CSlangPrettyPrinterTest >> testVisitCompoundStatement [

Expand Down Expand Up @@ -269,7 +284,7 @@ CSlangPrettyPrinterTest >> testVisitTernary [
then: (CConstantNode value: 0)
else: (CConstantNode value: 1)).

self assert: print trimBoth equals: '(a && b ? 0 : 1)'
self assert: print trimBoth equals: '((a && b) ? 0 : 1)'
]

{ #category : #'tests-visitor' }
Expand Down
272 changes: 272 additions & 0 deletions smalltalksrc/Slang-Tests/SlangBasicTranslationTest.class.st
Expand Up @@ -465,6 +465,45 @@ SlangBasicTranslationTest >> testSendAnd [
self assert: translation equals: '0 && 1'
]
{ #category : #'tests-send' }
SlangBasicTranslationTest >> testSendAsFloat [
| translation send |
send := TSendNode new
setSelector: #asFloat
receiver: (TVariableNode new setName: 'x')
arguments: {}.
translation := self translate: send.
self assert: translation equals: '(double)x'
]
{ #category : #'tests-send' }
SlangBasicTranslationTest >> testSendAsInteger [
| translation send |
send := TSendNode new
setSelector: #asInteger
receiver: (TVariableNode new setName: 'x')
arguments: {}.
translation := self translate: send.
self assert: translation equals: '(sqInt)x'
]
{ #category : #'tests-send' }
SlangBasicTranslationTest >> testSendAsIntegerPtr [
| translation send |
send := TSendNode new
setSelector: #asIntegerPtr
receiver: (TVariableNode new setName: 'x')
arguments: {}.
translation := self translate: send.
self assert: translation equals: '(sqIntptr_t)x'
]
{ #category : #'tests-send' }
SlangBasicTranslationTest >> testSendBetweenAnd [
Expand All @@ -480,6 +519,48 @@ SlangBasicTranslationTest >> testSendBetweenAnd [
self assert: translation equals: '(x >= 0) && (x <= 100)'
]
{ #category : #'tests-send' }
SlangBasicTranslationTest >> testSendBitAnd [
| translation send |
send := TSendNode new
setSelector: #bitAnd:
receiver: (TVariableNode new setName: 'a')
arguments: { TConstantNode value: 1 }.
translation := self translate: send.
self assert: translation equals: 'a & 1'
]
{ #category : #'tests-send' }
SlangBasicTranslationTest >> testSendBitOr [
| translation send |
send := TSendNode new
setSelector: #bitOr:
receiver: (TVariableNode new setName: 'a')
arguments: { TConstantNode value: 1 }.
translation := self translate: send.
self assert: translation equals: 'a | 1'
]
{ #category : #'tests-send' }
SlangBasicTranslationTest >> testSendBitXor [
| translation send |
send := TSendNode new
setSelector: #bitXor:
receiver: (TVariableNode new setName: 'a')
arguments: { TConstantNode value: 1 }.
translation := self translate: send.
self assert: translation equals: 'a ^ 1'
]
{ #category : #'tests-send' }
SlangBasicTranslationTest >> testSendDivide [
Expand Down Expand Up @@ -553,6 +634,34 @@ SlangBasicTranslationTest >> testSendIfTrue [
}'
]
{ #category : #'tests-send' }
SlangBasicTranslationTest >> testSendIfTrueIfFalse [
| translation send |
send := TSendNode new
setSelector: #ifTrue:ifFalse:
receiver: (TVariableNode new setName: 'x')
arguments: {
(TStmtListNode new setStatements: {
(TAssignmentNode new
setVariable: (TVariableNode new setName: 'a')
expression: (TConstantNode value: false)).
(TAssignmentNode new
setVariable: (TVariableNode new setName: 'c')
expression: (TConstantNode value: 1)) }).
(TStmtListNode new setStatements: { (TAssignmentNode new
setVariable: (TVariableNode new setName: 'a')
expression: (TConstantNode value: 1)) }) }.
translation := self translate: send.
self assert: translation trimBoth equals: 'if (x) {
a = 0;
c = 1;
}else {
a = 1;
}'
]
{ #category : #'tests-send' }
SlangBasicTranslationTest >> testSendIsNil [
Expand All @@ -567,6 +676,148 @@ SlangBasicTranslationTest >> testSendIsNil [
self assert: translation equals: 'ptr == NULL'
]
{ #category : #'tests-send' }
SlangBasicTranslationTest >> testSendLeftBitShifLitteralIntegerOverflow [
| translation send |
send := TSendNode new
setSelector: #<<
receiver: (TConstantNode value: 3)
arguments: { (TConstantNode value: 32) }.
translation := self translate: send.
self assert: translation equals: '3ULL << 32'
]
{ #category : #'tests-send' }
SlangBasicTranslationTest >> testSendLeftBitShifNegativeLitteralIntegerOverflow [
| translation send |
send := TSendNode new
setSelector: #<<
receiver: (TConstantNode value: -3)
arguments: { (TConstantNode value: 32) }.
translation := self translate: send.
self assert: translation equals: '((sqInt)((usqInt)(-3) << 32))'
]
{ #category : #'tests-send' }
SlangBasicTranslationTest >> testSendLeftBitShift [
| translation send |
generator currentMethod declarationAt: 'a' put: 'sqInt'.
send := TSendNode new
setSelector: #<<
receiver: (TVariableNode new setName: 'a')
arguments: { (TConstantNode value: 3) }.
translation := self translate: send.
self assert: translation equals: '((sqInt)((usqInt)(a) << 3))'
]
{ #category : #'tests-send' }
SlangBasicTranslationTest >> testSendLeftBitShiftByVariable [
| translation send |
generator currentMethod declarationAt: 'a' put: 'unsigned short'.
send := TSendNode new
setSelector: #<<
receiver: (TConstantNode value: 3)
arguments: { (TVariableNode new setName: 'a') }.
translation := self translate: send.
self assert: translation equals: '3U << a'
]
{ #category : #'tests-send' }
SlangBasicTranslationTest >> testSendLeftBitShiftByVariableIn32Bits [
| translation send |
generator currentMethod declarationAt: 'a' put: 'sqInt'.
send := TSendNode new
setSelector: #<<
receiver: (TConstantNode value: 3)
arguments: { (TVariableNode new setName: 'a') }.
translation := self translate: send.
self assert: translation equals: '3U << a'
]
{ #category : #'tests-send' }
SlangBasicTranslationTest >> testSendLeftBitShiftByVariableIn64Bits [
| translation send |
generator currentMethod declarationAt: 'a' put: 'sqInt'.
generator wordSize: 8.
send := TSendNode new
setSelector: #<<
receiver: (TConstantNode value: 3)
arguments: { (TVariableNode new setName: 'a') }.
translation := self translate: send.
self assert: translation equals: '3ULL << a'
]
{ #category : #'tests-send' }
SlangBasicTranslationTest >> testSendLeftBitShiftLong [
| translation send |
generator currentMethod declarationAt: 'a' put: 'sqLong'.
send := TSendNode new
setSelector: #<<
receiver: (TVariableNode new setName: 'a')
arguments: { (TConstantNode value: 3) }.
translation := self translate: send.
self assert: translation equals: '((sqLong)((usqLong)(a) << 3))'
]
{ #category : #'tests-send' }
SlangBasicTranslationTest >> testSendLeftBitShiftShortType [
| translation send |
generator currentMethod declarationAt: 'a' put: 'short'.
send := TSendNode new
setSelector: #<<
receiver: (TVariableNode new setName: 'a')
arguments: { (TConstantNode value: 3) }.
translation := self translate: send.
self assert: translation equals: '((sqInt)((usqInt)(a) << 3))'
]
{ #category : #'tests-send' }
SlangBasicTranslationTest >> testSendLeftBitShiftUnsigned [
| translation send |
generator currentMethod declarationAt: 'a' put: 'usqInt'.
send := TSendNode new
setSelector: #<<
receiver: (TVariableNode new setName: 'a')
arguments: { (TConstantNode value: 3) }.
translation := self translate: send.
self assert: translation equals: 'a << 3'
]
{ #category : #'tests-send' }
SlangBasicTranslationTest >> testSendLeftBitShiftUnsignedShortType [
| translation send |
generator currentMethod declarationAt: 'a' put: 'unsigned short'.
send := TSendNode new
setSelector: #<<
receiver: (TVariableNode new setName: 'a')
arguments: { (TConstantNode value: 3) }.
translation := self translate: send.
self assert: translation equals: '((usqInt)(a) << 3)'
]
{ #category : #'tests-send' }
SlangBasicTranslationTest >> testSendLessThan [
Expand Down Expand Up @@ -735,6 +986,27 @@ SlangBasicTranslationTest >> testSendPowerTo [
self assert: translation equals: '(sqInt)pow(x, 2)'
]
{ #category : #'tests-send' }
SlangBasicTranslationTest >> testSendSequentialAndWithConstantReceiverTrue [
| translation send |
send := TSendNode new
setSelector: #and:
receiver: (TConstantNode value: true)
arguments: { (TStmtListNode new setStatements: {
(TSendNode new
setSelector: #+
receiver: (TConstantNode value: 1)
arguments: {(TConstantNode value: 2)}).
(TSendNode new
setSelector: #=
receiver: (TVariableNode new setName: 'a')
arguments: { (TVariableNode new setName: 'b') }) }) }.
translation := self translate: send.
self assert: translation equals: '1 && ((1 + 2, a == b))'
]
{ #category : #'tests-send' }
SlangBasicTranslationTest >> testSendTimes [
Expand Down

0 comments on commit 2ba4de9

Please sign in to comment.