aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/shedlang/compiler/backends/PatioBackends.java
blob: b8f93ca37c62445ffdad7f0a2d0aac61963f55a9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package org.shedlang.compiler.backends;

import org.shedlang.compiler.config.BinConfig;
import org.shedlang.compiler.config.ProfileConfig;
import org.shedlang.compiler.config.ProjectConfig;
import org.shedlang.compiler.patio.PatioCompilationUnit;
import org.shedlang.compiler.shid.ShidNamespace;
import org.shedlang.compiler.shidtopatio.ShidToPatio;
import org.shedlang.compiler.shidtopatio.ShidToPatioContext;
import org.shedlang.compiler.sources.Sources;
import org.shedlang.compiler.typechecker.TypeInfos;
import org.shedlang.compiler.types.NamespaceName;

import java.io.IOException;
import java.util.List;
import java.util.Optional;

public class PatioBackends {
    public interface PatioToTarget {
        PatioToTarget namespace(
            NamespaceName namespaceName,
            PatioCompilationUnit patioCompilationUnit
        ) throws IOException, InterruptedException;

        void bin(
            String binName,
            PatioCompilationUnit patioCompilationUnit,
            String mainFunctionName,
            ProfileConfig profileConfig
        ) throws IOException, InterruptedException;
    }

    public static void compile(
        ProjectConfig config,
        ProfileConfig profileConfig,
        List<ShidNamespace> namespaces,
        TypeInfos typeInfos,
        PatioToTarget patioToTarget
    ) throws IOException, InterruptedException {
        var shidToPatioGlobalContext = ShidToPatioContext.GlobalContext.forTypeInfos(typeInfos);

        for (var namespace : namespaces) {
            var shidToPatioContext = ShidToPatioContext.initialForCompilationUnit(
                Optional.of(namespace.namespaceName()),
                shidToPatioGlobalContext
            );
            var patioCompilationUnitResult = ShidToPatio.generateNamespace(
                namespace,
                shidToPatioContext
            );
            var patioCompilationUnit = patioCompilationUnitResult.value();
            shidToPatioGlobalContext = patioCompilationUnitResult.context();

            patioToTarget = patioToTarget.namespace(namespace.namespaceName(), patioCompilationUnit);
        }

        for (var bin : config.bins()) {
            generateMain(profileConfig, bin, shidToPatioGlobalContext, patioToTarget);
        }
    }

    private static void generateMain(
        ProfileConfig profileConfig,
        BinConfig binConfig,
        ShidToPatioContext.GlobalContext shidToPatioGlobalContext,
        PatioToTarget patioToTarget
    ) throws IOException, InterruptedException {
        var shidToPatioContext = ShidToPatioContext.initialForCompilationUnit(
            Optional.empty(),
            shidToPatioGlobalContext
        );

        // TODO: set appropriate source
        var source = Sources.NULL;

        var generateMainResult = ShidToPatio.generateMain(
            binConfig.mainNamespace(),
            source,
            shidToPatioContext
        );
        var mainFunctionName = generateMainResult.value();
        shidToPatioContext = generateMainResult.context();

        shidToPatioContext = ShidToPatio.generateRtti(
            source,
            shidToPatioContext
        );

        var patioCompilationUnitResult = shidToPatioContext.toCompilationUnit(source);
        var patioCompilationUnit = patioCompilationUnitResult.value();
        shidToPatioGlobalContext = patioCompilationUnitResult.context();

        patioToTarget.bin(
            binConfig.name(),
            patioCompilationUnit,
            mainFunctionName,
            profileConfig
        );
    }
}