Skip to content

Commit 29a7f45

Browse files
committed
Add getControlFlowGraph() to relevant node impls
- RoutineImplementationNodeImpl - AnonymousMethodNodeImpl
1 parent 36468a3 commit 29a7f45

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

delphi-frontend/src/main/java/au/com/integradev/delphi/antlr/ast/node/AnonymousMethodNodeImpl.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,12 @@
1919
package au.com.integradev.delphi.antlr.ast.node;
2020

2121
import au.com.integradev.delphi.antlr.ast.visitors.DelphiParserVisitor;
22+
import au.com.integradev.delphi.cfg.ControlFlowGraphFactory;
23+
import au.com.integradev.delphi.cfg.api.ControlFlowGraph;
2224
import au.com.integradev.delphi.type.factory.TypeFactoryImpl;
2325
import au.com.integradev.delphi.type.parameter.FormalParameter;
26+
import com.google.common.base.Supplier;
27+
import com.google.common.base.Suppliers;
2428
import java.util.Collections;
2529
import java.util.Set;
2630
import java.util.stream.Collectors;
@@ -42,6 +46,16 @@
4246
public final class AnonymousMethodNodeImpl extends ExpressionNodeImpl
4347
implements AnonymousMethodNode {
4448
private String image;
49+
private final Supplier<ControlFlowGraph> cfgSupplier =
50+
Suppliers.memoize(
51+
() -> {
52+
CompoundStatementNode compoundStatementNode =
53+
getFirstChildOfType(CompoundStatementNode.class);
54+
if (compoundStatementNode == null) {
55+
return null;
56+
}
57+
return ControlFlowGraphFactory.create(compoundStatementNode);
58+
});
4559

4660
public AnonymousMethodNodeImpl(Token token) {
4761
super(token);
@@ -154,4 +168,9 @@ protected Type createType() {
154168
: returnTypeNode.getTypeNode().getType(),
155169
getDirectives());
156170
}
171+
172+
@Nullable
173+
public ControlFlowGraph getControlFlowGraph() {
174+
return cfgSupplier.get();
175+
}
157176
}

delphi-frontend/src/main/java/au/com/integradev/delphi/antlr/ast/node/RoutineImplementationNodeImpl.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@
1919
package au.com.integradev.delphi.antlr.ast.node;
2020

2121
import au.com.integradev.delphi.antlr.ast.visitors.DelphiParserVisitor;
22+
import au.com.integradev.delphi.cfg.ControlFlowGraphFactory;
23+
import au.com.integradev.delphi.cfg.api.ControlFlowGraph;
24+
import com.google.common.base.Supplier;
25+
import com.google.common.base.Suppliers;
2226
import java.util.function.Function;
2327
import javax.annotation.Nonnull;
2428
import javax.annotation.Nullable;
@@ -36,6 +40,19 @@
3640
public final class RoutineImplementationNodeImpl extends RoutineNodeImpl
3741
implements RoutineImplementationNode {
3842
private TypeNameDeclaration typeDeclaration;
43+
private final Supplier<ControlFlowGraph> cfgSupplier =
44+
Suppliers.memoize(
45+
() -> {
46+
RoutineBodyNode routineBody = getRoutineBody();
47+
if (routineBody == null) {
48+
return null;
49+
}
50+
CompoundStatementNode block = routineBody.getStatementBlock();
51+
if (block == null) {
52+
return null;
53+
}
54+
return ControlFlowGraphFactory.create(block);
55+
});
3956

4057
public RoutineImplementationNodeImpl(Token token) {
4158
super(token);
@@ -127,6 +144,11 @@ public NameReferenceNode getNameReferenceNode() {
127144
return getRoutineNameNode().getNameReferenceNode();
128145
}
129146

147+
@Nullable
148+
public ControlFlowGraph getControlFlowGraph() {
149+
return cfgSupplier.get();
150+
}
151+
130152
@Override
131153
public VisibilityType createVisibility() {
132154
return VisibilityType.PUBLIC;

0 commit comments

Comments
 (0)