fez-lisp 1.6.64 → 1.6.66
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/lib/baked/std.js +1 -1
- package/package.json +1 -1
- package/src/check.js +63 -20
package/package.json
CHANGED
package/src/check.js
CHANGED
@@ -72,7 +72,6 @@ export const identity = (name) => [
|
|
72
72
|
]
|
73
73
|
export const typeSetDefaultFunction = (Types, name, env, exp) =>
|
74
74
|
Types.set(withScope(name, env), () => formatType(name, env))
|
75
|
-
|
76
75
|
const returnType = (rest) => {
|
77
76
|
const body = rest.at(-1)
|
78
77
|
const rem = hasBlock(body) ? body.at(-1) : body
|
@@ -218,6 +217,12 @@ export const setReturnToTypeRef = (stats, value) => {
|
|
218
217
|
)
|
219
218
|
}
|
220
219
|
export const setStats = (a, b) => (a[STATS] = b[STATS])
|
220
|
+
export const cloneStats = (name, x) => ({
|
221
|
+
[STATS]: {
|
222
|
+
...x[STATS],
|
223
|
+
[SIGNATURE]: name
|
224
|
+
}
|
225
|
+
})
|
221
226
|
export const setStatsRef = (a, b) => (a[STATS] = b[STATS])
|
222
227
|
export const setTypeToReturnRef = (stats, value) => {
|
223
228
|
// To prevent getters overwritting the array subtype
|
@@ -607,11 +612,24 @@ const resolveCondition = ({ rem, name, env, exp, prop, stack, check }) => {
|
|
607
612
|
break
|
608
613
|
}
|
609
614
|
}
|
610
|
-
const resolveGetter = ({ rem, prop, name, env }) => {
|
615
|
+
const resolveGetter = ({ rem, prop, name, env, caller, exp }) => {
|
611
616
|
const array = isLeaf(rem[1]) ? rem[1] : rem[1][0]
|
612
617
|
if (!env[array[VALUE]] || !env[name]) return true
|
613
618
|
switch (array[TYPE]) {
|
614
619
|
case APPLY:
|
620
|
+
if (
|
621
|
+
getReturn(env[array[VALUE]][STATS]) === UNKNOWN ||
|
622
|
+
getReturn(env[array[VALUE]][STATS]) === ANY
|
623
|
+
)
|
624
|
+
return true
|
625
|
+
if (getReturn(env[array[VALUE]][STATS]) !== COLLECTION)
|
626
|
+
throw new TypeError(
|
627
|
+
`Incorrect type of argument (${0}) for (${caller}). Expected (${formatSubType(
|
628
|
+
getTypes(env[caller][STATS][ARGUMENTS][0][STATS])
|
629
|
+
)}) but got (${formatSubType(
|
630
|
+
getReturns(env[array[VALUE]][STATS])
|
631
|
+
)}) (${stringifyArgs(exp)}) (check #1001)`
|
632
|
+
)
|
615
633
|
if (hasSubReturn(env[array[VALUE]][STATS])) {
|
616
634
|
const rightSub = getSubReturn(env[array[VALUE]][STATS])
|
617
635
|
const isAtom = rightSub.has(NUMBER) || rightSub.has(BOOLEAN)
|
@@ -629,6 +647,19 @@ const resolveGetter = ({ rem, prop, name, env }) => {
|
|
629
647
|
break
|
630
648
|
case WORD:
|
631
649
|
{
|
650
|
+
if (
|
651
|
+
getType(env[array[VALUE]][STATS]) === UNKNOWN ||
|
652
|
+
getType(env[array[VALUE]][STATS]) === ANY
|
653
|
+
)
|
654
|
+
return true
|
655
|
+
if (getType(env[array[VALUE]][STATS]) !== COLLECTION)
|
656
|
+
throw new TypeError(
|
657
|
+
`Incorrect type of argument (${0}) for (${caller}). Expected (${formatSubType(
|
658
|
+
getTypes(env[caller][STATS][ARGUMENTS][0][STATS])
|
659
|
+
)}) but got (${formatSubType(
|
660
|
+
getType(env[array[VALUE]][STATS])
|
661
|
+
)}) (${stringifyArgs(exp)}) (check #1002)`
|
662
|
+
)
|
632
663
|
if (hasSubType(env[array[VALUE]][STATS])) {
|
633
664
|
const rightSub = getSubType(env[array[VALUE]][STATS])
|
634
665
|
const isAtom =
|
@@ -687,11 +718,17 @@ const resolveSetter = (first, rest, env, stack) => {
|
|
687
718
|
case WORD:
|
688
719
|
if (env[right[VALUE]]) {
|
689
720
|
if (hasSubType(env[right[VALUE]][STATS])) {
|
690
|
-
if (currentSubType.has(UNKNOWN))
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
721
|
+
if (currentSubType.has(UNKNOWN)) {
|
722
|
+
if (env[right[VALUE]][STATS][TYPE_PROP][0] === COLLECTION) {
|
723
|
+
current[STATS][TYPE_PROP][1] = new SubType([
|
724
|
+
COLLECTION,
|
725
|
+
...getSubType(env[right[VALUE]][STATS]).types
|
726
|
+
])
|
727
|
+
} else
|
728
|
+
current[STATS][TYPE_PROP][1] = new SubType(
|
729
|
+
getSubType(env[right[VALUE]][STATS]).types
|
730
|
+
)
|
731
|
+
} else if (!equalSubTypes(current[STATS], env[right[VALUE]][STATS]))
|
695
732
|
throw new TypeError(
|
696
733
|
`Incorrect array type at (${
|
697
734
|
first[VALUE]
|
@@ -701,9 +738,9 @@ const resolveSetter = (first, rest, env, stack) => {
|
|
701
738
|
getTypes(env[right[VALUE]][STATS])
|
702
739
|
)}) (${stringifyArgs([first, rest])}) (check #198)`
|
703
740
|
)
|
704
|
-
current[STATS][TYPE_PROP][1] = new SubType(
|
705
|
-
|
706
|
-
)
|
741
|
+
// current[STATS][TYPE_PROP][1] = new SubType(
|
742
|
+
// getSubType(env[right[VALUE]][STATS])
|
743
|
+
// )
|
707
744
|
} else
|
708
745
|
retry(env[right[VALUE]][STATS], [first[VALUE], rest], stack, () =>
|
709
746
|
resolveSetter(first, rest, env, stack)
|
@@ -722,11 +759,17 @@ const resolveSetter = (first, rest, env, stack) => {
|
|
722
759
|
break
|
723
760
|
}
|
724
761
|
if (hasSubReturn(env[right[VALUE]][STATS])) {
|
725
|
-
if (currentSubType.has(UNKNOWN))
|
726
|
-
|
727
|
-
|
728
|
-
|
729
|
-
|
762
|
+
if (currentSubType.has(UNKNOWN)) {
|
763
|
+
if (env[right[VALUE]][STATS][RETURNS][0] === COLLECTION) {
|
764
|
+
current[STATS][TYPE_PROP][1] = new SubType([
|
765
|
+
COLLECTION,
|
766
|
+
...getSubReturn(env[right[VALUE]][STATS]).types
|
767
|
+
])
|
768
|
+
} else
|
769
|
+
current[STATS][TYPE_PROP][1] = new SubType(
|
770
|
+
getSubReturn(env[right[VALUE]][STATS]).types
|
771
|
+
)
|
772
|
+
} else if (
|
730
773
|
!equalSubTypesWithSubReturn(
|
731
774
|
current[STATS],
|
732
775
|
env[right[VALUE]][STATS]
|
@@ -741,9 +784,9 @@ const resolveSetter = (first, rest, env, stack) => {
|
|
741
784
|
getReturns(env[right[VALUE]][STATS])
|
742
785
|
)}) (${stringifyArgs([first, rest])}) (check #198)`
|
743
786
|
)
|
744
|
-
current[STATS][TYPE_PROP][1] = new SubType([
|
745
|
-
|
746
|
-
])
|
787
|
+
// current[STATS][TYPE_PROP][1] = new SubType([
|
788
|
+
// ...getSubReturn(env[right[VALUE]][STATS])
|
789
|
+
// ])
|
747
790
|
}
|
748
791
|
// else
|
749
792
|
// retry(env[right[VALUE]][STATS], [first[VALUE], rest], stack, () =>
|
@@ -753,6 +796,7 @@ const resolveSetter = (first, rest, env, stack) => {
|
|
753
796
|
break
|
754
797
|
}
|
755
798
|
setTypeToCollection(current[STATS])
|
799
|
+
|
756
800
|
// // Retry setting the sub-type if infered it out later
|
757
801
|
// if (!hasSubType(current[STATS]) || getSubType(current[STATS]).has(UNKNOWN))
|
758
802
|
// retry(current[STATS], [first[VALUE], rest], stack, () =>
|
@@ -852,7 +896,7 @@ const resolveReturnType = ({
|
|
852
896
|
default:
|
853
897
|
{
|
854
898
|
if (GET_ARRAY_INFERENCE_SET.has(returns[VALUE]))
|
855
|
-
resolveGetter({ rem, prop, name, env })
|
899
|
+
resolveGetter({ rem, prop, name, env, caller: returns[VALUE], exp })
|
856
900
|
checkPredicateNameDeep(name, exp, exp.slice(1), returns)
|
857
901
|
// TODO: DRY
|
858
902
|
const index = env[name][STATS][ARGUMENTS]
|
@@ -1421,7 +1465,6 @@ export const typeCheck = (
|
|
1421
1465
|
check(rightHand, env, scope)
|
1422
1466
|
}
|
1423
1467
|
typeSet(Types, name, env, exp)
|
1424
|
-
// Types.set(withScope(name, env), () => formatType(name, env))
|
1425
1468
|
break
|
1426
1469
|
case KEYWORDS.ANONYMOUS_FUNCTION:
|
1427
1470
|
{
|