Codebase list javaparser / f65f978
New upstream version 3.6.27 Emmanuel Bourg 2 years ago
18 changed file(s) with 220 addition(s) and 31 deletion(s). Raw diff Collapse all Expand all
33 script: mvn test -P AlsoSlowTests
44 jdk:
55 - oraclejdk8
6 - oraclejdk10
6 # - openjdk11
77 notifications:
88 webhooks:
99 urls:
0 Version 3.6.27
1 ------------------
2 * The Json serialization now serializes more fields,
3 which *should* not impact existing code.
4
5 [issues resolved](https://github.com/javaparser/javaparser/milestone/111?closed=1)
6
07 Version 3.6.26
18 ------------------
29 * BREAKING: Node.getData now throws an exception if the data was not set before.
310 This can be rewritten by checking with Node.containsData before doing getData.
411
5 [issues resolved](https://github.com/javaparser/javaparser/milestone/109?closed=1)
12 [issues resolved](https://github.com/javaparser/javaparser/milestone/110?closed=1)
613
714 Version 3.6.25
815 ------------------
11 <parent>
22 <artifactId>javaparser-parent</artifactId>
33 <groupId>com.github.javaparser</groupId>
4 <version>3.6.26</version>
4 <version>3.6.27</version>
55 </parent>
66 <modelVersion>4.0.0</modelVersion>
77
2121 package com.github.javaparser.ast;
2222
2323 import java.util.EnumSet;
24 import java.util.Set;
2425
2526 /**
2627 * One of the modifiers known in Java.
5758 return EnumSet.of(this);
5859 }
5960
60 public static AccessSpecifier getAccessSpecifier(EnumSet<Modifier> modifiers) {
61 public static AccessSpecifier getAccessSpecifier(Set<Modifier> modifiers) {
6162 if (modifiers.contains(Modifier.PUBLIC)) {
6263 return AccessSpecifier.PUBLIC;
6364 } else if (modifiers.contains(Modifier.PROTECTED)) {
22 <parent>
33 <artifactId>javaparser-parent</artifactId>
44 <groupId>com.github.javaparser</groupId>
5 <version>3.6.26</version>
5 <version>3.6.27</version>
66 </parent>
77 <modelVersion>4.0.0</modelVersion>
88
22 <parent>
33 <artifactId>javaparser-parent</artifactId>
44 <groupId>com.github.javaparser</groupId>
5 <version>3.6.26</version>
5 <version>3.6.27</version>
66 </parent>
77 <modelVersion>4.0.0</modelVersion>
88
11 <parent>
22 <artifactId>javaparser-parent</artifactId>
33 <groupId>com.github.javaparser</groupId>
4 <version>3.6.26</version>
4 <version>3.6.27</version>
55 </parent>
66 <modelVersion>4.0.0</modelVersion>
77
1919 */
2020 package com.github.javaparser.serialization;
2121
22 import com.github.javaparser.*;
23 import com.github.javaparser.ast.CompilationUnit;
2224 import com.github.javaparser.ast.Modifier;
2325 import com.github.javaparser.ast.Node;
2426 import com.github.javaparser.ast.NodeList;
27 import com.github.javaparser.ast.comments.Comment;
2528 import com.github.javaparser.metamodel.BaseNodeMetaModel;
2629 import com.github.javaparser.metamodel.PropertyMetaModel;
2730 import com.github.javaparser.utils.Log;
2831
29 import javax.json.JsonArray;
30 import javax.json.JsonObject;
31 import javax.json.JsonReader;
32 import javax.json.JsonString;
33 import java.util.EnumSet;
34 import java.util.HashMap;
35 import java.util.Map;
32 import javax.json.*;
33 import java.util.*;
3634 import java.util.stream.Collectors;
3735
3836 import static com.github.javaparser.ast.NodeList.toNodeList;
5654 BaseNodeMetaModel nodeMetaModel = getNodeMetaModel(Class.forName(serializedNodeType))
5755 .orElseThrow(() -> new IllegalStateException("Trying to deserialize an unknown node type: " + serializedNodeType));
5856 Map<String, Object> parameters = new HashMap<>();
57 Map<String, JsonValue> deferredJsonValues = new HashMap<>();
58
5959 for (String name : nodeJson.keySet()) {
6060 if (name.equals(SERIALIZED_CLASS_KEY)) {
6161 continue;
6262 }
6363
64 PropertyMetaModel propertyMetaModel = nodeMetaModel.getAllPropertyMetaModels().stream()
64 Optional<PropertyMetaModel> optionalPropertyMetaModel = nodeMetaModel.getAllPropertyMetaModels().stream()
6565 .filter(mm -> mm.getName().equals(name))
66 .findFirst().orElseThrow(() -> new IllegalStateException("Unknown property: " + nodeMetaModel.getQualifiedClassName() + "." + name));
66 .findFirst();
67 if (!optionalPropertyMetaModel.isPresent()) {
68 deferredJsonValues.put(name, nodeJson.get(name));
69 continue;
70 }
6771
72 PropertyMetaModel propertyMetaModel = optionalPropertyMetaModel.get();
6873 if (propertyMetaModel.isNodeList()) {
6974 JsonArray nodeListJson = nodeJson.getJsonArray(name);
7075 parameters.put(name, deserializeNodeList(nodeListJson));
8792 }
8893 }
8994
90 return nodeMetaModel.construct(parameters);
95 Node node = nodeMetaModel.construct(parameters);
96 // Note: comment is a property meta model, but it is not listed as constructor parameter and not attached to node
97 // @see BaseNodeMetaModel.getConstructorParameters
98 if (parameters.containsKey("comment")) {
99 node.setComment((Comment)parameters.get("comment"));
100 }
101
102 for (String name : deferredJsonValues.keySet()) {
103 if (!readNonMetaProperties(name, deferredJsonValues.get(name), node)) {
104 throw new IllegalStateException("Unknown property: " + nodeMetaModel.getQualifiedClassName() + "." + name);
105 }
106 }
107 setSymbolResolverIfCompilationUnit(node);
108
109 return node;
91110 } catch (ClassNotFoundException e) {
92111 throw new RuntimeException(e);
93112 }
100119 private NodeList<?> deserializeNodeList(JsonArray nodeListJson) {
101120 return nodeListJson.stream().map(nodeJson -> deserializeObject((JsonObject) nodeJson)).collect(toNodeList());
102121 }
122
123 protected boolean readNonMetaProperties(String name, JsonValue jsonValue, Node node) {
124 return readRange(name, jsonValue, node)
125 || readTokenRange(name, jsonValue, node);
126 }
127
128 protected boolean readRange(String name, JsonValue jsonValue, Node node) {
129 if (name.equals("range")) {
130 JsonObject jsonObject = (JsonObject)jsonValue;
131 Position begin = new Position(jsonObject.getInt("beginLine"), jsonObject.getInt("beginColumn"));
132 Position end = new Position(jsonObject.getInt("endLine"), jsonObject.getInt("endColumn"));
133 node.setRange(new Range(begin, end));
134 return true;
135 }
136 return false;
137 }
138
139 protected boolean readTokenRange(String name, JsonValue jsonValue, Node node) {
140 if (name.equals("tokenRange")) {
141 JsonObject jsonObject = (JsonObject)jsonValue;
142 JavaToken begin = readToken("beginToken", jsonObject);
143 JavaToken end = readToken("endToken", jsonObject);
144 node.setTokenRange(new TokenRange(begin, end));
145 return true;
146 }
147 return false;
148 }
149
150 protected JavaToken readToken(String name, JsonObject jsonObject) {
151 JsonObject tokenJson = jsonObject.getJsonObject(name);
152 return new JavaToken(
153 tokenJson.getInt("kind"),
154 tokenJson.getString("text")
155 );
156 }
157
158 private void setSymbolResolverIfCompilationUnit(Node node) {
159 if (node instanceof CompilationUnit && JavaParser.getStaticConfiguration().getSymbolResolver().isPresent()) {
160 CompilationUnit cu = (CompilationUnit)node;
161 cu.setData(Node.SYMBOL_RESOLVER_KEY, JavaParser.getStaticConfiguration().getSymbolResolver().get());
162 }
163 }
103164 }
1919 */
2020 package com.github.javaparser.serialization;
2121
22 import com.github.javaparser.JavaToken;
23 import com.github.javaparser.Range;
24 import com.github.javaparser.TokenRange;
2225 import com.github.javaparser.ast.Node;
2326 import com.github.javaparser.ast.NodeList;
2427 import com.github.javaparser.metamodel.BaseNodeMetaModel;
5356 generator.writeStartObject(nodeName);
5457 }
5558 generator.write(SERIALIZED_CLASS_KEY, node.getClass().getName());
59 this.writeNonMetaProperties(node, generator);
5660 for (PropertyMetaModel propertyMetaModel : nodeMetaModel.getAllPropertyMetaModels()) {
5761 String name = propertyMetaModel.getName();
5862 Object value = propertyMetaModel.getValue(node);
8084 }
8185 generator.writeEnd();
8286 }
87
88 protected void writeNonMetaProperties(Node node, JsonGenerator generator) {
89 this.writeRange(node, generator);
90 this.writeTokens(node, generator);
91 }
92
93 protected void writeRange(Node node, JsonGenerator generator) {
94 if (node.getRange().isPresent()) {
95 Range range = node.getRange().get();
96 generator.writeStartObject("range");
97 generator.write("beginLine", range.begin.line);
98 generator.write("beginColumn", range.begin.column);
99 generator.write("endLine", range.end.line);
100 generator.write("endColumn", range.end.column);
101 generator.writeEnd();
102 }
103 }
104
105 protected void writeTokens(Node node, JsonGenerator generator) {
106 if (node.getTokenRange().isPresent()) {
107 TokenRange tokenRange = node.getTokenRange().get();
108 generator.writeStartObject("tokenRange");
109 writeToken("beginToken", tokenRange.getBegin(), generator);
110 writeToken("endToken", tokenRange.getEnd(), generator);
111 generator.writeEnd();
112 }
113 }
114
115 protected void writeToken(String name, JavaToken token, JsonGenerator generator) {
116 generator.writeStartObject(name);
117 generator.write("kind", token.getKind());
118 generator.write("text", token.getText());
119 generator.writeEnd();
120 }
121
83122 }
2020 package com.github.javaparser.serialization;
2121
2222 import com.github.javaparser.JavaParser;
23 import com.github.javaparser.Position;
24 import com.github.javaparser.Range;
25 import com.github.javaparser.TokenRange;
2326 import com.github.javaparser.ast.CompilationUnit;
2427 import com.github.javaparser.ast.Node;
28 import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
29 import com.github.javaparser.ast.body.MethodDeclaration;
30 import com.github.javaparser.ast.comments.Comment;
2531 import com.github.javaparser.ast.expr.Expression;
2632 import com.github.javaparser.ast.type.Type;
33 import com.github.javaparser.resolution.SymbolResolver;
34 import com.github.javaparser.resolution.types.ResolvedType;
2735 import org.junit.jupiter.api.Test;
2836
2937 import javax.json.Json;
38 import javax.json.JsonObject;
39 import javax.json.stream.JsonGenerator;
3040
3141 import java.io.StringReader;
42 import java.util.HashMap;
43 import java.util.LinkedList;
44 import java.util.List;
45 import java.util.Map;
3246
3347 import static com.github.javaparser.serialization.JavaParserJsonSerializerTest.*;
3448 import static com.github.javaparser.utils.Utils.EOL;
104118 assertEquals(type.hashCode(), deserialized.hashCode());
105119 }
106120
121 @Test
122 void testComment() {
123 CompilationUnit cu = JavaParser.parse("/* block comment */\npublic class X{ \n // line comment\npublic void test() {}\n}");
124 String serialized = serialize(cu, false);
125
126 CompilationUnit deserialized = (CompilationUnit)deserializer.deserializeObject(Json.createReader(new StringReader(serialized)));
127 ClassOrInterfaceDeclaration classXDeclaration = deserialized.getClassByName("X").get();
128 assertEquals(classXDeclaration.getComment().isPresent(), true);
129
130 Comment comment = classXDeclaration.getComment().get();
131 assertEquals(comment.getClass().getName(), "com.github.javaparser.ast.comments.BlockComment");
132 assertEquals(comment.getContent(), " block comment ");
133
134 MethodDeclaration methodDeclaration = classXDeclaration.getMethods().get(0);
135 assertEquals(methodDeclaration.getComment().isPresent(), true);
136 assertEquals(methodDeclaration.getComment().get().getClass().getName(), "com.github.javaparser.ast.comments.LineComment");
137 assertEquals(methodDeclaration.getComment().get().getContent(), " line comment");
138 }
139
140 @Test
141 void testNonMetaProperties() {
142 CompilationUnit cu = JavaParser.parse("public class X{} class Z{}");
143 String serialized = serialize(cu, false);
144
145 CompilationUnit deserialized = (CompilationUnit)deserializer.deserializeObject(Json.createReader(new StringReader(serialized)));
146
147 assertEquals(deserialized.getRange().isPresent(), true);
148 Range range = deserialized.getRange().get();
149 assertEquals(range.begin.line, 1);
150 assertEquals(range.begin.line, 1);
151 assertEquals(range.end.column, 26);
152
153 assertEquals(deserialized.getTokenRange().isPresent(), true);
154 TokenRange tokenRange = deserialized.getTokenRange().get();
155 assertEquals(tokenRange.getBegin().getText(), "public");
156 assertEquals(tokenRange.getEnd().getText(), "");
157 }
158
159 @Test
160 void testAttachingSymbolResolver() {
161 SymbolResolver stubResolver = new SymbolResolver() {
162 @Override
163 public <T> T resolveDeclaration(Node node, Class<T> resultClass) {
164 return null;
165 }
166
167 @Override
168 public <T> T toResolvedType(Type javaparserType, Class<T> resultClass) {
169 return null;
170 }
171
172 @Override
173 public ResolvedType calculateType(Expression expression) {
174 return null;
175 }
176 };
177 JavaParser.getStaticConfiguration().setSymbolResolver(stubResolver);
178 CompilationUnit cu = JavaParser.parse("public class X{} class Z{}");
179 String serialized = serialize(cu, false);
180
181 CompilationUnit deserialized = (CompilationUnit)deserializer.deserializeObject(Json.createReader(new StringReader(serialized)));
182 assertEquals(deserialized.containsData(Node.SYMBOL_RESOLVER_KEY), true);
183 assertEquals(deserialized.getData(Node.SYMBOL_RESOLVER_KEY), stubResolver);
184 }
185
107186 /**
108187 * Assert that "actual" equals "expected", and that any EOL characters in "actual" are correct for the platform.
109188 */
2929 import javax.json.stream.JsonGeneratorFactory;
3030 import java.io.StringWriter;
3131 import java.util.HashMap;
32 import java.util.LinkedList;
33 import java.util.List;
3234 import java.util.Map;
3335
3436 import static org.junit.jupiter.api.Assertions.assertEquals;
4042
4143 String serialized = serialize(cu, false);
4244
43 assertEquals("{\"!\":\"com.github.javaparser.ast.CompilationUnit\",\"imports\":[],\"types\":[{\"!\":\"com.github.javaparser.ast.body.ClassOrInterfaceDeclaration\",\"extendedTypes\":[],\"implementedTypes\":[],\"isInterface\":\"false\",\"typeParameters\":[],\"members\":[{\"!\":\"com.github.javaparser.ast.body.FieldDeclaration\",\"modifiers\":[],\"variables\":[{\"!\":\"com.github.javaparser.ast.body.VariableDeclarator\",\"name\":{\"!\":\"com.github.javaparser.ast.expr.SimpleName\",\"identifier\":\"y\"},\"type\":{\"!\":\"com.github.javaparser.ast.type.ClassOrInterfaceType\",\"name\":{\"!\":\"com.github.javaparser.ast.expr.SimpleName\",\"identifier\":\"Y\"},\"scope\":{\"!\":\"com.github.javaparser.ast.type.ClassOrInterfaceType\",\"name\":{\"!\":\"com.github.javaparser.ast.expr.SimpleName\",\"identifier\":\"util\"},\"scope\":{\"!\":\"com.github.javaparser.ast.type.ClassOrInterfaceType\",\"name\":{\"!\":\"com.github.javaparser.ast.expr.SimpleName\",\"identifier\":\"java\"},\"annotations\":[]},\"annotations\":[]},\"annotations\":[]}}],\"annotations\":[]}],\"modifiers\":[],\"name\":{\"!\":\"com.github.javaparser.ast.expr.SimpleName\",\"identifier\":\"X\"},\"annotations\":[]}]}", serialized);
45 assertEquals("{\"!\":\"com.github.javaparser.ast.CompilationUnit\",\"range\":{\"beginLine\":1,\"beginColumn\":1,\"endLine\":1,\"endColumn\":23},\"tokenRange\":{\"beginToken\":{\"kind\":19,\"text\":\"class\"},\"endToken\":{\"kind\":0,\"text\":\"\"}},\"imports\":[],\"types\":[{\"!\":\"com.github.javaparser.ast.body.ClassOrInterfaceDeclaration\",\"range\":{\"beginLine\":1,\"beginColumn\":1,\"endLine\":1,\"endColumn\":23},\"tokenRange\":{\"beginToken\":{\"kind\":19,\"text\":\"class\"},\"endToken\":{\"kind\":95,\"text\":\"}\"}},\"extendedTypes\":[],\"implementedTypes\":[],\"isInterface\":\"false\",\"typeParameters\":[],\"members\":[{\"!\":\"com.github.javaparser.ast.body.FieldDeclaration\",\"range\":{\"beginLine\":1,\"beginColumn\":9,\"endLine\":1,\"endColumn\":22},\"tokenRange\":{\"beginToken\":{\"kind\":89,\"text\":\"java\"},\"endToken\":{\"kind\":98,\"text\":\";\"}},\"modifiers\":[],\"variables\":[{\"!\":\"com.github.javaparser.ast.body.VariableDeclarator\",\"range\":{\"beginLine\":1,\"beginColumn\":21,\"endLine\":1,\"endColumn\":21},\"tokenRange\":{\"beginToken\":{\"kind\":89,\"text\":\"y\"},\"endToken\":{\"kind\":89,\"text\":\"y\"}},\"name\":{\"!\":\"com.github.javaparser.ast.expr.SimpleName\",\"range\":{\"beginLine\":1,\"beginColumn\":21,\"endLine\":1,\"endColumn\":21},\"tokenRange\":{\"beginToken\":{\"kind\":89,\"text\":\"y\"},\"endToken\":{\"kind\":89,\"text\":\"y\"}},\"identifier\":\"y\"},\"type\":{\"!\":\"com.github.javaparser.ast.type.ClassOrInterfaceType\",\"range\":{\"beginLine\":1,\"beginColumn\":9,\"endLine\":1,\"endColumn\":19},\"tokenRange\":{\"beginToken\":{\"kind\":89,\"text\":\"java\"},\"endToken\":{\"kind\":89,\"text\":\"Y\"}},\"name\":{\"!\":\"com.github.javaparser.ast.expr.SimpleName\",\"range\":{\"beginLine\":1,\"beginColumn\":19,\"endLine\":1,\"endColumn\":19},\"tokenRange\":{\"beginToken\":{\"kind\":89,\"text\":\"Y\"},\"endToken\":{\"kind\":89,\"text\":\"Y\"}},\"identifier\":\"Y\"},\"scope\":{\"!\":\"com.github.javaparser.ast.type.ClassOrInterfaceType\",\"range\":{\"beginLine\":1,\"beginColumn\":9,\"endLine\":1,\"endColumn\":17},\"tokenRange\":{\"beginToken\":{\"kind\":89,\"text\":\"java\"},\"endToken\":{\"kind\":89,\"text\":\"util\"}},\"name\":{\"!\":\"com.github.javaparser.ast.expr.SimpleName\",\"range\":{\"beginLine\":1,\"beginColumn\":14,\"endLine\":1,\"endColumn\":17},\"tokenRange\":{\"beginToken\":{\"kind\":89,\"text\":\"util\"},\"endToken\":{\"kind\":89,\"text\":\"util\"}},\"identifier\":\"util\"},\"scope\":{\"!\":\"com.github.javaparser.ast.type.ClassOrInterfaceType\",\"range\":{\"beginLine\":1,\"beginColumn\":9,\"endLine\":1,\"endColumn\":12},\"tokenRange\":{\"beginToken\":{\"kind\":89,\"text\":\"java\"},\"endToken\":{\"kind\":89,\"text\":\"java\"}},\"name\":{\"!\":\"com.github.javaparser.ast.expr.SimpleName\",\"range\":{\"beginLine\":1,\"beginColumn\":9,\"endLine\":1,\"endColumn\":12},\"tokenRange\":{\"beginToken\":{\"kind\":89,\"text\":\"java\"},\"endToken\":{\"kind\":89,\"text\":\"java\"}},\"identifier\":\"java\"},\"annotations\":[]},\"annotations\":[]},\"annotations\":[]}}],\"annotations\":[]}],\"modifiers\":[],\"name\":{\"!\":\"com.github.javaparser.ast.expr.SimpleName\",\"range\":{\"beginLine\":1,\"beginColumn\":7,\"endLine\":1,\"endColumn\":7},\"tokenRange\":{\"beginToken\":{\"kind\":89,\"text\":\"X\"},\"endToken\":{\"kind\":89,\"text\":\"X\"}},\"identifier\":\"X\"},\"annotations\":[]}]}", serialized);
4446 }
4547
4648 static String serialize(Node node, boolean prettyPrint) {
11 <parent>
22 <artifactId>javaparser-parent</artifactId>
33 <groupId>com.github.javaparser</groupId>
4 <version>3.6.26</version>
4 <version>3.6.27</version>
55 </parent>
66 <modelVersion>4.0.0</modelVersion>
77
22 <parent>
33 <artifactId>javaparser-parent</artifactId>
44 <groupId>com.github.javaparser</groupId>
5 <version>3.6.26</version>
5 <version>3.6.27</version>
66 </parent>
77 <modelVersion>4.0.0</modelVersion>
88
22 <parent>
33 <artifactId>javaparser-parent</artifactId>
44 <groupId>com.github.javaparser</groupId>
5 <version>3.6.26</version>
5 <version>3.6.27</version>
66 </parent>
77 <modelVersion>4.0.0</modelVersion>
88
22 <parent>
33 <artifactId>javaparser-parent</artifactId>
44 <groupId>com.github.javaparser</groupId>
5 <version>3.6.26</version>
5 <version>3.6.27</version>
66 </parent>
77 <modelVersion>4.0.0</modelVersion>
88
22 <parent>
33 <artifactId>javaparser-parent</artifactId>
44 <groupId>com.github.javaparser</groupId>
5 <version>3.6.26</version>
5 <version>3.6.27</version>
66 </parent>
77 <modelVersion>4.0.0</modelVersion>
88
1414 <groupId>com.github.javaparser</groupId>
1515 <artifactId>javaparser-parent</artifactId>
1616 <packaging>pom</packaging>
17 <version>3.6.26</version>
17 <version>3.6.27</version>
1818
1919 <name>javaparser-parent</name>
2020 <url>https://github.com/javaparser</url>
134134 <connection>scm:git:git://github.com/javaparser/javaparser.git</connection>
135135 <developerConnection>scm:git:git@github.com:javaparser/javaparser.git</developerConnection>
136136 <url>https://github.com/javaparser/javaparser.git</url>
137 <tag>javaparser-parent-3.6.26</tag>
137 <tag>javaparser-parent-3.6.27</tag>
138138 </scm>
139139
140140 <issueManagement>
2727 <dependency>
2828 <groupId>com.github.javaparser</groupId>
2929 <artifactId>javaparser-symbol-solver-core</artifactId>
30 <version>3.6.26</version>
30 <version>3.6.27</version>
3131 </dependency>
3232 ```
3333
3434 **Gradle**:
3535
3636 ```
37 compile 'com.github.javaparser:javaparser-symbol-solver-core:3.6.26'
37 compile 'com.github.javaparser:javaparser-symbol-solver-core:3.6.27'
3838 ```
3939
4040 Since Version 3.5.10, the JavaParser project includes the JavaSymbolSolver.
4949 <dependency>
5050 <groupId>com.github.javaparser</groupId>
5151 <artifactId>javaparser-core</artifactId>
52 <version>3.6.26</version>
52 <version>3.6.27</version>
5353 </dependency>
5454 ```
5555
5656 **Gradle**:
5757
5858 ```
59 compile 'com.github.javaparser:javaparser-core:3.6.26'
59 compile 'com.github.javaparser:javaparser-core:3.6.27'
6060 ```
6161
6262 Since version 3.6.17 the AST can be serialized to JSON.
6868 <dependency>
6969 <groupId>com.github.javaparser</groupId>
7070 <artifactId>javaparser-core-serialization</artifactId>
71 <version>3.6.26</version>
71 <version>3.6.27</version>
7272 </dependency>
7373 ```
7474
7575 **Gradle**:
7676
7777 ```
78 compile 'com.github.javaparser:javaparser-core-serialization:3.6.26'
78 compile 'com.github.javaparser:javaparser-core-serialization:3.6.27'
7979 ```
8080
8181 ## How To Compile Sources