refactor: refactoring
Some checks failed
Build and Test with Maven / Build-and-test-with-Maven (push) Failing after 5m20s

This commit is contained in:
Ruben 2024-09-04 10:42:11 +02:00
parent 3ac3af2327
commit 8f094eb025
3 changed files with 28 additions and 43 deletions

View File

@ -1,19 +1,20 @@
import java.lang.Object;
import java.lang.String;
import java.lang.Integer;
sealed interface List permits LinkedElem, Elem {}
sealed interface List permits LinkedElem {}
public record LinkedElem<T>(T a,List l) implements List{}
public record Elem<T>(T c) implements List{}
public record LinkedElem<T>(T a,List l) implements List{} //Implementiert List und wird auch permittet
public record Elem<T>(T c) implements List{} //Implementiert List, wird aber nicht permittet
public class SwitchCaseHeritageDetection {
//Wie gehe ich mit Type Erasure durch den Compiler um? Elemente werden wegen Generics immer zu Object umgewandelt, default Case muss also auch vom Type Object sein.
//Dadurch entsteht folgendes Constraint: java.lang.Integer <. T, das nicht aufgelöst werden kann.
public class GenericRecordSwitchCase {
public main(o) {
return switch(o) {
case LinkedElem(a, Elem(e)) -> a ;
case LinkedElem(a, LinkedElem(e, Elem(f))) -> e;
case LinkedElem(a, LinkedElem(e, Elem(f))) -> a;
default -> null;
};
}

View File

@ -1,12 +1,9 @@
//PL 2018-12-19: Merge chekcen
package de.dhbwstuttgart.typeinference.typeAlgo;
import java.lang.Record;
import java.sql.Ref;
import java.util.*;
import java.util.stream.Collectors;
import de.dhbwstuttgart.core.JavaTXCompiler;
import de.dhbwstuttgart.exceptions.NotImplementedException;
import de.dhbwstuttgart.exceptions.TypeinferenceException;
import de.dhbwstuttgart.parser.NullToken;
@ -835,6 +832,8 @@ public class TYPEStmt implements StatementVisitor {
}
}
}
if (caseExpressionType == null) {
for (var child : switchStmt.getBlocks()) {
for (var label : child.getLabels()) {
@ -843,7 +842,6 @@ public class TYPEStmt implements StatementVisitor {
}
if (label.getPattern() instanceof RecordPattern) {
RecordPattern recordPattern = (RecordPattern) label.getPattern();
//constraintsSet.addUndConstraint(new Pair(label.getPattern().getType(), switchStmt.getSwitch().getType(), PairOperator.SMALLERDOT, loc(label.getOffset())));
} else if (label.getPattern() instanceof FormalParameter) {
constraintsSet.addUndConstraint(new Pair(label.getPattern().getType(), switchStmt.getSwitch().getType(), PairOperator.SMALLERDOT, loc(label.getOffset())));
@ -853,7 +851,6 @@ public class TYPEStmt implements StatementVisitor {
} else {
constraintsSet.addUndConstraint(new Pair(caseExpressionType, switchStmt.getSwitch().getType(), PairOperator.EQUALSDOT, loc(switchStmt.getSwitch().getOffset())));
}
for (var child : switchStmt.getBlocks()) {
@ -863,48 +860,36 @@ public class TYPEStmt implements StatementVisitor {
if (el.getPattern() instanceof RecordPattern) {
var pattern = (RecordPattern) recType.getPattern();
recursiveAddRecordConstraints(pattern);
recursivelyAddRecordConstraints(pattern);
}
}
});
child.accept(this);
constraintsSet.addUndConstraint(new Pair(child.getType(), switchStmt.getType(), PairOperator.SMALLERDOT, loc(switchStmt.getOffset())));
child.accept(this);
}
switchStack.pop();
}
public void recursiveAddRecordConstraints(RecordPattern el) {
var pattern = el;
public void recursivelyAddRecordConstraints(RecordPattern pattern) {
var allClasses = info.getAvailableClasses();
var interestingClasses = allClasses.stream().filter(as -> as.getClassName().equals(((RefType) el.getType()).getName())).toList();
var test = "";
var interestingClasses = allClasses.stream().filter(as -> as.getClassName().equals(((RefType) pattern.getType()).getName())).toList();
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())));
int counter = 0;
}
}
for (var subPattern : pattern.getSubPattern()) {
for (Constructor con : constructors) {
System.out.println("----------------------\n" + subPattern.getType()+ " | " + con.getParameterList().getParameterAt(counter).getType() + "\n----------------------\n");
constraintsSet.addUndConstraint(new Pair(subPattern.getType(), con.getParameterList().getParameterAt(counter).getType(), PairOperator.SMALLERDOT, loc(con.getParameterList().getParameterAt(counter).getOffset())));
}
if (subPattern instanceof RecordPattern) recursivelyAddRecordConstraints((RecordPattern) subPattern);
counter++;
}
}
@ -917,7 +902,6 @@ public class TYPEStmt implements StatementVisitor {
@Override
public void visit(SwitchLabel switchLabel) {
System.out.println("I MOCH WAS");
}
@Override

View File

@ -779,7 +779,7 @@ public class TestComplete {
public void testGenericRecordSwitchCase() throws Exception {
var classFiles = generateClassFiles(new ByteArrayClassLoader(), "GenericRecordSwitchCase.jav");
var clazz = classFiles.get("SwitchCaseHeritageDetection");
var clazz = classFiles.get("GenericRecordSwitchCase");
var instance = clazz.getDeclaredConstructor().newInstance();
var swtch = clazz.getDeclaredMethod("main", Object.class);
@ -789,16 +789,16 @@ public class TestComplete {
var elem = classFiles.get("Elem");
var constructorLinkedElem = linkedElem.getDeclaredConstructor(Object.class, listInterface);
var constructorLinkedElem = linkedElem.getConstructor(Object.class, listInterface);
var constructorElem = elem.getConstructor(Object.class);
var listWithMoreThanOneElement = constructorLinkedElem.newInstance(5, constructorLinkedElem.newInstance(1, constructorElem.newInstance(5)));
assertEquals(swtch.invoke(instance, listWithMoreThanOneElement), 1);
assertEquals(swtch.invoke(instance, listWithMoreThanOneElement), 2);
var listWithOneElement = constructorLinkedElem.newInstance(5, constructorElem.newInstance(5));
assertEquals(swtch.invoke(instance, listWithOneElement), 5);
assertEquals(swtch.invoke(instance, listWithOneElement), 1);
}