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