Skip to content

Commit 5fed2b3

Browse files
committed
feat: emit per-variable field initializers in field declarations
1 parent 7d09491 commit 5fed2b3

4 files changed

Lines changed: 45 additions & 1 deletion

File tree

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
version=2.3.7
1+
version=2.3.8

src/main/java/com/ibm/cldk/SymbolTable.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -714,6 +714,15 @@ private static Field processFieldDeclaration(FieldDeclaration fieldDecl) {
714714
field.setVariables(
715715
fieldDecl.getVariables().stream().map(v -> v.getName().asString()).collect(Collectors.toList()));
716716

717+
// add variable initializers, keyed per variable (one declaration may flatten multiple declarators)
718+
field.setVariableInitializers(fieldDecl.getVariables().stream()
719+
.filter(v -> v.getInitializer().isPresent())
720+
.collect(Collectors.toMap(
721+
v -> v.getName().asString(),
722+
v -> v.getInitializer().get().toString(),
723+
(a, b) -> a,
724+
LinkedHashMap::new)));
725+
717726
// add field modifiers
718727
field.setModifiers(
719728
fieldDecl.getModifiers().stream().map(m -> m.toString().strip()).collect(Collectors.toList()));

src/main/java/com/ibm/cldk/entities/Field.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.ibm.cldk.entities;
22

33
import java.util.List;
4+
import java.util.Map;
45
import lombok.Data;
56

67
@Data
@@ -13,4 +14,5 @@ public class Field {
1314
private List<String> variables;
1415
private List<String> modifiers;
1516
private List<String> annotations;
17+
private Map<String, String> variableInitializers;
1618
}

src/test/java/com/ibm/cldk/SymbolTableTest.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.google.gson.JsonParser;
77
import com.ibm.cldk.entities.CallSite;
88
import com.ibm.cldk.entities.Callable;
9+
import com.ibm.cldk.entities.Field;
910
import com.ibm.cldk.entities.Import;
1011
import com.ibm.cldk.entities.JavaCompilationUnit;
1112
import com.ibm.cldk.entities.Type;
@@ -120,6 +121,38 @@ public void testExtractSingleImportMetadata() throws IOException {
120121
}
121122
}
122123

124+
@Test
125+
public void testExtractSingleFieldInitializers() throws IOException {
126+
String javaCode = String.join("\n",
127+
"class T {",
128+
" private static final String QUOTES_PATH = \"/rest/quotes\";",
129+
" private int count;",
130+
" private int first = 1, second, third = first + 2;",
131+
"}");
132+
Map<String, JavaCompilationUnit> symbolTable = SymbolTable.extractSingle(javaCode).getLeft();
133+
Assertions.assertEquals(1, symbolTable.size());
134+
List<Field> fields = symbolTable.values().iterator().next().getTypeDeclarations()
135+
.values().iterator().next().getFieldDeclarations();
136+
Assertions.assertEquals(3, fields.size());
137+
138+
Field quotesPath = fields.get(0);
139+
Assertions.assertEquals(List.of("QUOTES_PATH"), quotesPath.getVariables());
140+
Assertions.assertEquals(Map.of("QUOTES_PATH", "\"/rest/quotes\""), quotesPath.getVariableInitializers());
141+
142+
Field count = fields.get(1);
143+
Assertions.assertEquals(List.of("count"), count.getVariables());
144+
Assertions.assertTrue(count.getVariableInitializers().isEmpty());
145+
146+
Field multi = fields.get(2);
147+
Assertions.assertEquals(List.of("first", "second", "third"), multi.getVariables());
148+
Assertions.assertEquals(Map.of("first", "1", "third", "first + 2"), multi.getVariableInitializers());
149+
150+
JsonObject serializedField = JsonParser.parseString(CodeAnalyzer.gson.toJson(quotesPath)).getAsJsonObject();
151+
Assertions.assertTrue(serializedField.has("variable_initializers"));
152+
Assertions.assertEquals("\"/rest/quotes\"",
153+
serializedField.getAsJsonObject("variable_initializers").get("QUOTES_PATH").getAsString());
154+
}
155+
123156
private static void assertImport(List<Import> imports, String path, boolean isStatic, boolean isWildcard) {
124157
Import matchingImport = imports.stream()
125158
.filter(imp -> path.equals(imp.getPath())

0 commit comments

Comments
 (0)