Spaces:
Running
Running
File size: 2,528 Bytes
8f3f8db |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
transforming
recordDeclarations
"Record C type declarations of the forms
self returnTypeC: 'float'.
self var: #foo declareC: 'float foo'
self var: #foo as: Class
self var: #foo type: 'float'.
and remove the declarations from the method body."
| newStatements |
properties pragmas notEmpty ifTrue:
[properties pragmas do:
[:pragma|
pragma keyword = #var:declareC: ifTrue:
[self declarationAt: pragma arguments first asString put: pragma arguments last].
pragma keyword = #var:type: ifTrue:
[| varName varType |
varName := pragma arguments first asString.
varType := pragma arguments last.
varType last = $* ifFalse: [varType := varType, ' '].
self declarationAt: varName put: varType, varName].
pragma keyword = #var:as: ifTrue:
[| theClass |
theClass := Smalltalk at: pragma arguments last name asSymbol ifAbsent: [nil].
(theClass isKindOf: Behavior) ifFalse:
[^self error: 'declarator must be a Behavior'].
self declarationAt: pragma arguments first value asString
put: (theClass jscgDeclareJSForVar: pragma arguments first asString)].
pragma keyword = #returnTypeC: ifTrue:
[returnType := pragma arguments last].
pragma keyword = #doNotGenerate: ifTrue:
[locals removeKey: pragma arguments last]]].
newStatements := OrderedCollection new: parseTree statements size.
parseTree statements do:
[:stmt | | isDeclaration |
isDeclaration := false.
stmt isSend ifTrue:
[stmt selector = #var:declareC: ifTrue:
[isDeclaration := true.
self declarationAt: stmt args first value asString put: stmt args last value].
stmt selector = #var:type: ifTrue: [
| varName varType |
isDeclaration := true.
varName := stmt args first value asString.
varType := stmt args last value.
varType last = $* ifFalse: [varType := varType, ' '].
self declarationAt: varName put: varType, varName.
].
stmt selector = #var:as: ifTrue:
[| theClass |
isDeclaration := true.
theClass := Smalltalk at: stmt args last name asSymbol ifAbsent: [nil].
(theClass isKindOf: Behavior) ifFalse:
[^self error: 'declarator must be a Behavior'].
self declarationAt: stmt args first value asString
put: (theClass jscgDeclareJSForVar: stmt args first value asString)].
stmt selector = #returnTypeC: ifTrue:
[isDeclaration := true.
returnType := stmt args last value]].
isDeclaration ifFalse: [newStatements add: stmt]].
parseTree setStatements: newStatements asArray |