Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e1007cce30 | |||
| 4cfc070289 | |||
| 2920dfe68f | |||
| acce38e8b1 | |||
| dbd7f4fcfe | |||
| 9114642370 | |||
| 8ac0f96bd6 | |||
| c9d38728af | |||
| b7fad6e3c7 | |||
| 3cb9b74df1 |
@@ -73,8 +73,8 @@ http://maven.apache.org/maven-v4_0_0.xsd">
|
|||||||
<version>3.14.0</version>
|
<version>3.14.0</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<compilerArgs>--enable-preview</compilerArgs>
|
<compilerArgs>--enable-preview</compilerArgs>
|
||||||
<source>23</source>
|
<source>24</source>
|
||||||
<target>23</target>
|
<target>24</target>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import java.lang.Integer;
|
|||||||
import java.lang.Boolean;
|
import java.lang.Boolean;
|
||||||
|
|
||||||
public class MatrixOP extends Vector<Vector<Integer>> {
|
public class MatrixOP extends Vector<Vector<Integer>> {
|
||||||
|
|
||||||
MatrixOP () {
|
MatrixOP () {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,8 +36,8 @@ public class MatrixOP extends Vector<Vector<Integer>> {
|
|||||||
v2.addElement(erg);
|
v2.addElement(erg);
|
||||||
j++; }
|
j++; }
|
||||||
ret.addElement(v2);
|
ret.addElement(v2);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -132,6 +132,7 @@ public class Codegen {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void boxPrimitive(State state, TargetType type) {
|
private void boxPrimitive(State state, TargetType type) {
|
||||||
|
if (type instanceof TargetExtendsWildcard ew) type = ew.innerType();
|
||||||
var mv = state.mv;
|
var mv = state.mv;
|
||||||
if (type.equals(TargetType.Boolean) || type.equals(TargetType.boolean_)) {
|
if (type.equals(TargetType.Boolean) || type.equals(TargetType.boolean_)) {
|
||||||
mv.visitMethodInsn(INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;", false);
|
mv.visitMethodInsn(INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;", false);
|
||||||
@@ -153,6 +154,7 @@ public class Codegen {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void unboxPrimitive(State state, TargetType type) {
|
private void unboxPrimitive(State state, TargetType type) {
|
||||||
|
if (type instanceof TargetExtendsWildcard ew) type = ew.innerType();
|
||||||
var mv = state.mv;
|
var mv = state.mv;
|
||||||
if (type.equals(TargetType.Boolean)) {
|
if (type.equals(TargetType.Boolean)) {
|
||||||
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Boolean", "booleanValue", "()Z", false);
|
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Boolean", "booleanValue", "()Z", false);
|
||||||
@@ -228,6 +230,9 @@ public class Codegen {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void convertTo(State state, TargetType source, TargetType dest) {
|
private void convertTo(State state, TargetType source, TargetType dest) {
|
||||||
|
if (source instanceof TargetExtendsWildcard ew) source = ew.innerType();
|
||||||
|
if (dest instanceof TargetExtendsWildcard ew) dest = ew.innerType();
|
||||||
|
|
||||||
var mv = state.mv;
|
var mv = state.mv;
|
||||||
if (source.equals(dest))
|
if (source.equals(dest))
|
||||||
return;
|
return;
|
||||||
@@ -640,7 +645,7 @@ public class Codegen {
|
|||||||
} else if (op.expr() instanceof TargetFieldVar fieldVar) {
|
} else if (op.expr() instanceof TargetFieldVar fieldVar) {
|
||||||
generate(state, fieldVar.left());
|
generate(state, fieldVar.left());
|
||||||
mv.visitInsn(SWAP);
|
mv.visitInsn(SWAP);
|
||||||
mv.visitFieldInsn(PUTFIELD, fieldVar.owner().getInternalName(), fieldVar.right(), fieldVar.type().toSignature());
|
mv.visitFieldInsn(PUTFIELD, fieldVar.owner().getInternalName(), fieldVar.right(), fieldVar.type().toDescriptor());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -803,7 +808,7 @@ public class Codegen {
|
|||||||
var handle = new Handle(state.isStatic ? H_INVOKESTATIC : H_INVOKEVIRTUAL, clazz.getName(), impl.name(), implSignature.getDescriptor(), false);
|
var handle = new Handle(state.isStatic ? H_INVOKESTATIC : H_INVOKEVIRTUAL, clazz.getName(), impl.name(), implSignature.getDescriptor(), false);
|
||||||
|
|
||||||
var params = new ArrayList<TargetType>();
|
var params = new ArrayList<TargetType>();
|
||||||
if(!state.isStatic) params.add(new TargetRefType(clazz.qualifiedName().getClassName()));
|
if(!state.isStatic) params.add(new TargetRefType(clazz.qualifiedName().toString()));
|
||||||
params.addAll(lambda.captures().stream().map(mp -> mp.pattern().type()).toList());
|
params.addAll(lambda.captures().stream().map(mp -> mp.pattern().type()).toList());
|
||||||
|
|
||||||
if (!state.isStatic)
|
if (!state.isStatic)
|
||||||
@@ -942,7 +947,7 @@ public class Codegen {
|
|||||||
mv.visitInsn(DUP);
|
mv.visitInsn(DUP);
|
||||||
else
|
else
|
||||||
mv.visitInsn(DUP_X1);
|
mv.visitInsn(DUP_X1);
|
||||||
mv.visitFieldInsn(dot.isStatic() ? PUTSTATIC : PUTFIELD, dot.owner().getInternalName(), dot.right(), fieldType.toSignature());
|
mv.visitFieldInsn(dot.isStatic() ? PUTSTATIC : PUTFIELD, dot.owner().getInternalName(), dot.right(), fieldType.toDescriptor());
|
||||||
}
|
}
|
||||||
default -> throw new CodeGenException("Invalid assignment");
|
default -> throw new CodeGenException("Invalid assignment");
|
||||||
}
|
}
|
||||||
@@ -959,7 +964,7 @@ public class Codegen {
|
|||||||
case TargetFieldVar dot: {
|
case TargetFieldVar dot: {
|
||||||
if (!dot.isStatic())
|
if (!dot.isStatic())
|
||||||
generate(state, dot.left());
|
generate(state, dot.left());
|
||||||
mv.visitFieldInsn(dot.isStatic() ? GETSTATIC : GETFIELD, dot.left().type().getInternalName(), dot.right(), dot.type().toSignature());
|
mv.visitFieldInsn(dot.isStatic() ? GETSTATIC : GETFIELD, dot.left().type().getInternalName(), dot.right(), dot.type().toDescriptor());
|
||||||
unboxPrimitive(state, dot.type());
|
unboxPrimitive(state, dot.type());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1423,7 +1428,7 @@ public class Codegen {
|
|||||||
throw new CodeGenException("Couldn't find suitable field accessor for '" + type.name() + "'");
|
throw new CodeGenException("Couldn't find suitable field accessor for '" + type.name() + "'");
|
||||||
var field = clazz.getFieldDecl().get(i);
|
var field = clazz.getFieldDecl().get(i);
|
||||||
var fieldType = converter.convert(field.getType());
|
var fieldType = converter.convert(field.getType());
|
||||||
state.mv.visitMethodInsn(INVOKEVIRTUAL, type.getInternalName(), field.getName(), "()" + fieldType.toSignature(), false);
|
state.mv.visitMethodInsn(INVOKEVIRTUAL, type.getInternalName(), field.getName(), "()" + fieldType.toDescriptor(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void bindPattern(State state, TargetType type, TargetPattern pat, Label start, int index, int depth) {
|
private void bindPattern(State state, TargetType type, TargetPattern pat, Label start, int index, int depth) {
|
||||||
@@ -1528,7 +1533,7 @@ public class Codegen {
|
|||||||
//if ((access & ACC_PRIVATE) == 0 && (access & ACC_PROTECTED) == 0) // TODO Implement access modifiers properly
|
//if ((access & ACC_PRIVATE) == 0 && (access & ACC_PROTECTED) == 0) // TODO Implement access modifiers properly
|
||||||
// access |= ACC_PUBLIC;
|
// access |= ACC_PUBLIC;
|
||||||
|
|
||||||
cw.visitField(access, field.name(), field.type().toSignature(), field.type().toDescriptor(), null);
|
cw.visitField(access, field.name(), field.type().toDescriptor(), field.type().toSignature(), null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void generateStaticConstructor(TargetMethod constructor) {
|
private void generateStaticConstructor(TargetMethod constructor) {
|
||||||
@@ -1604,7 +1609,7 @@ public class Codegen {
|
|||||||
mv.visitCode();
|
mv.visitCode();
|
||||||
mv.visitVarInsn(ALOAD, 0);
|
mv.visitVarInsn(ALOAD, 0);
|
||||||
mv.visitMethodInsn(INVOKESTATIC, "java/util/List", "of", "([Ljava/lang/Object;)Ljava/util/List;", true);
|
mv.visitMethodInsn(INVOKESTATIC, "java/util/List", "of", "([Ljava/lang/Object;)Ljava/util/List;", true);
|
||||||
mv.visitMethodInsn(INVOKESTATIC, className, "main", "(Ljava/util/List;)V", false);
|
mv.visitMethodInsn(INVOKESTATIC, new TargetRefType(clazz.qualifiedName().toString()).getInternalName(), "main", "(Ljava/util/List;)V", false);
|
||||||
mv.visitInsn(RETURN);
|
mv.visitInsn(RETURN);
|
||||||
mv.visitMaxs(0, 0);
|
mv.visitMaxs(0, 0);
|
||||||
mv.visitEnd();
|
mv.visitEnd();
|
||||||
@@ -1661,12 +1666,12 @@ public class Codegen {
|
|||||||
if (!generics.isEmpty()) {
|
if (!generics.isEmpty()) {
|
||||||
ret += "<";
|
ret += "<";
|
||||||
for (var generic : generics) {
|
for (var generic : generics) {
|
||||||
ret += generic.name() + ":" + generic.bound().toDescriptor();
|
ret += generic.name() + ":" + generic.bound().toSignature();
|
||||||
}
|
}
|
||||||
ret += ">";
|
ret += ">";
|
||||||
}
|
}
|
||||||
if (clazz.superType() != null)
|
if (clazz.superType() != null)
|
||||||
ret += clazz.superType().toDescriptor();
|
ret += clazz.superType().toSignature();
|
||||||
for (var intf : clazz.implementingInterfaces()) {
|
for (var intf : clazz.implementingInterfaces()) {
|
||||||
ret += intf.toSignature();
|
ret += intf.toSignature();
|
||||||
}
|
}
|
||||||
@@ -1821,7 +1826,7 @@ public class Codegen {
|
|||||||
bootstrapArgs[1] = String.join(";", clazz.fields().stream().map(TargetField::name).toArray(String[]::new));
|
bootstrapArgs[1] = String.join(";", clazz.fields().stream().map(TargetField::name).toArray(String[]::new));
|
||||||
for (var i = 0; i < clazz.fields().size(); i++) {
|
for (var i = 0; i < clazz.fields().size(); i++) {
|
||||||
var field = clazz.fields().get(i);
|
var field = clazz.fields().get(i);
|
||||||
var fieldRef = new Handle(H_GETFIELD, clazz.getName(), field.name(), field.type().toSignature(), false);
|
var fieldRef = new Handle(H_GETFIELD, clazz.getName(), field.name(), field.type().toDescriptor(), false);
|
||||||
bootstrapArgs[i + 2] = fieldRef;
|
bootstrapArgs[i + 2] = fieldRef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ public class FunNGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static String applySignature(TargetType a) { return a.toSignature(); }
|
private static String applySignature(TargetType a) { return a.toSignature(); }
|
||||||
private static String applyNameDescriptor(TargetType a){ return a instanceof TargetGenericType ? "LTPH;" : String.format("%s", applySignature(a)); }
|
private static String applyNameDescriptor(TargetType a){ return a instanceof TargetGenericType ? "LTPH;" : String.format("%s", a.toDescriptor()); }
|
||||||
|
|
||||||
public static String encodeType(TargetType type) {
|
public static String encodeType(TargetType type) {
|
||||||
if (type == null) return VOID;
|
if (type == null) return VOID;
|
||||||
|
|||||||
+16
-145
@@ -49,27 +49,27 @@ public class LanguageServerInterface {
|
|||||||
* Example: file:///c:/test/main.jav -> file:///c:/test/out/main.class
|
* Example: file:///c:/test/main.jav -> file:///c:/test/out/main.class
|
||||||
*
|
*
|
||||||
* @param pathAsString the URI of the File. See Example.
|
* @param pathAsString the URI of the File. See Example.
|
||||||
* @throws IOException
|
|
||||||
* @throws ClassNotFoundException
|
|
||||||
* @throws URISyntaxException
|
|
||||||
*/
|
*/
|
||||||
public LanguageServerTransferObject getResultSetAndAbstractSyntax(String pathAsString) throws IOException, ClassNotFoundException, URISyntaxException {
|
public LanguageServerTransferObject getResultSetAndAbstractSyntax(String pathAsString){
|
||||||
System.setOut(new PrintStream(OutputStream.nullOutputStream()));
|
System.setOut(new PrintStream(OutputStream.nullOutputStream()));
|
||||||
|
try {
|
||||||
|
var uri = new URI(pathAsString);
|
||||||
|
var path = Path.of(uri);
|
||||||
|
var file = path.toFile();
|
||||||
|
Files.createDirectories(path.getParent().resolve("out"));
|
||||||
|
var compiler = new JavaTXCompiler(List.of(file), List.of(path.getParent().toFile()), path.getParent().resolve("out").toFile());
|
||||||
|
|
||||||
var uri = new URI(pathAsString);
|
var parsedSource = compiler.sourceFiles.get(file);
|
||||||
var path = Path.of(uri);
|
var tiResults = compiler.typeInference(file);
|
||||||
var file = path.toFile();
|
|
||||||
Files.createDirectories(path.getParent().resolve("out"));
|
|
||||||
var compiler = new JavaTXCompiler(List.of(file), List.of(path.getParent().toFile()), path.getParent().resolve("out").toFile());
|
|
||||||
|
|
||||||
var parsedSource = compiler.sourceFiles.get(file);
|
Map<JavaClassName, byte[]> bytecode = compiler.generateBytecode(parsedSource, tiResults);
|
||||||
var tiResults = compiler.typeInference(file);
|
Files.createDirectories(path.getParent().resolve("out"));
|
||||||
|
compiler.writeClassFile(bytecode, path.getParent().resolve("out").toFile(), false);
|
||||||
|
|
||||||
Map<JavaClassName, byte[]> bytecode = compiler.generateBytecode(parsedSource, tiResults);
|
return new LanguageServerTransferObject(tiResults, parsedSource, "", compiler.getGeneratedGenerics());
|
||||||
Files.createDirectories(path.getParent().resolve("out"));
|
}catch (Exception e){
|
||||||
compiler.writeClassFile(bytecode, path.getParent().resolve("out").toFile(), false);
|
throw new RuntimeException(e.getMessage());
|
||||||
|
}
|
||||||
return new LanguageServerTransferObject(tiResults, parsedSource, "", compiler.getGeneratedGenerics());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -112,138 +112,9 @@ public class LanguageServerInterface {
|
|||||||
return test;
|
return test;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void writeClassFile(String name, byte[] code, Path outputPath) throws IOException {
|
|
||||||
Files.createDirectories(outputPath);
|
|
||||||
Files.write(outputPath.resolve(name + ".class"), code);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Map<String, ? extends Class<?>> generateClassFiles(IByteArrayClassLoader classLoader, Path path, Path outputPath, String... files) throws IOException, ClassNotFoundException {
|
|
||||||
Files.createDirectories(outputPath);
|
|
||||||
var filenames = Arrays.stream(files).map(filename -> Path.of(path.toString(), filename).toFile()).toList();
|
|
||||||
var compiler = new JavaTXCompiler(filenames, List.of(path.toFile(), outputPath.toFile()), outputPath.toFile());
|
|
||||||
|
|
||||||
var result = new HashMap<String, Class<?>>();
|
|
||||||
for (var file : filenames) {
|
|
||||||
var resultSet = compiler.typeInference(file);
|
|
||||||
|
|
||||||
var sourceFile = compiler.sourceFiles.get(file);
|
|
||||||
var converter = new ASTToTargetAST(compiler, resultSet, sourceFile, classLoader);
|
|
||||||
var classes = compiler.sourceFiles.get(file).getClasses();
|
|
||||||
|
|
||||||
result.putAll(classes.stream().map(cli -> {
|
|
||||||
try {
|
|
||||||
return generateClass(converter.convert(cli), classLoader, converter, outputPath);
|
|
||||||
} catch (IOException exception) {
|
|
||||||
throw new RuntimeException(exception);
|
|
||||||
}
|
|
||||||
}).collect(Collectors.toMap(Class::getName, Function.identity())));
|
|
||||||
|
|
||||||
converter.generateFunNTypes();
|
|
||||||
|
|
||||||
for (var entry : converter.auxiliaries.entrySet()) {
|
|
||||||
writeClassFile(entry.getKey(), entry.getValue(), outputPath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var entry : compiler.loadedClasses.entrySet()) {
|
|
||||||
var name = entry.getKey().toString();
|
|
||||||
result.put(name, classLoader.loadClass(Path.of(entry.getValue().classFile().toURI())));
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Class<?> generateClass(TargetStructure clazz, IByteArrayClassLoader classLoader, ASTToTargetAST converter, Path outputPath) throws IOException {
|
|
||||||
Codegen codegen = new Codegen(clazz, converter.compiler, converter);
|
|
||||||
var code = codegen.generate();
|
|
||||||
writeClassFile(clazz.qualifiedName().getClassName(), code, outputPath);
|
|
||||||
return classLoader.loadClass(code);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Map<String, ? extends Class<?>> generateClassFiles(String filename, IByteArrayClassLoader classLoader, String filePath) throws IOException, ClassNotFoundException {
|
|
||||||
var file = Path.of(filePath, filename).toFile();
|
|
||||||
var compiler = new JavaTXCompiler(List.of(file), List.of(file.getParentFile()), Path.of(filePath + "/out").toFile());
|
|
||||||
var resultSet = compiler.typeInference(file);
|
|
||||||
|
|
||||||
var sourceFile = compiler.sourceFiles.get(file);
|
|
||||||
var converter = new ASTToTargetAST(compiler, resultSet, sourceFile, classLoader);
|
|
||||||
var classes = compiler.sourceFiles.get(file).getClasses();
|
|
||||||
|
|
||||||
var result = classes.stream().map(cli -> {
|
|
||||||
try {
|
|
||||||
return generateClass(converter.convert(cli), classLoader, converter, Path.of(filePath + "/out/"));
|
|
||||||
} catch (IOException exception) {
|
|
||||||
throw new RuntimeException(exception);
|
|
||||||
}
|
|
||||||
}).collect(Collectors.toMap(Class::getName, Function.identity()));
|
|
||||||
|
|
||||||
converter.generateFunNTypes();
|
|
||||||
|
|
||||||
for (var entry : converter.auxiliaries.entrySet()) {
|
|
||||||
writeClassFile(entry.getKey(), entry.getValue(), Path.of(filePath + "/out/"));
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static SourceFile getAST(String filename, String filePath) throws IOException, ClassNotFoundException {
|
public static SourceFile getAST(String filename, String filePath) throws IOException, ClassNotFoundException {
|
||||||
var file = Path.of(filePath, filename).toFile();
|
var file = Path.of(filePath, filename).toFile();
|
||||||
var compiler = new JavaTXCompiler(List.of(file), List.of(file.getParentFile()), Path.of(filePath + "/out").toFile());
|
var compiler = new JavaTXCompiler(List.of(file), List.of(file.getParentFile()), Path.of(filePath + "/out").toFile());
|
||||||
return compiler.sourceFiles.get(file);
|
return compiler.sourceFiles.get(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static LanguageServerTransferObject getLanguageServerTransferObject(String filename, IByteArrayClassLoader classLoader, String filePath) throws IOException, ClassNotFoundException {
|
|
||||||
var file = Path.of(filePath, filename).toFile();
|
|
||||||
var compiler = new JavaTXCompiler(List.of(file), List.of(file.getParentFile()), Path.of(filePath + "/out").toFile());
|
|
||||||
var resultSet = compiler.typeInference(file);
|
|
||||||
|
|
||||||
var sourceFile = compiler.sourceFiles.get(file);
|
|
||||||
var converter = new ASTToTargetAST(compiler, resultSet, sourceFile, classLoader);
|
|
||||||
compiler.generateBytecode();
|
|
||||||
converter.generateFunNTypes();
|
|
||||||
|
|
||||||
var ta = converter.javaGenerics();
|
|
||||||
var tb = converter.txGenerics();
|
|
||||||
Map<SourceFile, List<GenericsResult>> generics = new HashMap<>();
|
|
||||||
|
|
||||||
ArrayList<GenericsResult> genericsResults = new ArrayList<>();
|
|
||||||
genericsResults.addAll(ta);
|
|
||||||
genericsResults.addAll(tb);
|
|
||||||
generics.put(converter.compiler.sourceFiles.values().stream().findFirst().get(), ta);
|
|
||||||
var test = new LanguageServerTransferObject(resultSet, converter.compiler.sourceFiles.values().stream().findFirst().get(), "", compiler.getGeneratedGenerics());
|
|
||||||
return test;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* generates Bytecode for the given Path of the File.
|
|
||||||
* The Generated Bytecode can be found in the same place as the path, except the File lies in an /out/ Directory
|
|
||||||
* Example: file:///c:/test/main.jav -> file:///c:/test/out/main.class
|
|
||||||
*
|
|
||||||
* @param uri the URI of the File. See Example.
|
|
||||||
* @throws IOException
|
|
||||||
* @throws ClassNotFoundException
|
|
||||||
* @throws URISyntaxException
|
|
||||||
*/
|
|
||||||
public void generateBytecode(URI uri) throws IOException, ClassNotFoundException, URISyntaxException {
|
|
||||||
|
|
||||||
// System.setOut(new PrintStream(OutputStream.nullOutputStream()));
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// File inputDir = new File(uri.getPath());
|
|
||||||
// File outFile = new File(uri.getPath() + "/out");
|
|
||||||
// FileUtils.cleanDirectory(outFile);
|
|
||||||
// String[] allowedEndings = {".jav"};
|
|
||||||
// ArrayList<File> files = new ArrayList<>();
|
|
||||||
//
|
|
||||||
// try (Stream<Path> stream = Files.walk(Paths.get(inputDir.toURI()))) {
|
|
||||||
// stream.filter(Files::isRegularFile)
|
|
||||||
// .forEach(el -> files.add(el.toFile()));
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// List<String> javFiles = files.stream().filter(el -> el.getName().split("\\.").length >= 2 && el.getName().split("\\.")[el.getName().split("\\.").length - 1].contains("jav")).map(el -> el.getPath().replace(inputDir.getPath(), "").substring(1)).toList();
|
|
||||||
// //TODO: Link between Files
|
|
||||||
// generateClassFiles(new ByteArrayClassLoader(), Path.of(inputDir.toURI()), Path.of(outFile.toURI()), javFiles.toArray(new String[0]));
|
|
||||||
// System.setOut(System.out);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,30 +36,30 @@ public record TargetMethod(int access, String name, TargetBlock block, Signature
|
|||||||
public static String getDescriptor(TargetType returnType, TargetType... parameters) {
|
public static String getDescriptor(TargetType returnType, TargetType... parameters) {
|
||||||
String ret = "(";
|
String ret = "(";
|
||||||
for (var parameterType : parameters) {
|
for (var parameterType : parameters) {
|
||||||
ret += parameterType.toSignature();
|
ret += parameterType.toDescriptor();
|
||||||
}
|
}
|
||||||
ret += ")";
|
ret += ")";
|
||||||
if (returnType == null) ret += "V";
|
if (returnType == null) ret += "V";
|
||||||
else ret += returnType.toSignature();
|
else ret += returnType.toDescriptor();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getSignature(Set<TargetGeneric> generics, List<MethodParameter> parameters, TargetType returnType) {
|
public static String getSignature(Set<TargetGeneric> generics, List<MethodParameter> parameters, TargetType returnType) {
|
||||||
String ret = "";
|
String ret = "";
|
||||||
if (generics.size() > 0) {
|
if (!generics.isEmpty()) {
|
||||||
ret += "<";
|
ret += "<";
|
||||||
for (var generic : generics) {
|
for (var generic : generics) {
|
||||||
ret += generic.name() + ":" + generic.bound().toDescriptor();
|
ret += generic.name() + ":" + generic.bound().toSignature();
|
||||||
}
|
}
|
||||||
ret += ">";
|
ret += ">";
|
||||||
}
|
}
|
||||||
ret += "(";
|
ret += "(";
|
||||||
for (var param : parameters) {
|
for (var param : parameters) {
|
||||||
ret += param.pattern().type().toDescriptor();
|
ret += param.pattern().type().toSignature();
|
||||||
}
|
}
|
||||||
ret += ")";
|
ret += ")";
|
||||||
if (returnType == null) ret += "V";
|
if (returnType == null) ret += "V";
|
||||||
else ret += returnType.toDescriptor();
|
else ret += returnType.toSignature();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,12 +3,12 @@ package de.dhbwstuttgart.target.tree.type;
|
|||||||
public record TargetExtendsWildcard(TargetType innerType) implements TargetType {
|
public record TargetExtendsWildcard(TargetType innerType) implements TargetType {
|
||||||
@Override
|
@Override
|
||||||
public String toSignature() {
|
public String toSignature() {
|
||||||
return innerType.toSignature();
|
return "+" + innerType.toSignature();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toDescriptor() {
|
public String toDescriptor() {
|
||||||
return "+" + innerType.toDescriptor();
|
return innerType.toDescriptor();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -33,9 +33,4 @@ public record TargetFunNType(String name, List<TargetType> funNParams, List<Targ
|
|||||||
public String getInternalName() {
|
public String getInternalName() {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toSignature() {
|
|
||||||
return "L" + getInternalName() + ";";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,12 +2,12 @@ package de.dhbwstuttgart.target.tree.type;
|
|||||||
|
|
||||||
public record TargetGenericType(String name) implements TargetType {
|
public record TargetGenericType(String name) implements TargetType {
|
||||||
@Override
|
@Override
|
||||||
public String toSignature() {
|
public String toDescriptor() {
|
||||||
return "Ljava/lang/Object;"; // TODO Use bounds for this?
|
return "Ljava/lang/Object;"; // TODO Use bounds for this?
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toDescriptor() {
|
public String toSignature() {
|
||||||
return "T" + getInternalName() + ";";
|
return "T" + getInternalName() + ";";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,11 +12,6 @@ public record TargetRefType(String name, List<TargetType> params) implements Tar
|
|||||||
return this.name.replaceAll("\\.", "/");
|
return this.name.replaceAll("\\.", "/");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toSignature() {
|
|
||||||
return "L" + getInternalName() + ";";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Type erasure means we need to override hashCode and equals to only consider the name
|
// Type erasure means we need to override hashCode and equals to only consider the name
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
|
|||||||
@@ -6,16 +6,21 @@ public sealed interface TargetSpecializedType extends TargetType permits TargetF
|
|||||||
List<TargetType> params();
|
List<TargetType> params();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
default String toDescriptor() {
|
default String toSignature() {
|
||||||
String ret = "L" + getInternalName();
|
String ret = "L" + getInternalName();
|
||||||
if (params().size() > 0) {
|
if (!params().isEmpty()) {
|
||||||
ret += "<";
|
ret += "<";
|
||||||
for (var param : params()) {
|
for (var param : params()) {
|
||||||
ret += param.toDescriptor();
|
ret += param.toSignature();
|
||||||
}
|
}
|
||||||
ret += ">";
|
ret += ">";
|
||||||
}
|
}
|
||||||
ret += ";";
|
ret += ";";
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
default String toDescriptor() {
|
||||||
|
return "L" + getInternalName() + ";";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,12 +3,12 @@ package de.dhbwstuttgart.target.tree.type;
|
|||||||
public record TargetSuperWildcard(TargetType innerType) implements TargetType {
|
public record TargetSuperWildcard(TargetType innerType) implements TargetType {
|
||||||
@Override
|
@Override
|
||||||
public String toSignature() {
|
public String toSignature() {
|
||||||
return innerType.toSignature();
|
return "-" + innerType.toSignature();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toDescriptor() {
|
public String toDescriptor() {
|
||||||
return "-" + innerType.toDescriptor();
|
return innerType.toDescriptor();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,51 +0,0 @@
|
|||||||
package languageServerInterfaceTest;
|
|
||||||
|
|
||||||
import de.dhbwstuttgart.core.ConsoleInterface;
|
|
||||||
import de.dhbwstuttgart.core.JavaTXCompiler;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.factory.NameGenerator;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.visual.ASTPrinter;
|
|
||||||
import org.junit.Ignore;
|
|
||||||
import org.junit.Test;
|
|
||||||
import de.dhbwstuttgart.languageServerInterface.LanguageServerInterface;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.net.URI;
|
|
||||||
import java.net.URISyntaxException;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.junit.Assert.fail;
|
|
||||||
|
|
||||||
public class LangaugeServerInterfaceTest {
|
|
||||||
@Test
|
|
||||||
@Ignore
|
|
||||||
public void consoleInterfaceTest() throws IOException, ClassNotFoundException, URISyntaxException {
|
|
||||||
|
|
||||||
|
|
||||||
LanguageServerInterface languageServerInterface = new LanguageServerInterface();
|
|
||||||
var resp = languageServerInterface.getResultSetAndAbstractSyntax("/home/ruben/code/JavaCompilerCore/src/test/java/languageServerInterfaceTest/test.jav");
|
|
||||||
|
|
||||||
System.out.println("\n-----------------------------------------\n");
|
|
||||||
System.out.println(ASTPrinter.print(resp.getAst()));
|
|
||||||
System.out.println("\n-----------------------------------------\n");
|
|
||||||
|
|
||||||
LanguageServerInterface languageServerInterface2 = new LanguageServerInterface();
|
|
||||||
var ast = languageServerInterface2.getAst("/home/ruben/code/JavaCompilerCore/src/test/java/languageServerInterfaceTest/test.jav", "N");
|
|
||||||
|
|
||||||
System.out.println("\n-----------------------------------------\n");
|
|
||||||
System.out.println(ASTPrinter.print(ast));
|
|
||||||
System.out.println("\n-----------------------------------------\n");
|
|
||||||
System.out.println("");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@Ignore
|
|
||||||
public void testBytecodeGen() throws IOException, ClassNotFoundException, URISyntaxException {
|
|
||||||
|
|
||||||
//TODO: Ordner und Datei löschen wenn sie bereits existieren
|
|
||||||
LanguageServerInterface languageServerInterface = new LanguageServerInterface();
|
|
||||||
languageServerInterface.generateBytecode(new URI("c%3A/Users/ruben/Neuer%20Ordner%20%282%29/LSP-Vortrag/images/"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user