Überladung von case-Labels #348
Labels
No Label
Codegen
confirmed
duplicate
Eclipse-Plugin
Feature Request
generics
in progress
invalid
JavaCompilerCore
needs info
Parser
Trash
Type
Unify
won't fix
works for me
No Milestone
No project
No Assignees
3 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: JavaTX/JavaCompilerCore#348
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Folgendes Beispiel:
In diesem Fall wären zwei Möglichkeiten für den Funktionsaufruf
f
gegeben.Das case könnte also Überladen werden und dann so aussehen:
Die Problematik ist nun, dass im Result-Set erstmal nicht zu sehen ist, ob die ganze Methode oder nur der Case überladen werden soll.
In der Besprechung sind wir jetzt so verblieben, dass geprüft werden muss ob sich der Typ von
a
ändert. Falls nein wird jeweils für alle Kombinationen der Typvariablen im Record-Pattern eine Überladung durchgeführt.Nur nochmal für mich zum Verständnis:
wenn ich also den Switch-Case
habe, soll "automatisch" die richtige Methode dazu aufgerufen werden.
In diesem Fall bei
x = Integer
Casef(Integer x)
, beix = Float
Casef(Float x)
.Ich arbeite jetzt mit folgendem Beispiel:
Allerdings gibt es ein Problem. Die Constraints müssen hier auch angepasst werden. Sonst wird nämlich eine Überladung für
m
erstellt, jeweils mitDouble
oderInteger
als Return-Typ. Das Gleiche passiert auch, wenn man eine lokale Variable erstellt.Ich bin mir nicht sicher, ob das komplett im Bytecode lösbar ist, da ich auch Änderungen am Result-Set machen müsste.
@pl Das ist so ein Fall, in dem sich der Switch auf die äußere Methode auswirkt. Hast du eine Idee wie wir das lösen können?
Eigentlich müsste das meiner Meinung nach von der Typinferenz abgedeckt werden. Könnte man hier ein Constraint einfügen, welches die Fälle (von f) wieder einsammelt und einen gemeinsamen Rückgabetyp für das Switch berechnet? Ich möchte ungern im Bytecode einen gemeinsamen Supertyp für das Switch finden.
Kannst mal das ResultSet und dei Abstrakte Syntax mit Typisierung hier posten
Abstrakte Syntax:
ResultSet:
Mir fällt gerade auf, dass das
AI
nicht definiert ist, das hat vorher noch funktioniert. Sieht so aus als ob mein pull da was geändert hat.Hier müssten wohl zwei Methoden erzeugt werden. Wir müssen unsere Überlegungen von letzter Woche ergänzen. Nicht nur die input-Variable AH, sondern auch die output-Variable AR muss in allen Fällen des Resultssets gleich sein, um nur weitere Cases zu erzeugen.
Das Ergebnis wäre dann:
Um einen Fall zu generieren bei den tatsächlich ein weiterer Case-Fall erzeugt würde, müsste es so aussehen:
Dann würde es zu
Ich hab ein kleines Problem... Für die überladenen cases wähle ich ein Result-Set aus, in dem die Typen welche im Pattern benutzt werden gleich sind.
Das funktioniert soweit ganz gut, aber was passiert wenn die Methode gleichzeitig auch noch überladen wird
Dann kann es ja sein, dass mehrere Result-Sets in frage kommen.
Ich habe auch versucht den Typ einfach zu überschreiben, aber zu dem Zeitpunkt sind die Relationen nicht mehr klar.
Wenn z.B
A = B
undA = Integer
dann steht bei mir nur nochA = Integer
undB = Integer
drin. Wenn ich aber jetzt sage, dassA = Double
, dann wirdB
nicht geändert.Verstehe ich so leider nicht. Kannst Du bitte noch ein Beipiel dafür angeben.
Das Problem tritt hier auf:
Jetzt werden sowohl die Methode als auch der Case überladen. Für den überladenen Case muss ich eins der Result-Sets auswählen. Nun gibt es allerdings zwei die in Frage kommen könnten. Es reicht also nicht aus, nur den Typ von
o
anzuschauen.Die Result-Sets sehen ungefär so aus:
Für
o = Double
gibt es also zwei Result-Sets. Richtig wäre das Result-Set, welches mit der Überladung der äußeren Methode übereinstimmt.Praktisch wäre sowas wie eine Hierarchie in den Result-Sets, aber keine Ahnung wie das umgesetzt werden soll.
Wahrscheinlich musst Du so vorgehen, dass man zunächt die Typvariablen des Headres anschaut (Argumente und Return-Typ) und dieses mal aufteilt. Dann hat man die Überladungen. Wenn dann zwei gleich sind, dann macht man die bekannte Case-Betrachtung
In diesem Beispiel tritt das allerding m.E. nicht auf. Da switch das Return-Statement der Methode ist, führen alle 4 Fälle zu Überladungen:
Double m(r, Double x)
Double m(r, Integer x)
Integer m(R, Double x)
Integer m(r, Integer x)
Das Beispiel müsste wahrscheinlich so aussehen
Jetzt müsste m.E. folgenden rauskommen: