-
Notifications
You must be signed in to change notification settings - Fork 1.1k
/
JavaParserJsonSerializer.java
123 lines (111 loc) · 4.77 KB
/
JavaParserJsonSerializer.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
* Copyright (C) 2007-2010 Júlio Vilmar Gesser.
* Copyright (C) 2011, 2013-2018 The JavaParser Team.
*
* This file is part of JavaParser.
*
* JavaParser can be used either under the terms of
* a) the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* b) the terms of the Apache License
*
* You should have received a copy of both licenses in LICENCE.LGPL and
* LICENCE.APACHE. Please refer to those files for details.
*
* JavaParser is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*/
package com.github.javaparser.serialization;
import com.github.javaparser.JavaToken;
import com.github.javaparser.Range;
import com.github.javaparser.TokenRange;
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.NodeList;
import com.github.javaparser.metamodel.BaseNodeMetaModel;
import com.github.javaparser.metamodel.JavaParserMetaModel;
import com.github.javaparser.metamodel.PropertyMetaModel;
import com.github.javaparser.utils.Log;
import javax.json.stream.JsonGenerator;
import java.util.EnumSet;
import static java.util.Objects.requireNonNull;
/**
* Serializes an AST or a partial AST to JSON.
*/
public class JavaParserJsonSerializer {
public static final String SERIALIZED_CLASS_KEY = "!";
public void serialize(Node node, JsonGenerator generator) {
requireNonNull(node);
Log.info("Serializing Node to JSON.");
serialize(null, node, generator);
}
private void serialize(String nodeName, Node node, JsonGenerator generator) {
requireNonNull(node);
BaseNodeMetaModel nodeMetaModel = JavaParserMetaModel.getNodeMetaModel(node.getClass()).orElseThrow(() -> new IllegalStateException("Unknown Node: " + node.getClass()));
if (nodeName == null) {
generator.writeStartObject();
} else {
generator.writeStartObject(nodeName);
}
generator.write(SERIALIZED_CLASS_KEY, node.getClass().getName());
this.writeNonMetaProperties(node, generator);
for (PropertyMetaModel propertyMetaModel : nodeMetaModel.getAllPropertyMetaModels()) {
String name = propertyMetaModel.getName();
Object value = propertyMetaModel.getValue(node);
if (value != null) {
if (propertyMetaModel.isNodeList()) {
NodeList<Node> list = (NodeList<Node>) value;
generator.writeStartArray(name);
for (Node n : list) {
serialize(null, n, generator);
}
generator.writeEnd();
} else if (propertyMetaModel.isEnumSet()) {
EnumSet<? extends Enum> set = (EnumSet<? extends Enum>) value;
generator.writeStartArray(name);
for (Enum n : set) {
generator.write(n.name());
}
generator.writeEnd();
} else if (propertyMetaModel.isNode()) {
serialize(name, (Node) value, generator);
} else {
generator.write(name, value.toString());
}
}
}
generator.writeEnd();
}
protected void writeNonMetaProperties(Node node, JsonGenerator generator) {
this.writeRange(node, generator);
this.writeTokens(node, generator);
}
protected void writeRange(Node node, JsonGenerator generator) {
if (node.getRange().isPresent()) {
Range range = node.getRange().get();
generator.writeStartObject("range");
generator.write("beginLine", range.begin.line);
generator.write("beginColumn", range.begin.column);
generator.write("endLine", range.end.line);
generator.write("endColumn", range.end.column);
generator.writeEnd();
}
}
protected void writeTokens(Node node, JsonGenerator generator) {
if (node.getTokenRange().isPresent()) {
TokenRange tokenRange = node.getTokenRange().get();
generator.writeStartObject("tokenRange");
writeToken("beginToken", tokenRange.getBegin(), generator);
writeToken("endToken", tokenRange.getEnd(), generator);
generator.writeEnd();
}
}
protected void writeToken(String name, JavaToken token, JsonGenerator generator) {
generator.writeStartObject(name);
generator.write("kind", token.getKind());
generator.write("text", token.getText());
generator.writeEnd();
}
}