Version: 3.1.0
Status: ✅ Vollständig implementiert
Das Automatic Code Ordering System sortiert Funktionen, Typen und Blöcke automatisch basierend auf ihren Abhängigkeiten, sodass sie korrekt aufeinander aufbauen. Dies eliminiert die Notwendigkeit, Code manuell in der richtigen Reihenfolge zu schreiben.
Status: ✅ Implementiert in compiler/src/passes/code_order.rs
Der CodeOrderingPass analysiert alle Items im Programm und sortiert sie basierend auf ihren Abhängigkeiten.
- Functions → Abhängig von: verwendeten Typen, aufgerufenen Funktionen, importierten Modulen
- Structs → Abhängig von: Feldtypen, generischen Parametern
- Enums → Abhängig von: Variant-Typen
- TypeAliases → Abhängig von: referenzierten Typen
- Traits → Abhängig von: Method-Signaturen
- Impls → Abhängig von: Trait-Namen, Method-Implementierungen
- Modules → Abhängig von: Sub-Items (rekursiv)
- Use Statements → Abhängig von: Modul-Pfaden
- Use Statements (immer zuerst)
- TypeAliases (Typ-Definitionen)
- Enums (Enum-Definitionen)
- Structs (Struct-Definitionen)
- Traits (Trait-Definitionen)
- Impls (Trait-Implementierungen)
- Functions (Funktions-Definitionen)
- TopLevelCode (Top-Level Ausdrücke, immer zuletzt)
Innerhalb jeder Kategorie: Abhängigkeitsbasierte Sortierung (Topologische Sortierung)
Vorher (manuelle Reihenfolge):
fn processUser(user: User) {
return user.name.toUpperCase();
}
struct User {
name: string;
email: string;
}
Nachher (automatisch sortiert):
struct User {
name: string;
email: string;
}
fn processUser(user: User) {
return user.name.toUpperCase();
}
Die User Struct wird automatisch vor processUser platziert, da die Funktion von User abhängt.
Status: ✅ Implementiert mit petgraph
Das System verwendet topologische Sortierung, um Items in der korrekten Reihenfolge zu sortieren.
- Nodes: Items (Functions, Structs, etc.)
- Edges: Abhängigkeiten (Item A hängt von Item B ab)
Das System erkennt zirkuläre Abhängigkeiten und meldet sie als Fehler:
Error: Circular dependency detected involving: User, UserService
// Input (unsortiert)
fn createUser(name: string): User {
return User { name, email: generateEmail(name) };
}
fn generateEmail(name: string): string {
return format("{}@example.com", name);
}
struct User {
name: string;
email: string;
}
// Output (automatisch sortiert)
struct User {
name: string;
email: string;
}
fn generateEmail(name: string): string {
return format("{}@example.com", name);
}
fn createUser(name: string): User {
return User { name, email: generateEmail(name) };
}
Status: ✅ Implementiert in compiler/src/passes/code_order.rs
Das System extrahiert Abhängigkeiten aus:
- Parameter-Typen
- Return-Typen
- Aufgerufene Funktionen (in Funktions-Body)
- Verwendete Typen (in Funktions-Body)
- Feldtypen
- Generische Parameter (Constraints)
- Variant-Typen
- Aliased Typen
- Funktionsaufrufe
- Member-Zugriffe
- Typ-Konstruktoren
- Lambda-Parameter und Return-Typen
Status: ✅ Implementiert in compiler/src/compiler/orchestrator.rs
Der BuildOrchestrator orchestriert den gesamten Build-Ablauf automatisch basierend auf Abhängigkeiten zwischen Dateien.
- Multi-File Dependency-Graph: Erstellt einen Dependency-Graph zwischen Dateien
- Automatische Kompilierungsreihenfolge: Bestimmt die korrekte Reihenfolge für Multi-File-Projekte
- Zirkuläre Abhängigkeits-Erkennung: Erkennt und meldet zirkuläre Abhängigkeiten zwischen Dateien
Das System analysiert use Statements, um Datei-Abhängigkeiten zu bestimmen:
// main.velin
use models;
use services;
// models.velin wird vor main.velin kompiliert
// services.velin wird vor main.velin kompiliert
Projekt-Struktur:
project/
├── main.velin
├── models.velin
└── services.velin
Dependencies:
main.velin→models.velin,services.velinservices.velin→models.velin
Kompilierungsreihenfolge (automatisch):
models.velinservices.velinmain.velin
- ParserPass - Parsing und AST-Erstellung
- DesugaringPass - Transformation
- CodeOrderingPass ✅ (Neu in 3.1.0) - Automatische Code-Sortierung
- TypeCheckPass - Type Checking
- CodegenPass - Code-Generierung
Der CodeOrderingPass wird automatisch nach dem Desugaring-Pass ausgeführt:
compiler.add_pass(Box::new(ParserPass::new()));
compiler.add_pass(Box::new(DesugaringPass::new()));
compiler.add_pass(Box::new(CodeOrderingPass::new())); // Automatische Sortierung
compiler.add_pass(Box::new(TypeCheckPass::new(true)));- Schreibe Code in natürlicher Reihenfolge: Das System sortiert automatisch, du musst nicht über die Reihenfolge nachdenken
- Nutze explizite Typen: Explizite Typen helfen dem System, Abhängigkeiten besser zu erkennen
- Vermeide zirkuläre Abhängigkeiten: Zirkuläre Abhängigkeiten werden erkannt, aber sollten vermieden werden
- Nutze
useStatements: Das System verwendetuseStatements, um Datei-Abhängigkeiten zu bestimmen - Organisiere Module logisch: Auch wenn die Sortierung automatisch ist, hilft logische Organisation
Dateien:
compiler/src/passes/code_order.rs- CodeOrderingPass Implementierungcompiler/src/compiler/orchestrator.rs- BuildOrchestrator für Multi-File-Projekte
Abhängigkeiten:
petgraph- Graph-Datenstrukturen und topologische Sortierungindexmap- IndexMap für stabile Sortierung
- Dependency-Graph Erstellung: Analysiert alle Items und erstellt einen Dependency-Graph
- Topologische Sortierung: Führt topologische Sortierung durch
- Zirkuläre Abhängigkeits-Erkennung: Erkennt Zyklen und meldet Fehler
- Item-Reihenfolge: Sortiert Items basierend auf topologischer Sortierung
- O(V + E): Linear in Anzahl der Items und Abhängigkeiten
- Effizient: Nutzt effiziente Graph-Algorithmen von
petgraph
// Input
fn main() {
let user = createUser("John");
print(user.name);
}
struct User {
name: string;
}
fn createUser(name: string): User {
return User { name };
}
// Output (automatisch sortiert)
struct User {
name: string;
}
fn createUser(name: string): User {
return User { name };
}
fn main() {
let user = createUser("John");
print(user.name);
}
// Input
fn processList<T>(items: List<T>): List<T> {
return items.map(transform);
}
fn transform<T>(item: T): T {
return item;
}
struct Container<T> {
value: T;
}
// Output (automatisch sortiert)
struct Container<T> {
value: T;
}
fn transform<T>(item: T): T {
return item;
}
fn processList<T>(items: List<T>): List<T> {
return items.map(transform);
}
- Compiler Architecture - Compiler-Pass-System
- Type Inference - Type-Inference System
- Module Resolution - Modul-Auflösung
Letzte Aktualisierung: 2026-01-30
Version: 3.1.0