Skip to content

Commit 3d0dd88

Browse files
janvranyshingarov
authored andcommitted
Implement Sprite "unparsing"
This commit implements `#spriteOn:indent:` which tells the receiver to print itself as a Sprite expression. I find it easier to read than going through expression tree. It also adds GT inspector tabs showing the "unparsed" source. This is mainly a debugging aid, especially useful when debugging transformation from meta-language to core. As of now, it only prints program's expression(s) and *not* qualifiers, measures and datatypes. This is left as future work as it is not that simple (mainly because extensive use of associations and transformations done right when parsing, not later in some "pass").
1 parent 3817c74 commit 3d0dd88

40 files changed

+399
-1
lines changed

src/Metalanguage/Prog.class.st

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,12 @@ Prog >> core [
1919
data: data
2020
options: options
2121
]
22+
23+
{ #category : #GT }
24+
Prog >> gtInspectorSpriteOfCoreIn: composite [
25+
<gtInspectorPresentationOrder: 55>
26+
27+
^composite text
28+
title: 'Source (core program)';
29+
display: [ self core spriteString ]
30+
]

src/SpriteLang/ARef.class.st

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,19 @@ ARef >> refactorAppR: anEvalEnv [
7070
arPred: (arPred refactorAppR: amendedEnv)
7171
]
7272

73+
{ #category : #printing }
74+
ARef >> spriteOn: stream indent: level [
75+
stream nextPut: $(.
76+
arArgs
77+
do:[:nameAndRType | stream nextPutAll: nameAndRType key; nextPut: $:. nameAndRType value spriteOn: stream indent: level ]
78+
separatedBy:[stream nextPutAll: ', '].
79+
stream nextPutAll: ') => ['.
80+
"This is really ugly but that's the price for parser doing
81+
stuff it should not (converting stuff too early)"
82+
stream nextPutAll: arPred expr ps first expr conjuncts first text.
83+
stream nextPut: $].
84+
]
85+
7386
{ #category : #'as yet unclassified' }
7487
ARef >> subsAR: p ar: anARef [
7588
"bogus -- see Issue 62. this one is especially screaming."

src/SpriteLang/Alt.class.st

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,23 @@ Alt >> printOn: aStream [
9898
self printStructOn: aStream
9999
]
100100

101+
{ #category : #printing }
102+
Alt >> spriteOn: aStream indent: level [
103+
"Print receiver on `aStream` as SpriteLang source"
104+
105+
aStream next: level * 4 put: Character space.
106+
aStream nextPutAll: '| '; nextPutAll: daCon.
107+
binds notEmpty ifTrue:[
108+
aStream nextPut:$(.
109+
binds
110+
do:[:bind | aStream nextPutAll: bind id ]
111+
separatedBy: [ aStream nextPutAll: ', ' ].
112+
aStream nextPut:$)
113+
].
114+
aStream nextPutAll: ' => '.
115+
expr spriteOn: aStream indent: level + 1.
116+
]
117+
101118
{ #category : #'α-renaming' }
102119
Alt >> uniq2: α [
103120
^self class

src/SpriteLang/CoreProg.class.st

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,21 @@ CoreProg >> expr: anObject [
5050

5151
{ #category : #GT }
5252
CoreProg >> gtInspectorExprsIn: composite [
53-
<gtInspectorPresentationOrder: 50>
53+
<gtInspectorPresentationOrder: 60>
5454

5555
^(expr gtInspectorTreeIn: composite)
5656
title: 'Expressions'
5757
]
5858

59+
{ #category : #GT }
60+
CoreProg >> gtInspectorSpriteIn: composite [
61+
<gtInspectorPresentationOrder: 50>
62+
63+
^composite text
64+
title: 'Source';
65+
display: [ self spriteString ]
66+
]
67+
5968
{ #category : #accessing }
6069
CoreProg >> meas [
6170
^ meas
@@ -94,6 +103,32 @@ CoreProg >> solve [
94103
^vc solve
95104
]
96105

106+
{ #category : #printing }
107+
CoreProg >> spriteOn: aStream [
108+
self spriteOn: aStream indent: 0
109+
]
110+
111+
{ #category : #printing }
112+
CoreProg >> spriteOn: aStream indent: level [
113+
"Print receiver on `aStream` as SpriteLang source"
114+
115+
"
116+
quals , meas , data do:[:each |
117+
each unparseOn: aStream indent: level
118+
] separatedBy: [ aStream cr; cr. ].
119+
"
120+
expr spriteOn: aStream indent: level
121+
122+
]
123+
124+
{ #category : #printing }
125+
CoreProg >> spriteString [
126+
"Return a string representing the receiver as Sprite sourcea"
127+
128+
^ String streamContents:[:s| self spriteOn: s]
129+
130+
]
131+
97132
{ #category : #'α-renaming' }
98133
CoreProg >> uniq2 [
99134
^self uniq2: αRenames empty

src/SpriteLang/Data.class.st

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,11 @@ Data >> rvars: anObject [
144144
rvars := anObject
145145
]
146146

147+
{ #category : #printing }
148+
Data >> spriteOn: aStream indent: level [
149+
self halt.
150+
]
151+
147152
{ #category : #'α-renaming' }
148153
Data >> uniq2: α [
149154
| α′ |

src/SpriteLang/EAnn.class.st

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,13 @@ EAnn >> isEAnn [
6565
^ true
6666
]
6767

68+
{ #category : #printing }
69+
EAnn >> spriteOn: stream indent: level [
70+
ann spriteOn: stream indent: level.
71+
stream cr.
72+
stream nextPutAll: 'let ...'
73+
]
74+
6875
{ #category : #'as yet unclassified' }
6976
EAnn >> synth: Γ [
7077
"

src/SpriteLang/ECase.class.st

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,26 @@ ECase >> gtChildren [
5858
^alts
5959
]
6060

61+
{ #category : #printing }
62+
ECase >> spriteOn: aStream indent: level [
63+
"Print receiver on `aStream` as SpriteLang source"
64+
65+
aStream next: level * 4 put: Character space.
66+
aStream nextPutAll: 'switch ('.
67+
"x can ve either string or expr, sigh"
68+
x isString ifTrue:[
69+
aStream nextPutAll: x.
70+
] ifFalse:[
71+
x spriteOn: aStream indent: level.
72+
].
73+
aStream nextPutAll: ') {'.
74+
alts do:[:alt|
75+
alt spriteOn: aStream indent: level + 1
76+
].
77+
aStream next: level * 4 put: Character space.
78+
aStream nextPutAll: '}'.
79+
]
80+
6181
{ #category : #'α-renaming' }
6282
ECase >> uniq2: α [
6383
| x′ α′ alts′ |

src/SpriteLang/ECon.class.st

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,13 @@ ECon >> prim: anObject [
7070
prim := anObject
7171
]
7272

73+
{ #category : #printing }
74+
ECon >> spriteOn: aStream indent: level [
75+
"Print receiver on `aStream` as SpriteLang source"
76+
prim spriteOn: aStream indent: level
77+
78+
]
79+
7380
{ #category : #substitution }
7481
ECon >> subst: θ [
7582
^self

src/SpriteLang/EFun.class.st

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,28 @@ EFun >> renameTy: ty metric: m [
9393
^(TFun x: x s: s′ t: t′′) -> m′′
9494
]
9595

96+
{ #category : #printing }
97+
EFun >> spriteOn: stream indent: level [
98+
| efun args body |
99+
100+
args := OrderedCollection new: 3.
101+
efun := self.
102+
[ efun isKindOf: EFun ] whileTrue:[
103+
args add: efun bind id.
104+
efun := efun expr.
105+
].
106+
body := efun.
107+
108+
stream nextPut:$(.
109+
args do:[:arg|stream nextPutAll: arg] separatedBy:[stream nextPutAll:', '].
110+
stream nextPut:$).
111+
112+
stream nextPutAll: ' => {'; cr.
113+
stream next: (level + 1) * 4 put: Character space.
114+
body spriteOn: stream indent: level + 1.
115+
stream cr; nextPutAll: '}'.
116+
]
117+
96118
{ #category : #'α-renaming' }
97119
EFun >> uniq2: α [
98120
| id id′ α′ |

src/SpriteLang/EIf.class.st

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,24 @@ EIf >> gtChildren [
8585

8686
]
8787

88+
{ #category : #printing }
89+
EIf >> spriteOn: stream indent: level [
90+
91+
stream nextPutAll:'if ('.
92+
cond spriteOn: stream indent: level.
93+
stream nextPutAll:') {'; cr.
94+
stream next: level + 1 * 4 put: Character space.
95+
trueE spriteOn: stream indent: level + 1.
96+
stream cr.
97+
stream next: level * 4 put: Character space.
98+
stream nextPutAll:'} else {'; cr.
99+
stream next: level + 1 * 4 put: Character space.
100+
falseE spriteOn: stream indent: level + 1.
101+
stream cr.
102+
stream next: level * 4 put: Character space.
103+
stream nextPutAll:'}'.
104+
]
105+
88106
{ #category : #accessing }
89107
EIf >> trueE [
90108
^ trueE

0 commit comments

Comments
 (0)