• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

moosetechnology / Famix-Value / 15446436712

04 Jun 2025 03:34PM UTC coverage: 22.736% (-0.02%) from 22.756%
15446436712

push

github

Gabriel-Darbord
Add `ignoreUnknownAttributes` importer option
+ Categorize
+ Prettier comments

0 of 38 new or added lines in 4 files covered. (0.0%)

9 existing lines in 2 files now uncovered.

796 of 3501 relevant lines covered (22.74%)

0.23 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/Famix-Value-Importer/FamixValueJavaXStreamImporter.class.st
1
Class {
2
        #name : 'FamixValueJavaXStreamImporter',
3
        #superclass : 'FamixValueAbstractImporter',
4
        #instVars : [
5
                'specialTypes'
6
        ],
7
        #category : 'Famix-Value-Importer',
8
        #package : 'Famix-Value-Importer'
9
}
10

11
{ #category : 'private - utility' }
12
FamixValueJavaXStreamImporter >> findTypeDimensions: aFamixJavaAttribute [
×
13
        "Nothing in the XML tells if it is an array, so we have to check the source code"
×
14

×
15
        | dimensions source index char |
×
16
        dimensions := 0.
×
17
        source := aFamixJavaAttribute sourceAnchor fileReference contents.
×
18

×
NEW
19
        "Search after attribute name"
×
20
        index := aFamixJavaAttribute sourceAnchor endPos.
×
21
        [
×
22
        char := source at: (index := index + 1).
×
23
        char == $[ ifTrue: [ dimensions := dimensions + 1 ].
×
24
        char == $= or: [ char == $; ] ] whileFalse.
×
25

×
NEW
26
        "Search before"
×
27
        index := aFamixJavaAttribute sourceAnchor startPos.
×
28
        [
×
29
        char := source at: (index := index - 1).
×
30
        char == $[ ifTrue: [ dimensions := dimensions + 1 ].
×
31
        char isAlphaNumeric ] whileFalse.
×
32

×
33
        ^ dimensions
×
34
]
×
35

36
{ #category : 'importing' }
37
FamixValueJavaXStreamImporter >> importArray: aXMLElement of: type [
×
NEW
38
        "Element type should already be inferred by the caller, normally in the context of an object attribute"
×
39

×
40
        | collection |
×
41
        collection := self model newOfCollection type: type.
×
42
        objectDict at: aXMLElement put: collection.
×
43

×
44
        aXMLElement nodes ifNotEmpty: [ :nodes |
×
45
                nodes reject: [ :node | node isStringNode ] thenDo: [ :rawElement |
×
46
                        self model newOfCollectionElement
×
47
                                collection: collection;
×
48
                                value: (rawElement name = 'null'
×
49
                                                 ifTrue: [
×
50
                                                         model newOfPrimitiveType
×
51
                                                                 value: 'null';
×
52
                                                                 type: self loadType ]
×
53
                                                 ifFalse: [
×
54
                                                         self
×
55
                                                                 importValue: rawElement
×
56
                                                                 of: (self loadTypeNamed: rawElement name) ]) ] ].
×
57
        ^ collection
×
58
]
×
59

60
{ #category : 'importing' }
61
FamixValueJavaXStreamImporter >> importCollection: rawValue of: type [
×
NEW
62
        "Infer element types from type argument, e.g. List<String> => String"
×
63

×
64
        | collection |
×
65
        collection := self model newOfCollection type: type.
×
66
        objectDict at: rawValue put: collection.
×
67
        rawValue nodes ifEmpty: [ ^ collection ].
×
68
        self
×
69
                withTypeInference: ((self parametricTypeInferencesOf: type)
×
70
                                 ifNotEmpty: [ :inferences | inferences first ]
×
71
                                 ifEmpty: [ nil ])
×
72
                do: [
×
73
                        rawValue nodes
×
74
                                reject: [ :node | node isStringNode ]
×
75
                                thenDo: [ :rawElement |
×
76
                                        collection addValue:
×
77
                                                (self model newOfCollectionElement value: (self
×
78
                                                                  importValue: rawElement
×
79
                                                                  of: (self loadTypeNamed: rawElement name))) ] ].
×
80
        ^ collection
×
81
]
×
82

83
{ #category : 'importing' }
84
FamixValueJavaXStreamImporter >> importDictionary: rawValue of: type [
×
NEW
85
        "Infer from type arguments, e.g. Map<String, MyClass>"
×
86

×
87
        | dictionary keyType valueType assoc |
×
88
        dictionary := self model newOfDictionary type: type.
×
89
        objectDict at: rawValue put: dictionary.
×
90

×
91
        (self parametricTypeInferencesOf: type)
×
92
                ifNotEmpty: [ :paramTypeInferences |
×
93
                        keyType := paramTypeInferences at: 1.
×
94
                        valueType := paramTypeInferences at: 2 ]
×
95
                ifEmpty: [ keyType := valueType := nil ].
×
96

×
97
        rawValue nodes
×
98
                reject: [ :node | node isStringNode ]
×
99
                thenDo: [ :entryNode |
×
100
                        | nodes keyNode valueNode |
×
101
                        assoc := self model newOfDictionaryAssociation dictionary:
×
102
                                         dictionary.
×
103

×
104
                        nodes := entryNode nodes reject: [ :node | node isStringNode ].
×
105
                        nodes size = 2 ifFalse: [
×
106
                                Error signal: 'Expected 2 nodes in a table entry' ].
×
107
                        keyNode := nodes first.
×
108
                        valueNode := nodes second.
×
109

×
110
                        self withTypeInference: keyType do: [
×
111
                                | nodeType |
×
112
                                nodeType := keyNode name = 'string'
×
113
                                                    ifTrue: [ self loadTypeNamed: 'String' ]
×
114
                                                    ifFalse: [ self loadTypeNamed: keyNode name ].
×
115
                                assoc key: (self importValue: keyNode of: nodeType) ].
×
116

×
117
                        self withTypeInference: valueType do: [
×
118
                                | nodeType |
×
119
                                nodeType := valueNode name = 'string'
×
120
                                                    ifTrue: [ self loadTypeNamed: 'String' ]
×
121
                                                    ifFalse: [ self loadTypeNamed: valueNode name ].
×
122
                                assoc value: (self importValue: valueNode of: nodeType) ] ].
×
123
        ^ dictionary
×
124
]
×
125

126
{ #category : 'importing' }
127
FamixValueJavaXStreamImporter >> importObject: rawObject of: type [
×
128

×
129
        | object |
×
130
        object := self model newOfObject type: type.
×
131
        objectDict at: rawObject put: object.
×
132
        rawObject nodes
×
133
                reject: [ :node | node isStringNode ]
×
134
                thenDo: [ :node |
×
135
                        (self importObjectAttribute: node of: type named: node name)
×
136
                                ifNotNil: [ :attribute | attribute object: object ] ].
×
137
        ^ object
×
138
]
×
139

140
{ #category : 'importing' }
141
FamixValueJavaXStreamImporter >> importObjectAttribute: rawValue of: type named: name [
×
142

×
143
        | attribute dimensions |
×
144
        attribute := type findAttributeNamed: name.
×
145
        dimensions := self findTypeDimensions: attribute.
×
146

×
147
        ^ self withTypeInference: attribute declaredType do: [
×
148
                  self model newOfObjectAttribute
×
149
                          attribute: attribute;
×
150
                          value: (dimensions == 0
×
NEW
151
                                           ifTrue: [ "Regular type" self importValue: rawValue ]
×
NEW
152
                                           ifFalse: [ "Array type"
×
153
                                                   self
×
154
                                                           importArray: rawValue
×
155
                                                           of:
×
156
                                                                   ((FamixValueJavaArray wrapping: attribute declaredType)
×
157
                                                                            dimensions: dimensions) ]) ]
×
158
]
×
159

160
{ #category : 'importing' }
161
FamixValueJavaXStreamImporter >> importPrimitive: rawValue of: type [
×
162
        "Expect to be given a type name instead of a type!"
×
163

×
164
        ^ self model newOfPrimitiveType
×
165
                  value: rawValue nodes first string;
×
166
                  type: type
×
167
]
×
168

169
{ #category : 'importing' }
170
FamixValueJavaXStreamImporter >> importValue: aXMLElement [
×
171

×
172
        | type |
×
173
        (aXMLElement attributeAt: 'reference') ifNotEmpty: [ :reference |
×
174
                ^ self resolve: reference from: aXMLElement ].
×
175
        type := aXMLElement parent isDocument
×
176
                        ifTrue: [ self loadTypeNamed: aXMLElement name ]
×
177
                        ifFalse: [
×
178
                                (aXMLElement attributeAt: 'class')
×
179
                                        ifNotEmpty: [ :className | self loadTypeNamed: className ]
×
180
                                        ifEmpty: [ self loadType ] ].
×
181
        ^ type value: aXMLElement asJavaXStreamValueOn: self
×
182
]
×
183

184
{ #category : 'importing' }
185
FamixValueJavaXStreamImporter >> importValue: aXMLElement of: type [
×
186

×
187
        (aXMLElement attributeAt: 'reference') ifNotEmpty: [ :reference |
×
188
                ^ self resolve: reference from: aXMLElement ].
×
189
        ^ type value: aXMLElement asJavaXStreamValueOn: self
×
190
]
×
191

192
{ #category : 'private - utility' }
193
FamixValueJavaXStreamImporter >> newReader [
×
194

×
195
        self shouldNotImplement
×
196
]
×
197

198
{ #category : 'parsing' }
199
FamixValueJavaXStreamImporter >> parseList: serializedValues [
×
200

×
NEW
201
        self shouldBeImplemented
×
202
]
×
203

204
{ #category : 'parsing' }
205
FamixValueJavaXStreamImporter >> parseValue: serializedValue [
×
206
        "Parse and import a serialized value."
×
207

×
208
        ^ (XMLDOMParser on: serializedValue readStream) parseDocument nodes
×
209
                  ifEmpty: [ Error signal: 'Empty data' ]
×
210
                  ifNotEmpty: [ :nodes |
×
211
                          nodes size = 1 ifFalse: [ Error signal: 'Multiple root nodes' ].
×
212
                          self importValue: nodes first ]
×
213
]
×
214

215
{ #category : 'private - utility' }
216
FamixValueJavaXStreamImporter >> resolve: aString from: sourceNode [
×
217
        "Resolve a reference relative to the source node"
×
218

×
219
        | node |
×
220
        node := sourceNode.
×
221
        ($/ split: aString) do: [ :path |
×
222
                path = '..'
×
223
                        ifTrue: [ node := node parent ]
×
224
                        ifFalse: [
×
225
                                | index |
×
226
                                index := path indexOf: $[.
×
227
                                index > 0
×
228
                                        ifFalse: [ node := node elementAt: path ]
×
229
                                        ifTrue: [
×
230
                                                | name |
×
231
                                                name := path first: index - 1.
×
232
                                                index := (path copyFrom: index + 1 to: path size - 1) asInteger.
×
233
                                                node := (node nodes select: [ :n |
×
234
                                                                 n isStringNode not and: [ n name = name ] ]) at: index ] ] ].
×
235
        ^ self
×
236
                  getObjectFromIdentity: node
×
237
                  ifAbsent: [ Error signal: 'Failed to resolve reference' ]
×
238
]
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc