|
49 | 49 |
|
50 | 50 |
|
51 | 51 | ;; FIXME - Do something with paths in the case that a structure/vector is not mutable
|
52 |
| -(define (tc/hetero-ref i-e es-t vec-t name) |
| 52 | +(define (tc/hetero-ref i-e es-t vec-t name op) |
53 | 53 | (define i-val (tc/index i-e))
|
54 | 54 | (define i-bound (length es-t))
|
55 | 55 | (cond
|
56 | 56 | [(valid-index? i-val i-bound)
|
57 |
| - (ret (list-ref es-t i-val))] |
| 57 | + (define return-ty (list-ref es-t i-val)) |
| 58 | + (add-typeof-expr op (ret (-> vec-t -Fixnum return-ty))) |
| 59 | + (ret return-ty)] |
58 | 60 | [(not i-val)
|
59 |
| - (ret (apply Un es-t))] |
| 61 | + (define return-ty (apply Un es-t)) |
| 62 | + (add-typeof-expr op (ret (-> vec-t -Fixnum return-ty))) |
| 63 | + (ret return-ty)] |
60 | 64 | [else
|
61 | 65 | (index-error i-val i-bound i-e vec-t name)]))
|
62 | 66 |
|
63 |
| -(define (tc/hetero-set! i-e es-t val-e vec-t name) |
| 67 | +(define (tc/hetero-set! i-e es-t val-e vec-t name op) |
64 | 68 | (define i-val (tc/index i-e))
|
65 | 69 | (define i-bound (length es-t))
|
66 |
| - (cond |
| 70 | + (cond |
67 | 71 | [(valid-index? i-val i-bound)
|
68 |
| - (tc-expr/check val-e (ret (list-ref es-t i-val))) |
| 72 | + (define val-t (list-ref es-t i-val)) |
| 73 | + (tc-expr/check val-e (ret val-t)) |
| 74 | + (add-typeof-expr op (ret (-> vec-t -Fixnum val-t -Void))) |
69 | 75 | (ret -Void)]
|
70 | 76 | [(not i-val)
|
71 |
| - (define val-t (single-value val-e)) |
| 77 | + (define val-res (single-value val-e)) |
72 | 78 | (for ((es-type (in-list es-t)))
|
73 |
| - (check-below val-t (ret es-type))) |
| 79 | + (check-below val-res (ret es-type))) |
| 80 | + (define val-t |
| 81 | + (match val-res [(tc-result1: t) t])) |
| 82 | + (add-typeof-expr op (ret (-> vec-t -Fixnum val-t -Void))) |
74 | 83 | (ret -Void)]
|
75 | 84 | [else
|
76 | 85 | (single-value val-e)
|
77 | 86 | (index-error i-val i-bound i-e vec-t name)]))
|
78 | 87 |
|
79 | 88 | (define-tc/app-syntax-class (tc/app-hetero expected)
|
80 | 89 | #:literal-sets (hetero-literals)
|
81 |
| - (pattern (~and form ((~or unsafe-struct-ref unsafe-struct*-ref) struct:expr index:expr)) |
| 90 | + (pattern (~and form ((~and op (~or unsafe-struct-ref unsafe-struct*-ref)) struct:expr index:expr)) |
82 | 91 | (match (single-value #'struct)
|
83 | 92 | [(tc-result1: (and struct-t (app resolve (Struct: _ _ (list (fld: flds _ _) ...) _ _ _))))
|
84 |
| - (tc/hetero-ref #'index flds struct-t "struct")] |
| 93 | + (tc/hetero-ref #'index flds struct-t "struct" #'op)] |
85 | 94 | [(tc-result1: (and struct-t (app resolve (Prefab: _ (list flds ...)))))
|
86 |
| - (tc/hetero-ref #'index flds struct-t "prefab struct")] |
| 95 | + (tc/hetero-ref #'index flds struct-t "prefab struct" #'op)] |
87 | 96 | [s-ty (tc/app-regular #'form expected)]))
|
88 | 97 | ;; vector-ref on het vectors
|
89 |
| - (pattern (~and form ((~or vector-ref unsafe-vector-ref unsafe-vector*-ref) vec:expr index:expr)) |
| 98 | + (pattern (~and form ((~and op (~or vector-ref unsafe-vector-ref unsafe-vector*-ref)) vec:expr index:expr)) |
90 | 99 | (match (single-value #'vec)
|
91 | 100 | [(tc-result1: (and vec-t (app resolve (Is-a: (HeterogeneousVector: es)))))
|
92 |
| - (tc/hetero-ref #'index es vec-t "vector")] |
| 101 | + (tc/hetero-ref #'index es vec-t "vector" #'op)] |
93 | 102 | [v-ty (tc/app-regular #'form expected)]))
|
94 |
| - ;; unsafe struct-set! |
95 |
| - (pattern (~and form ((~or unsafe-struct-set! unsafe-struct*-set!) s:expr index:expr val:expr)) |
| 103 | + ;; unsafe struct-set! |
| 104 | + (pattern (~and form ((~and op (~or unsafe-struct-set! unsafe-struct*-set!)) s:expr index:expr val:expr)) |
96 | 105 | (match (single-value #'s)
|
97 | 106 | [(tc-result1: (and struct-t (app resolve (Struct: _ _ (list (fld: flds _ _) ...) _ _ _))))
|
98 |
| - (tc/hetero-set! #'index flds #'val struct-t "struct")] |
| 107 | + (tc/hetero-set! #'index flds #'val struct-t "struct" #'op)] |
99 | 108 | [s-ty (tc/app-regular #'form expected)]))
|
100 | 109 | ;; vector-set! on het vectors
|
101 |
| - (pattern (~and form ((~or vector-set! unsafe-vector-set! unsafe-vector*-set!) v:expr index:expr val:expr)) |
| 110 | + (pattern (~and form ((~and op (~or vector-set! unsafe-vector-set! unsafe-vector*-set!)) v:expr index:expr val:expr)) |
102 | 111 | (match (single-value #'v)
|
103 | 112 | [(tc-result1: (and vec-t (app resolve (Is-a: (HeterogeneousVector: es)))))
|
104 |
| - (tc/hetero-set! #'index es #'val vec-t "vector")] |
| 113 | + (tc/hetero-set! #'index es #'val vec-t "vector" #'op)] |
105 | 114 | [v-ty (tc/app-regular #'form expected)]))
|
106 |
| - (pattern (~and form ((~or vector-immutable vector) args:expr ...)) |
| 115 | + (pattern (~and form ((~and op (~or vector-immutable vector)) args:expr ...)) |
107 | 116 | (match expected
|
108 | 117 | [(tc-result1: (app resolve (Is-a: (Vector: t))))
|
109 |
| - (ret (make-HeterogeneousVector |
110 |
| - (for/list ([e (in-syntax #'(args ...))]) |
111 |
| - (tc-expr/check e (ret t)) |
112 |
| - t)))] |
| 118 | + (define arg-tys |
| 119 | + (for/list ([e (in-syntax #'(args ...))]) |
| 120 | + (tc-expr/check e (ret t)) |
| 121 | + t)) |
| 122 | + (define return-ty |
| 123 | + (make-HeterogeneousVector arg-tys)) |
| 124 | + (add-typeof-expr #'op (ret (->* arg-tys return-ty))) |
| 125 | + (ret return-ty)] |
113 | 126 | [(tc-result1: (app resolve (Is-a: (HeterogeneousVector: ts))))
|
114 | 127 | (cond
|
115 | 128 | [(= (length ts) (syntax-length #'(args ...)))
|
116 |
| - (ret |
117 |
| - (make-HeterogeneousVector |
118 |
| - (for/list ([e (in-syntax #'(args ...))] |
119 |
| - [t (in-list ts)]) |
120 |
| - (tc-expr/check/t e (ret t)))) |
121 |
| - -true-propset)] |
| 129 | + (define arg-tys |
| 130 | + (for/list ([e (in-syntax #'(args ...))] |
| 131 | + [t (in-list ts)]) |
| 132 | + (tc-expr/check/t e (ret t)))) |
| 133 | + (define return-ty |
| 134 | + (make-HeterogeneousVector arg-tys)) |
| 135 | + (add-typeof-expr #'op (ret (->* arg-tys return-ty))) |
| 136 | + (ret return-ty -true-propset)] |
122 | 137 | [else
|
123 | 138 | (tc-error/expr
|
124 | 139 | "expected vector with ~a elements, but got ~a"
|
|
136 | 151 | [_ (continue)])]
|
137 | 152 | ;; since vectors are mutable, if there is no expected type, we want to generalize the element type
|
138 | 153 | [(or #f (tc-any-results: _) (tc-result1: _))
|
139 |
| - (ret (make-HeterogeneousVector |
140 |
| - (for/list ((e (in-syntax #'(args ...)))) |
141 |
| - (generalize (tc-expr/t e)))))] |
| 154 | + (define arg-tys |
| 155 | + (for/list ((e (in-syntax #'(args ...)))) |
| 156 | + (generalize (tc-expr/t e)))) |
| 157 | + (define return-ty |
| 158 | + (make-HeterogeneousVector arg-tys)) |
| 159 | + (add-typeof-expr #'op (ret (->* arg-tys return-ty))) |
| 160 | + (ret return-ty)] |
142 | 161 | [_ (ret Err)])))
|
0 commit comments