Commit 0551948b authored by Carlos Galindo's avatar Carlos Galindo
Browse files

fixes for returned value of explicit constructor invocations

* TotalDefinition now can be connected to field declaration or total definition.
parent 2ef0b2d0
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -163,7 +163,7 @@ public class ExpressionObjectTreeFinder {
        String sourceMember = sourcePair.b;
        if (targetAction.hasObjectTree() &&
                (!sourceAction.hasObjectTree() || !sourceAction.getObjectTree().isLeaf(sourceMember)))
            ObjectTree.copyTree(sourceAction.getObjectTree(), targetAction.getObjectTree(), sourceMember, targetMember);
            ObjectTree.copyTargetTreeToSource(sourceAction.getObjectTree(), targetAction.getObjectTree(), sourceMember, targetMember);
        sourceAction.setPDGTreeConnectionTo(targetAction, sourceMember, targetMember);
    }
}
+3 −1
Original line number Diff line number Diff line
@@ -71,7 +71,9 @@ public class JSysCFG extends ESCFG {
    }

    public List<VariableAction> findLastTotalDefinitionOf(VariableAction action, String member) {
        return findLastVarActionsFrom(action, def -> def.isDefinition() && def.asDefinition().isTotallyDefinedMember(member));
        return findLastVarActionsFrom(action, def ->
                (def.isDeclaration() && def.hasTreeMember(member))
                || (def.isDefinition() && def.asDefinition().isTotallyDefinedMember(member)));
    }

    /** Given a definition of a given member, locate all definitions of the same object until a definition
+1 −1
Original line number Diff line number Diff line
@@ -87,7 +87,7 @@ public class ObjectTree implements Cloneable {
     * @param sourcePrefix The prefix to be consumed before copying nodes. Without root.
     * @param targetPrefix The prefix to be consumed before copying nodes. Without root.
     */
    public static void copyTree(ObjectTree source, ObjectTree target, String sourcePrefix, String targetPrefix) {
    public static void copyTargetTreeToSource(ObjectTree source, ObjectTree target, String sourcePrefix, String targetPrefix) {
        ObjectTree a = source.findObjectTreeOfMember(sourcePrefix);
        ObjectTree b = target.findObjectTreeOfMember(targetPrefix);
        a.addAll(b);
+11 −0
Original line number Diff line number Diff line
@@ -375,6 +375,17 @@ public class VariableVisitor extends GraphNodeContentVisitor<VariableVisitor.Act
        }
        // Regardless of whether it resolves or not, 'this' is defined
        acceptActionNullDefinition(FIELD, "this");
        // setup a connection between USE(-output-) and DEF(this)
        List<VariableAction> vaList = graphNode.getVariableActions();
        if (vaList.size() >= 5) { // call-super, DEC(this), USE(-output-), ret-super, DEF(this)
            VariableAction useOutput = vaList.get(vaList.size() - 3);
            VariableAction defThis = vaList.get(vaList.size() - 1);
            assert useOutput.isUsage() && useOutput.getName().equals(VARIABLE_NAME_OUTPUT);
            assert defThis.isDefinition() && defThis.getName().equals("this");
            defThis.asDefinition().setTotallyDefinedMember("this");
            ObjectTree.copyTargetTreeToSource(defThis.getObjectTree(), useOutput.getObjectTree(), "", "");
            useOutput.setPDGTreeConnectionTo(defThis, "", "");
        }
    }

    @Override