Skip to content

Commit 51a2bbc

Browse files
authored
Merge pull request #11 from sinha108/callable-callsites-info
Added information about call sites to callable
2 parents 497e5b5 + 036fc67 commit 51a2bbc

File tree

3 files changed

+65
-0
lines changed

3 files changed

+65
-0
lines changed

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

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,7 @@ private static Pair<String, Callable> processCallableDeclaration(CallableDeclara
300300

301301
callableNode.setCalledMethodDeclaringTypes(getCalledMethodDeclaringTypes(body));
302302
callableNode.setAccessedFields(getAccessedFields(body, classFields, typeName));
303+
callableNode.setCallSites(getCallSites(body));
303304

304305
String callableSignature = (callableDecl instanceof MethodDeclaration) ? callableDecl.getSignature().asString() : callableDecl.getSignature().asString().replace(callableDecl.getSignature().getName(), "<init>");
305306
return Pair.of(callableSignature, callableNode);
@@ -425,6 +426,53 @@ private static List<String> getCalledMethodDeclaringTypes(Optional<BlockStmt> ca
425426
return new ArrayList<>(calledMethodDeclaringTypes);
426427
}
427428

429+
/**
430+
* Returns information about call sites in the given callable. The information includes:
431+
* the method name, the declaring type name, and types of arguments used in method call.
432+
*
433+
* @param callableBody callable to compute call-site information for
434+
* @return list of call sites
435+
*/
436+
private static List<CallSite> getCallSites(Optional<BlockStmt> callableBody) {
437+
List<CallSite> callSites = new ArrayList<>();
438+
if (callableBody.isEmpty()) {
439+
return callSites;
440+
}
441+
for (MethodCallExpr methodCallExpr : callableBody.get().findAll(MethodCallExpr.class)) {
442+
// resolve declaring type for called method
443+
String declaringType = "";
444+
if (methodCallExpr.getScope().isPresent()) {
445+
declaringType = resolveExpression(methodCallExpr.getScope().get());
446+
if (declaringType.contains(" | ")) {
447+
declaringType = declaringType.split(" \\| ")[0];
448+
}
449+
}
450+
451+
// resolve arguments of the method call to types
452+
List<String> arguments = methodCallExpr.getArguments().stream()
453+
.map(arg -> resolveExpression(arg)).collect(Collectors.toList());
454+
455+
// add a new call site object
456+
CallSite callSite = new CallSite();
457+
callSite.setMethodName(methodCallExpr.getNameAsString());
458+
callSite.setDeclaringType(declaringType);
459+
callSite.setArgumentTypes(arguments);
460+
if (methodCallExpr.getRange().isPresent()) {
461+
callSite.setStartLine(methodCallExpr.getRange().get().begin.line);
462+
callSite.setStartColumn(methodCallExpr.getRange().get().begin.column);
463+
callSite.setEndLine(methodCallExpr.getRange().get().end.line);
464+
callSite.setEndColumn(methodCallExpr.getRange().get().end.column);
465+
} else {
466+
callSite.setStartLine(-1);
467+
callSite.setStartColumn(-1);
468+
callSite.setEndLine(-1);
469+
callSite.setEndColumn(-1);
470+
}
471+
callSites.add(callSite);
472+
}
473+
return callSites;
474+
}
475+
428476
/**
429477
* Calculates type for the given expression and returns the resolved type name, or empty string if
430478
* exception occurs during type resolution.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.ibm.northstar.entities;
2+
3+
import lombok.Data;
4+
5+
import java.util.List;
6+
7+
@Data
8+
public class CallSite {
9+
private String methodName;
10+
private String declaringType;
11+
private List<String> argumentTypes;
12+
private int startLine;
13+
private int startColumn;
14+
private int endLine;
15+
private int endColumn;
16+
}

src/main/java/com/ibm/northstar/entities/Callable.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,5 @@ public class Callable {
2222
private List<String> referencedTypes;
2323
private List<String> accessedFields;
2424
private List<String> calledMethodDeclaringTypes;
25+
private List<CallSite> callSites;
2526
}

0 commit comments

Comments
 (0)