Repository navigation
Conversation
2c69161 to
b14b51a
Compare
03284cb to
0455baf
Compare
There was a problem hiding this comment.
🟡 Changes recommended
Implicit argument handling and parent-scope checks still produce incorrect or incomplete nested-type inference.
2 open issues
What changed in this PR
Extends Unified’s type inference to represent nested types and preserve their enclosing generic arguments, with Swift regression coverage.
Changes:
- Adds parent-type parameters and qualified type names.
- Updates type mentions and enum construction to propagate parent-type paths.
- Adds nested-type tests and updates inference expectations.
| File | Description |
|---|---|
unified/ql/test/library-tests/type-inference/type-inference.expected |
Updates expected inference results. |
unified/ql/test/library-tests/type-inference/nested_types.swift |
Adds nested-generic, self-type, and extension coverage. |
unified/ql/test/library-tests/type-inference/generics.swift |
Removes a resolved MISSING annotation. |
unified/ql/test/library-tests/type-inference/classes.swift |
Updates the inline expected nested-type name. |
unified/ql/lib/codeql/unified/internal/typeinference/TypeMention.qll |
Adds nested-type qualification and implicit argument handling. |
unified/ql/lib/codeql/unified/internal/typeinference/TypeInferencePluginSwift.qll |
Removes Swift-specific enum plugin hooks. |
unified/ql/lib/codeql/unified/internal/typeinference/TypeInferencePlugin.qll |
Removes enum-specific hooks and wrappers. |
unified/ql/lib/codeql/unified/internal/typeinference/TypeInference.qll |
Integrates parent paths into constructor inference. |
unified/ql/lib/codeql/unified/internal/typeinference/Type.qll |
Introduces parent-type parameters and qualified names. |
unified/ql/lib/codeql/unified/internal/AstExtra.qll |
Adds shared enum relationships and enum-field modeling. |
Review effort: Max
0455baf to
e55b569
Compare
606fac6 to
fee52f9
Compare
There was a problem hiding this comment.
🟡 Changes recommended
Parent-type inference can recurse into itself and produce conflicting types for nested classes and aliases.
7 open issues
Prefer lexical parent over enclosing subclass fallback · New Preserve alias-expanded parent specialization · New Exclude fixed-specialization aliases from implicit arguments · New Exclude generic alias bases from parent fallback · New Avoid fallback on specialized unqualified alias uses · New Correct expected and spurious constructor targets · New Use bar(...) for zero-argument type inference · New
2 resolved since last review
Review effort: Max
fee52f9 to
a014cb6
Compare
There was a problem hiding this comment.
🟡 Changes recommended
Alias expansion can lose enclosing generic arguments or introduce conflicting certain types.
3 open issues
7 resolved since last review
Prefer lexical parent over enclosing subclass fallback Use bar(...) for zero-argument type inference Correct expected and spurious constructor targets Avoid fallback on specialized unqualified alias uses Exclude generic alias bases from parent fallback Exclude fixed-specialization aliases from implicit arguments Preserve alias-expanded parent specialization
Review effort: Max
9a2da2f to
f27b5df
Compare
5ffdc62 to
16e479a
Compare
16e479a to
d259816
Compare
There was a problem hiding this comment.
🟡 Changes recommended
Nested alias handling still loses qualifier information in forwarded references, generic arguments, and tuple elements, causing incorrect outer-type inference for qualified alias uses.
2 open issues
1 resolved since last review
Review effort: Max
af6d3b3 to
cd773cb
Compare
There was a problem hiding this comment.
🟡 Changes recommended
The enum-field inference rule misses generic arguments beneath parent paths, preventing nested enum initializers from acquiring outer type arguments from their annotations.
1 open issue
2 resolved since last review
Review effort: Max
12f09e4 to
6475b06
Compare
6475b06 to
6ca07df
Compare
| receiver = i.getArgument(0) | ||
| | | ||
| enumPrefixPath = | ||
| TypePath::singleton(TParentTypeParameterType(cd.(EnumCaseConstructor).getEnumCaseClass())) |
There was a problem hiding this comment.
Why do enum constructors need special handling here (and in needsContextualTyping)? If the enum case class is considered a subtype of the enum class, doesn't it work out via the normal code path?
There was a problem hiding this comment.
In the end I decided to not give enum constructors the special types, but instead the type of the whole enum as before. So this logic is about translating the special constructor types to the enum types.



This PR adds support for nested types in type inference. Since nested types can interact with both generics and sub typing, we need a way to represent outer types in addition to the nested type itself:
For example, we need to distinguish
Outer<Int>.Inner<Int>fromOuter<Bool>.Inner<Int>, as well as fromSubOuter<Int>.Inner<Int>.We do this by adding a pseudo type parameter to each nested type, which will hold type information about the outer type. For example,
Outer<Int>.Inner<String>is represented asTypePathType""Inner"TInner"String"Inner_Parent"Outer"Inner_Parent.TOuter"Intwhere
Inner_Parentis the special type parameter belonging to the nested classInner.Things can get further complicated when type aliases are used, which prompted a change to the existing
TypeMentionlogic: Instead of resolving aliases directly in thegetTypeAtrelation, we split resolution logic into different phases, where the initialgetUnexpandedTypeAtdoes not expand aliases, but instead treat them as ordinary types. Ultimately, ingetTypeAt, aliases are fully expanded, and type inference still does not need to worry about them.DCA is fine.