|
15 | 15 | import com.github.javaparser.ast.type.ClassOrInterfaceType;
|
16 | 16 | import com.github.javaparser.ast.type.ReferenceType;
|
17 | 17 | import com.github.javaparser.ast.type.Type;
|
| 18 | +import com.github.javaparser.resolution.TypeSolver; |
18 | 19 | import com.github.javaparser.resolution.UnsolvedSymbolException;
|
19 | 20 | import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration;
|
20 | 21 | import com.github.javaparser.resolution.declarations.ResolvedReferenceTypeDeclaration;
|
21 | 22 | import com.github.javaparser.resolution.types.ResolvedType;
|
22 | 23 | import com.github.javaparser.symbolsolver.JavaSymbolSolver;
|
| 24 | +import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade; |
23 | 25 | import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
|
24 | 26 | import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
|
25 | 27 | import com.github.javaparser.symbolsolver.utils.SymbolSolverCollectionStrategy;
|
@@ -172,9 +174,16 @@ else if (typeDecl instanceof RecordDeclaration) {
|
172 | 174 | typeNode = new com.ibm.cldk.entities.Type();
|
173 | 175 | }
|
174 | 176 |
|
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 */ |
| 177 | + /* set common attributes of types that available in type declarations: |
| 178 | + is nested type, is class or interface declaration, is enum declaration, |
| 179 | + comments, parent class, callable declarations, field declarations |
| 180 | + */ |
| 181 | + // Discover initialization blocks |
| 182 | + typeNode.setInitializationBlocks(typeDecl.findAll(InitializerDeclaration.class).stream() |
| 183 | + .map(initializerDeclaration -> { |
| 184 | + return createInitializationBlock(initializerDeclaration, parseResult.getStorage().map(s -> s.getPath().toString()).orElse("<in-memory>")); |
| 185 | + }) |
| 186 | + .collect(Collectors.toList())); |
178 | 187 | // Set fields indicating nested, class/interface, enum, annotation, and record types
|
179 | 188 | typeNode.setNestedType(typeDecl.isNestedType());
|
180 | 189 | typeNode.setClassOrInterfaceDeclaration(typeDecl.isClassOrInterfaceDeclaration());
|
@@ -213,7 +222,38 @@ else if (typeDecl instanceof RecordDeclaration) {
|
213 | 222 | return cUnit;
|
214 | 223 | }
|
215 | 224 |
|
216 |
| - |
| 225 | + private static InitializationBlock createInitializationBlock(InitializerDeclaration initializerDeclaration, String filePath) { |
| 226 | + InitializationBlock initializationBlock = new InitializationBlock(); |
| 227 | + initializationBlock.setFilePath(filePath); |
| 228 | + initializationBlock.setComment(initializerDeclaration.getComment().isPresent() ? initializerDeclaration.getComment().get().asString() : ""); |
| 229 | + initializationBlock.setAnnotations(initializerDeclaration.getAnnotations().stream().map(a -> a.toString().strip()).collect(Collectors.toList())); |
| 230 | + // add exceptions declared in "throws" clause |
| 231 | + initializationBlock.setThrownExceptions(initializerDeclaration.getBody().getStatements().stream().filter(Statement::isThrowStmt).map(throwStmt -> { |
| 232 | + try { |
| 233 | + return javaSymbolSolver.calculateType(throwStmt.asThrowStmt().getExpression()).describe(); |
| 234 | + } catch (Exception e) { |
| 235 | + return throwStmt.asThrowStmt().getExpression().toString(); |
| 236 | + } |
| 237 | + }).collect(Collectors.toList())); |
| 238 | + initializationBlock.setCode(initializerDeclaration.getBody().toString()); |
| 239 | + initializationBlock.setStartLine(initializerDeclaration.getRange().isPresent() ? initializerDeclaration.getRange().get().begin.line : -1); |
| 240 | + initializationBlock.setEndLine(initializerDeclaration.getRange().isPresent() ? initializerDeclaration.getRange().get().end.line : -1); |
| 241 | + initializationBlock.setStatic(initializerDeclaration.isStatic()); |
| 242 | + initializationBlock.setReferencedTypes(getReferencedTypes(Optional.ofNullable(initializerDeclaration.getBody()))); |
| 243 | + initializationBlock.setAccessedFields(getAccessedFields(Optional.ofNullable(initializerDeclaration.getBody()), Collections.emptyList(), "")); |
| 244 | + initializationBlock.setCallSites(getCallSites(Optional.ofNullable(initializerDeclaration.getBody()))); |
| 245 | + initializationBlock.setVariableDeclarations(getVariableDeclarations(Optional.ofNullable(initializerDeclaration.getBody()))); |
| 246 | + initializationBlock.setCyclomaticComplexity(getCyclomaticComplexity(initializerDeclaration)); |
| 247 | + return initializationBlock; |
| 248 | + } |
| 249 | + /** |
| 250 | + * Processes the given record to extract information about the |
| 251 | + * declared field and returns a JSON object containing the extracted |
| 252 | + * information. |
| 253 | + * |
| 254 | + * @param recordDecl field declaration to be processed |
| 255 | + * @return Field object containing extracted information |
| 256 | + */ |
217 | 257 | private static List<RecordComponent> processRecordComponents(RecordDeclaration recordDecl) {
|
218 | 258 | return recordDecl.getParameters().stream().map(
|
219 | 259 | parameter -> {
|
@@ -568,6 +608,14 @@ private static int getCyclomaticComplexity(CallableDeclaration callableDeclarati
|
568 | 608 | int catchClauseCount = callableDeclaration.findAll(CatchClause.class).size();
|
569 | 609 | return ifStmtCount + loopStmtCount + switchCaseCount + conditionalExprCount + catchClauseCount + 1;
|
570 | 610 | }
|
| 611 | + private static int getCyclomaticComplexity(InitializerDeclaration initializerDeclaration) { |
| 612 | + int ifStmtCount = initializerDeclaration.findAll(IfStmt.class).size(); |
| 613 | + int loopStmtCount = initializerDeclaration.findAll(DoStmt.class).size() + initializerDeclaration.findAll(ForStmt.class).size() + initializerDeclaration.findAll(ForEachStmt.class).size() + initializerDeclaration.findAll(WhileStmt.class).size(); |
| 614 | + int switchCaseCount = initializerDeclaration.findAll(SwitchStmt.class).stream().map(stmt -> stmt.getEntries().size()).reduce(0, Integer::sum); |
| 615 | + int conditionalExprCount = initializerDeclaration.findAll(ConditionalExpr.class).size(); |
| 616 | + int catchClauseCount = initializerDeclaration.findAll(CatchClause.class).size(); |
| 617 | + return ifStmtCount + loopStmtCount + switchCaseCount + conditionalExprCount + catchClauseCount + 1; |
| 618 | + } |
571 | 619 |
|
572 | 620 | /**
|
573 | 621 | * Processes the given field declaration to extract information about the
|
|
0 commit comments