Refactor processing of inference variables

Introduce hasTarget and resolveVar constraints for delayed resolving
of inference variables. In invocation context variables are not
inferred eagerly, but wait for the end of all conversions, and then
resolved via resolveVar.
This commit is contained in:
Fedor Isakov 2021-05-03 13:09:32 +02:00
parent e488399229
commit 47e6e07039
3 changed files with 1713 additions and 942 deletions

View File

@ -1530,7 +1530,57 @@
</node>
</node>
</node>
<node concept="3clFbH" id="4Z0pyZIFWuf" role="3cqZAp" />
<node concept="1Dw8fO" id="31ObkDYZQgE" role="3cqZAp">
<node concept="3clFbS" id="31ObkDYZQgF" role="2LFqv$">
<node concept="3cpWs8" id="31ObkDYZQgG" role="3cqZAp">
<node concept="3cpWsn" id="31ObkDYZQgH" role="3cpWs9">
<property role="TrG5h" value="exit" />
<node concept="3Tqbb2" id="31ObkDYZQgI" role="1tU5fm" />
<node concept="1y4W85" id="31ObkDYZQgJ" role="33vP2m">
<node concept="37vLTw" id="31ObkDYZQgK" role="1y58nS">
<ref role="3cqZAo" node="31ObkDYZQgS" resolve="i" />
</node>
<node concept="37vLTw" id="31ObkDYZQgL" role="1y566C">
<ref role="3cqZAo" node="zb1Nk79lNY" resolve="exits" />
</node>
</node>
</node>
</node>
<node concept="3Aqczg" id="31ObkDYZQgM" role="3cqZAp">
<node concept="3Aqt3T" id="31ObkDYZQgN" role="3Aqpz8">
<ref role="3AqCNq" to="kqnc:31ObkDYZPm0" resolve="resolveInferenceVar" />
<node concept="37jhX" id="31ObkDYZQgO" role="3AunhB">
<node concept="37vLTw" id="31ObkDYZQgP" role="37jj2">
<ref role="3cqZAo" node="31ObkDYZQgH" resolve="exit" />
</node>
</node>
</node>
</node>
</node>
<node concept="3cpWsn" id="31ObkDYZQgS" role="1Duv9x">
<property role="TrG5h" value="i" />
<node concept="10Oyi0" id="31ObkDYZQgT" role="1tU5fm" />
<node concept="3cmrfG" id="31ObkDYZQgU" role="33vP2m">
<property role="3cmrfH" value="0" />
</node>
</node>
<node concept="3eOVzh" id="31ObkDYZQgV" role="1Dwp0S">
<node concept="2OqwBi" id="31ObkDYZQgW" role="3uHU7w">
<node concept="37vLTw" id="31ObkDYZQgX" role="2Oq$k0">
<ref role="3cqZAo" node="zb1Nk79lNY" resolve="exits" />
</node>
<node concept="34oBXx" id="31ObkDYZQgY" role="2OqNvi" />
</node>
<node concept="37vLTw" id="31ObkDYZQgZ" role="3uHU7B">
<ref role="3cqZAo" node="31ObkDYZQgS" resolve="i" />
</node>
</node>
<node concept="2$rviw" id="31ObkDYZQh0" role="1Dwrff">
<node concept="37vLTw" id="31ObkDYZQh1" role="2$L3a6">
<ref role="3cqZAo" node="31ObkDYZQgS" resolve="i" />
</node>
</node>
</node>
<node concept="3Aqczg" id="4Z0pyZIF$Y3" role="3cqZAp">
<node concept="3A8Hvi" id="4Z0pyZIF$XX" role="3Aqpz8">
<node concept="a7P8L" id="4Z0pyZIF$Yt" role="3A8wtg">
@ -1629,6 +1679,19 @@
<node concept="3xSepi" id="5jbgz$E6gVR" role="3xSepv">
<node concept="3Aq9E8" id="5jbgz$E6gVS" role="3xSepj">
<node concept="3I6sU6" id="5jbgz$E6gVT" role="3Ip0Jz">
<node concept="3I6s7M" id="31ObkDYZPur" role="3I6sU7">
<node concept="3Aqt3T" id="31ObkDYZPup" role="3I6s78">
<ref role="3AqCNq" to="kqnc:31ObkDYZPlP" resolve="inferenceVar" />
<node concept="37jhX" id="31ObkDYZPvC" role="3AunhB">
<node concept="3A2sRY" id="31ObkDYZPvA" role="37jj2">
<ref role="3A2yKK" node="5jbgz$E6gUr" resolve="yld" />
</node>
</node>
<node concept="a7P8L" id="31ObkDYZPTV" role="3AunhB">
<ref role="a7OzE" node="5jbgz$E6gUK" resolve="YieldT" />
</node>
</node>
</node>
<node concept="3I6s7M" id="5jbgz$E6gVY" role="3I6sU7">
<node concept="3Aqt3T" id="5jbgz$E6gVX" role="3I6s78">
<ref role="3AqCNq" to="kqnc:34$A1MfhdDv" resolve="typeOf" />
@ -1700,6 +1763,23 @@
</node>
</node>
</node>
</node>
</node>
<node concept="3Aq9E8" id="31ObkDYZQ5n" role="3xSepj">
<node concept="3I6sU6" id="31ObkDYZQ5o" role="3Ip0Jz">
<node concept="3I6s7M" id="31ObkDYZPUU" role="3I6sU7">
<node concept="3Aqt3T" id="31ObkDYZPUS" role="3I6s78">
<ref role="3AqCNq" to="kqnc:31ObkDYZPlP" resolve="inferenceVar" />
<node concept="37jhX" id="31ObkDYZQ3u" role="3AunhB">
<node concept="3A2sRY" id="31ObkDYZQ3s" role="37jj2">
<ref role="3A2yKK" node="5jbgz$E6iox" resolve="yldAll" />
</node>
</node>
<node concept="a7P8L" id="31ObkDZ3yyh" role="3AunhB">
<ref role="a7OzE" node="5jbgz$E6j5t" resolve="Elem" />
</node>
</node>
</node>
<node concept="3I6s7M" id="5jbgz$E6kWg" role="3I6sU7">
<node concept="3Aqt3T" id="5jbgz$E6kWe" role="3I6s78">
<ref role="3AqCNq" to="kqnc:34$A1MfhdDv" resolve="typeOf" />
@ -1773,6 +1853,23 @@
</node>
</node>
</node>
</node>
</node>
<node concept="3Aq9E8" id="31ObkDYZQdG" role="3xSepj">
<node concept="3I6sU6" id="31ObkDYZQdH" role="3Ip0Jz">
<node concept="3I6s7M" id="31ObkDYZQg5" role="3I6sU7">
<node concept="3Aqt3T" id="31ObkDYZQg3" role="3I6s78">
<ref role="3AqCNq" to="kqnc:31ObkDYZPlP" resolve="inferenceVar" />
<node concept="37jhX" id="31ObkDYZQgh" role="3AunhB">
<node concept="3A2sRY" id="31ObkDYZQgf" role="37jj2">
<ref role="3A2yKK" node="5jbgz$E6iox" resolve="yldAll" />
</node>
</node>
<node concept="a7P8L" id="31ObkDZ3yzx" role="3AunhB">
<ref role="a7OzE" node="5jbgz$E6j5t" resolve="Elem" />
</node>
</node>
</node>
<node concept="3I6s7M" id="5jbgz$E6ioo" role="3I6sU7">
<node concept="3Aqt3T" id="5jbgz$E6iop" role="3I6s78">
<ref role="3AqCNq" to="kqnc:34$A1MfhdDv" resolve="typeOf" />
@ -4929,7 +5026,7 @@
<node concept="3clFbS" id="6yxoGioji64" role="2LFqv$">
<node concept="3Aqczg" id="6yxoGioji65" role="3cqZAp">
<node concept="3Aqt3T" id="6yxoGioji66" role="3Aqpz8">
<ref role="3AqCNq" to="kqnc:6N2bvv_5W0X" resolve="resolveVar" />
<ref role="3AqCNq" to="kqnc:4jGoIleP8jH" resolve="makeGround" />
<node concept="a7P8L" id="6yxoGioji67" role="3AunhB">
<ref role="a7OzE" node="6yxoGiojas8" resolve="MethTVs" />
<node concept="37vLTw" id="6yxoGioji68" role="3gCZO6">
@ -6199,7 +6296,7 @@
<node concept="37vLTw" id="53tmmMtoIIw" role="3jicU7">
<ref role="3cqZAo" node="3DgB4rOyEsk" resolve="mdecl" />
</node>
<node concept="37vLTw" id="53tmmMtoKNr" role="3jicU7">
<node concept="37vLTw" id="4jGoIleP8gR" role="3jicU7">
<ref role="3cqZAo" node="53tmmMtoJCO" resolve="noMethodTyArgs" />
</node>
<node concept="37vLTw" id="53tmmMtoKN_" role="3jicU7">
@ -6304,7 +6401,7 @@
<node concept="3clFbS" id="53tmmMtp2oQ" role="2LFqv$">
<node concept="3Aqczg" id="53tmmMtp7gJ" role="3cqZAp">
<node concept="3Aqt3T" id="53tmmMtp7gH" role="3Aqpz8">
<ref role="3AqCNq" to="kqnc:6N2bvv_5W0X" resolve="resolveVar" />
<ref role="3AqCNq" to="kqnc:4jGoIleP8jH" resolve="makeGround" />
<node concept="a7P8L" id="53tmmMtp7ib" role="3AunhB">
<ref role="a7OzE" node="53tmmMtoThW" resolve="MethTVs" />
<node concept="37vLTw" id="53tmmMtp7iJ" role="3gCZO6">

View File

@ -1112,6 +1112,70 @@
</node>
</node>
</node>
<node concept="3clFb_" id="4jGoIlfaAZT" role="jymVt">
<property role="TrG5h" value="acceptT2" />
<node concept="3clFbS" id="4jGoIlfaAZU" role="3clF47">
<node concept="3clFbF" id="4jGoIlfaCCy" role="3cqZAp">
<node concept="10Nm6u" id="4jGoIlfaCCx" role="3clFbG" />
</node>
</node>
<node concept="3Tm1VV" id="4jGoIlfaAZV" role="1B3o_S" />
<node concept="16syzq" id="4jGoIlfaC74" role="3clF45">
<ref role="16sUi3" node="4jGoIlfaB02" resolve="TA" />
</node>
<node concept="37vLTG" id="4jGoIlfaAZX" role="3clF46">
<property role="TrG5h" value="block" />
<node concept="1ajhzC" id="4jGoIlfaAZY" role="1tU5fm">
<node concept="16syzq" id="4jGoIlfaAZZ" role="1ajw0F">
<ref role="16sUi3" node="4jGoIlfaB02" resolve="TA" />
</node>
<node concept="16syzq" id="4jGoIlfaB00" role="1ajl9A">
<ref role="16sUi3" node="4jGoIlfaB01" resolve="TR" />
</node>
</node>
</node>
<node concept="16euLQ" id="4jGoIlfaB01" role="16eVyc">
<property role="TrG5h" value="TR" />
</node>
<node concept="16euLQ" id="4jGoIlfaB02" role="16eVyc">
<property role="TrG5h" value="TA" />
<node concept="16syzq" id="4jGoIlfaB03" role="3ztrMU">
<ref role="16sUi3" node="4jGoIlfaB01" resolve="TR" />
</node>
</node>
</node>
<node concept="3clFb_" id="4jGoIlfaCZP" role="jymVt">
<property role="TrG5h" value="acceptT3" />
<node concept="3clFbS" id="4jGoIlfaCZQ" role="3clF47">
<node concept="3clFbF" id="4jGoIlfaCZR" role="3cqZAp">
<node concept="10Nm6u" id="4jGoIlfaCZS" role="3clFbG" />
</node>
</node>
<node concept="3Tm1VV" id="4jGoIlfaCZT" role="1B3o_S" />
<node concept="16syzq" id="4jGoIlfaDsp" role="3clF45">
<ref role="16sUi3" node="4jGoIlfaCZZ" resolve="TR" />
</node>
<node concept="37vLTG" id="4jGoIlfaCZV" role="3clF46">
<property role="TrG5h" value="block" />
<node concept="1ajhzC" id="4jGoIlfaCZW" role="1tU5fm">
<node concept="16syzq" id="4jGoIlfaCZX" role="1ajw0F">
<ref role="16sUi3" node="4jGoIlfaD00" resolve="TA" />
</node>
<node concept="16syzq" id="4jGoIlfaCZY" role="1ajl9A">
<ref role="16sUi3" node="4jGoIlfaCZZ" resolve="TR" />
</node>
</node>
</node>
<node concept="16euLQ" id="4jGoIlfaCZZ" role="16eVyc">
<property role="TrG5h" value="TR" />
</node>
<node concept="16euLQ" id="4jGoIlfaD00" role="16eVyc">
<property role="TrG5h" value="TA" />
<node concept="16syzq" id="4jGoIlfaD01" role="3ztrMU">
<ref role="16sUi3" node="4jGoIlfaCZZ" resolve="TR" />
</node>
</node>
</node>
<node concept="3clFb_" id="zb1Nk7afOA" role="jymVt">
<property role="TrG5h" value="accept2" />
<node concept="3clFbS" id="zb1Nk7afOB" role="3clF47" />
@ -1347,6 +1411,92 @@
</node>
</node>
</node>
<node concept="3SKdUt" id="4jGoIlfaO$G" role="3cqZAp">
<node concept="1PaTwC" id="4jGoIlfaO$H" role="1aUNEU">
<node concept="3oM_SD" id="4jGoIlfaPgA" role="1PaTwD">
<property role="3oM_SC" value="the" />
</node>
<node concept="3oM_SD" id="4jGoIlfaPgC" role="1PaTwD">
<property role="3oM_SC" value="following" />
</node>
<node concept="3oM_SD" id="4jGoIlfaPgF" role="1PaTwD">
<property role="3oM_SC" value="two" />
</node>
<node concept="3oM_SD" id="4jGoIlfaPgJ" role="1PaTwD">
<property role="3oM_SC" value="test" />
</node>
<node concept="3oM_SD" id="4jGoIlfaPgO" role="1PaTwD">
<property role="3oM_SC" value="cases" />
</node>
<node concept="3oM_SD" id="4jGoIlfaPgU" role="1PaTwD">
<property role="3oM_SC" value="are" />
</node>
<node concept="3oM_SD" id="4jGoIlfaPh1" role="1PaTwD">
<property role="3oM_SC" value="actually" />
</node>
<node concept="3oM_SD" id="4jGoIlfaPh9" role="1PaTwD">
<property role="3oM_SC" value="correct:" />
</node>
<node concept="3oM_SD" id="4jGoIlfaPhi" role="1PaTwD">
<property role="3oM_SC" value="" />
</node>
</node>
</node>
<node concept="3SKdUt" id="4jGoIlfaPXA" role="3cqZAp">
<node concept="1PaTwC" id="4jGoIlfaPXB" role="1aUNEU">
<node concept="3oM_SD" id="4jGoIlfaQvz" role="1PaTwD">
<property role="3oM_SC" value="there" />
</node>
<node concept="3oM_SD" id="4jGoIlfaQv_" role="1PaTwD">
<property role="3oM_SC" value="is" />
</node>
<node concept="3oM_SD" id="4jGoIlfaQvC" role="1PaTwD">
<property role="3oM_SC" value="a" />
</node>
<node concept="3oM_SD" id="4jGoIlfaQvG" role="1PaTwD">
<property role="3oM_SC" value="substitution" />
</node>
<node concept="3oM_SD" id="4jGoIlfaQvL" role="1PaTwD">
<property role="3oM_SC" value="for" />
</node>
<node concept="3oM_SD" id="4jGoIlfaQvR" role="1PaTwD">
<property role="3oM_SC" value="vars" />
</node>
<node concept="3oM_SD" id="4jGoIlfaQvY" role="1PaTwD">
<property role="3oM_SC" value="TA,TR" />
</node>
<node concept="3oM_SD" id="4jGoIlfaQw6" role="1PaTwD">
<property role="3oM_SC" value="that" />
</node>
<node concept="3oM_SD" id="4jGoIlfaQwf" role="1PaTwD">
<property role="3oM_SC" value="satisfies" />
</node>
<node concept="3oM_SD" id="4jGoIlfaQwp" role="1PaTwD">
<property role="3oM_SC" value="this" />
</node>
<node concept="3oM_SD" id="4jGoIlfaQw$" role="1PaTwD">
<property role="3oM_SC" value="code:" />
</node>
<node concept="3oM_SD" id="4jGoIlfaToI" role="1PaTwD">
<property role="3oM_SC" value="[TA" />
</node>
<node concept="3oM_SD" id="4jGoIlfaToJ" role="1PaTwD">
<property role="3oM_SC" value="-&gt;" />
</node>
<node concept="3oM_SD" id="4jGoIlfaToK" role="1PaTwD">
<property role="3oM_SC" value="A," />
</node>
<node concept="3oM_SD" id="4jGoIlfaToL" role="1PaTwD">
<property role="3oM_SC" value="TR" />
</node>
<node concept="3oM_SD" id="4jGoIlfaToM" role="1PaTwD">
<property role="3oM_SC" value="-&gt;" />
</node>
<node concept="3oM_SD" id="4jGoIlfaToN" role="1PaTwD">
<property role="3oM_SC" value="A]" />
</node>
</node>
</node>
<node concept="3clFbF" id="4yZzE4kLTBc" role="3cqZAp">
<node concept="1rXfSq" id="4yZzE4kLTBd" role="3clFbG">
<ref role="37wK5l" node="zb1Nk79_Ee" resolve="acceptT1" />
@ -1364,9 +1514,6 @@
</node>
</node>
</node>
<node concept="1U20sH" id="4yZzE4kLU$7" role="lGtFl">
<property role="1U20sK" value="error" />
</node>
</node>
</node>
</node>
@ -1387,12 +1534,120 @@
</node>
</node>
</node>
<node concept="1U20sH" id="4yZzE4kN3f1" role="lGtFl">
<property role="1U20sK" value="error" />
</node>
</node>
</node>
<node concept="3clFbH" id="4jGoIlfaSTW" role="3cqZAp" />
<node concept="3cpWs8" id="4jGoIlfaFk5" role="3cqZAp">
<node concept="3cpWsn" id="4jGoIlfaFk6" role="3cpWs9">
<property role="TrG5h" value="a1" />
<node concept="3uibUv" id="4jGoIlfaFML" role="1tU5fm">
<ref role="3uigEE" node="zb1Nk79_lR" resolve="ClosureLiterals.A" />
</node>
<node concept="1rXfSq" id="4jGoIlfaFk7" role="33vP2m">
<ref role="37wK5l" node="4jGoIlfaAZT" resolve="acceptT2" />
<node concept="1bVj0M" id="4jGoIlfaFk8" role="37wK5m">
<node concept="37vLTG" id="4jGoIlfaFk9" role="1bW2Oz">
<property role="TrG5h" value="smth" />
<node concept="3uibUv" id="4jGoIlfaFka" role="1tU5fm">
<ref role="3uigEE" node="zb1Nk79_lR" resolve="ClosureLiterals.A" />
</node>
</node>
<node concept="3clFbS" id="4jGoIlfaFkb" role="1bW5cS">
<node concept="3clFbF" id="4jGoIlfaFkc" role="3cqZAp">
<node concept="37vLTw" id="4jGoIlfaFkd" role="3clFbG">
<ref role="3cqZAo" node="zb1Nk79_m7" resolve="c" />
</node>
</node>
</node>
</node>
</node>
</node>
</node>
<node concept="3cpWs8" id="4jGoIlfaHJi" role="3cqZAp">
<node concept="3cpWsn" id="4jGoIlfaHJj" role="3cpWs9">
<property role="TrG5h" value="a2" />
<node concept="3uibUv" id="4jGoIlfaIeb" role="1tU5fm">
<ref role="3uigEE" node="zb1Nk79_lR" resolve="ClosureLiterals.A" />
</node>
<node concept="1rXfSq" id="4jGoIlfaHJk" role="33vP2m">
<ref role="37wK5l" node="4jGoIlfaCZP" resolve="acceptT3" />
<node concept="1bVj0M" id="4jGoIlfaHJl" role="37wK5m">
<node concept="37vLTG" id="4jGoIlfaHJm" role="1bW2Oz">
<property role="TrG5h" value="smth" />
<node concept="3uibUv" id="4jGoIlfaHJn" role="1tU5fm">
<ref role="3uigEE" node="zb1Nk79_lR" resolve="ClosureLiterals.A" />
</node>
</node>
<node concept="3clFbS" id="4jGoIlfaHJo" role="1bW5cS">
<node concept="3cpWs6" id="4jGoIlfaHJp" role="3cqZAp">
<node concept="37vLTw" id="4jGoIlfaHJq" role="3cqZAk">
<ref role="3cqZAo" node="zb1Nk79_m7" resolve="c" />
</node>
</node>
</node>
</node>
</node>
</node>
</node>
<node concept="3cpWs8" id="4jGoIlfaL2J" role="3cqZAp">
<node concept="3cpWsn" id="4jGoIlfaL2K" role="3cpWs9">
<property role="TrG5h" value="c1" />
<node concept="3uibUv" id="4jGoIlfaLJh" role="1tU5fm">
<ref role="3uigEE" node="zb1Nk79_lW" resolve="ClosureLiterals.C" />
</node>
<node concept="1rXfSq" id="4jGoIlfaL2M" role="33vP2m">
<ref role="37wK5l" node="4jGoIlfaAZT" resolve="acceptT2" />
<node concept="1bVj0M" id="4jGoIlfaL2N" role="37wK5m">
<node concept="37vLTG" id="4jGoIlfaL2O" role="1bW2Oz">
<property role="TrG5h" value="smth" />
<node concept="3uibUv" id="4jGoIlfaL2P" role="1tU5fm">
<ref role="3uigEE" node="zb1Nk79_lR" resolve="ClosureLiterals.A" />
</node>
</node>
<node concept="3clFbS" id="4jGoIlfaL2Q" role="1bW5cS">
<node concept="3clFbF" id="4jGoIlfaL2R" role="3cqZAp">
<node concept="37vLTw" id="4jGoIlfaL2S" role="3clFbG">
<ref role="3cqZAo" node="zb1Nk79_m7" resolve="c" />
</node>
</node>
</node>
</node>
</node>
<node concept="1U20sH" id="4jGoIlfcBVL" role="lGtFl">
<property role="1U20sK" value="error" />
</node>
</node>
</node>
<node concept="3cpWs8" id="4jGoIlfaL2_" role="3cqZAp">
<node concept="3cpWsn" id="4jGoIlfaL2A" role="3cpWs9">
<property role="TrG5h" value="c2" />
<node concept="3uibUv" id="4jGoIlfaN9K" role="1tU5fm">
<ref role="3uigEE" node="zb1Nk79_lW" resolve="ClosureLiterals.C" />
</node>
<node concept="1rXfSq" id="4jGoIlfaL2C" role="33vP2m">
<ref role="37wK5l" node="4jGoIlfaCZP" resolve="acceptT3" />
<node concept="1bVj0M" id="4jGoIlfaL2D" role="37wK5m">
<node concept="37vLTG" id="4jGoIlfaL2E" role="1bW2Oz">
<property role="TrG5h" value="smth" />
<node concept="3uibUv" id="4jGoIlfaL2F" role="1tU5fm">
<ref role="3uigEE" node="zb1Nk79_lR" resolve="ClosureLiterals.A" />
</node>
</node>
<node concept="3clFbS" id="4jGoIlfaL2G" role="1bW5cS">
<node concept="3cpWs6" id="4jGoIlfaL2H" role="3cqZAp">
<node concept="37vLTw" id="4jGoIlfaL2I" role="3cqZAk">
<ref role="3cqZAo" node="zb1Nk79_m7" resolve="c" />
</node>
</node>
</node>
</node>
</node>
<node concept="1U20sH" id="4jGoIlfcCDJ" role="lGtFl">
<property role="1U20sK" value="error" />
</node>
</node>
</node>
<node concept="3clFbH" id="554EtBHF$an" role="3cqZAp" />
<node concept="3SKdUt" id="554EtBHFEmt" role="3cqZAp">
<node concept="1PaTwC" id="554EtBHFEmu" role="1aUNEU">