• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007-2010 Júlio Vilmar Gesser.
3  * Copyright (C) 2011, 2013-2016 The JavaParser Team.
4  *
5  * This file is part of JavaParser.
6  *
7  * JavaParser can be used either under the terms of
8  * a) the GNU Lesser General Public License as published by
9  *     the Free Software Foundation, either version 3 of the License, or
10  *     (at your option) any later version.
11  * b) the terms of the Apache License
12  *
13  * You should have received a copy of both licenses in LICENCE.LGPL and
14  * LICENCE.APACHE. Please refer to those files for details.
15  *
16  * JavaParser is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU Lesser General Public License for more details.
20  */
21 
22 package com.github.javaparser.printer;
23 
24 import com.github.javaparser.GeneratedJavaParserConstants;
25 import com.github.javaparser.ast.*;
26 import com.github.javaparser.ast.body.*;
27 import com.github.javaparser.ast.comments.Comment;
28 import com.github.javaparser.ast.expr.*;
29 import com.github.javaparser.ast.modules.*;
30 import com.github.javaparser.ast.observer.ObservableProperty;
31 import com.github.javaparser.ast.stmt.*;
32 import com.github.javaparser.ast.type.*;
33 import com.github.javaparser.metamodel.JavaParserMetaModel;
34 import com.github.javaparser.printer.concretesyntaxmodel.CsmConditional;
35 import com.github.javaparser.printer.concretesyntaxmodel.CsmElement;
36 import com.github.javaparser.printer.concretesyntaxmodel.CsmMix;
37 
38 import java.util.*;
39 import java.util.stream.Collectors;
40 
41 import static com.github.javaparser.GeneratedJavaParserConstants.*;
42 import static com.github.javaparser.ast.observer.ObservableProperty.*;
43 import static com.github.javaparser.printer.concretesyntaxmodel.CsmConditional.Condition.*;
44 import static com.github.javaparser.printer.concretesyntaxmodel.CsmElement.*;
45 
46 /**
47  * The Concrete Syntax Model for a single node type. It knows the syntax used to represent a certain element in Java
48  * code.
49  */
50 public class ConcreteSyntaxModel {
51 
52     private static final Map<Class, CsmElement> concreteSyntaxModelByClass = new HashMap<>();
53     private static Optional<String> initializationError;
54 
modifiers()55     private static CsmElement modifiers() {
56         return list(ObservableProperty.MODIFIERS, space(), none(), space());
57     }
58 
59     /**
60      * Build a mix collecting all the elements specified.
61      */
mix(CsmElement... elements)62     private static CsmElement mix(CsmElement... elements) {
63         return new CsmMix(Arrays.asList(elements));
64     }
65 
memberAnnotations()66     private static CsmElement memberAnnotations() {
67         return list(ObservableProperty.ANNOTATIONS, newline(), none(), newline());
68     }
69 
annotations()70     private static CsmElement annotations() {
71         return list(ObservableProperty.ANNOTATIONS, space(), none(), newline());
72     }
73 
typeParameters()74     private static CsmElement typeParameters() {
75         return list(ObservableProperty.TYPE_PARAMETERS, sequence(comma(), space()), token(GeneratedJavaParserConstants.LT),
76                 sequence(token(GeneratedJavaParserConstants.GT), space()));
77     }
78 
typeArguments()79     private static CsmElement typeArguments() {
80         return list(ObservableProperty.TYPE_ARGUMENTS, sequence(comma(), space()), token(GeneratedJavaParserConstants.LT),
81                 sequence(token(GeneratedJavaParserConstants.GT)));
82     }
83 
84     static {
85 
86         ///
87         /// Body
88         ///
89 
concreteSyntaxModelByClass.put(AnnotationDeclaration.class, sequence( comment(), memberAnnotations(), modifiers(), token(GeneratedJavaParserConstants.AT), token(GeneratedJavaParserConstants.INTERFACE), space(), child(ObservableProperty.NAME), space(), token(LBRACE), newline(), indent(), list(ObservableProperty.MEMBERS, newline(), none(), none(), newline()), unindent(), token(RBRACE) ))90         concreteSyntaxModelByClass.put(AnnotationDeclaration.class, sequence(
91                 comment(),
92                 memberAnnotations(),
93                 modifiers(),
94                 token(GeneratedJavaParserConstants.AT),
95                 token(GeneratedJavaParserConstants.INTERFACE),
96                 space(),
97                 child(ObservableProperty.NAME),
98                 space(),
99                 token(LBRACE),
100                 newline(),
101                 indent(),
102                 list(ObservableProperty.MEMBERS, newline(), none(), none(), newline()),
103                 unindent(),
104                 token(RBRACE)
105         ));
106 
concreteSyntaxModelByClass.put(AnnotationMemberDeclaration.class, sequence( comment(), memberAnnotations(), modifiers(), child(ObservableProperty.TYPE), space(), child(ObservableProperty.NAME), token(LPAREN), token(RPAREN), conditional(ObservableProperty.DEFAULT_VALUE, IS_PRESENT, sequence(space(), token(GeneratedJavaParserConstants._DEFAULT), space(), child(DEFAULT_VALUE))), semicolon() ))107         concreteSyntaxModelByClass.put(AnnotationMemberDeclaration.class, sequence(
108                 comment(),
109                 memberAnnotations(),
110                 modifiers(),
111                 child(ObservableProperty.TYPE),
112                 space(),
113                 child(ObservableProperty.NAME),
114                 token(LPAREN),
115                 token(RPAREN),
116                 conditional(ObservableProperty.DEFAULT_VALUE, IS_PRESENT, sequence(space(), token(GeneratedJavaParserConstants._DEFAULT), space(), child(DEFAULT_VALUE))),
117                 semicolon()
118         ));
119 
concreteSyntaxModelByClass.put(ClassOrInterfaceDeclaration.class, sequence( comment(), memberAnnotations(), modifiers(), conditional(ObservableProperty.INTERFACE, FLAG, token(GeneratedJavaParserConstants.INTERFACE), token(GeneratedJavaParserConstants.CLASS)), space(), child(ObservableProperty.NAME), list(TYPE_PARAMETERS, sequence(comma(), space()), string(GeneratedJavaParserConstants.LT), string(GeneratedJavaParserConstants.GT)), list(ObservableProperty.EXTENDED_TYPES, sequence(string(GeneratedJavaParserConstants.COMMA), space()), sequence(space(), token(GeneratedJavaParserConstants.EXTENDS), space()), none()), list(ObservableProperty.IMPLEMENTED_TYPES, sequence(string(GeneratedJavaParserConstants.COMMA), space()), sequence( space(), token(GeneratedJavaParserConstants.IMPLEMENTS), space()), none()), space(), block(sequence(newline(), list(ObservableProperty.MEMBERS, sequence(newline(), newline()), newline(), newline()))) ))120         concreteSyntaxModelByClass.put(ClassOrInterfaceDeclaration.class, sequence(
121                 comment(),
122                 memberAnnotations(),
123                 modifiers(),
124                 conditional(ObservableProperty.INTERFACE, FLAG, token(GeneratedJavaParserConstants.INTERFACE), token(GeneratedJavaParserConstants.CLASS)),
125                 space(),
126                 child(ObservableProperty.NAME),
127                 list(TYPE_PARAMETERS, sequence(comma(), space()), string(GeneratedJavaParserConstants.LT), string(GeneratedJavaParserConstants.GT)),
128                 list(ObservableProperty.EXTENDED_TYPES,
129                         sequence(string(GeneratedJavaParserConstants.COMMA), space()),
130                         sequence(space(), token(GeneratedJavaParserConstants.EXTENDS), space()),
131                         none()),
132                 list(ObservableProperty.IMPLEMENTED_TYPES, sequence(string(GeneratedJavaParserConstants.COMMA), space()), sequence(
133                         space(),
134                         token(GeneratedJavaParserConstants.IMPLEMENTS),
135                         space()), none()),
136                 space(),
137                 block(sequence(newline(), list(ObservableProperty.MEMBERS, sequence(newline(), newline()), newline(), newline())))
138         ));
139 
concreteSyntaxModelByClass.put(ConstructorDeclaration.class, sequence( comment(), memberAnnotations(), modifiers(), typeParameters(), child(ObservableProperty.NAME), token(GeneratedJavaParserConstants.LPAREN), list(ObservableProperty.PARAMETERS, sequence(comma(), space()), none(), none()), token(GeneratedJavaParserConstants.RPAREN), list(ObservableProperty.THROWN_EXCEPTIONS, sequence(comma(), space()), sequence(space(), token(GeneratedJavaParserConstants.THROWS), space()), none()), space(), child(ObservableProperty.BODY) ))140         concreteSyntaxModelByClass.put(ConstructorDeclaration.class, sequence(
141                 comment(),
142                 memberAnnotations(),
143                 modifiers(),
144                 typeParameters(),
145                 child(ObservableProperty.NAME),
146                 token(GeneratedJavaParserConstants.LPAREN),
147                 list(ObservableProperty.PARAMETERS, sequence(comma(), space()), none(), none()),
148                 token(GeneratedJavaParserConstants.RPAREN),
149                 list(ObservableProperty.THROWN_EXCEPTIONS, sequence(comma(), space()), sequence(space(), token(GeneratedJavaParserConstants.THROWS), space()), none()),
150                 space(),
151                 child(ObservableProperty.BODY)
152         ));
153 
concreteSyntaxModelByClass.put(EnumConstantDeclaration.class, sequence( comment(), memberAnnotations(), child(ObservableProperty.NAME), list(ObservableProperty.ARGUMENTS, sequence(comma(), space()), token(GeneratedJavaParserConstants.LPAREN), token(GeneratedJavaParserConstants.RPAREN)), conditional(CLASS_BODY, IS_NOT_EMPTY, sequence(space(), token(GeneratedJavaParserConstants.LBRACE), newline(), indent(), newline(), list(ObservableProperty.CLASS_BODY, newline(), newline(), none(), newline()), unindent(), token(RBRACE), newline())) ))154         concreteSyntaxModelByClass.put(EnumConstantDeclaration.class, sequence(
155                 comment(),
156                 memberAnnotations(),
157                 child(ObservableProperty.NAME),
158                 list(ObservableProperty.ARGUMENTS, sequence(comma(), space()), token(GeneratedJavaParserConstants.LPAREN), token(GeneratedJavaParserConstants.RPAREN)),
159                 conditional(CLASS_BODY, IS_NOT_EMPTY, sequence(space(), token(GeneratedJavaParserConstants.LBRACE), newline(), indent(), newline(),
160                         list(ObservableProperty.CLASS_BODY, newline(), newline(), none(), newline()),
161                         unindent(),
162                         token(RBRACE), newline()))
163         ));
164 
concreteSyntaxModelByClass.put(EnumDeclaration.class, sequence( comment(), annotations(), modifiers(), token(GeneratedJavaParserConstants.ENUM), space(), child(ObservableProperty.NAME), list(ObservableProperty.IMPLEMENTED_TYPES, sequence(comma(), space()), sequence(space(), token(GeneratedJavaParserConstants.IMPLEMENTS), space()), none()), space(), token(GeneratedJavaParserConstants.LBRACE), newline(), indent(), newline(), list(ObservableProperty.ENTRIES, sequence(comma(), newline()), none(), none()), conditional(ObservableProperty.MEMBERS, IS_EMPTY, conditional(ObservableProperty.ENTRIES, IS_NOT_EMPTY, newline()), sequence(semicolon(), newline(), newline(), list(ObservableProperty.MEMBERS, newline(), newline(), none(), newline()))), unindent(), token(RBRACE) ))165         concreteSyntaxModelByClass.put(EnumDeclaration.class, sequence(
166                 comment(),
167                 annotations(),
168                 modifiers(),
169                 token(GeneratedJavaParserConstants.ENUM),
170                 space(),
171                 child(ObservableProperty.NAME),
172                 list(ObservableProperty.IMPLEMENTED_TYPES,
173                         sequence(comma(), space()),
174                         sequence(space(), token(GeneratedJavaParserConstants.IMPLEMENTS), space()),
175                         none()),
176                 space(),
177                 token(GeneratedJavaParserConstants.LBRACE),
178                 newline(),
179                 indent(),
180                 newline(),
181                 list(ObservableProperty.ENTRIES,
182                         sequence(comma(), newline()),
183                         none(),
184                         none()),
185                 conditional(ObservableProperty.MEMBERS, IS_EMPTY,
186                         conditional(ObservableProperty.ENTRIES, IS_NOT_EMPTY, newline()),
187                         sequence(semicolon(), newline(), newline(), list(ObservableProperty.MEMBERS, newline(), newline(), none(), newline()))),
188                 unindent(),
189                 token(RBRACE)
190         ));
191 
concreteSyntaxModelByClass.put(FieldDeclaration.class, sequence( orphanCommentsBeforeThis(), comment(), annotations(), modifiers(), conditional(ObservableProperty.VARIABLES, IS_NOT_EMPTY, child(ObservableProperty.MAXIMUM_COMMON_TYPE)), space(), list(ObservableProperty.VARIABLES, sequence(comma(), space())), semicolon()))192         concreteSyntaxModelByClass.put(FieldDeclaration.class, sequence(
193                 orphanCommentsBeforeThis(),
194                 comment(),
195                 annotations(),
196                 modifiers(),
197                 conditional(ObservableProperty.VARIABLES, IS_NOT_EMPTY, child(ObservableProperty.MAXIMUM_COMMON_TYPE)),
198                 space(),
199                 list(ObservableProperty.VARIABLES, sequence(comma(), space())),
200                 semicolon()));
201 
concreteSyntaxModelByClass.put(InitializerDeclaration.class, sequence( comment(), conditional(ObservableProperty.STATIC, FLAG, sequence(token(GeneratedJavaParserConstants.STATIC), space())), child(ObservableProperty.BODY)))202         concreteSyntaxModelByClass.put(InitializerDeclaration.class, sequence(
203                 comment(),
204                 conditional(ObservableProperty.STATIC, FLAG, sequence(token(GeneratedJavaParserConstants.STATIC), space())),
205                 child(ObservableProperty.BODY)));
206 
concreteSyntaxModelByClass.put(MethodDeclaration.class, sequence( orphanCommentsBeforeThis(), comment(), mix(memberAnnotations(), modifiers()), typeParameters(), child(ObservableProperty.TYPE), space(), child(ObservableProperty.NAME), token(GeneratedJavaParserConstants.LPAREN), conditional(ObservableProperty.RECEIVER_PARAMETER, IS_PRESENT, sequence(child(ObservableProperty.RECEIVER_PARAMETER), comma(), space())), list(ObservableProperty.PARAMETERS, sequence(comma(), space()), none(), none()), token(GeneratedJavaParserConstants.RPAREN), list(ObservableProperty.THROWN_EXCEPTIONS, sequence(comma(), space()), sequence(space(), token(GeneratedJavaParserConstants.THROWS), space()), none()), conditional(ObservableProperty.BODY, IS_PRESENT, sequence(space(), child(ObservableProperty.BODY)), semicolon()) ))207         concreteSyntaxModelByClass.put(MethodDeclaration.class, sequence(
208                 orphanCommentsBeforeThis(),
209                 comment(),
210                 mix(memberAnnotations(), modifiers()),
211                 typeParameters(),
212                 child(ObservableProperty.TYPE),
213                 space(),
214                 child(ObservableProperty.NAME),
215                 token(GeneratedJavaParserConstants.LPAREN),
216                 conditional(ObservableProperty.RECEIVER_PARAMETER, IS_PRESENT, sequence(child(ObservableProperty.RECEIVER_PARAMETER), comma(), space())),
217                 list(ObservableProperty.PARAMETERS, sequence(comma(), space()), none(), none()),
218                 token(GeneratedJavaParserConstants.RPAREN),
219                 list(ObservableProperty.THROWN_EXCEPTIONS, sequence(comma(), space()), sequence(space(), token(GeneratedJavaParserConstants.THROWS), space()), none()),
220                 conditional(ObservableProperty.BODY, IS_PRESENT, sequence(space(), child(ObservableProperty.BODY)), semicolon())
221         ));
222 
concreteSyntaxModelByClass.put(Parameter.class, sequence( comment(), list(ObservableProperty.ANNOTATIONS, space(), none(), space()), modifiers(), child(ObservableProperty.TYPE), conditional(ObservableProperty.VAR_ARGS, FLAG, sequence( list(ObservableProperty.VAR_ARGS_ANNOTATIONS, space(), none(), none()), token(GeneratedJavaParserConstants.ELLIPSIS))), space(), child(ObservableProperty.NAME)))223         concreteSyntaxModelByClass.put(Parameter.class, sequence(
224                 comment(),
225                 list(ObservableProperty.ANNOTATIONS, space(), none(), space()),
226                 modifiers(),
227                 child(ObservableProperty.TYPE),
228                 conditional(ObservableProperty.VAR_ARGS, FLAG, sequence(
229                         list(ObservableProperty.VAR_ARGS_ANNOTATIONS, space(), none(), none()),
230                         token(GeneratedJavaParserConstants.ELLIPSIS))),
231                 space(),
232                 child(ObservableProperty.NAME)));
233 
concreteSyntaxModelByClass.put(ReceiverParameter.class, sequence( comment(), list(ObservableProperty.ANNOTATIONS, space(), none(), space()), child(ObservableProperty.TYPE), space(), child(ObservableProperty.NAME)))234         concreteSyntaxModelByClass.put(ReceiverParameter.class, sequence(
235                 comment(),
236                 list(ObservableProperty.ANNOTATIONS, space(), none(), space()),
237                 child(ObservableProperty.TYPE),
238                 space(),
239                 child(ObservableProperty.NAME)));
240 
concreteSyntaxModelByClass.put(VariableDeclarator.class, sequence( comment(), child(ObservableProperty.NAME), conditional(ObservableProperty.INITIALIZER, IS_PRESENT, sequence(space(), token(GeneratedJavaParserConstants.ASSIGN), space(), child(ObservableProperty.INITIALIZER))) ))241         concreteSyntaxModelByClass.put(VariableDeclarator.class, sequence(
242                 comment(),
243                 child(ObservableProperty.NAME),
244                 // FIXME: we should introduce a derived property
245                 // list(ObservableProperty.EXTRA_ARRAY_LEVELS),
246                 conditional(ObservableProperty.INITIALIZER, IS_PRESENT, sequence(space(), token(GeneratedJavaParserConstants.ASSIGN), space(),
247                         child(ObservableProperty.INITIALIZER)))
248         ));
249 
250         ///
251         /// Expressions
252         ///
253 
concreteSyntaxModelByClass.put(ArrayAccessExpr.class, sequence( comment(), child(ObservableProperty.NAME), token(GeneratedJavaParserConstants.LBRACKET), child(ObservableProperty.INDEX), token(GeneratedJavaParserConstants.RBRACKET) ))254         concreteSyntaxModelByClass.put(ArrayAccessExpr.class, sequence(
255                 comment(),
256                 child(ObservableProperty.NAME),
257                 token(GeneratedJavaParserConstants.LBRACKET),
258                 child(ObservableProperty.INDEX),
259                 token(GeneratedJavaParserConstants.RBRACKET)
260         ));
261 
concreteSyntaxModelByClass.put(ArrayCreationExpr.class, sequence( comment(), token(GeneratedJavaParserConstants.NEW), space(), child(ObservableProperty.ELEMENT_TYPE), list(ObservableProperty.LEVELS), conditional(ObservableProperty.INITIALIZER, IS_PRESENT, sequence(space(), child(ObservableProperty.INITIALIZER))) ))262         concreteSyntaxModelByClass.put(ArrayCreationExpr.class, sequence(
263                 comment(),
264                 token(GeneratedJavaParserConstants.NEW),
265                 space(),
266                 child(ObservableProperty.ELEMENT_TYPE),
267                 list(ObservableProperty.LEVELS),
268                 conditional(ObservableProperty.INITIALIZER, IS_PRESENT, sequence(space(), child(ObservableProperty.INITIALIZER)))
269         ));
270 
concreteSyntaxModelByClass.put(ArrayInitializerExpr.class, sequence( comment(), token(GeneratedJavaParserConstants.LBRACE), list(ObservableProperty.VALUES, sequence(comma(), space()), space(), space()), orphanCommentsEnding(), token(RBRACE)))271         concreteSyntaxModelByClass.put(ArrayInitializerExpr.class, sequence(
272                 comment(),
273                 token(GeneratedJavaParserConstants.LBRACE),
274                 list(ObservableProperty.VALUES, sequence(comma(), space()), space(), space()),
275                 orphanCommentsEnding(),
276                 token(RBRACE)));
277 
concreteSyntaxModelByClass.put(AssignExpr.class, sequence( comment(), child(ObservableProperty.TARGET), space(), attribute(ObservableProperty.OPERATOR), space(), child(ObservableProperty.VALUE) ))278         concreteSyntaxModelByClass.put(AssignExpr.class, sequence(
279                 comment(),
280                 child(ObservableProperty.TARGET),
281                 space(),
282                 attribute(ObservableProperty.OPERATOR),
283                 space(),
284                 child(ObservableProperty.VALUE)
285         ));
286 
concreteSyntaxModelByClass.put(BinaryExpr.class, sequence( comment(), child(ObservableProperty.LEFT), space(), attribute(ObservableProperty.OPERATOR), space(), child(ObservableProperty.RIGHT) ))287         concreteSyntaxModelByClass.put(BinaryExpr.class, sequence(
288                 comment(),
289                 child(ObservableProperty.LEFT),
290                 space(),
291                 attribute(ObservableProperty.OPERATOR),
292                 space(),
293                 child(ObservableProperty.RIGHT)
294         ));
295 
concreteSyntaxModelByClass.put(BooleanLiteralExpr.class, sequence( comment(), attribute(VALUE) ))296         concreteSyntaxModelByClass.put(BooleanLiteralExpr.class, sequence(
297                 comment(), attribute(VALUE)
298         ));
299 
concreteSyntaxModelByClass.put(CastExpr.class, sequence( comment(), token(GeneratedJavaParserConstants.LPAREN), child(ObservableProperty.TYPE), token(GeneratedJavaParserConstants.RPAREN), space(), child(ObservableProperty.EXPRESSION) ))300         concreteSyntaxModelByClass.put(CastExpr.class, sequence(
301                 comment(),
302                 token(GeneratedJavaParserConstants.LPAREN),
303                 child(ObservableProperty.TYPE),
304                 token(GeneratedJavaParserConstants.RPAREN),
305                 space(),
306                 child(ObservableProperty.EXPRESSION)
307         ));
308 
concreteSyntaxModelByClass.put(CharLiteralExpr.class, sequence( comment(), charToken(ObservableProperty.VALUE) ))309         concreteSyntaxModelByClass.put(CharLiteralExpr.class, sequence(
310                 comment(),
311                 charToken(ObservableProperty.VALUE)
312         ));
313 
concreteSyntaxModelByClass.put(ClassExpr.class, sequence( comment(), child(ObservableProperty.TYPE), token(GeneratedJavaParserConstants.DOT), token(GeneratedJavaParserConstants.CLASS)))314         concreteSyntaxModelByClass.put(ClassExpr.class, sequence(
315                 comment(), child(ObservableProperty.TYPE), token(GeneratedJavaParserConstants.DOT), token(GeneratedJavaParserConstants.CLASS)));
316 
concreteSyntaxModelByClass.put(ConditionalExpr.class, sequence( comment(), child(ObservableProperty.CONDITION), space(), token(GeneratedJavaParserConstants.HOOK), space(), child(ObservableProperty.THEN_EXPR), space(), token(GeneratedJavaParserConstants.COLON), space(), child(ObservableProperty.ELSE_EXPR) ))317         concreteSyntaxModelByClass.put(ConditionalExpr.class, sequence(
318                 comment(),
319                 child(ObservableProperty.CONDITION),
320                 space(),
321                 token(GeneratedJavaParserConstants.HOOK),
322                 space(),
323                 child(ObservableProperty.THEN_EXPR),
324                 space(),
325                 token(GeneratedJavaParserConstants.COLON),
326                 space(),
327                 child(ObservableProperty.ELSE_EXPR)
328         ));
329 
concreteSyntaxModelByClass.put(DoubleLiteralExpr.class, sequence( comment(), attribute(ObservableProperty.VALUE) ))330         concreteSyntaxModelByClass.put(DoubleLiteralExpr.class, sequence(
331                 comment(),
332                 attribute(ObservableProperty.VALUE)
333         ));
334 
concreteSyntaxModelByClass.put(EnclosedExpr.class, sequence( comment(), token(GeneratedJavaParserConstants.LPAREN), child(ObservableProperty.INNER), token(GeneratedJavaParserConstants.RPAREN) ))335         concreteSyntaxModelByClass.put(EnclosedExpr.class, sequence(
336                 comment(),
337                 token(GeneratedJavaParserConstants.LPAREN),
338                 child(ObservableProperty.INNER),
339                 token(GeneratedJavaParserConstants.RPAREN)
340         ));
341 
concreteSyntaxModelByClass.put(FieldAccessExpr.class, sequence( comment(), child(SCOPE), token(GeneratedJavaParserConstants.DOT), child(ObservableProperty.NAME) ))342         concreteSyntaxModelByClass.put(FieldAccessExpr.class, sequence(
343                 comment(),
344                 child(SCOPE),
345                 token(GeneratedJavaParserConstants.DOT),
346                 child(ObservableProperty.NAME)
347         ));
348 
concreteSyntaxModelByClass.put(InstanceOfExpr.class, sequence( comment(), child(ObservableProperty.EXPRESSION), space(), token(GeneratedJavaParserConstants.INSTANCEOF), space(), child(ObservableProperty.TYPE) ))349         concreteSyntaxModelByClass.put(InstanceOfExpr.class, sequence(
350                 comment(),
351                 child(ObservableProperty.EXPRESSION),
352                 space(),
353                 token(GeneratedJavaParserConstants.INSTANCEOF),
354                 space(),
355                 child(ObservableProperty.TYPE)
356         ));
357 
concreteSyntaxModelByClass.put(IntegerLiteralExpr.class, sequence( comment(), attribute(ObservableProperty.VALUE) ))358         concreteSyntaxModelByClass.put(IntegerLiteralExpr.class, sequence(
359                 comment(),
360                 attribute(ObservableProperty.VALUE)
361         ));
362 
concreteSyntaxModelByClass.put(LambdaExpr.class, sequence( comment(), conditional(ObservableProperty.ENCLOSING_PARAMETERS, FLAG, token(GeneratedJavaParserConstants.LPAREN)), list(ObservableProperty.PARAMETERS, sequence(comma(), space())), conditional(ObservableProperty.ENCLOSING_PARAMETERS, FLAG, token(GeneratedJavaParserConstants.RPAREN)), space(), token(GeneratedJavaParserConstants.ARROW), space(), conditional(ObservableProperty.EXPRESSION_BODY, IS_PRESENT, child(ObservableProperty.EXPRESSION_BODY), child(ObservableProperty.BODY)) ))363         concreteSyntaxModelByClass.put(LambdaExpr.class, sequence(
364                 comment(),
365                 conditional(ObservableProperty.ENCLOSING_PARAMETERS, FLAG, token(GeneratedJavaParserConstants.LPAREN)),
366                 list(ObservableProperty.PARAMETERS, sequence(comma(), space())),
367                 conditional(ObservableProperty.ENCLOSING_PARAMETERS, FLAG, token(GeneratedJavaParserConstants.RPAREN)),
368                 space(),
369                 token(GeneratedJavaParserConstants.ARROW),
370                 space(),
371                 conditional(ObservableProperty.EXPRESSION_BODY, IS_PRESENT, child(ObservableProperty.EXPRESSION_BODY), child(ObservableProperty.BODY))
372         ));
373 
concreteSyntaxModelByClass.put(LongLiteralExpr.class, sequence( comment(), attribute(ObservableProperty.VALUE) ))374         concreteSyntaxModelByClass.put(LongLiteralExpr.class, sequence(
375                 comment(),
376                 attribute(ObservableProperty.VALUE)
377         ));
378 
concreteSyntaxModelByClass.put(MarkerAnnotationExpr.class, sequence(comment(), token(GeneratedJavaParserConstants.AT), attribute(ObservableProperty.NAME)))379         concreteSyntaxModelByClass.put(MarkerAnnotationExpr.class, sequence(comment(), token(GeneratedJavaParserConstants.AT), attribute(ObservableProperty.NAME)));
380 
concreteSyntaxModelByClass.put(MemberValuePair.class, sequence(comment(), child(ObservableProperty.NAME), space(), token(GeneratedJavaParserConstants.ASSIGN), space(), child(ObservableProperty.VALUE)))381         concreteSyntaxModelByClass.put(MemberValuePair.class, sequence(comment(),
382                 child(ObservableProperty.NAME),
383                 space(),
384                 token(GeneratedJavaParserConstants.ASSIGN),
385                 space(),
386                 child(ObservableProperty.VALUE)));
387 
concreteSyntaxModelByClass.put(MethodCallExpr.class, sequence( comment(), conditional(ObservableProperty.SCOPE, IS_PRESENT, sequence(child(ObservableProperty.SCOPE), token(GeneratedJavaParserConstants.DOT))), typeArguments(), child(ObservableProperty.NAME), token(GeneratedJavaParserConstants.LPAREN), list(ObservableProperty.ARGUMENTS, sequence(comma(), space()), none(), none()), token(GeneratedJavaParserConstants.RPAREN) ))388         concreteSyntaxModelByClass.put(MethodCallExpr.class, sequence(
389                 comment(),
390                 conditional(ObservableProperty.SCOPE, IS_PRESENT, sequence(child(ObservableProperty.SCOPE), token(GeneratedJavaParserConstants.DOT))),
391                 typeArguments(),
392                 child(ObservableProperty.NAME),
393                 token(GeneratedJavaParserConstants.LPAREN),
394                 list(ObservableProperty.ARGUMENTS, sequence(comma(), space()), none(), none()),
395                 token(GeneratedJavaParserConstants.RPAREN)
396         ));
397 
concreteSyntaxModelByClass.put(MethodReferenceExpr.class, sequence( comment(), child(ObservableProperty.SCOPE), token(GeneratedJavaParserConstants.DOUBLECOLON), typeArguments(), attribute(ObservableProperty.IDENTIFIER) ))398         concreteSyntaxModelByClass.put(MethodReferenceExpr.class, sequence(
399                 comment(),
400                 child(ObservableProperty.SCOPE),
401                 token(GeneratedJavaParserConstants.DOUBLECOLON),
402                 typeArguments(),
403                 attribute(ObservableProperty.IDENTIFIER)
404         ));
405 
concreteSyntaxModelByClass.put(Modifier.class, attribute(ObservableProperty.KEYWORD))406         concreteSyntaxModelByClass.put(Modifier.class, attribute(ObservableProperty.KEYWORD));
407 
concreteSyntaxModelByClass.put(Name.class, sequence( comment(), conditional(ObservableProperty.QUALIFIER, IS_PRESENT, sequence(child(ObservableProperty.QUALIFIER), token(GeneratedJavaParserConstants.DOT))), attribute(ObservableProperty.IDENTIFIER), orphanCommentsEnding() ))408         concreteSyntaxModelByClass.put(Name.class, sequence(
409                 comment(),
410                 conditional(ObservableProperty.QUALIFIER, IS_PRESENT, sequence(child(ObservableProperty.QUALIFIER), token(GeneratedJavaParserConstants.DOT))),
411                 attribute(ObservableProperty.IDENTIFIER),
412                 orphanCommentsEnding()
413         ));
414 
concreteSyntaxModelByClass.put(NameExpr.class, sequence( comment(), child(ObservableProperty.NAME), orphanCommentsEnding() ))415         concreteSyntaxModelByClass.put(NameExpr.class, sequence(
416                 comment(),
417                 child(ObservableProperty.NAME),
418                 orphanCommentsEnding()
419         ));
420 
concreteSyntaxModelByClass.put(NormalAnnotationExpr.class, sequence( comment(), token(GeneratedJavaParserConstants.AT), child(ObservableProperty.NAME), token(GeneratedJavaParserConstants.LPAREN), list(ObservableProperty.PAIRS, sequence(comma(), space())), token(GeneratedJavaParserConstants.RPAREN) ))421         concreteSyntaxModelByClass.put(NormalAnnotationExpr.class, sequence(
422                 comment(),
423                 token(GeneratedJavaParserConstants.AT),
424                 child(ObservableProperty.NAME),
425                 token(GeneratedJavaParserConstants.LPAREN),
426                 list(ObservableProperty.PAIRS, sequence(comma(), space())),
427                 token(GeneratedJavaParserConstants.RPAREN)
428         ));
429 
concreteSyntaxModelByClass.put(NullLiteralExpr.class, sequence( comment(), token(GeneratedJavaParserConstants.NULL) ))430         concreteSyntaxModelByClass.put(NullLiteralExpr.class, sequence(
431                 comment(),
432                 token(GeneratedJavaParserConstants.NULL)
433         ));
434 
concreteSyntaxModelByClass.put(ObjectCreationExpr.class, sequence( comment(), conditional(ObservableProperty.SCOPE, IS_PRESENT, sequence(child(ObservableProperty.SCOPE), token(GeneratedJavaParserConstants.DOT))), token(GeneratedJavaParserConstants.NEW), space(), list(ObservableProperty.TYPE_ARGUMENTS, sequence(comma(), space()), token(LT), token(GT)), conditional(ObservableProperty.TYPE_ARGUMENTS, IS_NOT_EMPTY, space()), child(ObservableProperty.TYPE), token(GeneratedJavaParserConstants.LPAREN), list(ObservableProperty.ARGUMENTS, sequence(comma(), space()), none(), none()), token(GeneratedJavaParserConstants.RPAREN), conditional(ObservableProperty.ANONYMOUS_CLASS_BODY, IS_PRESENT, sequence( space(), token(LBRACE), newline(), indent(), list(ObservableProperty.ANONYMOUS_CLASS_BODY, newline(), newline(), newline(), newline()), unindent(), token(RBRACE) )) ))435         concreteSyntaxModelByClass.put(ObjectCreationExpr.class, sequence(
436                 comment(),
437                 conditional(ObservableProperty.SCOPE, IS_PRESENT, sequence(child(ObservableProperty.SCOPE), token(GeneratedJavaParserConstants.DOT))),
438                 token(GeneratedJavaParserConstants.NEW),
439                 space(),
440                 list(ObservableProperty.TYPE_ARGUMENTS, sequence(comma(), space()), token(LT), token(GT)),
441                 conditional(ObservableProperty.TYPE_ARGUMENTS, IS_NOT_EMPTY, space()),
442                 child(ObservableProperty.TYPE),
443                 token(GeneratedJavaParserConstants.LPAREN),
444                 list(ObservableProperty.ARGUMENTS, sequence(comma(), space()), none(), none()),
445                 token(GeneratedJavaParserConstants.RPAREN),
446                 conditional(ObservableProperty.ANONYMOUS_CLASS_BODY, IS_PRESENT,
447                         sequence(
448                                 space(), token(LBRACE), newline(), indent(),
449                                 list(ObservableProperty.ANONYMOUS_CLASS_BODY,
450                                         newline(),
451                                         newline(),
452                                         newline(),
453                                         newline()),
454                                 unindent(),
455                                 token(RBRACE)
456                         ))
457         ));
458 
concreteSyntaxModelByClass.put(SimpleName.class, attribute(ObservableProperty.IDENTIFIER))459         concreteSyntaxModelByClass.put(SimpleName.class, attribute(ObservableProperty.IDENTIFIER));
460 
concreteSyntaxModelByClass.put(SingleMemberAnnotationExpr.class, sequence( comment(), token(GeneratedJavaParserConstants.AT), child(ObservableProperty.NAME), token(GeneratedJavaParserConstants.LPAREN), child(ObservableProperty.MEMBER_VALUE), token(GeneratedJavaParserConstants.RPAREN)))461         concreteSyntaxModelByClass.put(SingleMemberAnnotationExpr.class, sequence(
462                 comment(),
463                 token(GeneratedJavaParserConstants.AT),
464                 child(ObservableProperty.NAME),
465                 token(GeneratedJavaParserConstants.LPAREN),
466                 child(ObservableProperty.MEMBER_VALUE),
467                 token(GeneratedJavaParserConstants.RPAREN)));
468 
concreteSyntaxModelByClass.put(StringLiteralExpr.class, sequence( comment(), stringToken(ObservableProperty.VALUE) ))469         concreteSyntaxModelByClass.put(StringLiteralExpr.class, sequence(
470                 comment(),
471                 stringToken(ObservableProperty.VALUE)
472         ));
473 
concreteSyntaxModelByClass.put(SuperExpr.class, sequence( comment(), conditional(TYPE_NAME, IS_PRESENT, sequence(child(TYPE_NAME), token(GeneratedJavaParserConstants.DOT))), token(GeneratedJavaParserConstants.SUPER) ))474         concreteSyntaxModelByClass.put(SuperExpr.class, sequence(
475                 comment(),
476                 conditional(TYPE_NAME, IS_PRESENT, sequence(child(TYPE_NAME), token(GeneratedJavaParserConstants.DOT))),
477                 token(GeneratedJavaParserConstants.SUPER)
478         ));
479 
concreteSyntaxModelByClass.put(ThisExpr.class, sequence( comment(), conditional(TYPE_NAME, IS_PRESENT, sequence(child(TYPE_NAME), token(GeneratedJavaParserConstants.DOT))), token(GeneratedJavaParserConstants.THIS) ))480         concreteSyntaxModelByClass.put(ThisExpr.class, sequence(
481                 comment(),
482                 conditional(TYPE_NAME, IS_PRESENT, sequence(child(TYPE_NAME), token(GeneratedJavaParserConstants.DOT))),
483                 token(GeneratedJavaParserConstants.THIS)
484         ));
485 
concreteSyntaxModelByClass.put(TypeExpr.class, sequence( comment(), child(ObservableProperty.TYPE) ))486         concreteSyntaxModelByClass.put(TypeExpr.class, sequence(
487                 comment(),
488                 child(ObservableProperty.TYPE)
489         ));
490 
concreteSyntaxModelByClass.put(UnaryExpr.class, sequence( conditional(ObservableProperty.PREFIX, FLAG, attribute(ObservableProperty.OPERATOR)), child(ObservableProperty.EXPRESSION), conditional(ObservableProperty.POSTFIX, FLAG, attribute(ObservableProperty.OPERATOR)) ))491         concreteSyntaxModelByClass.put(UnaryExpr.class, sequence(
492                 conditional(ObservableProperty.PREFIX, FLAG, attribute(ObservableProperty.OPERATOR)),
493                 child(ObservableProperty.EXPRESSION),
494                 conditional(ObservableProperty.POSTFIX, FLAG, attribute(ObservableProperty.OPERATOR))
495         ));
496 
concreteSyntaxModelByClass.put(VariableDeclarationExpr.class, sequence( comment(), list(ObservableProperty.ANNOTATIONS, space(), none(), space()), modifiers(), child(ObservableProperty.MAXIMUM_COMMON_TYPE), space(), list(ObservableProperty.VARIABLES, sequence(comma(), space())) ))497         concreteSyntaxModelByClass.put(VariableDeclarationExpr.class, sequence(
498                 comment(),
499                 list(ObservableProperty.ANNOTATIONS, space(), none(), space()),
500                 modifiers(),
501                 child(ObservableProperty.MAXIMUM_COMMON_TYPE),
502                 space(),
503                 list(ObservableProperty.VARIABLES, sequence(comma(), space()))
504         ));
505 
506         ///
507         /// Statements
508         ///
509 
concreteSyntaxModelByClass.put(AssertStmt.class, sequence( comment(), token(GeneratedJavaParserConstants.ASSERT), space(), child(ObservableProperty.CHECK), conditional(ObservableProperty.MESSAGE, IS_PRESENT, sequence( space(), token(GeneratedJavaParserConstants.COLON), space(), child(ObservableProperty.MESSAGE) )), semicolon() ))510         concreteSyntaxModelByClass.put(AssertStmt.class, sequence(
511                 comment(),
512                 token(GeneratedJavaParserConstants.ASSERT),
513                 space(),
514                 child(ObservableProperty.CHECK),
515                 conditional(ObservableProperty.MESSAGE, IS_PRESENT, sequence(
516                         space(),
517                         token(GeneratedJavaParserConstants.COLON),
518                         space(),
519                         child(ObservableProperty.MESSAGE)
520                 )),
521                 semicolon()
522         ));
523 
concreteSyntaxModelByClass.put(BlockStmt.class, sequence( orphanCommentsBeforeThis(), comment(), token(GeneratedJavaParserConstants.LBRACE), newline(), list(ObservableProperty.STATEMENTS, newline(), indent(), sequence(newline(), unindent())), orphanCommentsEnding(), token(RBRACE) ))524         concreteSyntaxModelByClass.put(BlockStmt.class, sequence(
525                 orphanCommentsBeforeThis(),
526                 comment(),
527                 token(GeneratedJavaParserConstants.LBRACE),
528                 newline(),
529                 list(ObservableProperty.STATEMENTS, newline(), indent(), sequence(newline(), unindent())),
530                 orphanCommentsEnding(),
531                 token(RBRACE)
532         ));
533 
concreteSyntaxModelByClass.put(BreakStmt.class, sequence( comment(), token(GeneratedJavaParserConstants.BREAK), conditional(VALUE, IS_PRESENT, sequence(space(), child(VALUE))), semicolon() ))534         concreteSyntaxModelByClass.put(BreakStmt.class, sequence(
535                 comment(),
536                 token(GeneratedJavaParserConstants.BREAK),
537                 conditional(VALUE, IS_PRESENT, sequence(space(), child(VALUE))),
538                 semicolon()
539         ));
540 
concreteSyntaxModelByClass.put(CatchClause.class, sequence( comment(), space(), token(GeneratedJavaParserConstants.CATCH), space(), token(LPAREN), child(ObservableProperty.PARAMETER), token(RPAREN), space(), child(BODY) ))541         concreteSyntaxModelByClass.put(CatchClause.class, sequence(
542                 comment(),
543                 space(),
544                 token(GeneratedJavaParserConstants.CATCH),
545                 space(),
546                 token(LPAREN),
547                 child(ObservableProperty.PARAMETER),
548                 token(RPAREN),
549                 space(),
550                 child(BODY)
551         ));
552 
concreteSyntaxModelByClass.put(ContinueStmt.class, sequence( comment(), token(GeneratedJavaParserConstants.CONTINUE), conditional(ObservableProperty.LABEL, IS_PRESENT, sequence(space(), child(ObservableProperty.LABEL))), semicolon() ))553         concreteSyntaxModelByClass.put(ContinueStmt.class, sequence(
554                 comment(),
555                 token(GeneratedJavaParserConstants.CONTINUE),
556                 conditional(ObservableProperty.LABEL, IS_PRESENT, sequence(space(), child(ObservableProperty.LABEL))),
557                 semicolon()
558         ));
559 
concreteSyntaxModelByClass.put(DoStmt.class, sequence( comment(), token(GeneratedJavaParserConstants.DO), space(), child(ObservableProperty.BODY), space(), token(GeneratedJavaParserConstants.WHILE), space(), token(GeneratedJavaParserConstants.LPAREN), child(ObservableProperty.CONDITION), token(GeneratedJavaParserConstants.RPAREN), semicolon() ))560         concreteSyntaxModelByClass.put(DoStmt.class, sequence(
561                 comment(),
562                 token(GeneratedJavaParserConstants.DO),
563                 space(),
564                 child(ObservableProperty.BODY),
565                 space(),
566                 token(GeneratedJavaParserConstants.WHILE),
567                 space(),
568                 token(GeneratedJavaParserConstants.LPAREN),
569                 child(ObservableProperty.CONDITION),
570                 token(GeneratedJavaParserConstants.RPAREN),
571                 semicolon()
572         ));
573 
concreteSyntaxModelByClass.put(EmptyStmt.class, sequence( comment(), token(GeneratedJavaParserConstants.SEMICOLON) ))574         concreteSyntaxModelByClass.put(EmptyStmt.class, sequence(
575                 comment(),
576                 token(GeneratedJavaParserConstants.SEMICOLON)
577         ));
578 
concreteSyntaxModelByClass.put(UnparsableStmt.class, sequence( comment(), token(GeneratedJavaParserConstants.SEMICOLON) ))579         concreteSyntaxModelByClass.put(UnparsableStmt.class, sequence(
580                 comment(),
581                 token(GeneratedJavaParserConstants.SEMICOLON)
582         ));
583 
concreteSyntaxModelByClass.put(ExplicitConstructorInvocationStmt.class, sequence( comment(), conditional(ObservableProperty.THIS, FLAG, sequence(typeArguments(), token(GeneratedJavaParserConstants.THIS)), sequence( conditional(ObservableProperty.EXPRESSION, IS_PRESENT, sequence(child(ObservableProperty.EXPRESSION), token(GeneratedJavaParserConstants.DOT))), typeArguments(), token(GeneratedJavaParserConstants.SUPER) )), token(GeneratedJavaParserConstants.LPAREN), list(ObservableProperty.ARGUMENTS, sequence(comma(), space())), token(GeneratedJavaParserConstants.RPAREN), semicolon() ))584         concreteSyntaxModelByClass.put(ExplicitConstructorInvocationStmt.class, sequence(
585                 comment(),
586                 conditional(ObservableProperty.THIS, FLAG,
587                         sequence(typeArguments(), token(GeneratedJavaParserConstants.THIS)),
588                         sequence(
589                                 conditional(ObservableProperty.EXPRESSION, IS_PRESENT, sequence(child(ObservableProperty.EXPRESSION), token(GeneratedJavaParserConstants.DOT))),
590                                 typeArguments(),
591                                 token(GeneratedJavaParserConstants.SUPER)
592                         )),
593                 token(GeneratedJavaParserConstants.LPAREN),
594                 list(ObservableProperty.ARGUMENTS, sequence(comma(), space())),
595                 token(GeneratedJavaParserConstants.RPAREN),
596                 semicolon()
597         ));
598 
concreteSyntaxModelByClass.put(ExpressionStmt.class, sequence( orphanCommentsBeforeThis(), comment(), child(ObservableProperty.EXPRESSION), semicolon() ))599         concreteSyntaxModelByClass.put(ExpressionStmt.class, sequence(
600                 orphanCommentsBeforeThis(),
601                 comment(),
602                 child(ObservableProperty.EXPRESSION),
603                 semicolon()
604         ));
605 
concreteSyntaxModelByClass.put(ForEachStmt.class, sequence( comment(), token(GeneratedJavaParserConstants.FOR), space(), token(GeneratedJavaParserConstants.LPAREN), child(ObservableProperty.VARIABLE), space(), token(GeneratedJavaParserConstants.COLON), space(), child(ObservableProperty.ITERABLE), token(GeneratedJavaParserConstants.RPAREN), space(), child(ObservableProperty.BODY) ))606         concreteSyntaxModelByClass.put(ForEachStmt.class, sequence(
607                 comment(),
608                 token(GeneratedJavaParserConstants.FOR),
609                 space(),
610                 token(GeneratedJavaParserConstants.LPAREN),
611                 child(ObservableProperty.VARIABLE),
612                 space(),
613                 token(GeneratedJavaParserConstants.COLON),
614                 space(),
615                 child(ObservableProperty.ITERABLE),
616                 token(GeneratedJavaParserConstants.RPAREN),
617                 space(),
618                 child(ObservableProperty.BODY)
619         ));
620 
concreteSyntaxModelByClass.put(ForStmt.class, sequence( comment(), token(GeneratedJavaParserConstants.FOR), space(), token(GeneratedJavaParserConstants.LPAREN), list(ObservableProperty.INITIALIZATION, sequence(comma(), space())), semicolon(), space(), child(ObservableProperty.COMPARE), semicolon(), space(), list(ObservableProperty.UPDATE, sequence(comma(), space())), token(GeneratedJavaParserConstants.RPAREN), space(), child(ObservableProperty.BODY) ))621         concreteSyntaxModelByClass.put(ForStmt.class, sequence(
622                 comment(),
623                 token(GeneratedJavaParserConstants.FOR),
624                 space(),
625                 token(GeneratedJavaParserConstants.LPAREN),
626                 list(ObservableProperty.INITIALIZATION, sequence(comma(), space())),
627                 semicolon(),
628                 space(),
629                 child(ObservableProperty.COMPARE),
630                 semicolon(),
631                 space(),
632                 list(ObservableProperty.UPDATE, sequence(comma(), space())),
633                 token(GeneratedJavaParserConstants.RPAREN),
634                 space(),
635                 child(ObservableProperty.BODY)
636         ));
637 
concreteSyntaxModelByClass.put(IfStmt.class, sequence( comment(), token(GeneratedJavaParserConstants.IF), space(), token(GeneratedJavaParserConstants.LPAREN), child(ObservableProperty.CONDITION), token(GeneratedJavaParserConstants.RPAREN), conditional(ObservableProperty.THEN_BLOCK, CsmConditional.Condition.FLAG, sequence(space(), child(ObservableProperty.THEN_STMT), conditional(ObservableProperty.ELSE_STMT, IS_PRESENT, space())), sequence(newline(), indent(), child(ObservableProperty.THEN_STMT), conditional(ObservableProperty.ELSE_STMT, IS_PRESENT, newline()), unindent())), conditional(ObservableProperty.ELSE_STMT, IS_PRESENT, sequence(token(GeneratedJavaParserConstants.ELSE), conditional(Arrays.asList(ObservableProperty.ELSE_BLOCK, ObservableProperty.CASCADING_IF_STMT), CsmConditional.Condition.FLAG, sequence(space(), child(ObservableProperty.ELSE_STMT)), sequence(newline(), indent(), child(ObservableProperty.ELSE_STMT), unindent())))) ))638         concreteSyntaxModelByClass.put(IfStmt.class, sequence(
639                 comment(),
640                 token(GeneratedJavaParserConstants.IF),
641                 space(),
642                 token(GeneratedJavaParserConstants.LPAREN),
643                 child(ObservableProperty.CONDITION),
644                 token(GeneratedJavaParserConstants.RPAREN),
645                 conditional(ObservableProperty.THEN_BLOCK, CsmConditional.Condition.FLAG,
646                         sequence(space(), child(ObservableProperty.THEN_STMT),
647                                 conditional(ObservableProperty.ELSE_STMT, IS_PRESENT, space())),
648                         sequence(newline(), indent(), child(ObservableProperty.THEN_STMT),
649                                 conditional(ObservableProperty.ELSE_STMT, IS_PRESENT, newline()),
650                                 unindent())),
651                 conditional(ObservableProperty.ELSE_STMT, IS_PRESENT,
652                         sequence(token(GeneratedJavaParserConstants.ELSE),
653                                 conditional(Arrays.asList(ObservableProperty.ELSE_BLOCK, ObservableProperty.CASCADING_IF_STMT), CsmConditional.Condition.FLAG,
654                                         sequence(space(), child(ObservableProperty.ELSE_STMT)),
655                                         sequence(newline(), indent(), child(ObservableProperty.ELSE_STMT), unindent()))))
656         ));
657 
concreteSyntaxModelByClass.put(LabeledStmt.class, sequence( comment(), child(ObservableProperty.LABEL), token(GeneratedJavaParserConstants.COLON), space(), child(ObservableProperty.STATEMENT) ))658         concreteSyntaxModelByClass.put(LabeledStmt.class, sequence(
659                 comment(),
660                 child(ObservableProperty.LABEL),
661                 token(GeneratedJavaParserConstants.COLON),
662                 space(),
663                 child(ObservableProperty.STATEMENT)
664         ));
665 
concreteSyntaxModelByClass.put(LocalClassDeclarationStmt.class, sequence( comment(), child(ObservableProperty.CLASS_DECLARATION) ))666         concreteSyntaxModelByClass.put(LocalClassDeclarationStmt.class, sequence(
667                 comment(),
668                 child(ObservableProperty.CLASS_DECLARATION)
669         ));
670 
concreteSyntaxModelByClass.put(ReturnStmt.class, sequence(comment(), token(GeneratedJavaParserConstants.RETURN), conditional(ObservableProperty.EXPRESSION, IS_PRESENT, sequence(space(), child(ObservableProperty.EXPRESSION))), semicolon()))671         concreteSyntaxModelByClass.put(ReturnStmt.class, sequence(comment(), token(GeneratedJavaParserConstants.RETURN),
672                 conditional(ObservableProperty.EXPRESSION, IS_PRESENT, sequence(space(), child(ObservableProperty.EXPRESSION))),
673                 semicolon()));
674 
concreteSyntaxModelByClass.put(SwitchEntry.class, sequence( comment(), conditional(ObservableProperty.LABELS, IS_NOT_EMPTY, sequence(token(GeneratedJavaParserConstants.CASE), space(), list(ObservableProperty.LABELS), token(GeneratedJavaParserConstants.COLON)), sequence(token(GeneratedJavaParserConstants._DEFAULT), token(GeneratedJavaParserConstants.COLON))), newline(), indent(), list(ObservableProperty.STATEMENTS, newline(), none(), newline()), unindent() ))675         concreteSyntaxModelByClass.put(SwitchEntry.class, sequence(
676                 comment(),
677                 conditional(ObservableProperty.LABELS, IS_NOT_EMPTY,
678                         sequence(token(GeneratedJavaParserConstants.CASE), space(), list(ObservableProperty.LABELS), token(GeneratedJavaParserConstants.COLON)),
679                         sequence(token(GeneratedJavaParserConstants._DEFAULT), token(GeneratedJavaParserConstants.COLON))),
680                 newline(),
681                 indent(),
682                 list(ObservableProperty.STATEMENTS, newline(), none(), newline()),
683                 unindent()
684         ));
685 
concreteSyntaxModelByClass.put(SwitchStmt.class, sequence( comment(), token(GeneratedJavaParserConstants.SWITCH), token(GeneratedJavaParserConstants.LPAREN), child(ObservableProperty.SELECTOR), token(GeneratedJavaParserConstants.RPAREN), space(), token(GeneratedJavaParserConstants.LBRACE), newline(), list(ObservableProperty.ENTRIES, none(), indent(), unindent()), token(GeneratedJavaParserConstants.RBRACE) ))686         concreteSyntaxModelByClass.put(SwitchStmt.class, sequence(
687                 comment(),
688                 token(GeneratedJavaParserConstants.SWITCH),
689                 token(GeneratedJavaParserConstants.LPAREN),
690                 child(ObservableProperty.SELECTOR),
691                 token(GeneratedJavaParserConstants.RPAREN),
692                 space(),
693                 token(GeneratedJavaParserConstants.LBRACE),
694                 newline(),
695                 list(ObservableProperty.ENTRIES, none(), indent(), unindent()),
696                 token(GeneratedJavaParserConstants.RBRACE)
697         ));
698 
concreteSyntaxModelByClass.put(SwitchExpr.class, sequence( comment(), token(GeneratedJavaParserConstants.SWITCH), token(GeneratedJavaParserConstants.LPAREN), child(ObservableProperty.SELECTOR), token(GeneratedJavaParserConstants.RPAREN), space(), token(GeneratedJavaParserConstants.LBRACE), newline(), list(ObservableProperty.ENTRIES, none(), indent(), unindent()), token(GeneratedJavaParserConstants.RBRACE) ))699         concreteSyntaxModelByClass.put(SwitchExpr.class, sequence(
700                 comment(),
701                 token(GeneratedJavaParserConstants.SWITCH),
702                 token(GeneratedJavaParserConstants.LPAREN),
703                 child(ObservableProperty.SELECTOR),
704                 token(GeneratedJavaParserConstants.RPAREN),
705                 space(),
706                 token(GeneratedJavaParserConstants.LBRACE),
707                 newline(),
708                 list(ObservableProperty.ENTRIES, none(), indent(), unindent()),
709                 token(GeneratedJavaParserConstants.RBRACE)
710         ));
711 
concreteSyntaxModelByClass.put(SynchronizedStmt.class, sequence( comment(), token(GeneratedJavaParserConstants.SYNCHRONIZED), space(), token(LPAREN), child(EXPRESSION), token(RPAREN), space(), child(BODY) ))712         concreteSyntaxModelByClass.put(SynchronizedStmt.class, sequence(
713                 comment(),
714                 token(GeneratedJavaParserConstants.SYNCHRONIZED),
715                 space(),
716                 token(LPAREN),
717                 child(EXPRESSION),
718                 token(RPAREN),
719                 space(),
720                 child(BODY)
721         ));
722 
concreteSyntaxModelByClass.put(ThrowStmt.class, sequence( comment(), token(GeneratedJavaParserConstants.THROW), space(), child(ObservableProperty.EXPRESSION), semicolon() ))723         concreteSyntaxModelByClass.put(ThrowStmt.class, sequence(
724                 comment(),
725                 token(GeneratedJavaParserConstants.THROW),
726                 space(),
727                 child(ObservableProperty.EXPRESSION),
728                 semicolon()
729         ));
730 
concreteSyntaxModelByClass.put(TryStmt.class, sequence( comment(), token(GeneratedJavaParserConstants.TRY), space(), conditional(ObservableProperty.RESOURCES, CsmConditional.Condition.IS_NOT_EMPTY, sequence( token(LPAREN), list(ObservableProperty.RESOURCES, sequence(semicolon(), newline()), indent(), unindent()), token(RPAREN), space())), child(ObservableProperty.TRY_BLOCK), list(ObservableProperty.CATCH_CLAUSES), conditional(ObservableProperty.FINALLY_BLOCK, IS_PRESENT, sequence(space(), token(GeneratedJavaParserConstants.FINALLY), space(), child(ObservableProperty.FINALLY_BLOCK))) ))731         concreteSyntaxModelByClass.put(TryStmt.class, sequence(
732                 comment(),
733                 token(GeneratedJavaParserConstants.TRY),
734                 space(),
735                 conditional(ObservableProperty.RESOURCES, CsmConditional.Condition.IS_NOT_EMPTY, sequence(
736                         token(LPAREN),
737                         list(ObservableProperty.RESOURCES, sequence(semicolon(), newline()), indent(), unindent()),
738                         token(RPAREN),
739                         space())),
740                 child(ObservableProperty.TRY_BLOCK),
741                 list(ObservableProperty.CATCH_CLAUSES),
742                 conditional(ObservableProperty.FINALLY_BLOCK, IS_PRESENT, sequence(space(), token(GeneratedJavaParserConstants.FINALLY), space(), child(ObservableProperty.FINALLY_BLOCK)))
743         ));
744 
concreteSyntaxModelByClass.put(WhileStmt.class, sequence( comment(), token(GeneratedJavaParserConstants.WHILE), space(), token(GeneratedJavaParserConstants.LPAREN), child(ObservableProperty.CONDITION), token(GeneratedJavaParserConstants.RPAREN), space(), child(ObservableProperty.BODY) ))745         concreteSyntaxModelByClass.put(WhileStmt.class, sequence(
746                 comment(),
747                 token(GeneratedJavaParserConstants.WHILE),
748                 space(),
749                 token(GeneratedJavaParserConstants.LPAREN),
750                 child(ObservableProperty.CONDITION),
751                 token(GeneratedJavaParserConstants.RPAREN),
752                 space(),
753                 child(ObservableProperty.BODY)
754         ));
755 
756         ///
757         /// Types
758         ///
759 
concreteSyntaxModelByClass.put(ArrayType.class, sequence( child(ObservableProperty.COMPONENT_TYPE), list(ObservableProperty.ANNOTATIONS), string(GeneratedJavaParserConstants.LBRACKET), string(GeneratedJavaParserConstants.RBRACKET)))760         concreteSyntaxModelByClass.put(ArrayType.class, sequence(
761                 child(ObservableProperty.COMPONENT_TYPE),
762                 list(ObservableProperty.ANNOTATIONS),
763                 string(GeneratedJavaParserConstants.LBRACKET),
764                 string(GeneratedJavaParserConstants.RBRACKET)));
765 
concreteSyntaxModelByClass.put(ClassOrInterfaceType.class, sequence(comment(), conditional(SCOPE, IS_PRESENT, sequence(child(SCOPE), string(GeneratedJavaParserConstants.DOT))), list(ANNOTATIONS, space()), child(NAME), conditional(ObservableProperty.USING_DIAMOND_OPERATOR, FLAG, sequence(string(GeneratedJavaParserConstants.LT), string(GeneratedJavaParserConstants.GT)), list(TYPE_ARGUMENTS, sequence(comma(), space()), string(GeneratedJavaParserConstants.LT), string(GeneratedJavaParserConstants.GT)))))766         concreteSyntaxModelByClass.put(ClassOrInterfaceType.class, sequence(comment(),
767                 conditional(SCOPE, IS_PRESENT, sequence(child(SCOPE), string(GeneratedJavaParserConstants.DOT))),
768                 list(ANNOTATIONS, space()),
769                 child(NAME),
770                 conditional(ObservableProperty.USING_DIAMOND_OPERATOR, FLAG,
771                         sequence(string(GeneratedJavaParserConstants.LT), string(GeneratedJavaParserConstants.GT)),
772                         list(TYPE_ARGUMENTS, sequence(comma(), space()), string(GeneratedJavaParserConstants.LT), string(GeneratedJavaParserConstants.GT)))));
773 
concreteSyntaxModelByClass.put(IntersectionType.class, sequence( comment(), annotations(), list(ObservableProperty.ELEMENTS, sequence(space(), token(GeneratedJavaParserConstants.BIT_AND), space()))))774         concreteSyntaxModelByClass.put(IntersectionType.class, sequence(
775                 comment(),
776                 annotations(),
777                 list(ObservableProperty.ELEMENTS, sequence(space(), token(GeneratedJavaParserConstants.BIT_AND), space()))));
778 
concreteSyntaxModelByClass.put(PrimitiveType.class, sequence( comment(), list(ObservableProperty.ANNOTATIONS), attribute(ObservableProperty.TYPE)))779         concreteSyntaxModelByClass.put(PrimitiveType.class, sequence(
780                 comment(),
781                 list(ObservableProperty.ANNOTATIONS),
782                 attribute(ObservableProperty.TYPE)));
783 
concreteSyntaxModelByClass.put(TypeParameter.class, sequence( comment(), annotations(), child(ObservableProperty.NAME), list(ObservableProperty.TYPE_BOUND, sequence( space(), token(GeneratedJavaParserConstants.BIT_AND), space()), sequence( space(), token(GeneratedJavaParserConstants.EXTENDS), space()), none()) ))784         concreteSyntaxModelByClass.put(TypeParameter.class, sequence(
785                 comment(),
786                 annotations(),
787                 child(ObservableProperty.NAME),
788                 list(ObservableProperty.TYPE_BOUND,
789                         sequence(
790                                 space(),
791                                 token(GeneratedJavaParserConstants.BIT_AND),
792                                 space()),
793                         sequence(
794                                 space(),
795                                 token(GeneratedJavaParserConstants.EXTENDS),
796                                 space()),
797                         none())
798         ));
799 
concreteSyntaxModelByClass.put(UnionType.class, sequence( comment(), annotations(), list(ObservableProperty.ELEMENTS, sequence(space(), token(GeneratedJavaParserConstants.BIT_OR), space())) ))800         concreteSyntaxModelByClass.put(UnionType.class, sequence(
801                 comment(),
802                 annotations(),
803                 list(ObservableProperty.ELEMENTS, sequence(space(), token(GeneratedJavaParserConstants.BIT_OR), space()))
804         ));
805 
concreteSyntaxModelByClass.put(UnknownType.class, none())806         concreteSyntaxModelByClass.put(UnknownType.class, none());
807 
concreteSyntaxModelByClass.put(VoidType.class, sequence(comment(), annotations(), token(GeneratedJavaParserConstants.VOID)))808         concreteSyntaxModelByClass.put(VoidType.class, sequence(comment(), annotations(), token(GeneratedJavaParserConstants.VOID)));
809 
concreteSyntaxModelByClass.put(VarType.class, sequence(comment(), annotations(), string(GeneratedJavaParserConstants.IDENTIFIER, "var")))810         concreteSyntaxModelByClass.put(VarType.class, sequence(comment(), annotations(), string(GeneratedJavaParserConstants.IDENTIFIER, "var")));
811 
concreteSyntaxModelByClass.put(WildcardType.class, sequence(comment(), annotations(), token(GeneratedJavaParserConstants.HOOK), conditional(ObservableProperty.EXTENDED_TYPE, IS_PRESENT, sequence(space(), token(GeneratedJavaParserConstants.EXTENDS), space(), child(EXTENDED_TYPE))), conditional(ObservableProperty.SUPER_TYPE, IS_PRESENT, sequence(space(), token(GeneratedJavaParserConstants.SUPER), space(), child(SUPER_TYPE)))))812         concreteSyntaxModelByClass.put(WildcardType.class, sequence(comment(), annotations(), token(GeneratedJavaParserConstants.HOOK),
813                 conditional(ObservableProperty.EXTENDED_TYPE, IS_PRESENT, sequence(space(), token(GeneratedJavaParserConstants.EXTENDS), space(), child(EXTENDED_TYPE))),
814                 conditional(ObservableProperty.SUPER_TYPE, IS_PRESENT, sequence(space(), token(GeneratedJavaParserConstants.SUPER), space(), child(SUPER_TYPE)))));
815 
816         ///
817         /// Top Level
818         ///
819 
concreteSyntaxModelByClass.put(ArrayCreationLevel.class, sequence( annotations(), token(GeneratedJavaParserConstants.LBRACKET), child(ObservableProperty.DIMENSION), token(GeneratedJavaParserConstants.RBRACKET) ))820         concreteSyntaxModelByClass.put(ArrayCreationLevel.class, sequence(
821                 annotations(),
822                 token(GeneratedJavaParserConstants.LBRACKET),
823                 child(ObservableProperty.DIMENSION),
824                 token(GeneratedJavaParserConstants.RBRACKET)
825         ));
826 
concreteSyntaxModelByClass.put(CompilationUnit.class, sequence( comment(), child(ObservableProperty.PACKAGE_DECLARATION), list(ObservableProperty.IMPORTS, newline(), none(), sequence(newline(), newline())), list(TYPES, newline(), newline(), none(), newline()), child(ObservableProperty.MODULE), orphanCommentsEnding()))827         concreteSyntaxModelByClass.put(CompilationUnit.class, sequence(
828                 comment(),
829                 child(ObservableProperty.PACKAGE_DECLARATION),
830                 list(ObservableProperty.IMPORTS, newline(), none(), sequence(newline(), newline())),
831                 list(TYPES, newline(), newline(), none(), newline()),
832                 child(ObservableProperty.MODULE),
833                 orphanCommentsEnding()));
834 
concreteSyntaxModelByClass.put(ImportDeclaration.class, sequence( comment(), token(GeneratedJavaParserConstants.IMPORT), space(), conditional(ObservableProperty.STATIC, FLAG, sequence(token(GeneratedJavaParserConstants.STATIC), space())), child(ObservableProperty.NAME), conditional(ASTERISK, FLAG, sequence(token(GeneratedJavaParserConstants.DOT), token(GeneratedJavaParserConstants.STAR))), semicolon(), orphanCommentsEnding() ))835         concreteSyntaxModelByClass.put(ImportDeclaration.class, sequence(
836                 comment(),
837                 token(GeneratedJavaParserConstants.IMPORT),
838                 space(),
839                 conditional(ObservableProperty.STATIC, FLAG, sequence(token(GeneratedJavaParserConstants.STATIC), space())),
840                 child(ObservableProperty.NAME),
841                 conditional(ASTERISK, FLAG, sequence(token(GeneratedJavaParserConstants.DOT), token(GeneratedJavaParserConstants.STAR))),
842                 semicolon(),
843                 orphanCommentsEnding()
844         ));
845 
concreteSyntaxModelByClass.put(PackageDeclaration.class, sequence( comment(), memberAnnotations(), token(GeneratedJavaParserConstants.PACKAGE), space(), child(ObservableProperty.NAME), semicolon(), newline(), newline(), orphanCommentsEnding()))846         concreteSyntaxModelByClass.put(PackageDeclaration.class, sequence(
847                 comment(),
848                 memberAnnotations(),
849                 token(GeneratedJavaParserConstants.PACKAGE),
850                 space(),
851                 child(ObservableProperty.NAME),
852                 semicolon(),
853                 newline(),
854                 newline(),
855                 orphanCommentsEnding()));
856 
857         ///
858         /// Module info
859         ///
860 
concreteSyntaxModelByClass.put(ModuleDeclaration.class, sequence( memberAnnotations(), conditional(ObservableProperty.OPEN, FLAG, sequence(token(GeneratedJavaParserConstants.OPEN), space())), token(GeneratedJavaParserConstants.MODULE), space(), child(ObservableProperty.NAME), space(), token(GeneratedJavaParserConstants.LBRACE), newline(), indent(), list(ObservableProperty.DIRECTIVES), unindent(), token(GeneratedJavaParserConstants.RBRACE), newline() ))861         concreteSyntaxModelByClass.put(ModuleDeclaration.class, sequence(
862                 memberAnnotations(),
863                 conditional(ObservableProperty.OPEN, FLAG, sequence(token(GeneratedJavaParserConstants.OPEN), space())),
864                 token(GeneratedJavaParserConstants.MODULE),
865                 space(),
866                 child(ObservableProperty.NAME),
867                 space(),
868                 token(GeneratedJavaParserConstants.LBRACE),
869                 newline(),
870                 indent(),
871                 list(ObservableProperty.DIRECTIVES),
872                 unindent(),
873                 token(GeneratedJavaParserConstants.RBRACE),
874                 newline()
875         ));
876 
concreteSyntaxModelByClass.put(ModuleExportsDirective.class, sequence( token(GeneratedJavaParserConstants.EXPORTS), space(), child(ObservableProperty.NAME), list(ObservableProperty.MODULE_NAMES, sequence(comma(), space()), sequence(space(), token(GeneratedJavaParserConstants.TO), space()), none()), semicolon(), newline() ))877         concreteSyntaxModelByClass.put(ModuleExportsDirective.class, sequence(
878                 token(GeneratedJavaParserConstants.EXPORTS),
879                 space(),
880                 child(ObservableProperty.NAME),
881                 list(ObservableProperty.MODULE_NAMES,
882                         sequence(comma(), space()),
883                         sequence(space(), token(GeneratedJavaParserConstants.TO), space()),
884                         none()),
885                 semicolon(),
886                 newline()
887         ));
888 
concreteSyntaxModelByClass.put(ModuleOpensDirective.class, sequence( token(GeneratedJavaParserConstants.OPENS), space(), child(ObservableProperty.NAME), list(ObservableProperty.MODULE_NAMES, sequence(comma(), space()), sequence(space(), token(GeneratedJavaParserConstants.TO), space()), none()), semicolon(), newline() ))889         concreteSyntaxModelByClass.put(ModuleOpensDirective.class, sequence(
890                 token(GeneratedJavaParserConstants.OPENS),
891                 space(),
892                 child(ObservableProperty.NAME),
893                 list(ObservableProperty.MODULE_NAMES,
894                         sequence(comma(), space()),
895                         sequence(space(), token(GeneratedJavaParserConstants.TO), space()),
896                         none()),
897                 semicolon(),
898                 newline()
899         ));
900 
concreteSyntaxModelByClass.put(ModuleProvidesDirective.class, sequence( token(GeneratedJavaParserConstants.PROVIDES), space(), child(ObservableProperty.NAME), list(ObservableProperty.WITH, sequence(comma(), space()), sequence(space(), token(GeneratedJavaParserConstants.WITH), space()), none()), semicolon(), newline() ))901         concreteSyntaxModelByClass.put(ModuleProvidesDirective.class, sequence(
902                 token(GeneratedJavaParserConstants.PROVIDES),
903                 space(),
904                 child(ObservableProperty.NAME),
905                 list(ObservableProperty.WITH,
906                         sequence(comma(), space()),
907                         sequence(space(), token(GeneratedJavaParserConstants.WITH), space()),
908                         none()),
909                 semicolon(),
910                 newline()
911         ));
912 
concreteSyntaxModelByClass.put(ModuleRequiresDirective.class, sequence( token(GeneratedJavaParserConstants.REQUIRES), space(), modifiers(), child(ObservableProperty.NAME), semicolon(), newline() ))913         concreteSyntaxModelByClass.put(ModuleRequiresDirective.class, sequence(
914                 token(GeneratedJavaParserConstants.REQUIRES),
915                 space(),
916                 modifiers(),
917                 child(ObservableProperty.NAME),
918                 semicolon(),
919                 newline()
920         ));
921 
concreteSyntaxModelByClass.put(ModuleUsesDirective.class, sequence( token(GeneratedJavaParserConstants.USES), space(), child(ObservableProperty.NAME), semicolon(), newline() ))922         concreteSyntaxModelByClass.put(ModuleUsesDirective.class, sequence(
923                 token(GeneratedJavaParserConstants.USES),
924                 space(),
925                 child(ObservableProperty.NAME),
926                 semicolon(),
927                 newline()
928         ));
929 
930         List<String> unsupportedNodeClassNames = JavaParserMetaModel.getNodeMetaModels().stream()
931                 .filter(c -> !c.isAbstract() && !Comment.class.isAssignableFrom(c.getType()) && !concreteSyntaxModelByClass.containsKey(c.getType()))
932                 .map(nm -> nm.getType().getSimpleName())
933                 .collect(Collectors.toList());
934         if (unsupportedNodeClassNames.isEmpty()) {
935             initializationError = Optional.empty();
936         } else {
937             initializationError = Optional.of("The CSM should include support for these classes: " + String.join(", ", unsupportedNodeClassNames));
938         }
939     }
940 
ConcreteSyntaxModel()941     private ConcreteSyntaxModel() {
942 
943     }
944 
genericPrettyPrint(Node node, SourcePrinter printer)945     public static void genericPrettyPrint(Node node, SourcePrinter printer) {
946         forClass(node.getClass()).prettyPrint(node, printer);
947     }
948 
genericPrettyPrint(Node node)949     public static String genericPrettyPrint(Node node) {
950         SourcePrinter sourcePrinter = new SourcePrinter();
951         forClass(node.getClass()).prettyPrint(node, sourcePrinter);
952         return sourcePrinter.toString();
953     }
954 
forClass(Class<? extends Node> nodeClazz)955     public static CsmElement forClass(Class<? extends Node> nodeClazz) {
956         initializationError.ifPresent(s -> {
957             throw new IllegalStateException(s);
958         });
959         if (!concreteSyntaxModelByClass.containsKey(nodeClazz)) {
960             throw new UnsupportedOperationException(nodeClazz.getSimpleName());
961         }
962         return concreteSyntaxModelByClass.get(nodeClazz);
963     }
964 
965 }
966