JavaPatternMatching/doc/documentation.md

2.7 KiB

Typinferenz

Generische Variablen

GTVs in Constraints

  • GTVs können in Constraints auf 2 Arten auftauchen.

    • Als GTZ und als TPH
  • In folgenden Fällen als TPH:

    • Die Generische Variable ist nicht in dem Bereich definiert, in dem sie benutzt wird.
    • Es kann auch vorkommen, dass die Generische Variable in der gleichen Klasse definiert wurde, aber für eine andere Methode gilt.
  • In folgenden Fällen als GTV:

    • Die Generische Variable ist für den Bereich definiert, in dem der Constraint generiert wird.
    • In der selben Methode oder der selben Klasse. Dies lässt sich überprüfen, indem man die Klasse in welcher die GTV deklariert wurde mit der Klasse in welcher deren Typ benutzt wird vergleicht.
    • Ist die GTV als Klassenparameter definiert und aus der selben Klasse wird darauf zugegriffen.
    • Die GTV ist in einer Methode oder FieldDeclaration definiert, aber nicht dem selben wie darauf zugegriffen wird.

ResultSet

  • Spezifisch für jedes SourceFile (nicht für jede Klasse)

  • mehrere ResultSets pro Klasse

  • Enthält:

    • constraintPairs
    • unifiedConstraints

TypeInsertSet

  • Stellt die Typeinsetzung für eine der generierten Lösungen dar
  • Setzt alle Typen und generischen Variablen ein, welche zu dieser Lösung gehören

Ablauf Typinferenz:

  1. Parsen

    • (Parser postProcessing)
  2. Typinferenz

    • Anfangspunkt SourceFile
    • löst geparste Typen zu richtigen Typen auf (RefTypes, GenericVar)
    • setzt TPHs ein
    • bildet Constraints, welche in ResultSet gesammelt werden. ResultSet wird durch Syntaxbaum gereicht.
    • Assumptions generieren
      • Wird im Syntaxbaum für jeden Knoten ausgeführt und die Assumptions für darunterliegende Knoten gebildet
  3. Unifizierung

    • wird im SourceFile aufgerufen
    • unifiziert Constraints aller im SourceFile vorkommenden Klassen
  4. Erstellen von TypeInsertSet

    • Durchlaufen des Syntaxbaumes
    • Jeder Knoten erstellt TypeInsertSets anhand des ResultSets.
    • Bei Knoten, welche Generische Variablen beinhalten können werden GenericTypeInsertPoints erstellt
  5. Einsetzen eines TypeInsertSet (optional)

    1. Auf allen TypeInsertPoints die getUnresolvedTPHs-Methoden aufrufen
    2. Alle Abhängigkeiten dieser

Typinferenz für Java 8

Programmablauf

  1. SourceFile parst die Java-Dateien
  2. SourceFile erstellt die Basic/Global Assumptions
  3. Das Globale AssumptionSet wird anschließend jeder Klasse im Syntaxbaum mit dem TRProg aufruf übergeben
  4. Jede Klasse verwaltet lokale Variablen in ihrem eigenen AssumptionSet. Das Globale ist Klassenübergreifend und jede AssumptionType darf darin nur einmalig gesetzt werden.
  5. Haben alle Klassen ihrer Constraints erstellt können diese Unifiziert werden.

Overloading

  • Die Overloading Klasse generiert Constraints aus einem Methodenaufruf.