@@ -58,6 +58,12 @@ vm.OP_UNARY_MAP = util.revertMap(unaryMap)
5858vm .OP_BINARY_MAP = util .revertMap (binaryMap )
5959vm .OP_OTHER_MAP = util .revertMap (otherMap )
6060
61+ --- @param source parser.object
62+ --- @return uri , vm.infer , vm.infer
63+ local function getOperandInfers (source )
64+ return guide .getUri (source ), vm .getInfer (source [1 ]), vm .getInfer (source [2 ])
65+ end
66+
6167--- @param operators parser.object[]
6268--- @param op string
6369--- @param value ? parser.object
@@ -267,6 +273,13 @@ vm.binarySwitch = util.switch()
267273 end
268274 if node then
269275 vm .setNode (source , node )
276+ return
277+ end
278+ -- Bitwise ops on integers always produce integer
279+ local uri , infer1 , infer2 = getOperandInfers (source )
280+ if infer1 :hasType (uri , ' integer' )
281+ and infer2 :hasType (uri , ' integer' ) then
282+ vm .setNode (source , vm .declareGlobal (' type' , ' integer' ))
270283 end
271284 end
272285 end )
@@ -386,9 +399,7 @@ vm.binarySwitch = util.switch()
386399 [1 ] = a .. b ,
387400 })
388401 else
389- local uri = guide .getUri (source )
390- local infer1 = vm .getInfer (source [1 ])
391- local infer2 = vm .getInfer (source [2 ])
402+ local uri , infer1 , infer2 = getOperandInfers (source )
392403 if (
393404 infer1 :hasType (uri , ' integer' )
394405 or infer1 :hasType (uri , ' number' )
0 commit comments