firefly-compiler 0.4.18 → 0.4.20

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/compiler/Builder.ff +1 -1
  2. package/compiler/Compiler.ff +6 -5
  3. package/compiler/Inference.ff +31 -19
  4. package/compiler/JsEmitter.ff +98 -71
  5. package/compiler/JsImporter.ff +1 -1
  6. package/compiler/LspHook.ff +17 -5
  7. package/compiler/Main.ff +6 -6
  8. package/compiler/Parser.ff +50 -52
  9. package/compiler/Patterns.ff +2 -0
  10. package/compiler/Syntax.ff +1 -1
  11. package/compiler/Tokenizer.ff +2 -2
  12. package/compiler/Workspace.ff +2 -2
  13. package/core/Array.ff +135 -294
  14. package/core/Buffer.ff +3 -3
  15. package/core/BuildSystem.ff +1 -1
  16. package/core/Equal.ff +36 -52
  17. package/core/HttpClient.ff +1 -1
  18. package/core/IntMap.ff +14 -18
  19. package/core/JsSystem.ff +1 -1
  20. package/core/JsValue.ff +6 -12
  21. package/core/Json.ff +21 -30
  22. package/core/List.ff +281 -312
  23. package/core/Map.ff +4 -8
  24. package/core/NodeSystem.ff +2 -2
  25. package/core/Option.ff +0 -4
  26. package/core/Ordering.ff +10 -6
  27. package/core/Pair.ff +0 -4
  28. package/core/Random.ff +12 -26
  29. package/core/RbMap.ff +216 -216
  30. package/core/Serializable.ff +9 -18
  31. package/core/Set.ff +0 -1
  32. package/core/SourceLocation.ff +1 -1
  33. package/core/Stream.ff +10 -14
  34. package/core/String.ff +24 -6
  35. package/core/StringMap.ff +15 -19
  36. package/guide/Main.ff +20 -2
  37. package/lsp/CompletionHandler.ff +18 -18
  38. package/lsp/Handler.ff +45 -34
  39. package/lsp/HoverHandler.ff +2 -2
  40. package/lsp/LanguageServer.ff +2 -2
  41. package/lsp/SignatureHelpHandler.ff +1 -1
  42. package/lsp/SymbolHandler.ff +19 -5
  43. package/lux/Lux.ff +3 -3
  44. package/output/js/ff/compiler/Builder.mjs +19 -21
  45. package/output/js/ff/compiler/Compiler.mjs +18 -20
  46. package/output/js/ff/compiler/Dependencies.mjs +8 -10
  47. package/output/js/ff/compiler/Deriver.mjs +234 -236
  48. package/output/js/ff/compiler/Dictionaries.mjs +6 -8
  49. package/output/js/ff/compiler/Environment.mjs +42 -44
  50. package/output/js/ff/compiler/Inference.mjs +346 -304
  51. package/output/js/ff/compiler/JsEmitter.mjs +907 -833
  52. package/output/js/ff/compiler/JsImporter.mjs +0 -2
  53. package/output/js/ff/compiler/LspHook.mjs +872 -51
  54. package/output/js/ff/compiler/Main.mjs +109 -111
  55. package/output/js/ff/compiler/Parser.mjs +427 -441
  56. package/output/js/ff/compiler/Patterns.mjs +64 -50
  57. package/output/js/ff/compiler/Resolver.mjs +36 -38
  58. package/output/js/ff/compiler/Substitution.mjs +4 -6
  59. package/output/js/ff/compiler/Syntax.mjs +160 -162
  60. package/output/js/ff/compiler/Token.mjs +52 -54
  61. package/output/js/ff/compiler/Tokenizer.mjs +16 -18
  62. package/output/js/ff/compiler/Unification.mjs +24 -26
  63. package/output/js/ff/compiler/Wildcards.mjs +0 -2
  64. package/output/js/ff/compiler/Workspace.mjs +18 -20
  65. package/output/js/ff/core/Any.mjs +0 -2
  66. package/output/js/ff/core/Array.mjs +216 -613
  67. package/output/js/ff/core/AssetSystem.mjs +2 -4
  68. package/output/js/ff/core/Atomic.mjs +0 -2
  69. package/output/js/ff/core/Bool.mjs +0 -2
  70. package/output/js/ff/core/Box.mjs +0 -2
  71. package/output/js/ff/core/BrowserSystem.mjs +0 -2
  72. package/output/js/ff/core/Buffer.mjs +0 -2
  73. package/output/js/ff/core/BuildSystem.mjs +12 -14
  74. package/output/js/ff/core/Channel.mjs +0 -2
  75. package/output/js/ff/core/Char.mjs +0 -2
  76. package/output/js/ff/core/Core.mjs +0 -2
  77. package/output/js/ff/core/Duration.mjs +0 -2
  78. package/output/js/ff/core/Equal.mjs +0 -22
  79. package/output/js/ff/core/Error.mjs +0 -2
  80. package/output/js/ff/core/FileHandle.mjs +0 -2
  81. package/output/js/ff/core/Float.mjs +0 -2
  82. package/output/js/ff/core/HttpClient.mjs +2 -4
  83. package/output/js/ff/core/Instant.mjs +0 -2
  84. package/output/js/ff/core/Int.mjs +8 -10
  85. package/output/js/ff/core/IntMap.mjs +32 -42
  86. package/output/js/ff/core/JsSystem.mjs +1 -3
  87. package/output/js/ff/core/JsValue.mjs +5 -12
  88. package/output/js/ff/core/Json.mjs +25 -58
  89. package/output/js/ff/core/List.mjs +648 -1989
  90. package/output/js/ff/core/Lock.mjs +0 -2
  91. package/output/js/ff/core/Log.mjs +0 -2
  92. package/output/js/ff/core/Map.mjs +10 -20
  93. package/output/js/ff/core/NodeSystem.mjs +6 -8
  94. package/output/js/ff/core/Nothing.mjs +0 -2
  95. package/output/js/ff/core/Option.mjs +8 -18
  96. package/output/js/ff/core/Ordering.mjs +20 -98
  97. package/output/js/ff/core/Pair.mjs +6 -16
  98. package/output/js/ff/core/Path.mjs +12 -14
  99. package/output/js/ff/core/Random.mjs +24 -54
  100. package/output/js/ff/core/RbMap.mjs +54 -56
  101. package/output/js/ff/core/Serializable.mjs +19 -36
  102. package/output/js/ff/core/Set.mjs +0 -14
  103. package/output/js/ff/core/Show.mjs +0 -2
  104. package/output/js/ff/core/SourceLocation.mjs +0 -2
  105. package/output/js/ff/core/Stream.mjs +34 -44
  106. package/output/js/ff/core/String.mjs +31 -5
  107. package/output/js/ff/core/StringMap.mjs +32 -42
  108. package/output/js/ff/core/Task.mjs +0 -2
  109. package/output/js/ff/core/Try.mjs +0 -2
  110. package/output/js/ff/core/Unit.mjs +0 -2
  111. package/package.json +1 -1
  112. package/vscode/client/src/extension.ts +30 -2
  113. package/vscode/package.json +17 -1
  114. package/webserver/WebServer.ff +8 -8
  115. package/core/Stack.ff +0 -263
  116. package/output/js/ff/core/Stack.mjs +0 -603
package/compiler/Main.ff CHANGED
@@ -108,7 +108,7 @@ main(system: NodeSystem): Unit {
108
108
  }
109
109
 
110
110
  try {
111
- let command = parseCommandLine(system.arguments().toList())
111
+ let command = parseCommandLine(system.arguments())
112
112
  runCommand(command)
113
113
  } catch {| CommandLineError(message), error =>
114
114
  Log.debug(message)
@@ -144,7 +144,7 @@ parseCommandLine(arguments: List[String]): MainCommand {
144
144
  browserArguments.{
145
145
  | [mainFile] {mainFile.removeLast(".ff") | Some(mainName)} =>
146
146
  BrowserCommand(mainName)
147
- | [_, _, ..._] => throw(CommandLineError(
147
+ | [_, _, ...] => throw(CommandLineError(
148
148
  "You must only specify a single argument to browser." + usageString
149
149
  ))
150
150
  | _ => throw(CommandLineError(
@@ -155,7 +155,7 @@ parseCommandLine(arguments: List[String]): MainCommand {
155
155
  buildArguments.{
156
156
  | [mainFile] {mainFile.removeLast(".ff") | Some(mainName)} =>
157
157
  BuildCommand(mainName)
158
- | [_, _, ..._] => throw(CommandLineError(
158
+ | [_, _, ...] => throw(CommandLineError(
159
159
  "You must only specify a single argument to build." + usageString
160
160
  ))
161
161
  | _ => throw(CommandLineError(
@@ -166,7 +166,7 @@ parseCommandLine(arguments: List[String]): MainCommand {
166
166
  checkArguments.{
167
167
  | [fileName] {fileName.removeLast(".ff") | Some(_)} =>
168
168
  CheckCommand(fileName)
169
- | [_, _, ..._] => throw(CommandLineError(
169
+ | [_, _, ...] => throw(CommandLineError(
170
170
  "You must only specify a single argument to check." + usageString
171
171
  ))
172
172
  | _ => throw(CommandLineError(
@@ -177,7 +177,7 @@ parseCommandLine(arguments: List[String]): MainCommand {
177
177
  throw(CommandLineError("bootstrap takes no arguments" + usageString))
178
178
  | ["bootstrap"] => BootstrapCommand
179
179
  | [] => throw(CommandLineError("You must specify a command or a main file to run." + usageString))
180
- | [s, ..._] => throw(CommandLineError("Unknown command '" + s + "'" + usageString))
180
+ | [s, ...] => throw(CommandLineError("Unknown command '" + s + "'" + usageString))
181
181
  }
182
182
 
183
183
  bundleForPkg(system: NodeSystem, packagePair: PackagePair, mainFile: String) {
@@ -213,7 +213,7 @@ importAndRun(
213
213
  const workingDirectory = cwd.indexOf(':') == 1 ? 'file:///' + cwd : cwd;
214
214
  const packagePath = packagePair_.group_ + "/" + packagePair_.name_
215
215
  const main = await import(workingDirectory + "/.firefly/output/" + target_ + "/" + packagePath + "/" + mainFile_ + ".mjs");
216
- await main.$run$(fireflyPath_, ff_core_List.List_toArray(arguments_))
216
+ await main.$run$(fireflyPath_, arguments_)
217
217
  """
218
218
 
219
219
  prepareFireflyDirectory(path: Path) {
@@ -6,7 +6,7 @@ import LspHook
6
6
  class Parser(
7
7
  packagePair: PackagePair
8
8
  file: String
9
- tokens: Array[Token]
9
+ tokens: List[Token]
10
10
  end: Token
11
11
  targetIsNode: Bool
12
12
  lspHook: LspHook
@@ -32,7 +32,7 @@ data ParsedTargets(
32
32
  make(
33
33
  packagePair: PackagePair
34
34
  file: String
35
- tokens: Array[Token]
35
+ tokens: List[Token]
36
36
  targetIsNode: Bool
37
37
  lspHook: LspHook
38
38
  ): Parser {
@@ -151,12 +151,12 @@ extend self: Parser {
151
151
  /* TODO: if(self.package != None && self.current().is(LKeyword) && self.current().rawIs("dependency")) {
152
152
  self.fail(self.current().at(), "Dependencies must be defined in the same file as the package declaration")
153
153
  }*/
154
- let dependencies = Stack.make[DDependency]()
154
+ let dependencies = Array.make[DDependency]()
155
155
  while {self.current().is(LKeyword) && self.current().rawIs("dependency")} {
156
156
  dependencies.push(self.parseDependencyDefinition(package.targets))
157
157
  if(!self.current().is(LEnd)) {self.skipSeparator(LSemicolon)}
158
158
  }
159
- let includes = Stack.make[DInclude]()
159
+ let includes = Array.make[DInclude]()
160
160
  while {self.current().is(LKeyword) && self.current().rawIs("include")} {
161
161
  includes.push(self.parseIncludeDefinition())
162
162
  if(!self.current().is(LEnd)) {self.skipSeparator(LSemicolon)}
@@ -166,13 +166,13 @@ extend self: Parser {
166
166
  }
167
167
 
168
168
  parseModule(): Module {
169
- let imports = Stack.make[DImport]()
170
- let types = Stack.make[DType]()
171
- let traits = Stack.make[DTrait]()
172
- let instances = Stack.make[DInstance]()
173
- let extends = Stack.make[DExtend]()
174
- let lets = Stack.make[DLet]()
175
- let functions = Stack.make[DFunction]()
169
+ let imports = Array.make[DImport]()
170
+ let types = Array.make[DType]()
171
+ let traits = Array.make[DTrait]()
172
+ let instances = Array.make[DInstance]()
173
+ let extends = Array.make[DExtend]()
174
+ let lets = Array.make[DLet]()
175
+ let functions = Array.make[DFunction]()
176
176
  while {!self.current().is(LEnd)} {
177
177
  if(self.current().is(LLower) && (self.ahead().is(LAssign) || self.ahead().is(LColon))) {
178
178
  lets.push(self.parseLetDefinition())
@@ -232,7 +232,7 @@ extend self: Parser {
232
232
  if(self.lspHook.trackSymbols) {
233
233
  self.lspHook.emit(ParseSymbolEnd(
234
234
  name = nameToken.raw()
235
- kind = 14
235
+ kind = SLet(mutable = False)
236
236
  selectionStart = nameToken.at()
237
237
  selectionEnd = nameToken.end()
238
238
  start = nameToken.at()
@@ -254,10 +254,9 @@ extend self: Parser {
254
254
  bestTarget
255
255
  )
256
256
  if(self.lspHook.trackSymbols) {
257
- let kind = if(member) {6} else {12}
258
257
  self.lspHook.emit(ParseSymbolEnd(
259
258
  name = signature.name
260
- kind = kind
259
+ kind = SFunction(member)
261
260
  selectionStart = signature.at
262
261
  selectionEnd = signature.at.Location(column = signature.at.column + signature.name.size())
263
262
  start = signature.at
@@ -349,7 +348,7 @@ extend self: Parser {
349
348
  self.skip(LColon)
350
349
  let type = self.parseType()
351
350
  self.rawSkip(LBracketLeft, "{")
352
- let methods = Stack.make[DFunction]()
351
+ let methods = Array.make[DFunction]()
353
352
  while {!self.current().is(LBracketRight)} {
354
353
  methods.push(self.parseFunctionDefinition(member = True))
355
354
  if(!self.current().is(LBracketRight)) {self.skipSeparator(LSemicolon)}
@@ -365,7 +364,7 @@ extend self: Parser {
365
364
  }
366
365
  self.lspHook.emit(ParseSymbolEnd(
367
366
  name = name
368
- kind = 3 // Namespace
367
+ kind = SExtend
369
368
  selectionStart = nameToken.at()
370
369
  selectionEnd = nameToken.end()
371
370
  start = extendToken.at()
@@ -389,7 +388,7 @@ extend self: Parser {
389
388
  self.skip(LColon)
390
389
  let nameToken = self.skip(LUpper)
391
390
  let poly = if(!self.current().rawIs("[")) {Poly([], [])} else {self.parseTypeParameters()}
392
- let constraints = Stack.make[Constraint]()
391
+ let constraints = Array.make[Constraint]()
393
392
  while {self.current().is(LColon)} {
394
393
  self.fail(self.current().at(), "Trait constraints is not yet implemented")
395
394
  self.skip(LColon)
@@ -399,10 +398,10 @@ extend self: Parser {
399
398
  ))
400
399
  }
401
400
  let generatorParameters = if(!self.current().rawIs("(")) {[]} else {self.parseFunctionParameters()}
402
- let methodGenerators = Stack.make[Pair[String, Lambda]]()
403
- let methodDefaults = Stack.make[Pair[String, Lambda]]()
401
+ let methodGenerators = Array.make[Pair[String, Lambda]]()
402
+ let methodDefaults = Array.make[Pair[String, Lambda]]()
404
403
  let methodSignatures = if(!self.current().rawIs("{")) {[]} else {
405
- let signatures = Stack.make[Signature]()
404
+ let signatures = Array.make[Signature]()
406
405
  self.rawSkip(LBracketLeft, "{")
407
406
  while {!self.current().is(LBracketRight)} {
408
407
  if(self.lspHook.trackSymbols) {self.lspHook.emit(ParseSymbolBegin)}
@@ -411,7 +410,7 @@ extend self: Parser {
411
410
  if(self.lspHook.trackSymbols) {
412
411
  self.lspHook.emit(ParseSymbolEnd(
413
412
  name = signatureNameToken.raw()
414
- kind = 12 // Function
413
+ kind = STraitFunction
415
414
  selectionStart = signatureNameToken.at()
416
415
  selectionEnd = signatureNameToken.end()
417
416
  start = signatureNameToken.at()
@@ -436,7 +435,7 @@ extend self: Parser {
436
435
  if(self.lspHook.trackSymbols) {
437
436
  self.lspHook.emit(ParseSymbolEnd(
438
437
  name = nameToken.raw()
439
- kind = 11 // Interface
438
+ kind = STrait
440
439
  selectionStart = nameToken.at()
441
440
  selectionEnd = nameToken.end()
442
441
  start = traitToken.at()
@@ -460,7 +459,7 @@ extend self: Parser {
460
459
  let instanceToken = self.rawSkip(LKeyword, "instance")
461
460
  let token = self.skip(LUpper)
462
461
  let poly = if(!self.current().rawIs("[")) {Poly([], [])} else {self.parseTypeParameters()}
463
- let typeArguments = Stack.make[Type]()
462
+ let typeArguments = Array.make[Type]()
464
463
  typeArguments.push(TConstructor(token.at(), token.raw(), poly.generics.map {TConstructor(token.at(), _, [])}))
465
464
  self.skip(LColon)
466
465
  let nameToken = self.skip(LUpper)
@@ -474,7 +473,7 @@ extend self: Parser {
474
473
  }
475
474
  let generatorArguments = self.parseFunctionArguments(nameToken.at(), False).first
476
475
  let methods = if(!self.current().rawIs("{")) {[]} else {
477
- let definitions = Stack.make[DFunction]()
476
+ let definitions = Array.make[DFunction]()
478
477
  self.rawSkip(LBracketLeft, "{")
479
478
  while {!self.current().is(LBracketRight)} {
480
479
  definitions.push(self.parseFunctionDefinition(member = False))
@@ -487,7 +486,7 @@ extend self: Parser {
487
486
  let name = token.raw() + ": " + nameToken.raw()
488
487
  self.lspHook.emit(ParseSymbolEnd(
489
488
  name = name
490
- kind = 19 // Object
489
+ kind = SInstance
491
490
  selectionStart = nameToken.at()
492
491
  selectionEnd = nameToken.end()
493
492
  start = instanceToken.at()
@@ -528,7 +527,7 @@ extend self: Parser {
528
527
  [Variant(nameToken.at(), nameToken.raw(), [])]
529
528
  } else {
530
529
  self.rawSkip(LBracketLeft, "{")
531
- let variantsBuilder = Stack.make[Variant]()
530
+ let variantsBuilder = Array.make[Variant]()
532
531
  while {!self.current().is(LBracketRight)} {
533
532
  if(self.lspHook.trackSymbols) {self.lspHook.emit(ParseSymbolBegin)}
534
533
  let variantNameToken = self.skip(LUpper)
@@ -545,7 +544,7 @@ extend self: Parser {
545
544
  if(self.lspHook.trackSymbols) {
546
545
  self.lspHook.emit(ParseSymbolEnd(
547
546
  name = variantNameToken.raw()
548
- kind = 10 // Enum
547
+ kind = SVariant
549
548
  selectionStart = variantNameToken.at()
550
549
  selectionEnd = variantNameToken.end()
551
550
  start = variantNameToken.at()
@@ -571,7 +570,7 @@ extend self: Parser {
571
570
  if(self.lspHook.trackSymbols) {
572
571
  self.lspHook.emit(ParseSymbolEnd(
573
572
  name = nameToken.raw()
574
- kind = 5
573
+ kind = SType
575
574
  selectionStart = nameToken.at()
576
575
  selectionEnd = nameToken.end()
577
576
  start = kindToken.at()
@@ -583,7 +582,7 @@ extend self: Parser {
583
582
 
584
583
  parseImportDefinition(currentPackagePair: PackagePair): DImport {
585
584
  let importToken = self.rawSkip(LKeyword, "import")
586
- let path = Stack.make[String]()
585
+ let path = Array.make[String]()
587
586
  while {self.current().is(LLower)} {
588
587
  path.push(self.parseDashedName())
589
588
  self.skip(LDot)
@@ -712,8 +711,8 @@ extend self: Parser {
712
711
 
713
712
  parseTypeParameters(): Poly {
714
713
  self.rawSkip(LBracketLeft, "[")
715
- let parameters = Stack.make[String]()
716
- let constraints = Stack.make[Constraint]()
714
+ let parameters = Array.make[String]()
715
+ let constraints = Array.make[Constraint]()
717
716
  while {!self.current().is(LBracketRight) && !self.current().is(LSemicolon)} {
718
717
  if(self.ahead().is(LBracketLeft)) {
719
718
  constraints.push(self.parseConstraint())
@@ -736,7 +735,7 @@ extend self: Parser {
736
735
 
737
736
  parseTypeArguments(parenthesis: Bool = False): List[Type] {
738
737
  self.rawSkip(LBracketLeft, if(parenthesis) {"("} else {"["})
739
- let types = Stack.make[Type]()
738
+ let types = Array.make[Type]()
740
739
  while {!self.current().is(LBracketRight)} {
741
740
  types.push(self.parseType())
742
741
  if(!self.current().is(LBracketRight)) {self.skip(LComma)}
@@ -746,7 +745,7 @@ extend self: Parser {
746
745
  }
747
746
 
748
747
  parseFunctionParameters(allowMutable: Bool = False): List[Parameter] {
749
- let parameters = Stack.make[Parameter]()
748
+ let parameters = Array.make[Parameter]()
750
749
  self.rawSkip(LBracketLeft, "(")
751
750
  while {!self.current().is(LBracketRight)} {
752
751
  let lspTrackSymbols = self.lspHook.trackSymbols && allowMutable
@@ -770,7 +769,7 @@ extend self: Parser {
770
769
  if(lspTrackSymbols) {
771
770
  self.lspHook.emit(ParseSymbolEnd(
772
771
  name = parameterNameToken.raw()
773
- kind = 7 // Property
772
+ kind = SParameter
774
773
  selectionStart = parameterNameToken.at()
775
774
  selectionEnd = parameterNameToken.end()
776
775
  start = lspFirst.at()
@@ -784,7 +783,7 @@ extend self: Parser {
784
783
  }
785
784
 
786
785
  parseFunctionArguments(callAt: Location, trailing: Bool): Pair[List[Argument], Bool] {
787
- let arguments = Stack.make[Argument]()
786
+ let arguments = Array.make[Argument]()
788
787
  if(self.current().rawIs("(")){
789
788
  self.rawSkip(LBracketLeft, "(")
790
789
  while {!self.current().is(LBracketRight)} {
@@ -854,13 +853,13 @@ extend self: Parser {
854
853
  let token = if(colon) {self.skip(LColon)} else {self.rawSkip(LBracketLeft, "{")}
855
854
  if(ignoreGenerateKeyword && self.current().is(LKeyword) && self.current().rawIs("generate")) {self.skip(LKeyword)}
856
855
  let result = if(self.current().is(LPipe)) {
857
- let cases = Stack.make[MatchCase]()
856
+ let cases = Array.make[MatchCase]()
858
857
  while {self.current().is(LPipe)} {
859
858
  cases.push(self.parseCase())
860
859
  }
861
860
  cases.toList()
862
861
  } elseIf {self.current().is2(LLower, LWildcard) && self.ahead().is2(LComma, LArrowThick)} {
863
- let parameters = Stack.make[MatchPattern]()
862
+ let parameters = Array.make[MatchPattern]()
864
863
  while {!self.current().is(LArrowThick)} {
865
864
  let isVariable = self.current().is(LLower)
866
865
  let parameterToken = if(isVariable) {self.skip(LLower)} else {self.skip(LWildcard)}
@@ -888,14 +887,14 @@ extend self: Parser {
888
887
 
889
888
  parseCase(): MatchCase {
890
889
  let token = self.skip(LPipe)
891
- let patterns = Stack.make[MatchPattern]()
890
+ let patterns = Array.make[MatchPattern]()
892
891
  while {!self.current().is3(LArrowThick, LPipe, LBracketRight) && !self.current().rawIs("{")} {
893
892
  patterns.push(self.parsePattern())
894
893
  if(!self.current().is3(LArrowThick, LPipe, LBracketRight) && !self.current().rawIs("{")) {
895
894
  self.skip(LComma)
896
895
  }
897
896
  }
898
- let guards = Stack.make[MatchGuard]()
897
+ let guards = Array.make[MatchGuard]()
899
898
  while {self.current().rawIs("{")} {
900
899
  guards.push(self.parseCaseGuard())
901
900
  }
@@ -944,7 +943,7 @@ extend self: Parser {
944
943
  } else {
945
944
  let token = self.skip(LUpper)
946
945
  if(self.current().rawIs("(")) {
947
- let patterns = Stack.make[MatchPattern]()
946
+ let patterns = Array.make[MatchPattern]()
948
947
  self.rawSkip(LBracketLeft, "(")
949
948
  while {!self.current().is(LBracketRight)} {
950
949
  let pattern = self.parsePattern()
@@ -1059,10 +1058,9 @@ extend self: Parser {
1059
1058
  self.skip(LAssign)
1060
1059
  let value = self.parseTerm()
1061
1060
  if(self.lspHook.trackSymbols) {
1062
- let kind = if(mutable) {13} else {14}
1063
1061
  self.lspHook.emit(ParseSymbolEnd(
1064
1062
  name = nameToken.raw()
1065
- kind = kind
1063
+ kind = SLet(mutable)
1066
1064
  selectionStart = nameToken.at()
1067
1065
  selectionEnd = nameToken.end()
1068
1066
  start = mutableToken.at()
@@ -1080,7 +1078,7 @@ extend self: Parser {
1080
1078
 
1081
1079
  parseFunctions(): Term {
1082
1080
  let at = self.current().at()
1083
- let functions = Stack.make[DFunction]()
1081
+ let functions = Array.make[DFunction]()
1084
1082
  while {self.current().rawIs("function")} {
1085
1083
  if(self.lspHook.trackSymbols) {self.lspHook.emit(ParseSymbolBegin)}
1086
1084
  let functionAt = self.rawSkip(LKeyword, "function").at()
@@ -1095,7 +1093,7 @@ extend self: Parser {
1095
1093
  if(self.lspHook.trackSymbols) {
1096
1094
  self.lspHook.emit(ParseSymbolEnd(
1097
1095
  name = signature.name
1098
- kind = 12
1096
+ kind = SFunction(member = False)
1099
1097
  selectionStart = signature.at
1100
1098
  selectionEnd = signature.at.Location(column = signature.at.column + signature.name.size())
1101
1099
  start = functionAt
@@ -1256,7 +1254,7 @@ extend self: Parser {
1256
1254
  }
1257
1255
 
1258
1256
  parseRecord(copyAt: Option[Location]): List[Field] {
1259
- let fields = Stack.make[Field]()
1257
+ let fields = Array.make[Field]()
1260
1258
  let startBracketAt = self.rawSkip(LBracketLeft, "(").at()
1261
1259
  let startAt = copyAt.else {startBracketAt}
1262
1260
  while {!self.current().is(LBracketRight)} {
@@ -1287,7 +1285,7 @@ extend self: Parser {
1287
1285
  }
1288
1286
 
1289
1287
  parseRecordType(): List[Pair[String, Type]] {
1290
- let fields = Stack.make[Pair[String, Type]]()
1288
+ let fields = Array.make[Pair[String, Type]]()
1291
1289
  self.rawSkip(LBracketLeft, "(")
1292
1290
  while {!self.current().is(LBracketRight)} {
1293
1291
  let fieldToken = self.skip(LLower)
@@ -1300,7 +1298,7 @@ extend self: Parser {
1300
1298
  }
1301
1299
 
1302
1300
  parseRecordPattern(): List[Pair[String, MatchPattern]] {
1303
- let fields = Stack.make[Pair[String, MatchPattern]]()
1301
+ let fields = Array.make[Pair[String, MatchPattern]]()
1304
1302
  self.rawSkip(LBracketLeft, "(")
1305
1303
  while {!self.current().is(LBracketRight)} {
1306
1304
  let fieldToken = self.skip(LLower)
@@ -1314,14 +1312,14 @@ extend self: Parser {
1314
1312
 
1315
1313
  parseListPattern(): MatchPattern {
1316
1314
  function convertListPattern(at: Location, items: List[Pair[MatchPattern, Bool]]): MatchPattern {
1317
- | _, [] => PVariant(at, "ff:core/List.Empty", [])
1315
+ | _, [] => PVariant(at, "List$Empty", [])
1318
1316
  | _, [Pair(p, False), ...ps] =>
1319
- PVariant(at, "ff:core/List.Link", [p, convertListPattern(at, ps)])
1317
+ PVariant(at, "List$Link", [p, convertListPattern(at, ps)])
1320
1318
  | _, [Pair(p, True)] => p
1321
1319
  | _, [Pair(p, True), ...] =>
1322
1320
  throw(CompileError(p.at, "Invalid pattern: ... is only allowed for the last element in a list"))
1323
1321
  }
1324
- let items = Stack.make[Pair[MatchPattern, Bool]]()
1322
+ let items = Array.make[Pair[MatchPattern, Bool]]()
1325
1323
  let at = self.rawSkip(LBracketLeft, "[").at()
1326
1324
  while {!self.current().rawIs("]")} {
1327
1325
  let spread = self.current().is(LDotDotDot)
@@ -1339,7 +1337,7 @@ extend self: Parser {
1339
1337
  }
1340
1338
 
1341
1339
  parseList(): Term {
1342
- let items = Stack.make[Pair[Term, Bool]]()
1340
+ let items = Array.make[Pair[Term, Bool]]()
1343
1341
  let at = self.rawSkip(LBracketLeft, "[").at()
1344
1342
  while {!self.current().rawIs("]")} {
1345
1343
  let spread = self.current().is(LDotDotDot)
@@ -1361,7 +1359,7 @@ binaryOperators = [
1361
1359
  ["+", "-"]
1362
1360
  ["*", "/", "%"]
1363
1361
  ["^"]
1364
- ].toArray()
1362
+ ]
1365
1363
 
1366
1364
  findBestTarget(targetIsNode: Bool, body: Option[Lambda], targets: ParsedTargets): Target {
1367
1365
  let foreignTarget = if(targetIsNode) {
@@ -50,6 +50,8 @@ convert(modules: Map[String, Module], cases: List[MatchCase]): List[PatternCaseI
50
50
  name.reverse().takeWhile {_ != '.'}.reverse()
51
51
  }
52
52
  function otherVariants(name: String): Set[String] {
53
+ if(name == "List$Empty") {["List$Link"].toSet()} else:
54
+ if(name == "List$Link") {["List$Empty"].toSet()} else:
53
55
  let variantName = unqualifiedName(name)
54
56
  let moduleName = name.dropLast(variantName.size() + 1)
55
57
  let variantModule = modules.grab(moduleName)
@@ -264,7 +264,7 @@ extend self: Type {
264
264
  | TConstructor(at, name, [_, ...generics]) {name.startsWith("Function$")} =>
265
265
  "(" + generics.dropLast().map {go(_)}.join(", ") + ") => " + go(generics.grabLast())
266
266
  | TConstructor(at, name, generics) {name.startsWith("Record$")} =>
267
- let as = name.split('$').toList().dropFirst().zip(generics)
267
+ let as = name.split('$').dropFirst().zip(generics)
268
268
  "(" + as.map {| Pair(label, t) => label + ": " + go(t)}.join(", ") + ")"
269
269
  | TConstructor(at, name, generics) =>
270
270
  let shortenedName = shortenType(name)
@@ -2,12 +2,12 @@ import Token
2
2
  import Syntax
3
3
  import LspHook
4
4
 
5
- tokenize(file: String, code: String, completionAt: Option[Location], attemptFixes: Bool): Array[Token] {
5
+ tokenize(file: String, code: String, completionAt: Option[Location], attemptFixes: Bool): List[Token] {
6
6
 
7
7
  let completionLine = completionAt.filter {_.file == file}.map {_.line}.else {-1}
8
8
  let completionColumn = completionAt.filter {_.file == file}.map {_.column}.else {-1}
9
9
 
10
- let tokens = Stack.make[Token]()
10
+ let tokens = Array.make[Token]()
11
11
  mutable line = 1
12
12
  mutable lineOffset = 0
13
13
 
@@ -29,9 +29,9 @@ loadWorkspace(path: Path): Workspace {
29
29
  parseWorkspaceFile(path: Path, packageDirectory: Path): Workspace {
30
30
  let text = path.readText()
31
31
  mutable defaultLocation = None
32
- let lines = text.split('\n').toList().map {_.replace("\r", "").takeWhile {_ != '#'}}.filter {_.size() != 0}
32
+ let lines = text.split('\n').map {_.replace("\r", "").takeWhile {_ != '#'}}.filter {_.size() != 0}
33
33
  let rules = lines.collect {line =>
34
- let columns = line.replace("\t", " ").split(' ').toList().filter {_.size() != 0}
34
+ let columns = line.replace("\t", " ").split(' ').filter {_.size() != 0}
35
35
  defaultLocation.each {_ =>
36
36
  panic("Unexpected rule after the * rule: " + line)
37
37
  }