|
33 | 33 | import com.ibm.cldk.entities.*;
|
34 | 34 | import com.ibm.cldk.utils.Log;
|
35 | 35 | import org.apache.commons.lang3.tuple.Pair;
|
36 |
| -import org.checkerframework.checker.units.qual.C; |
37 | 36 |
|
38 | 37 | import java.io.IOException;
|
39 | 38 | import java.nio.file.Path;
|
@@ -172,9 +171,16 @@ else if (typeDecl instanceof RecordDeclaration) {
|
172 | 171 | typeNode = new com.ibm.cldk.entities.Type();
|
173 | 172 | }
|
174 | 173 |
|
175 |
| - /* set common attributes of types that available in type declarations: |
176 |
| - is nested type, is class or interface declaration, is enum declaration, |
177 |
| - comments, parent class, callable declarations, field declarations */ |
| 174 | + /* set common attributes of types that available in type declarations: |
| 175 | + is nested type, is class or interface declaration, is enum declaration, |
| 176 | + comments, parent class, callable declarations, field declarations |
| 177 | + */ |
| 178 | + // Discover initialization blocks |
| 179 | + typeNode.setInitializationBlocks(typeDecl.findAll(InitializerDeclaration.class).stream() |
| 180 | + .map(initializerDeclaration -> { |
| 181 | + return createInitializationBlock(initializerDeclaration, parseResult.getStorage().map(s -> s.getPath().toString()).orElse("<in-memory>")); |
| 182 | + }) |
| 183 | + .collect(Collectors.toList())); |
178 | 184 | // Set fields indicating nested, class/interface, enum, annotation, and record types
|
179 | 185 | typeNode.setNestedType(typeDecl.isNestedType());
|
180 | 186 | typeNode.setClassOrInterfaceDeclaration(typeDecl.isClassOrInterfaceDeclaration());
|
@@ -213,7 +219,38 @@ else if (typeDecl instanceof RecordDeclaration) {
|
213 | 219 | return cUnit;
|
214 | 220 | }
|
215 | 221 |
|
216 |
| - |
| 222 | + private static InitializationBlock createInitializationBlock(InitializerDeclaration initializerDeclaration, String filePath) { |
| 223 | + InitializationBlock initializationBlock = new InitializationBlock(); |
| 224 | + initializationBlock.setFilePath(filePath); |
| 225 | + initializationBlock.setComment(initializerDeclaration.getComment().isPresent() ? initializerDeclaration.getComment().get().asString() : ""); |
| 226 | + initializationBlock.setAnnotations(initializerDeclaration.getAnnotations().stream().map(a -> a.toString().strip()).collect(Collectors.toList())); |
| 227 | + // add exceptions declared in "throws" clause |
| 228 | + initializationBlock.setThrownExceptions(initializerDeclaration.getBody().getStatements().stream().filter(Statement::isThrowStmt).map(throwStmt -> { |
| 229 | + try { |
| 230 | + return javaSymbolSolver.calculateType(throwStmt.asThrowStmt().getExpression()).describe(); |
| 231 | + } catch (Exception e) { |
| 232 | + return throwStmt.asThrowStmt().getExpression().toString(); |
| 233 | + } |
| 234 | + }).collect(Collectors.toList())); |
| 235 | + initializationBlock.setCode(initializerDeclaration.getBody().toString()); |
| 236 | + initializationBlock.setStartLine(initializerDeclaration.getRange().isPresent() ? initializerDeclaration.getRange().get().begin.line : -1); |
| 237 | + initializationBlock.setEndLine(initializerDeclaration.getRange().isPresent() ? initializerDeclaration.getRange().get().end.line : -1); |
| 238 | + initializationBlock.setStatic(initializerDeclaration.isStatic()); |
| 239 | + initializationBlock.setReferencedTypes(getReferencedTypes(Optional.ofNullable(initializerDeclaration.getBody()))); |
| 240 | + initializationBlock.setAccessedFields(getAccessedFields(Optional.ofNullable(initializerDeclaration.getBody()), Collections.emptyList(), "")); |
| 241 | + initializationBlock.setCallSites(getCallSites(Optional.ofNullable(initializerDeclaration.getBody()))); |
| 242 | + initializationBlock.setVariableDeclarations(getVariableDeclarations(Optional.ofNullable(initializerDeclaration.getBody()))); |
| 243 | + initializationBlock.setCyclomaticComplexity(getCyclomaticComplexity(initializerDeclaration)); |
| 244 | + return initializationBlock; |
| 245 | + } |
| 246 | + /** |
| 247 | + * Processes the given record to extract information about the |
| 248 | + * declared field and returns a JSON object containing the extracted |
| 249 | + * information. |
| 250 | + * |
| 251 | + * @param recordDecl field declaration to be processed |
| 252 | + * @return Field object containing extracted information |
| 253 | + */ |
217 | 254 | private static List<RecordComponent> processRecordComponents(RecordDeclaration recordDecl) {
|
218 | 255 | return recordDecl.getParameters().stream().map(
|
219 | 256 | parameter -> {
|
@@ -568,6 +605,14 @@ private static int getCyclomaticComplexity(CallableDeclaration callableDeclarati
|
568 | 605 | int catchClauseCount = callableDeclaration.findAll(CatchClause.class).size();
|
569 | 606 | return ifStmtCount + loopStmtCount + switchCaseCount + conditionalExprCount + catchClauseCount + 1;
|
570 | 607 | }
|
| 608 | + private static int getCyclomaticComplexity(InitializerDeclaration initializerDeclaration) { |
| 609 | + int ifStmtCount = initializerDeclaration.findAll(IfStmt.class).size(); |
| 610 | + int loopStmtCount = initializerDeclaration.findAll(DoStmt.class).size() + initializerDeclaration.findAll(ForStmt.class).size() + initializerDeclaration.findAll(ForEachStmt.class).size() + initializerDeclaration.findAll(WhileStmt.class).size(); |
| 611 | + int switchCaseCount = initializerDeclaration.findAll(SwitchStmt.class).stream().map(stmt -> stmt.getEntries().size()).reduce(0, Integer::sum); |
| 612 | + int conditionalExprCount = initializerDeclaration.findAll(ConditionalExpr.class).size(); |
| 613 | + int catchClauseCount = initializerDeclaration.findAll(CatchClause.class).size(); |
| 614 | + return ifStmtCount + loopStmtCount + switchCaseCount + conditionalExprCount + catchClauseCount + 1; |
| 615 | + } |
571 | 616 |
|
572 | 617 | /**
|
573 | 618 | * Processes the given field declaration to extract information about the
|
|
0 commit comments