test & feat: recursive Method-Call for nested Constraint-Generation Patterns in Records and added Linked-List Testcase.
All checks were successful
Build and Test with Maven / Build-and-test-with-Maven (push) Successful in 6m7s

This commit is contained in:
Ruben 2024-08-20 19:52:55 +02:00
parent 3be557a32b
commit 94c359f7a1
4 changed files with 88 additions and 24 deletions

View File

@ -3,7 +3,7 @@ import java.lang.Object;
import java.lang.Float; import java.lang.Float;
import java.lang.String; import java.lang.String;
public record Rec(Object a, Object b) {} public record Rec(Object a, Object b) {}

View File

@ -0,0 +1,27 @@
import java.lang.Integer;
import java.lang.Object;
import java.lang.Float;
import java.lang.String;
sealed interface List permits LinkedElem {}
public record LinkedElem(Integer a,List l) implements List{} //Implementiert List und wird auch permittet
public record Elem(Integer c) implements List{} //Implementiert List, wird aber nicht permittet
public class SwitchCaseHeritageDetection {
public main(o) {
return switch(o) {
case LinkedElem(a, Elem(e)) -> a + e;
case LinkedElem(a, LinkedElem(e, Elem(f))) -> a + e + f;
default -> 0;
};
}
}

View File

@ -863,26 +863,7 @@ public class TYPEStmt implements StatementVisitor {
if (el.getPattern() instanceof RecordPattern) { if (el.getPattern() instanceof RecordPattern) {
var pattern = (RecordPattern) recType.getPattern(); var pattern = (RecordPattern) recType.getPattern();
recursiveAddRecordConstraints(pattern);
var allClasses = info.getAvailableClasses();
var interestingClasses = allClasses.stream().filter(as -> as.getClassName().equals(((RefType) el.getType()).getName())).toList();
var test = "";
var constructors = interestingClasses.get(0).getConstructors();
for (int i = 0; i < pattern.getSubPattern().size(); i++) {
var supPattern = pattern.getSubPattern().get(i);
for (int j = 0; j < interestingClasses.size(); j++) {
var clazz = interestingClasses.get(j);
for (int k = 0; k < clazz.getConstructors().size(); k++) {
var constructor = clazz.getConstructors().get(k);
constraintsSet.addUndConstraint(new Pair(supPattern.getType(), constructor.getParameterList().getParameterAt(i).getType(), PairOperator.SMALLERDOT, loc(constructor.getParameterList().getParameterAt(i).getOffset())));
}
}
}
} }
@ -896,6 +877,37 @@ public class TYPEStmt implements StatementVisitor {
switchStack.pop(); switchStack.pop();
} }
public void recursiveAddRecordConstraints(RecordPattern el) {
var pattern = el;
var allClasses = info.getAvailableClasses();
var interestingClasses = allClasses.stream().filter(as -> as.getClassName().equals(((RefType) el.getType()).getName())).toList();
var test = "";
var constructors = interestingClasses.get(0).getConstructors();
for (int i = 0; i < pattern.getSubPattern().size(); i++) {
var supPattern = pattern.getSubPattern().get(i);
if (supPattern instanceof RecordPattern) {
recursiveAddRecordConstraints((RecordPattern) supPattern);
} else {
for (int j = 0; j < interestingClasses.size(); j++) {
var clazz = interestingClasses.get(j);
for (int k = 0; k < clazz.getConstructors().size(); k++) {
var constructor = clazz.getConstructors().get(k);
constraintsSet.addUndConstraint(new Pair(supPattern.getType(), constructor.getParameterList().getParameterAt(i).getType(), PairOperator.SMALLERDOT, loc(constructor.getParameterList().getParameterAt(i).getOffset())));
}
}
}
}
}
@Override @Override
public void visit(SwitchBlock switchBlock) { public void visit(SwitchBlock switchBlock) {
for (var stmt : switchBlock.statements) { for (var stmt : switchBlock.statements) {

View File

@ -680,7 +680,6 @@ public class TestComplete {
assertEquals(swtch.invoke(instance, "Some string"), 0); assertEquals(swtch.invoke(instance, "Some string"), 0);
} }
@Ignore("Not implemented")
@Test @Test
public void testSwitchInfered() throws Exception { public void testSwitchInfered() throws Exception {
var classFiles = generateClassFiles(new ByteArrayClassLoader(), "SwitchInfered.jav"); var classFiles = generateClassFiles(new ByteArrayClassLoader(), "SwitchInfered.jav");
@ -697,9 +696,9 @@ public class TestComplete {
assertEquals(swtch.invoke(instance, r1), "asd"); assertEquals(swtch.invoke(instance, r1), "asd");
} }
@Ignore("Not implemented")
@Test @Test
public void testRecordList() throws Exception { public void testSwitchCaseHeritageDetection() throws Exception {
var classFiles = generateClassFiles(new ByteArrayClassLoader(), "SwitchCaseHeritageDetection.jav"); var classFiles = generateClassFiles(new ByteArrayClassLoader(), "SwitchCaseHeritageDetection.jav");
var clazz = classFiles.get("SwitchCaseHeritageDetection"); var clazz = classFiles.get("SwitchCaseHeritageDetection");
var clazzAbst = classFiles.get("NumberOrText"); var clazzAbst = classFiles.get("NumberOrText");
@ -720,6 +719,32 @@ public class TestComplete {
assertEquals(swtch.invoke(instance, r1), "Second Element is a Text"); assertEquals(swtch.invoke(instance, r1), "Second Element is a Text");
assertEquals(swtch.invoke(instance, r2), "Second Element is a Number"); assertEquals(swtch.invoke(instance, r2), "Second Element is a Number");
} }
@Ignore("Not implemented")
@Test
public void testSwitchListRecord() throws Exception {
var classFiles = generateClassFiles(new ByteArrayClassLoader(), "SwitchRecordList.jav");
var clazz = classFiles.get("SwitchCaseHeritageDetection");
var instance = clazz.getDeclaredConstructor().newInstance();
var swtch = clazz.getDeclaredMethod("main", Object.class);
var linkedElem = classFiles.get("LinkedElem");
var listInterface = classFiles.get("List");
var elem = classFiles.get("Elem");
var constructorLinkedElem = linkedElem.getDeclaredConstructor(Integer.class, listInterface);
var constructorElem = elem.getConstructor(Integer.class);
var listWithMoreThanOneElement = constructorLinkedElem.newInstance(5, constructorLinkedElem.newInstance(1, constructorElem.newInstance(5)));
assertEquals(swtch.invoke(instance, listWithMoreThanOneElement), 11);
var listWithOneElement = constructorLinkedElem.newInstance(5, constructorElem.newInstance(5));
assertEquals(swtch.invoke(instance, listWithOneElement), 10);
}
@Ignore("Not implemented") @Ignore("Not implemented")
@Test @Test