@@ -140,29 +140,78 @@ func (e *extractor) err(err error) {
140
140
}
141
141
142
142
func (e * extractor ) Visit (node ast.Node ) ast.Visitor {
143
- e .extractMessage (node )
143
+ e .extractMessages (node )
144
144
return e
145
145
}
146
146
147
- func (e * extractor ) extractMessage (node ast.Node ) {
147
+ func (e * extractor ) extractMessages (node ast.Node ) {
148
148
cl , ok := node .(* ast.CompositeLit )
149
149
if ! ok {
150
150
return
151
151
}
152
- se , ok := cl .Type .(* ast.SelectorExpr )
153
- if ! ok {
154
- return
152
+ switch t := cl .Type .(type ) {
153
+ case * ast.SelectorExpr :
154
+ if ! e .isMessageType (t ) {
155
+ return
156
+ }
157
+ e .extractMessage (cl )
158
+ case * ast.ArrayType :
159
+ if ! e .isMessageType (t .Elt ) {
160
+ return
161
+ }
162
+ for _ , el := range cl .Elts {
163
+ ecl , ok := el .(* ast.CompositeLit )
164
+ if ! ok {
165
+ continue
166
+ }
167
+ e .extractMessage (ecl )
168
+ }
169
+ case * ast.MapType :
170
+ if ! e .isMessageType (t .Value ) {
171
+ return
172
+ }
173
+ for _ , el := range cl .Elts {
174
+ kve , ok := el .(* ast.KeyValueExpr )
175
+ if ! ok {
176
+ continue
177
+ }
178
+ vcl , ok := kve .Value .(* ast.CompositeLit )
179
+ if ! ok {
180
+ continue
181
+ }
182
+ e .extractMessage (vcl )
183
+ }
184
+ }
185
+ }
186
+
187
+ func (e * extractor ) isMessageType (expr ast.Expr ) bool {
188
+ se := unwrapSelectorExpr (expr )
189
+ if se == nil {
190
+ return false
155
191
}
156
192
if se .Sel .Name != "Message" && se .Sel .Name != "LocalizeConfig" {
157
- return
193
+ return false
158
194
}
159
195
x , ok := se .X .(* ast.Ident )
160
196
if ! ok {
161
- return
197
+ return false
162
198
}
163
- if x .Name != e .i18nPackageName {
164
- return
199
+ return x .Name == e .i18nPackageName
200
+ }
201
+
202
+ func unwrapSelectorExpr (e ast.Expr ) * ast.SelectorExpr {
203
+ switch et := e .(type ) {
204
+ case * ast.SelectorExpr :
205
+ return et
206
+ case * ast.StarExpr :
207
+ se , _ := et .X .(* ast.SelectorExpr )
208
+ return se
209
+ default :
210
+ return nil
165
211
}
212
+ }
213
+
214
+ func (e * extractor ) extractMessage (cl * ast.CompositeLit ) {
166
215
data := make (map [string ]string )
167
216
for _ , elt := range cl .Elts {
168
217
kve , ok := elt .(* ast.KeyValueExpr )
@@ -182,11 +231,10 @@ func (e *extractor) extractMessage(node ast.Node) {
182
231
if len (data ) == 0 {
183
232
return
184
233
}
185
- if se .Sel .Name == "Message" {
186
- e .messages = append (e .messages , internal .MustNewMessage (data ))
187
- } else if messageID := data ["MessageID" ]; messageID != "" {
188
- e .messages = append (e .messages , & i18n.Message {ID : messageID })
234
+ if messageID := data ["MessageID" ]; messageID != "" {
235
+ data ["ID" ] = messageID
189
236
}
237
+ e .messages = append (e .messages , internal .MustNewMessage (data ))
190
238
}
191
239
192
240
func extractStringLiteral (expr ast.Expr ) (string , bool ) {
0 commit comments