forked from JavaTX/JavaCompilerCore
TypeInsertTests angefügt
This commit is contained in:
parent
9ced1b4827
commit
1872b8aac4
@ -380,7 +380,8 @@ public class Pair
|
|||||||
*/
|
*/
|
||||||
public Vector<TypePlaceholder> getTypePlaceholder() {
|
public Vector<TypePlaceholder> getTypePlaceholder() {
|
||||||
Vector<TypePlaceholder> ret = new Vector<TypePlaceholder>();
|
Vector<TypePlaceholder> ret = new Vector<TypePlaceholder>();
|
||||||
|
if(this.TA1 instanceof TypePlaceholder)ret.add((TypePlaceholder)TA1);
|
||||||
|
if(this.TA2 instanceof TypePlaceholder)ret.add((TypePlaceholder)TA2);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@ import java.util.Vector;
|
|||||||
import typinferenz.JavaCodeResult;
|
import typinferenz.JavaCodeResult;
|
||||||
import typinferenz.ResultSet;
|
import typinferenz.ResultSet;
|
||||||
import typinferenz.TypeInsertPoint;
|
import typinferenz.TypeInsertPoint;
|
||||||
|
import typinferenz.TypeInsertSet;
|
||||||
import typinferenz.TypeInsertable;
|
import typinferenz.TypeInsertable;
|
||||||
import mycompiler.MyCompiler;
|
import mycompiler.MyCompiler;
|
||||||
import mycompiler.mytypereconstruction.replacementlistener.CReplaceTypeEvent;
|
import mycompiler.mytypereconstruction.replacementlistener.CReplaceTypeEvent;
|
||||||
@ -511,11 +512,11 @@ public class TypePlaceholder extends Type implements IReplaceTypeEventProvider
|
|||||||
return equalType.printJavaCode(resultSet);
|
return equalType.printJavaCode(resultSet);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Vector<TypeInsertPoint> getTypeInsertPoints(ResultSet result) {
|
public TypeInsertSet getTypeInsertPoints(ResultSet result) {
|
||||||
Vector<TypeInsertPoint> ret = new Vector<TypeInsertPoint>();
|
TypeInsertSet ret = new TypeInsertSet();
|
||||||
for(ITypeReplacementListener ti : this.m_ReplacementListeners){
|
for(ITypeReplacementListener ti : this.m_ReplacementListeners){
|
||||||
if(ti instanceof TypeInsertable){
|
if(ti instanceof TypeInsertable){
|
||||||
new TypeInsertPoint(this, ti, result.getTypeEqualTo(this));
|
ret.add(new TypeInsertPoint(this, (TypeInsertable)ti, result.getTypeEqualTo(this), result));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -10,6 +10,7 @@ import java.util.Vector;
|
|||||||
import typinferenz.ConstraintsSet;
|
import typinferenz.ConstraintsSet;
|
||||||
import typinferenz.ResultSet;
|
import typinferenz.ResultSet;
|
||||||
import typinferenz.TypeInsertPoint;
|
import typinferenz.TypeInsertPoint;
|
||||||
|
import typinferenz.TypeInsertSet;
|
||||||
import typinferenz.TypinferenzException;
|
import typinferenz.TypinferenzException;
|
||||||
import typinferenz.assumptions.TypeAssumptions;
|
import typinferenz.assumptions.TypeAssumptions;
|
||||||
import mycompiler.mytype.GenericTypeVar;
|
import mycompiler.mytype.GenericTypeVar;
|
||||||
@ -116,11 +117,11 @@ public class TypeinferenceResultSet
|
|||||||
* Berechnet alle möglichen Punkte zum Einsetzen eines Typs im Quelltext an der Stelle dieses TypePlaceholders
|
* Berechnet alle möglichen Punkte zum Einsetzen eines Typs im Quelltext an der Stelle dieses TypePlaceholders
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public Vector<TypeInsertPoint> getTypeInsertionPoints(){
|
public Vector<TypeInsertSet> getTypeInsertionPoints(){
|
||||||
Vector<TypeInsertPoint> ret = new Vector<TypeInsertPoint>();
|
Vector<TypeInsertSet> ret = new Vector<TypeInsertSet>();
|
||||||
for(Pair p : constraints){
|
for(Pair p : constraints){
|
||||||
for(TypePlaceholder tph : p.getTypePlaceholder()){
|
for(TypePlaceholder tph : p.getTypePlaceholder()){
|
||||||
ret.addAll(tph.getTypeInsertPoints(this.unifiedConstraints));
|
ret.add(tph.getTypeInsertPoints(this.unifiedConstraints));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1,11 +1,42 @@
|
|||||||
package typinferenz;
|
package typinferenz;
|
||||||
|
|
||||||
import mycompiler.mytype.*;
|
import mycompiler.mytype.*;
|
||||||
|
import mycompiler.mytypereconstruction.replacementlistener.ITypeReplacementListener;
|
||||||
|
|
||||||
|
|
||||||
public class TypeInsertPoint {
|
public class TypeInsertPoint {
|
||||||
|
|
||||||
public TypeInsertPoint(TypePlaceholder tph, TypeInsertable insertPoint, Type insertType){
|
private TypePlaceholder tph;
|
||||||
|
private TypeInsertable point;
|
||||||
|
private Type type;
|
||||||
|
private ResultSet resultSet;
|
||||||
|
|
||||||
|
public TypeInsertPoint(TypePlaceholder tph, TypeInsertable insertPoint, Type insertType, ResultSet resultSet){
|
||||||
|
this.tph = tph;
|
||||||
|
this.point = insertPoint;
|
||||||
|
this.type = insertType;
|
||||||
|
this.resultSet = resultSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setzt den Typ dieses TypeInsertPoint in den übergebenen Quelltext ein.
|
||||||
|
* @param fileContent - der Quelltext
|
||||||
|
* @param additionalOffset - Falls mehrere Typen in einen Quellcode eingesetzet werden muss die Verschiebung der Offsets mit einbezogen werden.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String insertType(String fileContent, int additionalOffset) {
|
||||||
|
String anfang = fileContent.substring(0, point.getOffset()+additionalOffset);
|
||||||
|
String mitte = this.getTypeInsertString();
|
||||||
|
String ende = fileContent.substring(point.getOffset()+additionalOffset);
|
||||||
|
return anfang + mitte + ende;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getInsertLength() {
|
||||||
|
return this.getTypeInsertString().length();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getTypeInsertString(){
|
||||||
|
String ret = type.printJavaCode(this.resultSet).toString()+" ";
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
41
src/typinferenz/TypeInsertSet.java
Normal file
41
src/typinferenz/TypeInsertSet.java
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
package typinferenz;
|
||||||
|
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bündelt ein Set von TypeInsertPoints, die alle zu einem TypePlaceholder gehören.
|
||||||
|
* Diese müssen gemeinsam eingesetzt werden.
|
||||||
|
* @author janulrich
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class TypeInsertSet {
|
||||||
|
|
||||||
|
Vector<TypeInsertPoint> points = new Vector<TypeInsertPoint>();
|
||||||
|
|
||||||
|
public TypeInsertSet(TypeInsertPoint p){
|
||||||
|
points.add(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
public TypeInsertSet() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void add(TypeInsertPoint typeInsertPoint) {
|
||||||
|
points.add(typeInsertPoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fügt alle Typen dieses TypeInsertSets in den übergebenen Quellcode ein
|
||||||
|
* @param fileContent
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String insertAllTypes(String fileContent) {
|
||||||
|
int additionalOffset = 0;
|
||||||
|
String ret = fileContent;
|
||||||
|
for(TypeInsertPoint p : points){
|
||||||
|
ret = p.insertType(ret, additionalOffset);
|
||||||
|
additionalOffset += p.getInsertLength();
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
56
test/plugindevelopment/TypeInsertTester.java
Normal file
56
test/plugindevelopment/TypeInsertTester.java
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
package plugindevelopment;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
import typinferenz.TypeInsertPoint;
|
||||||
|
import typinferenz.TypeInsertSet;
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
import mycompiler.MyCompiler;
|
||||||
|
import mycompiler.MyCompilerAPI;
|
||||||
|
import mycompiler.myparser.JavaParser.yyException;
|
||||||
|
import mycompiler.mytypereconstruction.TypeinferenceResultSet;
|
||||||
|
|
||||||
|
|
||||||
|
public class TypeInsertTester extends TestCase {
|
||||||
|
|
||||||
|
private static final String rootDirectory = System.getProperty("user.dir")+"/test/plugindevelopment/";
|
||||||
|
|
||||||
|
public static void test(String sourceFileToInfere, String solutionFile){
|
||||||
|
String inferedSource = "";
|
||||||
|
MyCompilerAPI compiler = MyCompiler.getAPI();
|
||||||
|
try {
|
||||||
|
compiler.parse(new File(rootDirectory + sourceFileToInfere));
|
||||||
|
Vector<TypeinferenceResultSet> results = compiler.typeReconstruction();
|
||||||
|
assertTrue("Es darf nicht mehr als eine Lösungsmöglichkeit geben", results.size()==1);
|
||||||
|
for(TypeinferenceResultSet result : results){
|
||||||
|
Vector<TypeInsertSet> points = result.getTypeInsertionPoints();
|
||||||
|
assertTrue("Es muss genau ein TypeInsertSet vorhanden sein", points.size()==1);
|
||||||
|
for(TypeInsertSet point : points){
|
||||||
|
inferedSource = point.insertAllTypes(getFileContent(rootDirectory + sourceFileToInfere));
|
||||||
|
String solutionSource = getFileContent(rootDirectory + solutionFile);
|
||||||
|
System.out.println("\nInferierter Source:\n"+inferedSource);
|
||||||
|
assertTrue("Nicht das erwartete Ergebnis", inferedSource.equals(solutionSource));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (IOException | yyException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
fail();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Source: https://stackoverflow.com/questions/326390/how-to-create-a-java-string-from-the-contents-of-a-file
|
||||||
|
private static String getFileContent(String path)throws IOException
|
||||||
|
{
|
||||||
|
byte[] encoded = Files.readAllBytes(Paths.get(path));
|
||||||
|
return StandardCharsets.UTF_8.decode(ByteBuffer.wrap(encoded)).toString();
|
||||||
|
}
|
||||||
|
}
|
4
test/plugindevelopment/VariableTypeInsertTest.jav
Normal file
4
test/plugindevelopment/VariableTypeInsertTest.jav
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
class VariableTypeInsertTest{
|
||||||
|
var = "test";
|
||||||
|
}
|
15
test/plugindevelopment/VariableTypeInsertTest.java
Normal file
15
test/plugindevelopment/VariableTypeInsertTest.java
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
package plugindevelopment;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class VariableTypeInsertTest {
|
||||||
|
|
||||||
|
private static final String TEST_FILE = "VariableTypeInsertTest.jav";
|
||||||
|
private static final String SOLUTION_FILE = "VariableTypeInsertTestSolution.jav";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void run(){
|
||||||
|
TypeInsertTester.test(this.TEST_FILE, this.SOLUTION_FILE);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
class VariableTypeInsertTest{
|
||||||
|
String var = "test";
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user