From fcaadd63c87a22b95fdca47c90b082db4af76bb9 Mon Sep 17 00:00:00 2001 From: Saurabh Sinha Date: Fri, 30 May 2025 20:36:22 -0400 Subject: [PATCH 1/2] Updated callable and initializer code to be stored in lexical-preserving manner (so blank lines are not discarded); added codeStartLine attribute to callables Signed-off-by: Saurabh Sinha --- src/main/java/com/ibm/cldk/SymbolTable.java | 41 ++++--------------- .../java/com/ibm/cldk/entities/Callable.java | 3 ++ 2 files changed, 11 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/ibm/cldk/SymbolTable.java b/src/main/java/com/ibm/cldk/SymbolTable.java index d5b5bc84..168aced1 100644 --- a/src/main/java/com/ibm/cldk/SymbolTable.java +++ b/src/main/java/com/ibm/cldk/SymbolTable.java @@ -16,38 +16,23 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; +import com.github.javaparser.*; +import com.github.javaparser.ast.*; import com.github.javaparser.ast.body.*; import com.github.javaparser.ast.comments.Comment; import com.github.javaparser.ast.comments.JavadocComment; +import com.github.javaparser.ast.expr.*; import com.github.javaparser.ast.nodeTypes.NodeWithJavadoc; import com.github.javaparser.ast.stmt.*; +import com.github.javaparser.printer.lexicalpreservation.LexicalPreservingPrinter; +import com.ibm.cldk.entities.*; import com.ibm.cldk.javaee.EntrypointsFinderFactory; import org.apache.commons.lang3.tuple.Pair; -import com.github.javaparser.JavaParser; -import com.github.javaparser.ParseResult; -import com.github.javaparser.ParserConfiguration; -import com.github.javaparser.Problem; -import com.github.javaparser.ast.AccessSpecifier; -import com.github.javaparser.ast.CompilationUnit; -import com.github.javaparser.ast.Node; -import com.github.javaparser.ast.NodeList; -import com.github.javaparser.ast.expr.AnnotationExpr; -import com.github.javaparser.ast.expr.AssignExpr; -import com.github.javaparser.ast.expr.CastExpr; -import com.github.javaparser.ast.expr.ConditionalExpr; -import com.github.javaparser.ast.expr.Expression; -import com.github.javaparser.ast.expr.FieldAccessExpr; -import com.github.javaparser.ast.expr.MethodCallExpr; -import com.github.javaparser.ast.expr.NameExpr; -import com.github.javaparser.ast.expr.ObjectCreationExpr; import com.github.javaparser.ast.nodeTypes.NodeWithName; -import com.github.javaparser.ast.type.ClassOrInterfaceType; import com.github.javaparser.ast.type.ReferenceType; import com.github.javaparser.ast.type.Type; -import com.github.javaparser.resolution.UnsolvedSymbolException; import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration; -import com.github.javaparser.resolution.declarations.ResolvedReferenceTypeDeclaration; import com.github.javaparser.resolution.types.ResolvedType; import com.github.javaparser.symbolsolver.JavaSymbolSolver; import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver; @@ -57,17 +42,6 @@ import com.github.javaparser.utils.SourceRoot; import com.google.common.collect.Table; import com.google.common.collect.Tables; -import com.ibm.cldk.entities.CRUDOperation; -import com.ibm.cldk.entities.CRUDQuery; -import com.ibm.cldk.entities.CallSite; -import com.ibm.cldk.entities.Callable; -import com.ibm.cldk.entities.EnumConstant; -import com.ibm.cldk.entities.Field; -import com.ibm.cldk.entities.InitializationBlock; -import com.ibm.cldk.entities.JavaCompilationUnit; -import com.ibm.cldk.entities.ParameterInCallable; -import com.ibm.cldk.entities.RecordComponent; -import com.ibm.cldk.entities.VariableDeclaration; import com.ibm.cldk.javaee.CRUDFinderFactory; import com.ibm.cldk.javaee.utils.enums.CRUDOperationType; import com.ibm.cldk.javaee.utils.enums.CRUDQueryType; @@ -365,7 +339,7 @@ private static InitializationBlock createInitializationBlock(InitializerDeclarat return throwStmt.asThrowStmt().getExpression().toString(); } }).collect(Collectors.toList())); - initializationBlock.setCode(initializerDeclaration.getBody().toString()); + initializationBlock.setCode(LexicalPreservingPrinter.setup(initializerDeclaration.getBody()).toString()); initializationBlock.setStartLine( initializerDeclaration.getRange().isPresent() ? initializerDeclaration.getRange().get().begin.line : -1); @@ -589,7 +563,8 @@ private static Pair processCallableDeclaration(CallableDeclara callableNode.setStartLine(callableDecl.getRange().isPresent() ? callableDecl.getRange().get().begin.line : -1); callableNode.setEndLine(callableDecl.getRange().isPresent() ? callableDecl.getRange().get().end.line : -1); callableNode.setReferencedTypes(getReferencedTypes(body)); - callableNode.setCode(body.isPresent() ? body.get().toString() : ""); + callableNode.setCode(body.isPresent() ? LexicalPreservingPrinter.setup(body.get()).toString() : ""); + callableNode.setCodeStartLine(body.isPresent()? body.get().getBegin().get().line : -1); callableNode.setAccessedFields(getAccessedFields(body, classFields, typeName)); callableNode.setCallSites(getCallSites(body)); diff --git a/src/main/java/com/ibm/cldk/entities/Callable.java b/src/main/java/com/ibm/cldk/entities/Callable.java index 04d91ee2..cb4927ca 100644 --- a/src/main/java/com/ibm/cldk/entities/Callable.java +++ b/src/main/java/com/ibm/cldk/entities/Callable.java @@ -70,6 +70,9 @@ public class Callable { /** The ending line number of the callable entity in the source file. */ private int endLine; + /** The starting line number of the callable code in the source file. */ + private int codeStartLine; + /** The return type of the callable entity. */ private String returnType = null; From 980d587da5b829b40b7eca0405ecaf2c6d3d6725 Mon Sep 17 00:00:00 2001 From: Saurabh Sinha Date: Sun, 1 Jun 2025 23:33:17 +0530 Subject: [PATCH 2/2] Fix for lexical preserving printing of code Signed-off-by: Saurabh Sinha --- src/main/java/com/ibm/cldk/SymbolTable.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/ibm/cldk/SymbolTable.java b/src/main/java/com/ibm/cldk/SymbolTable.java index 168aced1..6fbd042a 100644 --- a/src/main/java/com/ibm/cldk/SymbolTable.java +++ b/src/main/java/com/ibm/cldk/SymbolTable.java @@ -339,7 +339,7 @@ private static InitializationBlock createInitializationBlock(InitializerDeclarat return throwStmt.asThrowStmt().getExpression().toString(); } }).collect(Collectors.toList())); - initializationBlock.setCode(LexicalPreservingPrinter.setup(initializerDeclaration.getBody()).toString()); + initializationBlock.setCode(LexicalPreservingPrinter.print(initializerDeclaration.getBody())); initializationBlock.setStartLine( initializerDeclaration.getRange().isPresent() ? initializerDeclaration.getRange().get().begin.line : -1); @@ -563,7 +563,7 @@ private static Pair processCallableDeclaration(CallableDeclara callableNode.setStartLine(callableDecl.getRange().isPresent() ? callableDecl.getRange().get().begin.line : -1); callableNode.setEndLine(callableDecl.getRange().isPresent() ? callableDecl.getRange().get().end.line : -1); callableNode.setReferencedTypes(getReferencedTypes(body)); - callableNode.setCode(body.isPresent() ? LexicalPreservingPrinter.setup(body.get()).toString() : ""); + callableNode.setCode(body.isPresent() ? LexicalPreservingPrinter.print(body.get()) : ""); callableNode.setCodeStartLine(body.isPresent()? body.get().getBegin().get().line : -1); callableNode.setAccessedFields(getAccessedFields(body, classFields, typeName)); @@ -1090,7 +1090,7 @@ public static Pair, Map>> for (SourceRoot sourceRoot : projectRoot.getSourceRoots()) { for (ParseResult parseResult : sourceRoot.tryToParse()) { if (parseResult.isSuccessful()) { - CompilationUnit compilationUnit = parseResult.getResult().get(); + CompilationUnit compilationUnit = LexicalPreservingPrinter.setup(parseResult.getResult().get()); symbolTable.put(compilationUnit.getStorage().get().getPath().toString(), processCompilationUnit(compilationUnit)); } else { @@ -1116,7 +1116,7 @@ public static Pair, Map>> JavaParser javaParser = new JavaParser(parserConfiguration); ParseResult parseResult = javaParser.parse(code); if (parseResult.isSuccessful()) { - CompilationUnit compilationUnit = parseResult.getResult().get(); + CompilationUnit compilationUnit = LexicalPreservingPrinter.setup(parseResult.getResult().get()); Log.debug("Successfully parsed code. Now processing compilation unit"); symbolTable.put("", processCompilationUnit(compilationUnit)); } else { @@ -1158,7 +1158,7 @@ public static Pair, Map>> for (Path javaFilePath : javaFilePaths) { ParseResult parseResult = javaParser.parse(javaFilePath); if (parseResult.isSuccessful()) { - CompilationUnit compilationUnit = parseResult.getResult().get(); + CompilationUnit compilationUnit = LexicalPreservingPrinter.setup(parseResult.getResult().get()); System.out.println("Successfully parsed file: " + javaFilePath.toString()); symbolTable.put(compilationUnit.getStorage().get().getPath().toString(), processCompilationUnit(compilationUnit));