diff --git a/gradle.properties b/gradle.properties index 867fa98..df44ad5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -version=2.3.7 +version=2.3.8 diff --git a/src/main/java/com/ibm/cldk/SymbolTable.java b/src/main/java/com/ibm/cldk/SymbolTable.java index c7a203d..1ef9fcc 100644 --- a/src/main/java/com/ibm/cldk/SymbolTable.java +++ b/src/main/java/com/ibm/cldk/SymbolTable.java @@ -714,6 +714,15 @@ private static Field processFieldDeclaration(FieldDeclaration fieldDecl) { field.setVariables( fieldDecl.getVariables().stream().map(v -> v.getName().asString()).collect(Collectors.toList())); + // add variable initializers, keyed per variable (one declaration may flatten multiple declarators) + field.setVariableInitializers(fieldDecl.getVariables().stream() + .filter(v -> v.getInitializer().isPresent()) + .collect(Collectors.toMap( + v -> v.getName().asString(), + v -> v.getInitializer().get().toString(), + (a, b) -> a, + LinkedHashMap::new))); + // add field modifiers field.setModifiers( fieldDecl.getModifiers().stream().map(m -> m.toString().strip()).collect(Collectors.toList())); diff --git a/src/main/java/com/ibm/cldk/entities/Field.java b/src/main/java/com/ibm/cldk/entities/Field.java index e1f9f6a..6850021 100644 --- a/src/main/java/com/ibm/cldk/entities/Field.java +++ b/src/main/java/com/ibm/cldk/entities/Field.java @@ -1,6 +1,7 @@ package com.ibm.cldk.entities; import java.util.List; +import java.util.Map; import lombok.Data; @Data @@ -13,4 +14,5 @@ public class Field { private List variables; private List modifiers; private List annotations; + private Map variableInitializers; } diff --git a/src/test/java/com/ibm/cldk/SymbolTableTest.java b/src/test/java/com/ibm/cldk/SymbolTableTest.java index 2dcc669..1d2339e 100644 --- a/src/test/java/com/ibm/cldk/SymbolTableTest.java +++ b/src/test/java/com/ibm/cldk/SymbolTableTest.java @@ -6,6 +6,7 @@ import com.google.gson.JsonParser; import com.ibm.cldk.entities.CallSite; import com.ibm.cldk.entities.Callable; +import com.ibm.cldk.entities.Field; import com.ibm.cldk.entities.Import; import com.ibm.cldk.entities.JavaCompilationUnit; import com.ibm.cldk.entities.Type; @@ -120,6 +121,38 @@ public void testExtractSingleImportMetadata() throws IOException { } } + @Test + public void testExtractSingleFieldInitializers() throws IOException { + String javaCode = String.join("\n", + "class T {", + " private static final String QUOTES_PATH = \"/rest/quotes\";", + " private int count;", + " private int first = 1, second, third = first + 2;", + "}"); + Map symbolTable = SymbolTable.extractSingle(javaCode).getLeft(); + Assertions.assertEquals(1, symbolTable.size()); + List fields = symbolTable.values().iterator().next().getTypeDeclarations() + .values().iterator().next().getFieldDeclarations(); + Assertions.assertEquals(3, fields.size()); + + Field quotesPath = fields.get(0); + Assertions.assertEquals(List.of("QUOTES_PATH"), quotesPath.getVariables()); + Assertions.assertEquals(Map.of("QUOTES_PATH", "\"/rest/quotes\""), quotesPath.getVariableInitializers()); + + Field count = fields.get(1); + Assertions.assertEquals(List.of("count"), count.getVariables()); + Assertions.assertTrue(count.getVariableInitializers().isEmpty()); + + Field multi = fields.get(2); + Assertions.assertEquals(List.of("first", "second", "third"), multi.getVariables()); + Assertions.assertEquals(Map.of("first", "1", "third", "first + 2"), multi.getVariableInitializers()); + + JsonObject serializedField = JsonParser.parseString(CodeAnalyzer.gson.toJson(quotesPath)).getAsJsonObject(); + Assertions.assertTrue(serializedField.has("variable_initializers")); + Assertions.assertEquals("\"/rest/quotes\"", + serializedField.getAsJsonObject("variable_initializers").get("QUOTES_PATH").getAsString()); + } + private static void assertImport(List imports, String path, boolean isStatic, boolean isWildcard) { Import matchingImport = imports.stream() .filter(imp -> path.equals(imp.getPath())