fez-lisp 1.6.84 → 1.6.85
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/package.json +1 -1
- package/src/check.js +25 -23
package/package.json
CHANGED
package/src/check.js
CHANGED
@@ -652,31 +652,29 @@ const resolveGetter = ({ rem, prop, name, env, caller, exp }) => {
|
|
652
652
|
const rec = resolveGetterRec(rem, env)
|
653
653
|
if (!rec) return true
|
654
654
|
const [times, level, type, types] = resolveGetterRec(rem, env)
|
655
|
-
const isUnknown =
|
655
|
+
const isUnknown =
|
656
|
+
types.at(-1) === UNKNOWN || types.at(-1) === COLLECTION
|
656
657
|
if (!isUnknown && times >= level)
|
657
658
|
throw new RangeError(
|
658
659
|
`(${caller}) is trying to access nested structure at level (${level}) which is deeper than it's (${
|
659
660
|
times - 1
|
660
661
|
}) levels at (${stringifyArgs(exp)}) (check #1003)`
|
661
662
|
)
|
662
|
-
if (times === level - 1)
|
663
|
+
if (times === level - 1)
|
663
664
|
setPropToType(env[name][STATS], prop, {
|
664
|
-
[TYPE_PROP]:
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
|
670
|
-
]
|
671
|
-
: [UNKNOWN]
|
665
|
+
[TYPE_PROP]:
|
666
|
+
types.length && !isUnknown
|
667
|
+
? [type, new SubType([types.at(-1)])]
|
668
|
+
: types.at(-1) === COLLECTION
|
669
|
+
? [COLLECTION]
|
670
|
+
: [UNKNOWN]
|
672
671
|
})
|
673
|
-
|
672
|
+
else
|
674
673
|
setPropToType(env[name][STATS], prop, {
|
675
674
|
[TYPE_PROP]: types.length
|
676
675
|
? [COLLECTION, new SubType(types.slice(times))]
|
677
676
|
: [UNKNOWN]
|
678
677
|
})
|
679
|
-
}
|
680
678
|
return true
|
681
679
|
}
|
682
680
|
if (
|
@@ -704,11 +702,10 @@ const resolveGetter = ({ rem, prop, name, env, caller, exp }) => {
|
|
704
702
|
setPropToReturn(env[name][STATS], prop, {
|
705
703
|
[RETURNS]: [f, new SubType(r)]
|
706
704
|
})
|
707
|
-
} else if (rightSub.has(APPLY))
|
705
|
+
} else if (rightSub.has(APPLY))
|
708
706
|
// TODOD: abstractions go here but what can we do with them
|
709
707
|
// perhaps show the signature?
|
710
708
|
setPropToAbstraction(env[name][STATS], prop)
|
711
|
-
}
|
712
709
|
}
|
713
710
|
break
|
714
711
|
case WORD:
|
@@ -739,11 +736,10 @@ const resolveGetter = ({ rem, prop, name, env, caller, exp }) => {
|
|
739
736
|
setPropToType(env[name][STATS], prop, {
|
740
737
|
[TYPE_PROP]: [f, new SubType(r)]
|
741
738
|
})
|
742
|
-
} else if (rightSub.has(APPLY))
|
739
|
+
} else if (rightSub.has(APPLY))
|
743
740
|
// TODOD: abstractions go here but what can we do with them
|
744
741
|
// perhaps show the signature?
|
745
742
|
setPropToAbstraction(env[name][STATS], prop)
|
746
|
-
}
|
747
743
|
}
|
748
744
|
}
|
749
745
|
break
|
@@ -874,6 +870,8 @@ const resolveSetter = (first, rest, env, stack) => {
|
|
874
870
|
// )
|
875
871
|
}
|
876
872
|
}
|
873
|
+
const countLevels = (arr, lvl = -1) =>
|
874
|
+
Array.isArray(arr[0]) ? countLevels(arr[0], ++lvl) : lvl
|
877
875
|
const initArrayTypeRec = ({ rem, env }) =>
|
878
876
|
rem.slice(1).map((x) => {
|
879
877
|
if (isLeaf(x))
|
@@ -906,14 +904,15 @@ const initArrayTypeRec = ({ rem, env }) =>
|
|
906
904
|
})
|
907
905
|
const initArrayType = ({ rem, env }) => {
|
908
906
|
const ret = initArrayTypeRec({ rem, env })
|
909
|
-
const
|
910
|
-
const
|
907
|
+
const flat = ret.flat(Infinity).filter((x) => !isSubType(x))
|
908
|
+
const subTypes = ret.flat(Infinity).filter((x) => isSubType(x))
|
909
|
+
const known = flat.find((x) => x !== ANY && x !== UNKNOWN)
|
910
|
+
const isCollection = ret.length && Array.isArray(ret[0])
|
911
911
|
if (
|
912
912
|
known &&
|
913
913
|
ret.length &&
|
914
|
-
|
915
|
-
|
916
|
-
: !ret.some((x) => known[0] !== x[0]))
|
914
|
+
!flat.some((x) => known !== x) &&
|
915
|
+
!subTypes.some((x) => subTypes[0].types[0] !== x.types[0])
|
917
916
|
) {
|
918
917
|
if (Array.isArray(ret[0][0])) {
|
919
918
|
let head = ret[0][0]
|
@@ -934,7 +933,7 @@ const initArrayType = ({ rem, env }) => {
|
|
934
933
|
[RETURNS]: [
|
935
934
|
COLLECTION,
|
936
935
|
isCollection
|
937
|
-
? new SubType(isSubType(sub) ? [
|
936
|
+
? new SubType(isSubType(sub) ? [...sub] : [COLLECTION])
|
938
937
|
: new SubType(isSubType(sub) ? [...sub] : [main])
|
939
938
|
]
|
940
939
|
}
|
@@ -944,7 +943,10 @@ const initArrayType = ({ rem, env }) => {
|
|
944
943
|
[RETURNS]: [
|
945
944
|
COLLECTION,
|
946
945
|
isCollection
|
947
|
-
? new SubType([
|
946
|
+
? new SubType([
|
947
|
+
...Array.from({ length: countLevels(ret) }).fill(COLLECTION),
|
948
|
+
UNKNOWN
|
949
|
+
])
|
948
950
|
: new SubType([UNKNOWN])
|
949
951
|
]
|
950
952
|
}
|