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
);
}
}
|