firefly-compiler 0.4.30 → 0.4.32
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.
- package/bin/Release.ff +6 -0
- package/compiler/Builder.ff +15 -8
- package/compiler/Compiler.ff +13 -8
- package/compiler/Dependencies.ff +24 -17
- package/compiler/DependencyLock.ff +17 -0
- package/compiler/Deriver.ff +2 -1
- package/compiler/Dictionaries.ff +4 -4
- package/compiler/Environment.ff +3 -3
- package/compiler/Inference.ff +38 -8
- package/compiler/JsEmitter.ff +2 -2
- package/compiler/JsImporter.ff +2 -2
- package/compiler/LspHook.ff +2 -2
- package/compiler/Main.ff +22 -8
- package/compiler/ModuleCache.ff +6 -6
- package/compiler/Parser.ff +36 -36
- package/compiler/Resolver.ff +7 -7
- package/compiler/Syntax.ff +1 -1
- package/compiler/Tokenizer.ff +2 -3
- package/compiler/Unification.ff +3 -4
- package/compiler/Wildcards.ff +1 -1
- package/core/.firefly/include/package-lock.json +96 -96
- package/core/.firefly/include/package.json +1 -1
- package/core/Array.ff +2 -2
- package/core/Atomic.ff +1 -1
- package/core/Buffer.ff +1 -1
- package/core/Int.ff +2 -2
- package/core/IntMap.ff +4 -4
- package/core/Json.ff +5 -5
- package/core/List.ff +15 -15
- package/core/Map.ff +1 -1
- package/core/NodeSystem.ff +85 -0
- package/core/Option.ff +10 -3
- package/core/Random.ff +1 -1
- package/core/RbMap.ff +1 -1
- package/core/Serializable.ff +2 -2
- package/core/Set.ff +2 -2
- package/core/Stream.ff +4 -4
- package/core/StringMap.ff +4 -4
- package/experimental/random/Index.ff +53 -0
- package/experimental/random/MapTest.ff +2 -2
- package/experimental/random/Process.ff +120 -0
- package/experimental/random/RunLength.ff +2 -2
- package/experimental/random/Symbols.ff +2 -2
- package/experimental/random/Units.ff +36 -0
- package/lsp/CompletionHandler.ff +3 -6
- package/lsp/Handler.ff +45 -25
- package/lsp/LanguageServer.ff +13 -3
- package/lsp/SymbolHandler.ff +2 -2
- package/lsp/TestReferences.ff +3 -3
- package/lux/Lux.ff +6 -7
- package/output/js/ff/compiler/Builder.mjs +40 -28
- package/output/js/ff/compiler/Compiler.mjs +38 -14
- package/output/js/ff/compiler/Dependencies.mjs +30 -16
- package/output/js/ff/compiler/DependencyLock.mjs +128 -0
- package/output/js/ff/compiler/Deriver.mjs +4 -4
- package/output/js/ff/compiler/Dictionaries.mjs +8 -8
- package/output/js/ff/compiler/Environment.mjs +6 -6
- package/output/js/ff/compiler/Inference.mjs +256 -14
- package/output/js/ff/compiler/JsEmitter.mjs +4 -4
- package/output/js/ff/compiler/JsImporter.mjs +4 -4
- package/output/js/ff/compiler/LspHook.mjs +4 -4
- package/output/js/ff/compiler/Main.mjs +16 -14
- package/output/js/ff/compiler/ModuleCache.mjs +6 -6
- package/output/js/ff/compiler/Parser.mjs +72 -72
- package/output/js/ff/compiler/Patterns.mjs +2 -2
- package/output/js/ff/compiler/Resolver.mjs +14 -14
- package/output/js/ff/compiler/Syntax.mjs +2 -2
- package/output/js/ff/compiler/Tokenizer.mjs +4 -4
- package/output/js/ff/compiler/Unification.mjs +4 -4
- package/output/js/ff/compiler/Wildcards.mjs +2 -2
- package/output/js/ff/core/Array.mjs +5 -5
- package/output/js/ff/core/Atomic.mjs +3 -3
- package/output/js/ff/core/Buffer.mjs +3 -3
- package/output/js/ff/core/Int.mjs +4 -4
- package/output/js/ff/core/IntMap.mjs +9 -9
- package/output/js/ff/core/Json.mjs +10 -10
- package/output/js/ff/core/List.mjs +31 -31
- package/output/js/ff/core/Map.mjs +2 -2
- package/output/js/ff/core/NodeSystem.mjs +119 -0
- package/output/js/ff/core/Option.mjs +28 -2
- package/output/js/ff/core/Random.mjs +2 -2
- package/output/js/ff/core/RbMap.mjs +2 -2
- package/output/js/ff/core/Serializable.mjs +4 -4
- package/output/js/ff/core/Set.mjs +4 -4
- package/output/js/ff/core/Stream.mjs +8 -8
- package/output/js/ff/core/StringMap.mjs +9 -9
- package/output/js/ff/core/Task.mjs +4 -4
- package/package.json +1 -1
- package/postgresql/Pg.ff +2 -2
- package/rpc/Rpc.ff +3 -3
- package/vscode/package.json +1 -1
- package/webserver/WebServer.ff +2 -2
- package/httpserver/.firefly/package.ff +0 -1
- package/httpserver/HttpServer.ff +0 -184
package/compiler/Parser.ff
CHANGED
|
@@ -29,7 +29,7 @@ data ParsedTargets(
|
|
|
29
29
|
nodeAsync: Option[String]
|
|
30
30
|
)
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
new(
|
|
33
33
|
packagePair: PackagePair
|
|
34
34
|
file: String
|
|
35
35
|
tokens: List[Token]
|
|
@@ -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 = Array.
|
|
154
|
+
let dependencies = Array.new[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 = Array.
|
|
159
|
+
let includes = Array.new[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 = Array.
|
|
170
|
-
let types = Array.
|
|
171
|
-
let traits = Array.
|
|
172
|
-
let instances = Array.
|
|
173
|
-
let extends = Array.
|
|
174
|
-
let lets = Array.
|
|
175
|
-
let functions = Array.
|
|
169
|
+
let imports = Array.new[DImport]()
|
|
170
|
+
let types = Array.new[DType]()
|
|
171
|
+
let traits = Array.new[DTrait]()
|
|
172
|
+
let instances = Array.new[DInstance]()
|
|
173
|
+
let extends = Array.new[DExtend]()
|
|
174
|
+
let lets = Array.new[DLet]()
|
|
175
|
+
let functions = Array.new[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())
|
|
@@ -348,7 +348,7 @@ extend self: Parser {
|
|
|
348
348
|
self.skip(LColon)
|
|
349
349
|
let type = self.parseType()
|
|
350
350
|
self.rawSkip(LBracketLeft, "{")
|
|
351
|
-
let methods = Array.
|
|
351
|
+
let methods = Array.new[DFunction]()
|
|
352
352
|
while {!self.current().is(LBracketRight)} {
|
|
353
353
|
methods.push(self.parseFunctionDefinition(member = True))
|
|
354
354
|
if(!self.current().is(LBracketRight)) {self.skipSeparator(LSemicolon)}
|
|
@@ -388,7 +388,7 @@ extend self: Parser {
|
|
|
388
388
|
self.skip(LColon)
|
|
389
389
|
let nameToken = self.skip(LUpper)
|
|
390
390
|
let poly = if(!self.current().rawIs("[")) {Poly([], [])} else {self.parseTypeParameters()}
|
|
391
|
-
let constraints = Array.
|
|
391
|
+
let constraints = Array.new[Constraint]()
|
|
392
392
|
while {self.current().is(LColon)} {
|
|
393
393
|
self.fail(self.current().at(), "Trait constraints is not yet implemented")
|
|
394
394
|
self.skip(LColon)
|
|
@@ -398,10 +398,10 @@ extend self: Parser {
|
|
|
398
398
|
))
|
|
399
399
|
}
|
|
400
400
|
let generatorParameters = if(!self.current().rawIs("(")) {[]} else {self.parseFunctionParameters()}
|
|
401
|
-
let methodGenerators = Array.
|
|
402
|
-
let methodDefaults = Array.
|
|
401
|
+
let methodGenerators = Array.new[Pair[String, Lambda]]()
|
|
402
|
+
let methodDefaults = Array.new[Pair[String, Lambda]]()
|
|
403
403
|
let methodSignatures = if(!self.current().rawIs("{")) {[]} else {
|
|
404
|
-
let signatures = Array.
|
|
404
|
+
let signatures = Array.new[Signature]()
|
|
405
405
|
self.rawSkip(LBracketLeft, "{")
|
|
406
406
|
while {!self.current().is(LBracketRight)} {
|
|
407
407
|
if(self.lspHook.trackSymbols) {self.lspHook.emit(ParseSymbolBegin)}
|
|
@@ -459,7 +459,7 @@ extend self: Parser {
|
|
|
459
459
|
let instanceToken = self.rawSkip(LKeyword, "instance")
|
|
460
460
|
let token = self.skip(LUpper)
|
|
461
461
|
let poly = if(!self.current().rawIs("[")) {Poly([], [])} else {self.parseTypeParameters()}
|
|
462
|
-
let typeArguments = Array.
|
|
462
|
+
let typeArguments = Array.new[Type]()
|
|
463
463
|
typeArguments.push(TConstructor(token.at(), token.raw(), poly.generics.map {TConstructor(token.at(), _, [])}))
|
|
464
464
|
self.skip(LColon)
|
|
465
465
|
let nameToken = self.skip(LUpper)
|
|
@@ -473,7 +473,7 @@ extend self: Parser {
|
|
|
473
473
|
}
|
|
474
474
|
let generatorArguments = self.parseFunctionArguments(nameToken.at(), False).first
|
|
475
475
|
let methods = if(!self.current().rawIs("{")) {[]} else {
|
|
476
|
-
let definitions = Array.
|
|
476
|
+
let definitions = Array.new[DFunction]()
|
|
477
477
|
self.rawSkip(LBracketLeft, "{")
|
|
478
478
|
while {!self.current().is(LBracketRight)} {
|
|
479
479
|
definitions.push(self.parseFunctionDefinition(member = False))
|
|
@@ -527,7 +527,7 @@ extend self: Parser {
|
|
|
527
527
|
[Variant(nameToken.at(), nameToken.raw(), [])]
|
|
528
528
|
} else {
|
|
529
529
|
self.rawSkip(LBracketLeft, "{")
|
|
530
|
-
let variantsBuilder = Array.
|
|
530
|
+
let variantsBuilder = Array.new[Variant]()
|
|
531
531
|
while {!self.current().is(LBracketRight)} {
|
|
532
532
|
if(self.lspHook.trackSymbols) {self.lspHook.emit(ParseSymbolBegin)}
|
|
533
533
|
let variantNameToken = self.skip(LUpper)
|
|
@@ -582,7 +582,7 @@ extend self: Parser {
|
|
|
582
582
|
|
|
583
583
|
parseImportDefinition(currentPackagePair: PackagePair): DImport {
|
|
584
584
|
let importToken = self.rawSkip(LKeyword, "import")
|
|
585
|
-
let path = Array.
|
|
585
|
+
let path = Array.new[String]()
|
|
586
586
|
while {self.current().is(LLower)} {
|
|
587
587
|
path.push(self.parseDashedName())
|
|
588
588
|
self.skip(LDot)
|
|
@@ -711,8 +711,8 @@ extend self: Parser {
|
|
|
711
711
|
|
|
712
712
|
parseTypeParameters(): Poly {
|
|
713
713
|
self.rawSkip(LBracketLeft, "[")
|
|
714
|
-
let parameters = Array.
|
|
715
|
-
let constraints = Array.
|
|
714
|
+
let parameters = Array.new[String]()
|
|
715
|
+
let constraints = Array.new[Constraint]()
|
|
716
716
|
while {!self.current().is(LBracketRight) && !self.current().is(LSemicolon)} {
|
|
717
717
|
if(self.ahead().is(LBracketLeft)) {
|
|
718
718
|
constraints.push(self.parseConstraint())
|
|
@@ -735,7 +735,7 @@ extend self: Parser {
|
|
|
735
735
|
|
|
736
736
|
parseTypeArguments(parenthesis: Bool = False): List[Type] {
|
|
737
737
|
self.rawSkip(LBracketLeft, if(parenthesis) {"("} else {"["})
|
|
738
|
-
let types = Array.
|
|
738
|
+
let types = Array.new[Type]()
|
|
739
739
|
while {!self.current().is(LBracketRight)} {
|
|
740
740
|
types.push(self.parseType())
|
|
741
741
|
if(!self.current().is(LBracketRight)) {self.skip(LComma)}
|
|
@@ -745,7 +745,7 @@ extend self: Parser {
|
|
|
745
745
|
}
|
|
746
746
|
|
|
747
747
|
parseFunctionParameters(allowMutable: Bool = False): List[Parameter] {
|
|
748
|
-
let parameters = Array.
|
|
748
|
+
let parameters = Array.new[Parameter]()
|
|
749
749
|
self.rawSkip(LBracketLeft, "(")
|
|
750
750
|
while {!self.current().is(LBracketRight)} {
|
|
751
751
|
let lspTrackSymbols = self.lspHook.trackSymbols && allowMutable
|
|
@@ -783,7 +783,7 @@ extend self: Parser {
|
|
|
783
783
|
}
|
|
784
784
|
|
|
785
785
|
parseFunctionArguments(callAt: Location, trailing: Bool): Pair[List[Argument], Bool] {
|
|
786
|
-
let arguments = Array.
|
|
786
|
+
let arguments = Array.new[Argument]()
|
|
787
787
|
if(self.current().rawIs("(")){
|
|
788
788
|
self.rawSkip(LBracketLeft, "(")
|
|
789
789
|
while {!self.current().is(LBracketRight)} {
|
|
@@ -853,13 +853,13 @@ extend self: Parser {
|
|
|
853
853
|
let token = if(colon) {self.skip(LColon)} else {self.rawSkip(LBracketLeft, "{")}
|
|
854
854
|
if(ignoreGenerateKeyword && self.current().is(LKeyword) && self.current().rawIs("generate")) {self.skip(LKeyword)}
|
|
855
855
|
let result = if(self.current().is(LPipe)) {
|
|
856
|
-
let cases = Array.
|
|
856
|
+
let cases = Array.new[MatchCase]()
|
|
857
857
|
while {self.current().is(LPipe)} {
|
|
858
858
|
cases.push(self.parseCase())
|
|
859
859
|
}
|
|
860
860
|
cases.toList()
|
|
861
861
|
} elseIf {self.current().is2(LLower, LWildcard) && self.ahead().is2(LComma, LArrowThick)} {
|
|
862
|
-
let parameters = Array.
|
|
862
|
+
let parameters = Array.new[MatchPattern]()
|
|
863
863
|
while {!self.current().is(LArrowThick)} {
|
|
864
864
|
let isVariable = self.current().is(LLower)
|
|
865
865
|
let parameterToken = if(isVariable) {self.skip(LLower)} else {self.skip(LWildcard)}
|
|
@@ -871,7 +871,7 @@ extend self: Parser {
|
|
|
871
871
|
[MatchCase(token.at(), parameters.toList(), [], term)]
|
|
872
872
|
} else {
|
|
873
873
|
let term = self.parseStatements()
|
|
874
|
-
let wildcards = Wildcards.
|
|
874
|
+
let wildcards = Wildcards.new()
|
|
875
875
|
let e = wildcards.fixWildcards(term)
|
|
876
876
|
let arguments = if(wildcards.seenWildcards != 0) {
|
|
877
877
|
List.range(wildcards.seenWildcards).map {i => PVariable(token.at(), Some("_w" + (i + 1)))}
|
|
@@ -887,14 +887,14 @@ extend self: Parser {
|
|
|
887
887
|
|
|
888
888
|
parseCase(): MatchCase {
|
|
889
889
|
let token = self.skip(LPipe)
|
|
890
|
-
let patterns = Array.
|
|
890
|
+
let patterns = Array.new[MatchPattern]()
|
|
891
891
|
while {!self.current().is3(LArrowThick, LPipe, LBracketRight) && !self.current().rawIs("{")} {
|
|
892
892
|
patterns.push(self.parsePattern())
|
|
893
893
|
if(!self.current().is3(LArrowThick, LPipe, LBracketRight) && !self.current().rawIs("{")) {
|
|
894
894
|
self.skip(LComma)
|
|
895
895
|
}
|
|
896
896
|
}
|
|
897
|
-
let guards = Array.
|
|
897
|
+
let guards = Array.new[MatchGuard]()
|
|
898
898
|
while {self.current().rawIs("{")} {
|
|
899
899
|
guards.push(self.parseCaseGuard())
|
|
900
900
|
}
|
|
@@ -943,7 +943,7 @@ extend self: Parser {
|
|
|
943
943
|
} else {
|
|
944
944
|
let token = self.skip(LUpper)
|
|
945
945
|
if(self.current().rawIs("(")) {
|
|
946
|
-
let patterns = Array.
|
|
946
|
+
let patterns = Array.new[MatchPattern]()
|
|
947
947
|
self.rawSkip(LBracketLeft, "(")
|
|
948
948
|
while {!self.current().is(LBracketRight)} {
|
|
949
949
|
let pattern = self.parsePattern()
|
|
@@ -1078,7 +1078,7 @@ extend self: Parser {
|
|
|
1078
1078
|
|
|
1079
1079
|
parseFunctions(): Term {
|
|
1080
1080
|
let at = self.current().at()
|
|
1081
|
-
let functions = Array.
|
|
1081
|
+
let functions = Array.new[DFunction]()
|
|
1082
1082
|
while {self.current().rawIs("function")} {
|
|
1083
1083
|
if(self.lspHook.trackSymbols) {self.lspHook.emit(ParseSymbolBegin)}
|
|
1084
1084
|
let functionAt = self.rawSkip(LKeyword, "function").at()
|
|
@@ -1254,7 +1254,7 @@ extend self: Parser {
|
|
|
1254
1254
|
}
|
|
1255
1255
|
|
|
1256
1256
|
parseRecord(copyAt: Option[Location]): List[Field] {
|
|
1257
|
-
let fields = Array.
|
|
1257
|
+
let fields = Array.new[Field]()
|
|
1258
1258
|
let startBracketAt = self.rawSkip(LBracketLeft, "(").at()
|
|
1259
1259
|
let startAt = copyAt.else {startBracketAt}
|
|
1260
1260
|
while {!self.current().is(LBracketRight)} {
|
|
@@ -1285,7 +1285,7 @@ extend self: Parser {
|
|
|
1285
1285
|
}
|
|
1286
1286
|
|
|
1287
1287
|
parseRecordType(): List[Pair[String, Type]] {
|
|
1288
|
-
let fields = Array.
|
|
1288
|
+
let fields = Array.new[Pair[String, Type]]()
|
|
1289
1289
|
self.rawSkip(LBracketLeft, "(")
|
|
1290
1290
|
while {!self.current().is(LBracketRight)} {
|
|
1291
1291
|
let fieldToken = self.skip(LLower)
|
|
@@ -1298,7 +1298,7 @@ extend self: Parser {
|
|
|
1298
1298
|
}
|
|
1299
1299
|
|
|
1300
1300
|
parseRecordPattern(): List[Pair[String, MatchPattern]] {
|
|
1301
|
-
let fields = Array.
|
|
1301
|
+
let fields = Array.new[Pair[String, MatchPattern]]()
|
|
1302
1302
|
self.rawSkip(LBracketLeft, "(")
|
|
1303
1303
|
while {!self.current().is(LBracketRight)} {
|
|
1304
1304
|
let fieldToken = self.skip(LLower)
|
|
@@ -1319,7 +1319,7 @@ extend self: Parser {
|
|
|
1319
1319
|
| _, [Pair(p, True), ...] =>
|
|
1320
1320
|
throw(CompileError(p.at, "Invalid pattern: ... is only allowed for the last element in a list"))
|
|
1321
1321
|
}
|
|
1322
|
-
let items = Array.
|
|
1322
|
+
let items = Array.new[Pair[MatchPattern, Bool]]()
|
|
1323
1323
|
let at = self.rawSkip(LBracketLeft, "[").at()
|
|
1324
1324
|
while {!self.current().rawIs("]")} {
|
|
1325
1325
|
let spread = self.current().is(LDotDotDot)
|
|
@@ -1337,7 +1337,7 @@ extend self: Parser {
|
|
|
1337
1337
|
}
|
|
1338
1338
|
|
|
1339
1339
|
parseList(): Term {
|
|
1340
|
-
let items = Array.
|
|
1340
|
+
let items = Array.new[Pair[Term, Bool]]()
|
|
1341
1341
|
let at = self.rawSkip(LBracketLeft, "[").at()
|
|
1342
1342
|
while {!self.current().rawIs("]")} {
|
|
1343
1343
|
let spread = self.current().is(LDotDotDot)
|
package/compiler/Resolver.ff
CHANGED
|
@@ -26,7 +26,7 @@ data CaseVariable(
|
|
|
26
26
|
asBound: Option[String]
|
|
27
27
|
)
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
new(packagePair: PackagePair, moduleName: String, lspHook: LspHook): Resolver {
|
|
30
30
|
Resolver(
|
|
31
31
|
variables = [].toMap()
|
|
32
32
|
variableLocations = [].toMap()
|
|
@@ -545,23 +545,23 @@ extend self: Resolver {
|
|
|
545
545
|
resolveCase(case: MatchCase, topLevel: Bool): MatchCase {
|
|
546
546
|
function findVariables(pattern: MatchPattern): Map[String, CaseVariable] {
|
|
547
547
|
| PString _ =>
|
|
548
|
-
Map.
|
|
548
|
+
Map.new()
|
|
549
549
|
| PInt _ =>
|
|
550
|
-
Map.
|
|
550
|
+
Map.new()
|
|
551
551
|
| PChar _ =>
|
|
552
|
-
Map.
|
|
552
|
+
Map.new()
|
|
553
553
|
| PVariable(at, Some(name)) =>
|
|
554
554
|
[Pair(name, CaseVariable(at, name, None))].toMap()
|
|
555
555
|
| PVariable(_, None) =>
|
|
556
|
-
Map.
|
|
556
|
+
Map.new()
|
|
557
557
|
| PVariant(_, _, patterns) =>
|
|
558
|
-
patterns.map(findVariables).foldLeft(Map.
|
|
558
|
+
patterns.map(findVariables).foldLeft(Map.new()) {_.addAll(_)}
|
|
559
559
|
| PVariantAs(at, variant, variableAt, variable) =>
|
|
560
560
|
variable.toList().map {x => Pair(x, CaseVariable(variableAt, x, Some(variant)))}.toMap()
|
|
561
561
|
| PAlias(at, pattern, variable) =>
|
|
562
562
|
[Pair(variable, CaseVariable(at, variable, None))].toMap().addAll(findVariables(pattern))
|
|
563
563
|
}
|
|
564
|
-
let variableMap = case.patterns.map(findVariables).foldLeft(Map.
|
|
564
|
+
let variableMap = case.patterns.map(findVariables).foldLeft(Map.new()) {_.addAll(_)}
|
|
565
565
|
mutable guards = []
|
|
566
566
|
let variableMap2 = case.guards.foldLeft(variableMap) {variableMap1, g =>
|
|
567
567
|
let self2 = self.Resolver(
|
package/compiler/Syntax.ff
CHANGED
|
@@ -231,7 +231,7 @@ data Version(at: Location, major: Int, minor: Int, patch: Int)
|
|
|
231
231
|
|
|
232
232
|
extend self: Type {
|
|
233
233
|
show(shownTypes: List[Type]): String {
|
|
234
|
-
mutable seenTypes = Map.
|
|
234
|
+
mutable seenTypes = Map.new()
|
|
235
235
|
let typeNames = 'a'.codeUnit.to('z'.codeUnit).map {Char(_).toString()}.toStream()
|
|
236
236
|
function shortenType(qualified: String): String {
|
|
237
237
|
qualified.reverse().takeWhile {_ != '.'}.reverse()
|
package/compiler/Tokenizer.ff
CHANGED
|
@@ -7,7 +7,7 @@ tokenize(file: String, code: String, completionAt: Option[Location], attemptFixe
|
|
|
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 = Array.
|
|
10
|
+
let tokens = Array.new[Token]()
|
|
11
11
|
mutable line = 1
|
|
12
12
|
mutable lineOffset = 0
|
|
13
13
|
|
|
@@ -15,7 +15,7 @@ tokenize(file: String, code: String, completionAt: Option[Location], attemptFixe
|
|
|
15
15
|
mutable startLineOffset = lineOffset
|
|
16
16
|
|
|
17
17
|
let operatorCharactersString = "!@#$%&/=?+|^~*<>.:-;"
|
|
18
|
-
mutable operatorCharacters = Set.
|
|
18
|
+
mutable operatorCharacters = Set.new[Char]()
|
|
19
19
|
List.range(operatorCharactersString.size()).map {j =>
|
|
20
20
|
operatorCharacters = operatorCharacters.add(operatorCharactersString.grab(j))
|
|
21
21
|
}
|
|
@@ -83,7 +83,6 @@ tokenize(file: String, code: String, completionAt: Option[Location], attemptFixe
|
|
|
83
83
|
if(i + 1 < code.size() && code.grab(i) == '_') {i += 1}
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
|
-
Unit // Think about how to avoid requiring this
|
|
87
86
|
} else {
|
|
88
87
|
while {i < code.size() && (code.grab(i) == ' ' || code.grab(i) == '\t' || code.grab(i) == '\r')} {i += 1}
|
|
89
88
|
}
|
package/compiler/Unification.ff
CHANGED
|
@@ -27,11 +27,11 @@ fail[T](at: Location, message: String): T {
|
|
|
27
27
|
throw(CompileError(at, message))
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
new(modules: List[Module], attemptFixes: Bool): Unification {
|
|
31
31
|
|
|
32
32
|
Unification(
|
|
33
|
-
Map.
|
|
34
|
-
Map.
|
|
33
|
+
Map.new()
|
|
34
|
+
Map.new()
|
|
35
35
|
3 // To avoid collision with the parser and resolver
|
|
36
36
|
modules.flatMap {module =>
|
|
37
37
|
let moduleName = module.file.dropLast(".ff".size())
|
|
@@ -173,7 +173,6 @@ extend self: Unification {
|
|
|
173
173
|
generics1.dropLast().zip(generics2.dropLast()).each {| Pair(t3, t4) => self.unify(at, t3, t4)}
|
|
174
174
|
generics1.takeLast().zip(generics2.takeLast()).each {| Pair(t3, t4) => self.unify(at, t3, t4)}
|
|
175
175
|
}
|
|
176
|
-
Unit // TODO: Think about how to avoid writing this
|
|
177
176
|
} else {
|
|
178
177
|
generics1.zip(generics2).each {| Pair(t1, t2) => self.unify(at, t1, t2) }
|
|
179
178
|
}
|