refactor: refactoring
Some checks failed
Build and Test with Maven / Build-and-test-with-Maven (push) Failing after 5m20s
Some checks failed
Build and Test with Maven / Build-and-test-with-Maven (push) Failing after 5m20s
This commit is contained in:
parent
3ac3af2327
commit
8f094eb025
@ -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;
|
||||
};
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user