firefly-compiler 0.4.36 → 0.4.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/.hintrc +4 -4
  2. package/.vscode/settings.json +4 -4
  3. package/bin/Release.ff +99 -49
  4. package/bin/firefly.mjs +1 -1
  5. package/compiler/Builder.ff +257 -257
  6. package/compiler/Compiler.ff +227 -227
  7. package/compiler/Dependencies.ff +186 -186
  8. package/compiler/DependencyLock.ff +17 -17
  9. package/compiler/JsEmitter.ff +946 -946
  10. package/compiler/LspHook.ff +202 -202
  11. package/compiler/ModuleCache.ff +178 -178
  12. package/compiler/Workspace.ff +88 -88
  13. package/core/.firefly/include/package-lock.json +394 -394
  14. package/core/.firefly/include/package.json +5 -5
  15. package/core/.firefly/include/prepare.sh +1 -1
  16. package/core/.firefly/package.ff +2 -2
  17. package/core/Array.ff +265 -265
  18. package/core/Atomic.ff +64 -64
  19. package/core/Box.ff +7 -7
  20. package/core/BrowserSystem.ff +40 -37
  21. package/core/Buffer.ff +3 -3
  22. package/core/BuildSystem.ff +148 -145
  23. package/core/Crypto.ff +96 -95
  24. package/core/Equal.ff +36 -36
  25. package/core/HttpClient.ff +87 -87
  26. package/core/Instant.ff +17 -0
  27. package/core/JsSystem.ff +69 -69
  28. package/core/Json.ff +434 -434
  29. package/core/List.ff +415 -415
  30. package/core/Lock.ff +144 -144
  31. package/core/NodeSystem.ff +189 -189
  32. package/core/Ordering.ff +161 -161
  33. package/core/Path.ff +401 -401
  34. package/core/Random.ff +134 -134
  35. package/core/RbMap.ff +216 -216
  36. package/core/Show.ff +43 -43
  37. package/core/SourceLocation.ff +68 -68
  38. package/core/Stream.ff +1 -1
  39. package/core/Task.ff +141 -141
  40. package/experimental/benchmarks/ListGrab.ff +23 -23
  41. package/experimental/benchmarks/ListGrab.java +55 -55
  42. package/experimental/benchmarks/Pyrotek45.ff +30 -30
  43. package/experimental/benchmarks/Pyrotek45.java +64 -64
  44. package/experimental/bidirectional/Bidi.ff +88 -88
  45. package/experimental/random/Index.ff +53 -53
  46. package/experimental/random/Process.ff +120 -120
  47. package/experimental/random/RunLength.ff +3 -3
  48. package/experimental/random/Scrape.ff +51 -51
  49. package/experimental/random/Symbols.ff +73 -73
  50. package/experimental/random/Tensor.ff +52 -52
  51. package/experimental/random/Units.ff +36 -36
  52. package/experimental/s3/S3TestAuthorizationHeader.ff +38 -38
  53. package/experimental/s3/S3TestPut.ff +15 -15
  54. package/experimental/tests/TestJson.ff +26 -26
  55. package/firefly.sh +0 -0
  56. package/fireflysite/Main.ff +13 -13
  57. package/lsp/.firefly/package.ff +1 -1
  58. package/lsp/CompletionHandler.ff +811 -811
  59. package/lsp/Handler.ff +714 -714
  60. package/lsp/HoverHandler.ff +79 -79
  61. package/lsp/LanguageServer.ff +272 -272
  62. package/lsp/SignatureHelpHandler.ff +55 -55
  63. package/lsp/SymbolHandler.ff +181 -181
  64. package/lsp/TestReferences.ff +16 -16
  65. package/lsp/TestReferencesCase.ff +7 -7
  66. package/lsp/stderr.txt +1 -1
  67. package/lsp/stdout.txt +34 -34
  68. package/lux/.firefly/package.ff +1 -1
  69. package/lux/Css.ff +648 -648
  70. package/lux/CssTest.ff +48 -48
  71. package/lux/Lux.ff +487 -487
  72. package/lux/LuxEvent.ff +116 -116
  73. package/lux/Main.ff +128 -128
  74. package/lux/Main2.ff +144 -144
  75. package/output/js/ff/compiler/Builder.mjs +43 -43
  76. package/output/js/ff/compiler/Dependencies.mjs +3 -3
  77. package/output/js/ff/core/Array.mjs +59 -59
  78. package/output/js/ff/core/Atomic.mjs +36 -36
  79. package/output/js/ff/core/BrowserSystem.mjs +19 -11
  80. package/output/js/ff/core/Buffer.mjs +7 -7
  81. package/output/js/ff/core/BuildSystem.mjs +38 -30
  82. package/output/js/ff/core/Crypto.mjs +67 -68
  83. package/output/js/ff/core/HttpClient.mjs +24 -24
  84. package/output/js/ff/core/Instant.mjs +38 -0
  85. package/output/js/ff/core/Json.mjs +147 -147
  86. package/output/js/ff/core/List.mjs +50 -50
  87. package/output/js/ff/core/Lock.mjs +97 -97
  88. package/output/js/ff/core/NodeSystem.mjs +77 -77
  89. package/output/js/ff/core/Ordering.mjs +8 -8
  90. package/output/js/ff/core/Path.mjs +231 -231
  91. package/output/js/ff/core/Random.mjs +56 -56
  92. package/output/js/ff/core/Stream.mjs +2 -2
  93. package/output/js/ff/core/Task.mjs +31 -31
  94. package/package.json +29 -29
  95. package/rpc/.firefly/package.ff +1 -1
  96. package/rpc/Rpc.ff +69 -69
  97. package/s3/.firefly/package.ff +1 -0
  98. package/{experimental/s3 → s3}/S3.ff +92 -92
  99. package/unsafejs/UnsafeJs.ff +19 -19
  100. package/vscode/LICENSE.txt +21 -21
  101. package/vscode/Prepublish.ff +15 -15
  102. package/vscode/README.md +16 -16
  103. package/vscode/client/package.json +22 -22
  104. package/vscode/client/src/extension.ts +104 -104
  105. package/vscode/icons/firefly-icon.svg +10 -10
  106. package/vscode/language-configuration.json +61 -61
  107. package/vscode/package-lock.json +3623 -3623
  108. package/vscode/package.json +160 -160
  109. package/vscode/snippets.json +241 -241
  110. package/webserver/.firefly/include/package-lock.json +16 -16
  111. package/webserver/.firefly/include/package.json +5 -5
  112. package/webserver/.firefly/package.ff +2 -2
  113. package/webserver/WebServer.ff +685 -685
  114. package/websocket/.firefly/package.ff +1 -1
  115. package/websocket/WebSocket.ff +131 -131
  116. package/crypto/SubtleCrypto.ff +0 -149
@@ -1,227 +1,227 @@
1
- import Syntax
2
- import Tokenizer
3
- import ModuleCache
4
- import Parser
5
- import Resolver
6
- import Deriver
7
- import Inference
8
- import JsEmitter
9
- import Dictionaries
10
- import Dependencies
11
- import LspHook
12
-
13
- capability Compiler(
14
- emitTarget: EmitTarget
15
- task: Task
16
- compilerModulePath: Option[Path]
17
- jsOutputPath: Path
18
- packagePaths: Map[PackagePair, Path]
19
- singleFilePackages: Set[PackagePair]
20
- virtualFiles: Map[String, String]
21
- cache: ModuleCache
22
- lspHook: LspHook
23
- mutable phaseDurationDelta: Duration
24
- phaseDurations: Array[Pair[String, Duration]]
25
- )
26
-
27
- new(
28
- emitTarget: EmitTarget
29
- task: Task
30
- compilerModulePath: Option[Path]
31
- jsOutputPath: Path
32
- resolvedDependencies: ResolvedDependencies
33
- virtualFiles: Map[String, String]
34
- cache: ModuleCache
35
- lspHook: LspHook
36
- ): Compiler {
37
- Compiler(
38
- emitTarget = emitTarget
39
- task = task
40
- compilerModulePath = compilerModulePath
41
- jsOutputPath = jsOutputPath
42
- packagePaths = resolvedDependencies.packagePaths
43
- singleFilePackages = resolvedDependencies.singleFilePackages
44
- virtualFiles = virtualFiles
45
- cache = cache
46
- lspHook = lspHook
47
- phaseDurationDelta = Duration(0.0)
48
- phaseDurations = [].toArray()
49
- )
50
- }
51
-
52
- fail[T](at: Location, message: String): T {
53
- panic(message + " " + at.show())
54
- }
55
-
56
- coreImports: List[DImport] =
57
- [
58
- "Any"
59
- "Array"
60
- "AssetSystem"
61
- "Atomic"
62
- "Bool"
63
- "BrowserSystem"
64
- "Buffer"
65
- "BuildSystem"
66
- "Channel"
67
- "Char"
68
- "Core"
69
- "Crypto"
70
- "Duration"
71
- "Equal"
72
- "Error"
73
- "FileHandle"
74
- "Float"
75
- "HttpClient"
76
- "Instant"
77
- "Int"
78
- "IntMap"
79
- "Json"
80
- "JsValue"
81
- "JsSystem"
82
- "List"
83
- "Lock"
84
- "Log"
85
- "Map"
86
- "NodeSystem"
87
- "Nothing"
88
- "Option"
89
- "Ordering"
90
- "Pair"
91
- "Path"
92
- "Random"
93
- "Serializable"
94
- "Set"
95
- "Show"
96
- "SourceLocation"
97
- "Stream"
98
- "String"
99
- "StringMap"
100
- "Task"
101
- "Try"
102
- "Unit"
103
- ].map {moduleName =>
104
- DImport(
105
- at = Location("<prelude>", 1, 1)
106
- alias = moduleName
107
- package = PackagePair("ff", "core")
108
- directory = []
109
- file = moduleName
110
- )
111
- }
112
-
113
- extend self: Compiler {
114
-
115
- measure[T](phase: String, packagePair: PackagePair, moduleName: String, body: () => T): T {
116
- let start = Duration(self.task.elapsed().seconds - self.phaseDurationDelta.seconds)
117
- let result = body()
118
- let stop = Duration(self.task.elapsed().seconds - self.phaseDurationDelta.seconds)
119
- let duration = Duration(stop.seconds - start.seconds)
120
- self.phaseDurationDelta = Duration(self.phaseDurationDelta.seconds + duration.seconds)
121
- let text = phase + " " + packagePair.groupName() + "/" + moduleName
122
- self.phaseDurations.push(Pair(text, duration))
123
- result
124
- }
125
-
126
- printMeasurements(): Unit {
127
- let worst = self.phaseDurations.toList().sortBy {
128
- (_.second.seconds + 1000000.0) + ""
129
- }.takeLast(5).reverse()
130
- worst.each {| Pair(text, duration) =>
131
- Log.debug(text + ":\t" + duration.show())
132
- }
133
- }
134
-
135
- parse(packagePair: PackagePair, moduleName: String, importedAt: Option[Location]): Module {
136
- self.cache.cacheParsedModule(self.packagePaths, packagePair, moduleName): path =>
137
- let packageName = packagePair.groupName()
138
- self.measure("Parse", packagePair, moduleName):
139
- let code = self.virtualFiles.get(path.absolute()).else {
140
- importedAt.each {at => if(!path.exists()) {
141
- throw(CompileError(at, "Imported module not found: " + packageName + "/" + moduleName))
142
- }}
143
- path.readText()
144
- }
145
- let completionAt = if(self.lspHook.isEnabled() && self.lspHook.insertIdentifier) {self.lspHook.at}
146
- let tokens = Tokenizer.tokenize(path.absolute(), code, completionAt, self.lspHook.isEnabled())
147
- let parser = Parser.new(packagePair, path.base(), tokens, self.emitTarget != EmitBrowser, self.lspHook)
148
- let module = if(self.singleFilePackages.contains(packagePair)) {
149
- parser.parseModuleWithPackageInfo().module
150
- } else {
151
- parser.parseModuleWithoutPackageInfo()
152
- }
153
- let result = module.Module(
154
- imports = [...coreImports, ...module.imports]
155
- )
156
- result
157
- }
158
-
159
- imports(module: Module): List[Module] {
160
- module.imports.map {import =>
161
- let newPackagePair = import.package
162
- let newModuleName = import.directory.map {_ + "/"}.join("") + import.file
163
- if(!self.packagePaths.contains(newPackagePair)) {
164
- throw(CompileError(import.at, "Missing dependency declaration for: " + newPackagePair.groupName()))
165
- }
166
- try {
167
- self.parse(newPackagePair, newModuleName, Some(import.at))
168
- } catch {| CompileError(_, _) @ e, error =>
169
- let newError = CompileError(import.at, "Parse error in imported module: " + import.package.groupName() + "/" + newModuleName)
170
- throw(CompileErrors([e, newError]))
171
- } grab()
172
- }
173
- }
174
-
175
- resolve(packagePair: PackagePair, moduleName: String): Module {
176
- self.cache.cacheResolvedModule(self.packagePaths, packagePair, moduleName): path =>
177
- self.measure("Resolve", packagePair, moduleName):
178
-
179
- let module = self.parse(packagePair, moduleName, None)
180
- let otherModules = self.imports(module)
181
- let resolver = Resolver.new(packagePair, moduleName, self.lspHook)
182
- resolver.resolveModule(module, otherModules)
183
- }
184
-
185
- derive(packagePair: PackagePair, moduleName: String): Module {
186
- self.cache.cacheDerivedModule(self.packagePaths, packagePair, moduleName): path =>
187
- self.measure("Derive", packagePair, moduleName):
188
-
189
- let module = self.resolve(packagePair, moduleName)
190
- Deriver.new().deriveModule(module)
191
- }
192
-
193
- infer(packagePair: PackagePair, moduleName: String): Module {
194
- self.cache.cacheInferredModule(self.packagePaths, packagePair, moduleName): path =>
195
- self.measure("Infer", packagePair, moduleName):
196
-
197
- let module = self.derive(packagePair, moduleName)
198
- let otherModules = self.imports(module).map {i =>
199
- self.derive(i.packagePair, i.file.dropLast(".ff".size()))
200
- }
201
- let inference = Inference.new([module, ...otherModules], self.lspHook)
202
- let inferredModule = inference.inferModule(module, otherModules)
203
- Dictionaries.new([module, ...otherModules]).processModule(inferredModule, otherModules)
204
- }
205
-
206
- emit(packagePair: PackagePair, moduleName: String, isMainModule: Bool): Unit {
207
- self.cache.cacheEmittedModule(self.packagePaths, packagePair, moduleName): path =>
208
- self.measure("Emit", packagePair, moduleName):
209
-
210
- let module = self.infer(packagePair, moduleName)
211
- let otherModules = self.imports(module).map {i =>
212
- let newModuleName = i.file.dropLast(".ff".size())
213
- self.emit(i.packagePair, newModuleName, isMainModule = False)
214
- self.infer(i.packagePair, newModuleName)
215
- }
216
-
217
- let allModules = [module, ...otherModules]
218
- let js =
219
- JsEmitter.new(allModules, self.emitTarget, isMainModule, self.compilerModulePath, packagePair, moduleName)
220
- .emitModule(packagePair, module)
221
- let jsPath = self.jsOutputPath.slash(packagePair.group).slash(packagePair.name)
222
- let jsFile = jsPath.slash(moduleName + ".mjs")
223
- jsPath.createDirectory(createParentDirectories = True)
224
- jsFile.writeText(js)
225
- }
226
-
227
- }
1
+ import Syntax
2
+ import Tokenizer
3
+ import ModuleCache
4
+ import Parser
5
+ import Resolver
6
+ import Deriver
7
+ import Inference
8
+ import JsEmitter
9
+ import Dictionaries
10
+ import Dependencies
11
+ import LspHook
12
+
13
+ capability Compiler(
14
+ emitTarget: EmitTarget
15
+ task: Task
16
+ compilerModulePath: Option[Path]
17
+ jsOutputPath: Path
18
+ packagePaths: Map[PackagePair, Path]
19
+ singleFilePackages: Set[PackagePair]
20
+ virtualFiles: Map[String, String]
21
+ cache: ModuleCache
22
+ lspHook: LspHook
23
+ mutable phaseDurationDelta: Duration
24
+ phaseDurations: Array[Pair[String, Duration]]
25
+ )
26
+
27
+ new(
28
+ emitTarget: EmitTarget
29
+ task: Task
30
+ compilerModulePath: Option[Path]
31
+ jsOutputPath: Path
32
+ resolvedDependencies: ResolvedDependencies
33
+ virtualFiles: Map[String, String]
34
+ cache: ModuleCache
35
+ lspHook: LspHook
36
+ ): Compiler {
37
+ Compiler(
38
+ emitTarget = emitTarget
39
+ task = task
40
+ compilerModulePath = compilerModulePath
41
+ jsOutputPath = jsOutputPath
42
+ packagePaths = resolvedDependencies.packagePaths
43
+ singleFilePackages = resolvedDependencies.singleFilePackages
44
+ virtualFiles = virtualFiles
45
+ cache = cache
46
+ lspHook = lspHook
47
+ phaseDurationDelta = Duration(0.0)
48
+ phaseDurations = [].toArray()
49
+ )
50
+ }
51
+
52
+ fail[T](at: Location, message: String): T {
53
+ panic(message + " " + at.show())
54
+ }
55
+
56
+ coreImports: List[DImport] =
57
+ [
58
+ "Any"
59
+ "Array"
60
+ "AssetSystem"
61
+ "Atomic"
62
+ "Bool"
63
+ "BrowserSystem"
64
+ "Buffer"
65
+ "BuildSystem"
66
+ "Channel"
67
+ "Char"
68
+ "Core"
69
+ "Crypto"
70
+ "Duration"
71
+ "Equal"
72
+ "Error"
73
+ "FileHandle"
74
+ "Float"
75
+ "HttpClient"
76
+ "Instant"
77
+ "Int"
78
+ "IntMap"
79
+ "Json"
80
+ "JsValue"
81
+ "JsSystem"
82
+ "List"
83
+ "Lock"
84
+ "Log"
85
+ "Map"
86
+ "NodeSystem"
87
+ "Nothing"
88
+ "Option"
89
+ "Ordering"
90
+ "Pair"
91
+ "Path"
92
+ "Random"
93
+ "Serializable"
94
+ "Set"
95
+ "Show"
96
+ "SourceLocation"
97
+ "Stream"
98
+ "String"
99
+ "StringMap"
100
+ "Task"
101
+ "Try"
102
+ "Unit"
103
+ ].map {moduleName =>
104
+ DImport(
105
+ at = Location("<prelude>", 1, 1)
106
+ alias = moduleName
107
+ package = PackagePair("ff", "core")
108
+ directory = []
109
+ file = moduleName
110
+ )
111
+ }
112
+
113
+ extend self: Compiler {
114
+
115
+ measure[T](phase: String, packagePair: PackagePair, moduleName: String, body: () => T): T {
116
+ let start = Duration(self.task.elapsed().seconds - self.phaseDurationDelta.seconds)
117
+ let result = body()
118
+ let stop = Duration(self.task.elapsed().seconds - self.phaseDurationDelta.seconds)
119
+ let duration = Duration(stop.seconds - start.seconds)
120
+ self.phaseDurationDelta = Duration(self.phaseDurationDelta.seconds + duration.seconds)
121
+ let text = phase + " " + packagePair.groupName() + "/" + moduleName
122
+ self.phaseDurations.push(Pair(text, duration))
123
+ result
124
+ }
125
+
126
+ printMeasurements(): Unit {
127
+ let worst = self.phaseDurations.toList().sortBy {
128
+ (_.second.seconds + 1000000.0) + ""
129
+ }.takeLast(5).reverse()
130
+ worst.each {| Pair(text, duration) =>
131
+ Log.debug(text + ":\t" + duration.show())
132
+ }
133
+ }
134
+
135
+ parse(packagePair: PackagePair, moduleName: String, importedAt: Option[Location]): Module {
136
+ self.cache.cacheParsedModule(self.packagePaths, packagePair, moduleName): path =>
137
+ let packageName = packagePair.groupName()
138
+ self.measure("Parse", packagePair, moduleName):
139
+ let code = self.virtualFiles.get(path.absolute()).else {
140
+ importedAt.each {at => if(!path.exists()) {
141
+ throw(CompileError(at, "Imported module not found: " + packageName + "/" + moduleName))
142
+ }}
143
+ path.readText()
144
+ }
145
+ let completionAt = if(self.lspHook.isEnabled() && self.lspHook.insertIdentifier) {self.lspHook.at}
146
+ let tokens = Tokenizer.tokenize(path.absolute(), code, completionAt, self.lspHook.isEnabled())
147
+ let parser = Parser.new(packagePair, path.base(), tokens, self.emitTarget != EmitBrowser, self.lspHook)
148
+ let module = if(self.singleFilePackages.contains(packagePair)) {
149
+ parser.parseModuleWithPackageInfo().module
150
+ } else {
151
+ parser.parseModuleWithoutPackageInfo()
152
+ }
153
+ let result = module.Module(
154
+ imports = [...coreImports, ...module.imports]
155
+ )
156
+ result
157
+ }
158
+
159
+ imports(module: Module): List[Module] {
160
+ module.imports.map {import =>
161
+ let newPackagePair = import.package
162
+ let newModuleName = import.directory.map {_ + "/"}.join("") + import.file
163
+ if(!self.packagePaths.contains(newPackagePair)) {
164
+ throw(CompileError(import.at, "Missing dependency declaration for: " + newPackagePair.groupName()))
165
+ }
166
+ try {
167
+ self.parse(newPackagePair, newModuleName, Some(import.at))
168
+ } catch {| CompileError(_, _) @ e, error =>
169
+ let newError = CompileError(import.at, "Parse error in imported module: " + import.package.groupName() + "/" + newModuleName)
170
+ throw(CompileErrors([e, newError]))
171
+ } grab()
172
+ }
173
+ }
174
+
175
+ resolve(packagePair: PackagePair, moduleName: String): Module {
176
+ self.cache.cacheResolvedModule(self.packagePaths, packagePair, moduleName): path =>
177
+ self.measure("Resolve", packagePair, moduleName):
178
+
179
+ let module = self.parse(packagePair, moduleName, None)
180
+ let otherModules = self.imports(module)
181
+ let resolver = Resolver.new(packagePair, moduleName, self.lspHook)
182
+ resolver.resolveModule(module, otherModules)
183
+ }
184
+
185
+ derive(packagePair: PackagePair, moduleName: String): Module {
186
+ self.cache.cacheDerivedModule(self.packagePaths, packagePair, moduleName): path =>
187
+ self.measure("Derive", packagePair, moduleName):
188
+
189
+ let module = self.resolve(packagePair, moduleName)
190
+ Deriver.new().deriveModule(module)
191
+ }
192
+
193
+ infer(packagePair: PackagePair, moduleName: String): Module {
194
+ self.cache.cacheInferredModule(self.packagePaths, packagePair, moduleName): path =>
195
+ self.measure("Infer", packagePair, moduleName):
196
+
197
+ let module = self.derive(packagePair, moduleName)
198
+ let otherModules = self.imports(module).map {i =>
199
+ self.derive(i.packagePair, i.file.dropLast(".ff".size()))
200
+ }
201
+ let inference = Inference.new([module, ...otherModules], self.lspHook)
202
+ let inferredModule = inference.inferModule(module, otherModules)
203
+ Dictionaries.new([module, ...otherModules]).processModule(inferredModule, otherModules)
204
+ }
205
+
206
+ emit(packagePair: PackagePair, moduleName: String, isMainModule: Bool): Unit {
207
+ self.cache.cacheEmittedModule(self.packagePaths, packagePair, moduleName): path =>
208
+ self.measure("Emit", packagePair, moduleName):
209
+
210
+ let module = self.infer(packagePair, moduleName)
211
+ let otherModules = self.imports(module).map {i =>
212
+ let newModuleName = i.file.dropLast(".ff".size())
213
+ self.emit(i.packagePair, newModuleName, isMainModule = False)
214
+ self.infer(i.packagePair, newModuleName)
215
+ }
216
+
217
+ let allModules = [module, ...otherModules]
218
+ let js =
219
+ JsEmitter.new(allModules, self.emitTarget, isMainModule, self.compilerModulePath, packagePair, moduleName)
220
+ .emitModule(packagePair, module)
221
+ let jsPath = self.jsOutputPath.slash(packagePair.group).slash(packagePair.name)
222
+ let jsFile = jsPath.slash(moduleName + ".mjs")
223
+ jsPath.createDirectory(createParentDirectories = True)
224
+ jsFile.writeText(js)
225
+ }
226
+
227
+ }