Slava Pestov
8406d44db8
RequirementMachine: Allow MutableTerm::rewriteSubTerm() to make the term longer
...
I'm about to change the reduction order so that terms with more
name symbols always order after terms with fewer name symbols,
so for example
[P].A > [P:T].[Q:U].[R:V]
This will be used to implement protocol typealiases.
2022-02-13 00:24:23 -05:00
Slava Pestov
65fda8092f
RequirementMachine: Small fix for debug output
2022-02-13 00:24:23 -05:00
Slava Pestov
d4a4540494
RequirementMachine: Fix name lookups for the internal 'where' clause of a GenericParamList
...
These come up in SIL and in the experimental named opaque result types
implementation. Pass the correct DeclContext here, instead of using
the ModuleDecl.
2022-02-10 17:23:54 -05:00
Slava Pestov
2d066dd7ed
RequirementMachine: Do a better job of filtering out invalid superclass and concrete type requirements
...
In the long run it doesn't really matter if we leave them in there, but for now
matching the GenericSignatureBuilder's behavior makes the tests pass with
-requirement-machine-inferred-signatures=verify.
2022-02-10 17:23:54 -05:00
Slava Pestov
d64fb39514
RequirementMachine: Introduce conditional requirements in desugaring
2022-02-10 17:23:54 -05:00
Slava Pestov
48ca87ddeb
RequirementMachine: Handle type parameters in @_differentiable requirement inference
2022-02-10 17:23:54 -05:00
Slava Pestov
915ae67974
RequirementMachine: Factor out lookupMemberType() utility in RequirementLowering.cpp
2022-02-10 17:23:54 -05:00
Slava Pestov
e445335eb3
RequirementMachine: Record rewrite loops during superclass unification
...
This is the second half of rdar://problem/88134910.
Also addresses rdar://problem/25065503.
2022-02-09 22:44:06 -05:00
Slava Pestov
94b55bd408
RequirementMachine: Factor out PropertyMap::unifyConcreteTypes() from ::addConcreteTypeProperty()
2022-02-09 16:49:24 -05:00
Slava Pestov
d39c667e26
RequirementMachine: New elimination order based on projection count
...
We want to prefer to eliminate rules that are not concrete type rules,
unless non-concrete type rule in question is a projection. For example,
suppose that this rule comes from a protocol:
T.T == G<T.U, T.V>
And these three rules are in our minimization domain:
a) T.T == G<Int, W>
b) T.U == Int
c) T.V == W
Then a) implies both b) and c), and vice versa.
In this case, we want to keep T.U == Int and T.V == W, and eliminate
T.T == G<Int, W>.
T.T == G<Int, W> is concrete and T.V == W is not, but because T.V == W
is defined by a projection, we still prefer to eliminate T.T == G<Int, W>
over T.V == W.
2022-02-09 11:31:35 -05:00
Slava Pestov
aeceda3cfa
RequirementMachine: Introduce RewriteLoop::getProjectionCount()
2022-02-09 10:45:09 -05:00
Slava Pestov
6685e55135
RequirementMachine: Print loop numbers in RewriteSystem::dump()
2022-02-09 10:45:09 -05:00
Slava Pestov
fcd41a01af
RequirementMachine: Fix introduction of same-type requirement for recursive concrete witness
2022-02-09 01:09:00 -05:00
Slava Pestov
0f3ec0f2f0
RequirementMachine: Simpler handling of concrete conformances in minimal conformances algorithm
...
This logic was tricky and unsound.
Correct handling of concrete conformances requires rebuilding the
signature after dropping protocol conformance requiremnts made
redundant by concrete type requirements.
The old support for "derived-via-concrete" requirements in the
minimal conformances algorithm was causing other problems, and it
is the wrong approach anyway, so just remove it.
2022-02-09 01:05:12 -05:00
Slava Pestov
4d1a8dfe23
RequirementMachine: Don't record no-op PrefixSubstitutions rewrite steps
2022-02-09 00:26:04 -05:00
Slava Pestov
50f84cb4bf
RequirementMachine: Tweak debug output
2022-02-09 00:26:04 -05:00
Slava Pestov
0cf2881edf
RequirementMachine: Simplify Symbol internal storage
2022-02-07 18:57:45 -05:00
Slava Pestov
0d0bcb2ff1
RequirementMachine: Simplify the Symbol API for removal of merged associated types
2022-02-07 18:57:45 -05:00
Slava Pestov
e2e088e082
RequirementMachine: Remove merged associated types from completion
2022-02-07 18:57:45 -05:00
Slava Pestov
868e48cb7a
RequirementMachine: Mark rules as simplified in PropertyMap::addConcreteTypeProperty()
2022-02-07 08:20:59 -05:00
Slava Pestov
9e234a09c6
RequirementMachine: Record rewrite loop relating concrete type rules in processTypeDifference()
...
We can't actually rely on concretelySimplifyLeftHandSideSubstitutions()
to do this for us, because the less-simplified rule (the LHS rule)
might only apply to a suffix of the base term.
2022-02-07 08:20:59 -05:00
Slava Pestov
5bb80286e9
RequirementMachine: Factor out a utility for building a rewrite path unifying to concrete type rules
2022-02-07 08:20:59 -05:00
Slava Pestov
70876171e6
RequirementMachine: Build rewrite paths for concrete unification induced rules
2022-02-07 08:20:59 -05:00
Slava Pestov
9ee702026f
RequirementMachine: Factor out TypeDifference::getOriginalSubstitution()
2022-02-07 08:20:59 -05:00
Slava Pestov
60db9174e6
RequirementMachine: Factor out PropertyMap::processTypeDifference()
2022-02-07 08:20:59 -05:00
Slava Pestov
fcd467ad4c
RequirementMachine: Factor out TypeDifference::getReplacementSubstitution()
2022-02-07 08:20:59 -05:00
Slava Pestov
2c355de71b
RequirementMachine: Introduce RewriteStep::{Left,Right}ConcreteProjection
2022-02-07 08:20:59 -05:00
Slava Pestov
00d226fd2f
RequirementMachine: Store the base term in the TypeDifference
2022-02-07 08:20:59 -05:00
Slava Pestov
06d4770adb
RequirementMachine: Teach homotopy reduction to better deal with incomparable rules
2022-02-07 08:20:59 -05:00
Slava Pestov
037dc98845
RequirementMachine: Generalize compare() methods to return None instead of asserting on incomparable symbols
2022-02-07 08:20:59 -05:00
Slava Pestov
37be2d5dd7
RequirementMachine: Emit a diagnostic note with the offending rewrite rule if completion failed
...
This surfaces an implementation detail, but it might be better
than nothing.
2022-02-07 08:20:59 -05:00
Slava Pestov
b0dd114fdd
RequirementMachine: Add a FIXME comment
2022-02-07 08:20:59 -05:00
Slava Pestov
0060592b85
RequirementMachine: Add concrete nesting depth check
...
Configured with -requirement-machine-max-concrete-nesting= frontend flag.
2022-02-07 08:20:59 -05:00
Slava Pestov
634ca55764
RequirementMachine: Rework completion limits a bit
...
- Rename StepLimit to MaxRuleCount, DepthLimit to MaxRuleLength
- Rename command line flags to -requirement-machine-max-rule-{count,length}=
- Check limits outside of PropertyMap::buildPropertyMap()
- Simplify the logic in RequirementMachine::computeCompletion()
2022-02-07 08:20:59 -05:00
Slava Pestov
730941b3ea
RequirementMachine: Implement PropertyMap::concretelySimplifyLeftHandSideSubstitutions()
2022-02-07 08:20:58 -05:00
Slava Pestov
7e4a5876d1
RequirementMachine: Introduce RewriteStep::DecomposeConcrete
2022-02-07 08:20:58 -05:00
Slava Pestov
d8aa79c5e5
RequirementMachine: Rename RewriteStep::AdjustConcreteType to ::PrefixSubstitutions
2022-02-07 08:20:58 -05:00
Slava Pestov
7464a5f139
RequirementMachine: Make recordTypeDifference() and buildTypeDifference() public
2022-02-07 08:20:58 -05:00
Slava Pestov
73296edc63
RequirementMachine: Less indirect TypeDifference representation
2022-02-07 08:20:58 -05:00
Slava Pestov
e19ee4d1a1
RequirementMachine: Refactor PropertyMap::addConcreteTypeProperty() to use computeTypeDifference()
...
This doesn't record rewrite loops from most concrete unifications just yet,
only handling a case where two concrete types were identical except for an
adjustment.
2022-02-07 08:20:58 -05:00
Slava Pestov
8eb8e8d86d
RequirementMachine: Make RewriteSystem::recordRewriteLoop() public for use by the property map
2022-02-07 08:20:58 -05:00
Slava Pestov
b28d35fa22
RequirementMachine: Introduce RewriteSystem::computeTypeDifference()
2022-02-07 08:20:58 -05:00
Slava Pestov
0c777e7534
RequirementMachine: Split up PropertyMap::addProperty()
2022-02-07 08:20:58 -05:00
Slava Pestov
a11151a7e3
RequirementMachine: Fix up some comments
2022-02-04 22:49:28 -05:00
Slava Pestov
3790bba7a0
RequirementMachine: Verify loops immediately when they're added to aid debugging
2022-02-04 22:48:35 -05:00
Slava Pestov
6895fa0f9b
RequirementMachine: Remove dead RewriteStep::applyConcreteConformance() declaration
2022-02-04 22:48:05 -05:00
Slava Pestov
e12cdd3773
RequirementMachine: Split off nested type concretization from PropertyUnification.cpp to ConcreteTypeWitness.cpp
2022-02-04 22:47:49 -05:00
Slava Pestov
b138c7602d
RequirementMachine: Add DebugFlags::PropertyMap
2022-02-04 22:47:49 -05:00
Slava Pestov
4f3d05f502
RequirementMachine: Remove Symbol::getSuperclass()
2022-02-04 22:47:19 -05:00
Slava Pestov
1539128dc4
RequirementMachine: Move getGenericParamIndex() to RewriteContext
2022-02-04 22:47:19 -05:00