Imports von importierten Klassen werden nicht berücksichtigt #290

Closed
opened 2024-03-13 17:58:52 +00:00 by i21023 · 1 comment
Collaborator

Wenn man eine Klasse mit dem JavaTX Compiler aufruft, von welcher eine weitere Klasse aufgeruft wird, verwendet der Typinferenz-Algorithmus nur die Imports, die in der ursprünglich aufgerufenen Klasse verwendet werden. Imports in der referenzierten Klasse werden nicht beachtet (zumindest beim Prüfen der Binary Operationen).

Beispiel

.
├── Bar.jav
├── Foo.jav
└── JavaTXcompiler-0.9-jar-with-dependencies.jar

Aufzurufende Klasse Foo.jav

import Bar;

public class Foo{
    public void bar(){
        new Bar();
    }
}

Von Foo.jav verwendete Klasse Bar.jav

import java.lang.String;
import java.lang.Integer;

public class Bar{
    String name;

    public Bar(){
        Integer i = 0;
        name = i.toString() + "$$";
    }
}

Ausgabe beim Aufruf java -jar JavaTXcompiler-0.9-jar-with-dependencies.jar Foo.jav:

Exception in thread "main" de.dhbwstuttgart.exceptions.TypeinferenceException: Kein Typ für ADD vorhanden
        at de.dhbwstuttgart.typeinference.typeAlgo.TYPEStmt.visit(TYPEStmt.java:335)
        at de.dhbwstuttgart.syntaxtree.statement.BinaryExpr.accept(BinaryExpr.java:10)
        at de.dhbwstuttgart.typeinference.typeAlgo.TYPEStmt.visit(TYPEStmt.java:92)
        at de.dhbwstuttgart.syntaxtree.statement.Assign.accept(Assign.java:26)
        at de.dhbwstuttgart.typeinference.typeAlgo.TYPEStmt.visit(TYPEStmt.java:99)
        at de.dhbwstuttgart.syntaxtree.statement.Block.accept(Block.java:25)
        at de.dhbwstuttgart.typeinference.typeAlgo.TYPE.getConstraintsMethod(TYPE.java:80)
        at de.dhbwstuttgart.typeinference.typeAlgo.TYPE.getConstraintsConstructor(TYPE.java:88)
        at de.dhbwstuttgart.typeinference.typeAlgo.TYPE.getConstraintsClass(TYPE.java:43)
        at de.dhbwstuttgart.typeinference.typeAlgo.TYPE.getConstraints(TYPE.java:30)
        at de.dhbwstuttgart.core.JavaTXCompiler.getConstraints(JavaTXCompiler.java:156)
        at de.dhbwstuttgart.core.JavaTXCompiler.typeInference(JavaTXCompiler.java:419)
        at de.dhbwstuttgart.core.JavaTXCompiler.generateBytecode(JavaTXCompiler.java:716)
        at de.dhbwstuttgart.core.JavaTXCompiler.generateBytecode(JavaTXCompiler.java:699)
        at de.dhbwstuttgart.core.JavaTXCompiler.generateBytecode(JavaTXCompiler.java:709)
        at de.dhbwstuttgart.core.ConsoleInterface.main(ConsoleInterface.java:40)

Das folgt glaube ich daher, dass die in Bar.jav importierten Klassen String und Integer bei der Überprüfung von Binary in der Typinferenz nicht beachtet werden, sondern lediglich die Imports aus der Klasse die ursprünglich vom Compiler aufgerufen wird (Foo.jav)
grafik
Debug Ansicht der Variable info in Klasse TypeStmt

Wenn Foo.jav so angepasst wird, dass String und Integer zusätzlich direkt hier importiert werden (obwohl diese Klasse sie gar nicht benutzt), erkennt die Typinferenz die Typen für die Binary ADD Operation und kompiliert.

import Bar;
import java.lang.String;
import java.lang.Integer;

public class Foo{
    public void bar(){
        new Bar();
    }
}

grafik
Debug Ansicht der Variable info in Klasse TypeStmt

Wenn man eine Klasse mit dem JavaTX Compiler aufruft, von welcher eine weitere Klasse aufgeruft wird, verwendet der Typinferenz-Algorithmus nur die Imports, die in der ursprünglich aufgerufenen Klasse verwendet werden. Imports in der referenzierten Klasse werden nicht beachtet (zumindest beim Prüfen der Binary Operationen). ### Beispiel . ├── Bar.jav ├── Foo.jav └── JavaTXcompiler-0.9-jar-with-dependencies.jar **Aufzurufende Klasse `Foo.jav`** ```java import Bar; public class Foo{ public void bar(){ new Bar(); } } ``` **Von Foo.jav verwendete Klasse `Bar.jav`** ```java import java.lang.String; import java.lang.Integer; public class Bar{ String name; public Bar(){ Integer i = 0; name = i.toString() + "$$"; } } ``` **Ausgabe beim Aufruf `java -jar JavaTXcompiler-0.9-jar-with-dependencies.jar Foo.jav`:** ``` Exception in thread "main" de.dhbwstuttgart.exceptions.TypeinferenceException: Kein Typ für ADD vorhanden at de.dhbwstuttgart.typeinference.typeAlgo.TYPEStmt.visit(TYPEStmt.java:335) at de.dhbwstuttgart.syntaxtree.statement.BinaryExpr.accept(BinaryExpr.java:10) at de.dhbwstuttgart.typeinference.typeAlgo.TYPEStmt.visit(TYPEStmt.java:92) at de.dhbwstuttgart.syntaxtree.statement.Assign.accept(Assign.java:26) at de.dhbwstuttgart.typeinference.typeAlgo.TYPEStmt.visit(TYPEStmt.java:99) at de.dhbwstuttgart.syntaxtree.statement.Block.accept(Block.java:25) at de.dhbwstuttgart.typeinference.typeAlgo.TYPE.getConstraintsMethod(TYPE.java:80) at de.dhbwstuttgart.typeinference.typeAlgo.TYPE.getConstraintsConstructor(TYPE.java:88) at de.dhbwstuttgart.typeinference.typeAlgo.TYPE.getConstraintsClass(TYPE.java:43) at de.dhbwstuttgart.typeinference.typeAlgo.TYPE.getConstraints(TYPE.java:30) at de.dhbwstuttgart.core.JavaTXCompiler.getConstraints(JavaTXCompiler.java:156) at de.dhbwstuttgart.core.JavaTXCompiler.typeInference(JavaTXCompiler.java:419) at de.dhbwstuttgart.core.JavaTXCompiler.generateBytecode(JavaTXCompiler.java:716) at de.dhbwstuttgart.core.JavaTXCompiler.generateBytecode(JavaTXCompiler.java:699) at de.dhbwstuttgart.core.JavaTXCompiler.generateBytecode(JavaTXCompiler.java:709) at de.dhbwstuttgart.core.ConsoleInterface.main(ConsoleInterface.java:40) ``` Das folgt glaube ich daher, dass die in Bar.jav importierten Klassen String und Integer bei der Überprüfung von Binary in der Typinferenz nicht beachtet werden, sondern lediglich die Imports aus der Klasse die ursprünglich vom Compiler aufgerufen wird (Foo.jav) ![grafik](/attachments/8d4e7f84-9743-4816-bf96-51c492dddcbd) *Debug Ansicht der Variable `info` in Klasse `TypeStmt`* Wenn `Foo.jav` so angepasst wird, dass String und Integer zusätzlich direkt hier importiert werden (obwohl diese Klasse sie gar nicht benutzt), erkennt die Typinferenz die Typen für die Binary ADD Operation und kompiliert. ```java import Bar; import java.lang.String; import java.lang.Integer; public class Foo{ public void bar(){ new Bar(); } } ``` ![grafik](/attachments/1e71a9ff-0d5d-4a3e-a2cc-b05ff5b853d7) *Debug Ansicht der Variable `info` in Klasse `TypeStmt`*
Owner

Ich bin mir nicht sicher ob es funktioniert, musst du testen. Es müssen jetzt allerdings auch Klassen importiert werden die im selben Package sind. Das versuche ich noch zu fixen aber es schadet definitiv nicht die mit reinzuschreiben.

Ich bin mir nicht sicher ob es funktioniert, musst du testen. Es müssen jetzt allerdings auch Klassen importiert werden die im selben Package sind. Das versuche ich noch zu fixen aber es schadet definitiv nicht die mit reinzuschreiben.
Sign in to join this conversation.
No Milestone
No project
No Assignees
2 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: JavaTX/JavaCompilerCore#290
No description provided.