diff --git a/unified/ql/lib/codeql/unified/internal/AstExtra.qll b/unified/ql/lib/codeql/unified/internal/AstExtra.qll index f2182698f6d0..80944c2359b4 100644 --- a/unified/ql/lib/codeql/unified/internal/AstExtra.qll +++ b/unified/ql/lib/codeql/unified/internal/AstExtra.qll @@ -138,6 +138,9 @@ module Public { final class EnumCaseClass extends ClassLikeDeclaration { EnumCaseClass() { this.hasModifier("enum_case") } + /** Gets the enum declaration that this case class belongs to. */ + ClassLikeDeclaration getEnumClass() { this = result.getAMember() } + /** Gets the constructor of this algebraic data type. */ EnumCaseConstructor getConstructor() { result = this.getAMember() } } @@ -168,5 +171,31 @@ module Public { /** Gets the class containing this constructor. */ EnumCaseClass getEnumCaseClass() { result.getAMember() = this } + + /** Gets the enum declaration that this constructor belongs to. */ + ClassLikeDeclaration getEnumClass() { result = this.getEnumCaseClass().getEnumClass() } + } + + /** + * A field of an enum case in an algebraic data type. For example `a` and + * `b` in + * + * ```swift + * enum E { + * case a + * case b + * } + * ``` + */ + final class EnumField extends VariableDeclaration { + private ClassLikeDeclaration enum; + + EnumField() { + this = enum.getAMember() and + this.hasModifier("enum_case") + } + + /** Gets the enum declaration that this enum field belongs to. */ + ClassLikeDeclaration getEnumClass() { result = enum } } } diff --git a/unified/ql/lib/codeql/unified/internal/ExprPositions.qll b/unified/ql/lib/codeql/unified/internal/ExprPositions.qll index d93205b371a1..7de4b5e195d8 100644 --- a/unified/ql/lib/codeql/unified/internal/ExprPositions.qll +++ b/unified/ql/lib/codeql/unified/internal/ExprPositions.qll @@ -3,9 +3,10 @@ private import NameBinding as NameBinding private import ExprPositionsPlugin /** - * Holds if `expr` appears in a context where it must refer to a type. + * Holds if `expr` appears in a context where it must refer to a type, + * based entirely on the syntactic context of the expression. */ -predicate isInTypeContext(Expr expr) { +predicate isInSyntacticTypeContext(Expr expr) { expr = any(TypeCastExpr n).getType() or expr = any(TypeTestExpr n).getType() @@ -36,11 +37,24 @@ predicate isInTypeContext(Expr expr) { or expr.getParent() instanceof TypeConstraint or + any(ExprPositionsPlugin p).isInSyntacticTypeContext(expr) + or + isInSyntacticTypeContext(expr.getEnclosingExpr()) +} + +private predicate isInTypeContext0(Expr expr) { exists(NameBinding::getTypeFromRef(expr)) or - any(ExprPositionsPlugin p).isInTypeContext(expr) + isInTypeContext0(expr.getEnclosingExpr()) +} + +/** + * Holds if `expr` appears in a context where it must refer to a type. + */ +predicate isInTypeContext(Expr expr) { + isInSyntacticTypeContext(expr) or - isInTypeContext(expr.getEnclosingExpr()) + isInTypeContext0(expr) } /** Holds if `e` appears in a name-binding position inside `declaration` */ diff --git a/unified/ql/lib/codeql/unified/internal/ExprPositionsPlugin.qll b/unified/ql/lib/codeql/unified/internal/ExprPositionsPlugin.qll index e85937ef03a4..911ccc9f6591 100644 --- a/unified/ql/lib/codeql/unified/internal/ExprPositionsPlugin.qll +++ b/unified/ql/lib/codeql/unified/internal/ExprPositionsPlugin.qll @@ -6,7 +6,7 @@ private module Plugins { } class ExprPositionsPlugin extends Unit { - predicate isInTypeContext(Expr e) { none() } + predicate isInSyntacticTypeContext(Expr e) { none() } predicate isReturnedExpr(Callable callable, Expr e) { none() } } diff --git a/unified/ql/lib/codeql/unified/internal/ExprPositionsPluginSwift.qll b/unified/ql/lib/codeql/unified/internal/ExprPositionsPluginSwift.qll index 65d112563525..c16806babfaa 100644 --- a/unified/ql/lib/codeql/unified/internal/ExprPositionsPluginSwift.qll +++ b/unified/ql/lib/codeql/unified/internal/ExprPositionsPluginSwift.qll @@ -2,7 +2,7 @@ private import unified private import ExprPositionsPlugin private class ExprPositionsPluginSwift extends ExprPositionsPlugin { - override predicate isInTypeContext(Expr e) { e = any(GenericTypeExpr g).getBase() } + override predicate isInSyntacticTypeContext(Expr e) { e = any(GenericTypeExpr g).getBase() } override predicate isReturnedExpr(Callable callable, Expr e) { // Short-hand return from a function body, e.g. `func foo() -> String { "42" }` diff --git a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll index 8d40d3f6b099..d17e832d4202 100644 --- a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll +++ b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll @@ -8,6 +8,7 @@ private import unified as U private import AstPlugin private import codeql.files.FileSystem private import codeql.unified.internal.NameBinding as NameBinding +private import codeql.unified.internal.typeinference.TypeMention as TypeMention module Unified { private import Ast::Unified as G @@ -50,6 +51,11 @@ module Unified { ) } + /** + * Gets the nearest resolved enclosing class declaration, if any. + */ + ClassLikeDeclaration getEnclosingClassResolved() { result = this.getEnclosingClass().resolve() } + private AstNode overrideEnclosingCallableParent() { exists(FunctionExpr func | // Capture declarations are evaluated as part of the outer context, and @@ -239,15 +245,16 @@ module Unified { /** Gets the name of this declaration. */ string getName() { result = this.getNameNode().getValue() } - /** Gets a direct base class of this class. */ + /** Gets a direct base class of this class, where type aliases are resolved. */ + pragma[nomagic] ClassLikeDeclaration getABaseClass() { - result.getNameNode() = - NameBinding::getStaticBindingTargetFromRef(this.getABaseType().getType()) + result = this.getABaseType().getType().(TypeMention::TypeMention).getClassLikeDeclaration() } /** * Gets the target of this extension class, or this class itself if it is not an extension. */ + pragma[nomagic] ClassLikeDeclaration resolve() { not exists(this.getExtensionTarget()) and result = this diff --git a/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll b/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll index 2b01d98d28dc..067b60eea683 100644 --- a/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll +++ b/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll @@ -99,7 +99,8 @@ predicate isStaticMember(Member member) { exists(ClassLikeDeclaration cls | cls.getAMember() = member | not any(NameBindingPlugin p).isInstanceMember(cls, member) or member instanceof ConstructorDeclaration or - member instanceof TypeAliasDeclaration + member instanceof TypeAliasDeclaration or + member instanceof ClassLikeDeclaration ) or member = any(TopLevel t).getBody().getAStmt() diff --git a/unified/ql/lib/codeql/unified/internal/typeinference/Type.qll b/unified/ql/lib/codeql/unified/internal/typeinference/Type.qll index 0395b24b028a..6fa56ab86e2a 100644 --- a/unified/ql/lib/codeql/unified/internal/typeinference/Type.qll +++ b/unified/ql/lib/codeql/unified/internal/typeinference/Type.qll @@ -4,6 +4,7 @@ module; import unified // reexport in order to shadow e.g. the `TypeParameter` class private import unified as Unified +private import TypeMention private import TypeInference private import codeql.unified.internal.StaticNameBinding @@ -38,12 +39,24 @@ predicate associatedTypeParameterInherited( name = a.getName() } +private predicate isNestedType(Member m, Identifier nested, ClassLikeDeclaration parent) { + exists(parent.getNameNode()) and + nested = m.getNameNode() and + m = parent.getAMemberIncludingExtensions() and + ( + exists(m.(ClassLikeDeclaration).getNameNode()) + or + m instanceof TypeAliasDeclaration + ) +} + cached newtype TType = TClassLikeDeclarationType(ClassLikeDeclaration c) { CachedStage::ref() and exists(c.getNameNode()) } or + TAliasType(TypeAliasDeclaration alias) or TClosureParameterPseudoType(Parameter p) { exists(FunctionExpr fe | p = fe.getAParameter() and @@ -56,6 +69,7 @@ newtype TType = ) { associatedTypeParameter(c, a, inherited) } or + TParentTypeParameterType(Member m) { isNestedType(m, _, _) } or TUnknownType() or TUnknownTypeTypeParameter(int i) { i in [0 .. 20] } @@ -78,7 +92,20 @@ abstract private class TypeImpl extends TType { * This includes both positional type parameters and synthetic type parameters, * such as associated types. */ - TypeParameter getATypeParameter() { result = this.getPositionalTypeParameter(_) } + TypeParameter getATypeParameter() { + result = this.getPositionalTypeParameter(_) + or + exists(Member m | + result = TParentTypeParameterType(m) and + isNestedType(m, this.getNameNode(), _) + ) + } + + /** Gets the parent type of this nested type, if any. */ + ClassLikeDeclarationType getParentType() { + result.getClassLikeDeclaration() = + this.getATypeParameter().(ParentTypeParameterType).getParent() + } /** Gets the name node of this type, if any. */ abstract Identifier getNameNode(); @@ -117,11 +144,35 @@ class ClassLikeDeclarationType extends TypeImpl, TClassLikeDeclarationType { result = TAssociatedTypeParameterType(c, _, _) } - override string toString() { result = c.getName() } + override string toString() { result = c.getQualifiedName() } override Location getLocation() { result = c.getLocation() } } +/** + * A type representing a type alias. For type inference, type aliases are expanded, + * but we need them for resolving type mentions. + */ +class AliasType extends TypeImpl, TAliasType { + TypeAliasDeclaration alias; + + AliasType() { this = TAliasType(alias) } + + TypeAliasDeclaration getTypeAliasDeclaration() { result = alias } + + TypeMention getAlias() { result = alias.getType() } + + override Identifier getNameNode() { result = alias.getNameNode() } + + override TypeParameter getPositionalTypeParameter(int i) { + result = TTypeParameterType(alias.getTypeParameter(i)) + } + + override string toString() { result = alias.getQualifiedName() } + + override Location getLocation() { result = alias.getLocation() } +} + /** * A pseudo type that does not correspond to any concrete type in the source code. */ @@ -165,7 +216,8 @@ abstract class TypeParameter extends TypeImpl { } private class IdAstNode = - @unified_type_parameter or @unified_class_like_declaration or @unified_associated_type_declaration; + @unified_type_parameter or @unified_class_like_declaration or + @unified_associated_type_declaration or @unified_member; private predicate id(IdAstNode x, IdAstNode y) { x = y } @@ -217,6 +269,45 @@ class AssociatedTypeParameterType extends TypeParameter, TAssociatedTypeParamete } } +/** + * A special type parameter used to represent the parent type of a nested class. + * + * For example, for + * + * ```swift + * class Outer { + * class Inner { + * } + * } + * ``` + * + * the type `Outer.Inner` is represented as + * + * `TypePath` | `Type` + * ----------------------- | -------- + * `""` | `Inner` + * `"TInner"` | `String` + * `"Inner_Parent"` | `Outer` + * `"Inner_Parent.TOuter"` | `Int` + * + * where `Inner_Parent` is one of these type parameters. + */ +class ParentTypeParameterType extends TypeParameter, TParentTypeParameterType { + private Member m; + + ParentTypeParameterType() { this = TParentTypeParameterType(m) } + + ClassLikeDeclaration getParent() { isNestedType(m, _, result) } + + override Member getDeclaringItem() { result = m } + + override Identifier getNameNode() { none() } + + override string toString() { result = "(parent:" + m.getNameOrFallback() + ")" } + + override Location getLocation() { result = m.getLocation() } +} + /** * A type parameter of the special `UnknownType`. */ diff --git a/unified/ql/lib/codeql/unified/internal/typeinference/TypeAbstraction.qll b/unified/ql/lib/codeql/unified/internal/typeinference/TypeAbstraction.qll index cde6a2449e2d..4695189f9d1c 100644 --- a/unified/ql/lib/codeql/unified/internal/typeinference/TypeAbstraction.qll +++ b/unified/ql/lib/codeql/unified/internal/typeinference/TypeAbstraction.qll @@ -15,5 +15,10 @@ abstract class TypeAbstraction extends AstNode { */ private class ClassLikeDeclarationTypeAbstraction extends TypeAbstraction instanceof Unified::ClassLikeDeclaration { - override TypeParameter getATypeParameter() { this = result.getDeclaringItem() } + override TypeParameter getATypeParameter() { + this = result.getDeclaringItem() + or + // type parameters from outer classes are also in scope + super.resolve().getEnclosingClassResolved*() = result.getDeclaringItem() + } } diff --git a/unified/ql/lib/codeql/unified/internal/typeinference/TypeInference.qll b/unified/ql/lib/codeql/unified/internal/typeinference/TypeInference.qll index 2dd7596e29cc..fad8f5d67706 100644 --- a/unified/ql/lib/codeql/unified/internal/typeinference/TypeInference.qll +++ b/unified/ql/lib/codeql/unified/internal/typeinference/TypeInference.qll @@ -2,7 +2,6 @@ /* * Known limitations: - * - Implicit constructors in classes and structs are not generated by the extractor * - Pattern matching, including enum destructuring * - Inferred qualifiers `.foo` * - Type parameter bounds (`foo(x : T)`) @@ -15,7 +14,6 @@ * - Overloading (both arity based and type based) * - Indexing expressions * - Operations - * - Inherited constructors * - Closure short-hand parameters `$0`, `$1`, etc (extractor change?) */ @@ -64,6 +62,13 @@ private module Input1 implements InputSig1 { kind = 3 and tp0 = TUnknownTypeTypeParameter(id1) and id2 = 0 + or + kind = 4 and + exists(Member m | + m = tp0.(ParentTypeParameterType).getDeclaringItem() and + id1 = idOfTypeParameterAstNode(m) and + id2 = 0 + ) | tp0 order by kind, id1, id2 ) @@ -273,7 +278,7 @@ module Input3 implements InputSig3 { private class EnumField_ extends VariableDeclarationField { override EnumField decl; - override TypeMention getType() { result = decl.getEnum().getNameNode() } + override TypeMention getType() { result = decl.getEnumClass().getNameNode() } } private class AccessorField extends FieldImpl, Callable { @@ -421,9 +426,6 @@ module Input3 implements InputSig3 { Unified::Callable getCallable() { result = c } override TypeMention getDeclaringType() { - result = c.(EnumConstructor).getEnum().getNameNode() - or - not c instanceof EnumConstructor and exists(ClassLikeDeclaration cls | c = cls.getAMember() and result = getClassLikeDeclarationTypeMention(cls) @@ -437,9 +439,9 @@ module Input3 implements InputSig3 { or result = c.(FunctionDeclaration).getNameNode() or - result = c.(EnumConstructor).getEnclosingClass().getNameNode() + result = c.(EnumCaseConstructor).getEnumCaseClass().getNameNode() or - not c instanceof EnumConstructor and + not c instanceof EnumCaseConstructor and result = c.(ConstructorDeclaration).getNameNode() } @@ -524,15 +526,21 @@ module Input3 implements InputSig3 { } Callable getTargetViaStaticNameBinding() { - exists(NameBinding b | b = getStaticBindingTargetFromRef(this.getCallee()) | - // object creation (including enum constructors): `String(42)`, `Optional.Some(42)` - exists(ClassLikeDeclaration cls | - cls.getNameNode() = b and - result.isInstanceMemberOf(cls, _) and - result.asCallable() instanceof ConstructorDeclaration - ) - or - // call without explicit receiver: `foo(42)` + // object creation (including enum constructors): `String(42)`, `Optional.Some(42)` + exists(ClassLikeDeclaration cls | + cls = + this.getCallee() + .(TypeMention) + .getType() + .(ClassLikeDeclarationType) + .getClassLikeDeclaration() and + result.isInstanceMemberOf(cls, _) and + result.asCallable() instanceof ConstructorDeclaration + ) + or + // call without explicit receiver: `foo(42)` + exists(NameBinding b | + b = getStaticBindingTargetFromRef(this.getCallee()) and result.getNameNode() = b ) } @@ -695,10 +703,20 @@ module Input3 implements InputSig3 { result = getQualifierTypeMention(invocation) } - private predicate constructionReceiver(Invocation i, Callable constructor, Expr receiver) { - constructor = i.getTargetImpl(_) and - constructor.asCallable() instanceof ConstructorDeclaration and - receiver = i.getArgument(0) + private predicate constructionReceiver( + Invocation i, Callable constructor, Expr receiver, TypePath enumPrefixPath + ) { + exists(ConstructorDeclaration cd | + constructor = i.getTargetImpl(_) and + cd = constructor.asCallable() and + receiver = i.getArgument(0) + | + enumPrefixPath = + TypePath::singleton(TParentTypeParameterType(cd.(EnumCaseConstructor).getEnumCaseClass())) + or + not cd instanceof EnumCaseConstructor and + enumPrefixPath.isEmpty() + ) } /** @@ -732,11 +750,15 @@ module Input3 implements InputSig3 { M3::ContextualTyping::ContextualReturnType; private predicate needsContextualTyping(Invocation i, TypePath path) { - exists(Callable constructor, Expr receiver, ClassLikeDeclarationType receiverType | - constructionReceiver(i, constructor, receiver) and - receiverType = inferType(receiver) + exists( + Callable constructor, Expr receiver, TypePath enumPrefixPath, + ClassLikeDeclarationType receiverType, TypePath path0 + | + constructionReceiver(i, constructor, receiver, enumPrefixPath) and + receiverType = inferType(receiver) and + path = path0.stripPrefix(enumPrefixPath) | - ContextualConstructorReturnType::needsContextualTyping(i, path) and + ContextualConstructorReturnType::needsContextualTyping(i, path0) and receiverType = constructor.getDeclaringType().getType() or // inherited constructor @@ -746,18 +768,19 @@ module Input3 implements InputSig3 { | declType = constructor.getDeclaringType().getType() and BaseTypes::rootTypesSatisfaction(receiverType, declType, abs, _, constraint) and - path = TypePath::singleton(tp) + tp = + getClassLikeDeclarationTypeMention(receiverType.getClassLikeDeclaration()) + .getTypeAt(path0) | // `A : B` - exists(TypePath path0 | - BaseTypes::conditionSatisfiesConstraintTypeAt(abs, _, constraint, path0, tp) and - ContextualConstructorReturnType::needsContextualTyping(i, path0) + exists(TypePath path1 | + BaseTypes::conditionSatisfiesConstraintTypeAt(abs, _, constraint, path1, tp) and + ContextualConstructorReturnType::needsContextualTyping(i, path1) ) or // `A : B` - tp = receiverType.getATypeParameter() and not BaseTypes::conditionSatisfiesConstraintTypeAt(abs, _, constraint, _, tp) and - not exists(Type t | t = i.getTypeQualifier(path) and not t instanceof PseudoType) + not exists(Type t | t = i.getTypeQualifier(path0) and not t instanceof PseudoType) ) ) } @@ -770,8 +793,7 @@ module Input3 implements InputSig3 { * as well as calls receivers, `self.init(0)` or `super.init(0)`. */ predicate step(AstNode n1, TypePath prefix1, AstNode n2, TypePath prefix2) { - constructionReceiver(n2, _, n1) and - prefix1.isEmpty() and + constructionReceiver(n2, _, n1, prefix1) and prefix2.isEmpty() } @@ -827,8 +849,9 @@ module Input3 implements InputSig3 { // `Optional.none` has an unknown `Wrapper` type exists(EnumField_ f, TypeParameter tp | n.(FieldAccess).getField() = f and - tp = f.getType().getType().getATypeParameter() and - path = TypePath::singleton(tp) and + tp = f.getType().getType().getParentType*().getATypeParameter() and + not tp instanceof ParentTypeParameterType and + tp = f.getType().getTypeAt(path) and // `Optional.none` does not have an unknown `Wrapper` type not exists(n.(MemberAccessExpr).getBase().(TypeMention).getTypeAt(path)) ) and diff --git a/unified/ql/lib/codeql/unified/internal/typeinference/TypeInferenceConsistency.qll b/unified/ql/lib/codeql/unified/internal/typeinference/TypeInferenceConsistency.qll index 20aa749a7216..a3d439311506 100644 --- a/unified/ql/lib/codeql/unified/internal/typeinference/TypeInferenceConsistency.qll +++ b/unified/ql/lib/codeql/unified/internal/typeinference/TypeInferenceConsistency.qll @@ -17,3 +17,7 @@ query predicate nonUniqueCertainType(AstNode n, TypePath path) { Consistency::nonUniqueCertainType(n, path) and n.fromSource() } + +query predicate hasAliasType(AstNode n, TypePath path, AliasType alias) { + alias = inferType(n, path) +} diff --git a/unified/ql/lib/codeql/unified/internal/typeinference/TypeInferencePlugin.qll b/unified/ql/lib/codeql/unified/internal/typeinference/TypeInferencePlugin.qll index 0680c6914ada..c810d192b6c7 100644 --- a/unified/ql/lib/codeql/unified/internal/typeinference/TypeInferencePlugin.qll +++ b/unified/ql/lib/codeql/unified/internal/typeinference/TypeInferencePlugin.qll @@ -81,14 +81,6 @@ class TypeInferencePlugin extends Unit { /** Holds if `field` is a field of the tuple type `tuple` with the given `name`. */ abstract predicate tupleField(Type tuple, string name, VariableDeclaration field); - /** Holds if `case` is an enum case constructor of `enum` with identifier `i`. */ - abstract predicate isEnumConstructor( - ClassLikeDeclaration enum, ConstructorDeclaration case, Identifier i - ); - - /** Holds if `field` is an enum field of `enum`. */ - abstract predicate isEnumField(ClassLikeDeclaration enum, VariableDeclaration field); - /** Gets the inferred type for the given AST node and type path. */ Type inferType(AstNode n, TypePath path) { none() } } @@ -139,25 +131,6 @@ class TupleType extends Type { } } -class EnumConstructor extends ConstructorDeclaration { - private ClassLikeDeclaration enum; - private Identifier id; - - EnumConstructor() { any(TypeInferencePlugin p).isEnumConstructor(enum, this, id) } - - ClassLikeDeclaration getEnum() { result = enum } - - Identifier getNameNode() { result = id } -} - -class EnumField extends VariableDeclaration { - private ClassLikeDeclaration enum; - - EnumField() { any(TypeInferencePlugin p).isEnumField(enum, this) } - - ClassLikeDeclaration getEnum() { result = enum } -} - Type inferType(AstNode n, TypePath path) { result = any(TypeInferencePlugin p).inferType(n, path) } Callable getFunctionInvoke(Type t) { result = any(TypeInferencePlugin p).getFunctionInvoke(t) } diff --git a/unified/ql/lib/codeql/unified/internal/typeinference/TypeInferencePluginSwift.qll b/unified/ql/lib/codeql/unified/internal/typeinference/TypeInferencePluginSwift.qll index 2ea9ccd4afdc..aac017efed39 100644 --- a/unified/ql/lib/codeql/unified/internal/typeinference/TypeInferencePluginSwift.qll +++ b/unified/ql/lib/codeql/unified/internal/typeinference/TypeInferencePluginSwift.qll @@ -94,31 +94,6 @@ TypeParameter getTupleTypeParameter(int arity, int i) { result = any(TupleType t | t.getArity() = arity).getPositionalTypeParameter(i) } -private class Enum extends ClassLikeDeclaration { - Enum() { this.getAModifier().getValue() = "enum" } -} - -private class EnumConstructor extends EnumCaseConstructor { - private Enum e; - - EnumConstructor() { this = e.getAMember().(EnumCaseClass).getConstructor() } - - Identifier getNameNode() { result = this.getEnumCaseClass().getNameNode() } - - Enum getEnum() { result = e } -} - -private class EnumField extends VariableDeclaration { - private Enum e; - - EnumField() { - this = e.getAMember() and - this.getAModifier().getValue() = "enum_case" - } - - Enum getEnum() { result = e } -} - private predicate inferTypeAlias = inferType/2; private class SwiftTypeInferencePlugin extends Plugin::TypeInferencePlugin { @@ -169,20 +144,6 @@ private class SwiftTypeInferencePlugin extends Plugin::TypeInferencePlugin { field = tuple.(TupleType).getField(name) } - override predicate isEnumConstructor( - ClassLikeDeclaration enum, ConstructorDeclaration case, Identifier i - ) { - case = - any(EnumConstructor ec | - enum = ec.getEnum() and - i = ec.getNameNode() - ) - } - - override predicate isEnumField(ClassLikeDeclaration enum, VariableDeclaration field) { - enum = field.(EnumField).getEnum() - } - override Type inferType(AstNode n, TypePath path) { // todo: approximation for now n instanceof BinaryExpr and diff --git a/unified/ql/lib/codeql/unified/internal/typeinference/TypeMention.qll b/unified/ql/lib/codeql/unified/internal/typeinference/TypeMention.qll index baef8f970e26..f4f6ff4affa4 100644 --- a/unified/ql/lib/codeql/unified/internal/typeinference/TypeMention.qll +++ b/unified/ql/lib/codeql/unified/internal/typeinference/TypeMention.qll @@ -5,101 +5,249 @@ private import TypeInferencePlugin as Plugin private import codeql.unified.internal.StaticNameBinding private import codeql.unified.internal.ExprPositions +/** + * Holds if `alias` is an alias at `pathToNested` for nested type `nested` with + * enclosing type `parent`, where the alias itself is also enclosed by `parent`: + * + * ```swift + * class Parent { + * class Nested {} + * typealias Alias = Nested // example + * class MoreNested { + * typealias Alias = Nested // example + * } + * } + * typealias Alias = Parent.Nested // non-example + * ``` + * + * The type path `pathParents` is any valid sequence of `ParentTypeParameterType`s starting + * from the alias declaration and not escaping `parent`, while `encl` is the enclosing + * class of the last element of `path`. + * + * Restricted to aliases without a qualifier for `nested`. + */ +private predicate isInnerUnqualifiedAlias( + TypeAliasDeclaration alias, TypePath pathToNested, ClassLikeDeclaration nested, + ClassLikeDeclaration parent, TypePath pathParents, ClassLikeDeclaration encl +) { + nested = alias.getType().(TypeMention).getSimpleExpandedTypeAt(pathToNested).asClass() and + // if the alias already has a qualifier that mentions the parent type, then we assume + // it applies + not exists(ParentTypeParameterType ptp | + ptp.getParent() = parent and + exists( + alias + .getType() + .(TypeMention) + .getSimpleExpandedTypeAt(pathToNested.append(TypePath::singleton(ptp))) + ) + ) and + parent = nested.getEnclosingClassResolved() and + alias.getEnclosingClassResolved+() = parent and + pathParents = TypePath::singleton(TParentTypeParameterType(alias)) and + encl = alias.getEnclosingClassResolved() + or + exists(TypePath mid, ClassLikeDeclaration enclMid | + isInnerUnqualifiedAlias(alias, pathToNested, nested, parent, mid, enclMid) and + not enclMid = parent and + pathParents = mid.append(TypePath::singleton(TParentTypeParameterType(enclMid))) and + encl = enclMid.getEnclosingClassResolved() + ) +} + final class TypeMention = TypeMentionImpl; /** An AST node that mentions a type. */ abstract private class TypeMentionImpl extends AstNode { /** - * Gets the type mentioned at `path`. + * INTERNAL: Do not use; use `getTypeAt` instead. + * + * Gets the type mentioned at `path`, where type aliases are not expanded. */ pragma[nomagic] - abstract Type getTypeAt(TypePath path); + abstract Type getUnexpandedTypeAt(TypePath path); /** - * Gets the type mentioned at the root of this type mention. + * INTERNAL: Do not use; use `getType` instead. + * + * Gets the root type mentioned, where type aliases are not expanded. + * + * This is the same as `this.getUnexpandedTypeAt(TypePath::nil())`, but does not depend + * on the full `getUnexpandedTypeAt` relation. */ - final Type getType() { result = this.getTypeAt(TypePath::nil()) } -} + abstract Type getUnexpandedType(); -final class ExprTypeMention = ExprTypeMentionImpl; - -abstract private class ExprTypeMentionImpl extends TypeMentionImpl, Expr { - ExprTypeMentionImpl() { - isInTypeContext(this) and - not this instanceof GenericTypeExpr and - not this instanceof ModifiedTypeExpr + /** + * INTERNAL: Do not use; use `getType` instead. + * + * Gets the type mentioned at `path`, including expanding type aliases, but without + * expanding inner unqualified aliases with qualifiers provided at the use sites. + */ + Type getSimpleExpandedTypeAt(TypePath path) { + result = this.getUnexpandedTypeAt(path) + or + exists(AliasType alias, TypePath prefix, TypePath suffix | + this.getSimpleExpandedTypeAt(prefix) = alias + | + // expand alias RHS + result = alias.getAlias().getSimpleExpandedTypeAt(suffix) and + path = prefix.append(suffix) and + not result = alias.getATypeParameter() + or + // substitute for type parameters in alias RHS + exists(TypeParameter tp, TypePath mid | + tp = alias.getATypeParameter() and + tp = alias.getAlias().getSimpleExpandedTypeAt(mid) and + result = + this.getSimpleExpandedTypeAt(prefix + .appendInverse(any(TypePath cons | cons.isCons(tp, suffix)))) and + path = prefix.append(mid).append(suffix) + ) + ) } - pragma[nomagic] - abstract TypePath getTypeArgumentPath(int i); -} - -/** - * A type mention that resolves via an alias (aliases are expanded). - */ -private class AliasExprTypeMention extends ExprTypeMentionImpl { - private TypeAliasDeclaration alias; + /** + * Same as `getSimpleExpandedTypeAt`, but also handles inner unqualified aliases where + * the qualifier is provided at the use site: + * + * ```swift + * class Parent { + * class Nested {} + * class MoreNested { + * typealias Alias = Nested + * } + * } + * + * // this will expand to `Parent.Nested` + * let x : Parent.MoreNested.Alias = ... + * ``` + */ + private Type getExpandedTypeAt(TypePath path) { + result = this.getSimpleExpandedTypeAt(path) + or + exists( + AliasType alias, TypePath prefix, TypePath pathToNested, ClassLikeDeclaration nested, + ClassLikeDeclaration parent, TypePath pathParents, TypePath suffix + | + this.getExpandedTypeAt(prefix) = alias and + isInnerUnqualifiedAlias(alias.getTypeAliasDeclaration(), pathToNested, nested, parent, + pathParents, _) and + this.getExpandedTypeAt(prefix.append(pathParents)).asClass().getABaseClass*() = parent and + result = this.getExpandedTypeAt(prefix.append(pathParents).appendInverse(suffix)) and + path = + prefix.append(pathToNested.append(TypePath::cons(TParentTypeParameterType(nested), suffix))) + ) + } - AliasExprTypeMention() { alias.getNameNode() = getTypeFromRef(this) } + private Type getExpandedType() { result = this.getExpandedTypeAt(TypePath::nil()) } - private TypeParameterType getAliasTypeParameter(int i) { - result.getTypeParameter() = alias.getTypeParameter(i) + /** + * Gets the class-like declaration mentioned by this type mention, if any. + */ + ClassLikeDeclaration getClassLikeDeclaration() { + result = this.getExpandedType().(ClassLikeDeclarationType).getClassLikeDeclaration() } - override TypePath getTypeArgumentPath(int i) { - exists(TypeParameterType tp | - tp = this.getAliasTypeParameter(i) and - tp = alias.getType().(TypeMention).getTypeAt(result) + pragma[nomagic] + private ClassLikeDeclaration getImplicitQualifierCand(TypePath path, ParentTypeParameterType tp) { + exists(Type t | + tp = t.getATypeParameter() and + t = this.getTypeAt(path) and + not exists(this.getExpandedTypeAt(path.append(TypePath::singleton(tp)))) and + result = this.getEnclosingClassResolved+() ) } - override Type getTypeAt(TypePath path) { - result = alias.getType().(TypeMention).getTypeAt(path) and - not result = this.getAliasTypeParameter(_) - } -} - -/** - * A type mention that does not resolve via an alias. - */ -private class NonAliasExprTypeMention extends ExprTypeMentionImpl { - NonAliasExprTypeMention() { not this instanceof AliasExprTypeMention } - - private Type getRootType0() { - exists(Identifier i | i = getTypeFromRef(this) | - // for now, we resolve enum cases to their enclosing class - exists(EnumCaseClass c | - i = c.getNameNode() and - result.getNameNode() = c.getEnclosingClass().getNameNode() - ) - or - not i = any(EnumCaseClass c).getNameNode() and - result.getNameNode() = i and + /** + * Gets the type mentioned at `path`. + */ + final Type getTypeAt(TypePath path) { + // Filter away alias types that are expanded + not exists(AliasType alias | ( - not result instanceof AssociatedTypeParameterType + result = alias or - result = TAssociatedTypeParameterType(this.getEnclosingClass(), _, _) + result = alias.getATypeParameter() + ) and + // allow for alias types that cannot expand, for example accesses to `Identity` + // cannot expand when `typealias Identity = T` + not result = unique( | | this.getExpandedTypeAt(path)) + or + path.getElement(_) = alias.getATypeParameter() + ) and + ( + result = this.getExpandedTypeAt(path) + or + // A mention of a nested type without an explicit qualifier implicitly mentions + // the parent type (including at the identifer that introduces the type) + // + // ```swift + // class Outer { + // class Inner { + // let y: Inner // short-hand for `Outer.Inner` + // } + // } + // ``` + exists( + TypePath prefix, ClassLikeDeclaration parent, ParentTypeParameterType tp, TypePath suffix, + ClassLikeDeclaration encl + | + encl = this.getImplicitQualifierCand(prefix, tp) and + parent = tp.getParent() and + result = encl.getNameNode().(TypeMention).getTypeAt(suffix) and + path = prefix.append(TypePath::cons(tp, suffix)) + | + encl = parent + or + not parent = this.getEnclosingClassResolved+() and + encl.getABaseClass+() = parent + ) + or + // A mention of a generic type without explicit type arguments and within + // the scope of the type, implicitly mentions all type parameters (including + // at the identifer that introduces the type): + // + // ```swift + // class Generic { + // let x: Generic // short-hand for `Generic + // } + // ``` + not this = any(GenericTypeExpr g).getBase() and + exists(TypePath prefix, ClassLikeDeclarationType t | + t = this.getTypeAt(prefix) and + forex(TypeParameter tp | + tp = t.getATypeParameter() and not tp instanceof ParentTypeParameterType + | + not exists(this.getExpandedTypeAt(prefix.append(TypePath::singleton(tp)))) + ) and + t.getClassLikeDeclaration() = this.getEnclosingClassResolved+() and + result = t.getATypeParameter() and + path = prefix.append(TypePath::singleton(result)) and + not result instanceof ParentTypeParameterType + | + isInSyntacticTypeContext(this) or this = t.getNameNode() ) ) - or - result = Plugin::getFunctionExprType(this) - or - result.(Plugin::TupleType).getArity() = this.(TupleExpr).getNumberOfElements() } - Type getRootType() { - result = this.getRootType0() - or - not exists(this.getRootType0()) and - result instanceof UnknownType - } + /** + * Gets the type mentioned at the root of this type mention. + */ + final Type getType() { result = this.getTypeAt(TypePath::nil()) } +} - override TypePath getTypeArgumentPath(int i) { - result = TypePath::singleton(this.getRootType().getPositionalTypeParameter(i)) +class ExprTypeMention extends TypeMentionImpl, Expr { + ExprTypeMention() { + isInTypeContext(this) and + not this instanceof GenericTypeExpr and + not this instanceof ModifiedTypeExpr and + not this = any(MemberAccessExpr mae).getMemberNameNode() } - override Type getTypeAt(TypePath path) { - result = this.getRootType() and + final override Type getUnexpandedTypeAt(TypePath path) { + // recursion guard to check that `getUnexpandedType` does not recursively depend on `getUnexpandedTypeAt` + (exists(this.getUnexpandedType()) implies any()) and + result = this.getUnexpandedType() and path.isEmpty() or exists( @@ -126,7 +274,7 @@ private class NonAliasExprTypeMention extends ExprTypeMentionImpl { alias = c.getAMember() and alias.getName() = name and path = TypePath::cons(baseTp, suffix) and - result = alias.getType().(TypeMention).getTypeAt(suffix) + result = alias.getType().(TypeMention).getUnexpandedTypeAt(suffix) ) ) or @@ -137,62 +285,89 @@ private class NonAliasExprTypeMention extends ExprTypeMentionImpl { | exists(int i | prefix = Plugin::getFunctionExprParameterTypePath(t, fe.getNumberOfParameters(), i) and - result = fe.getParameter(i).getType().(TypeMention).getTypeAt(suffix) + result = fe.getParameter(i).getType().(TypeMention).getUnexpandedTypeAt(suffix) ) or prefix = Plugin::getFunctionExprReturnTypePath(t) and - result = fe.getReturnType().(TypeMention).getTypeAt(suffix) + result = fe.getReturnType().(TypeMention).getUnexpandedTypeAt(suffix) ) or this = any(TupleExpr te | exists(Plugin::TupleType tt, int i, TypePath suffix | tt.getArity() = te.getNumberOfElements() and - result = te.getElement(i).getValue().(TypeMention).getTypeAt(suffix) and + result = te.getElement(i).getValue().(TypeMention).getUnexpandedTypeAt(suffix) and path = TypePath::cons(tt.getPositionalTypeParameter(i), suffix) ) ) + or + // A mention of a nested type with an explicit qualifier + exists(TypeMention qualifier, ParentTypeParameterType tp, TypePath suffix | + qualifier = this.(MemberAccessExpr).getBase() and + tp = this.getUnexpandedType().getATypeParameter() and + path = TypePath::cons(tp, suffix) and + result = qualifier.getUnexpandedTypeAt(suffix) + ) + } + + private Type getUnexpandedType0() { + exists(Identifier i | i = getTypeFromRef(this) | + result.getNameNode() = i and + ( + not result instanceof AssociatedTypeParameterType + or + result = TAssociatedTypeParameterType(this.getEnclosingClass().resolve(), _, _) + ) + ) + or + result = Plugin::getFunctionExprType(this) + or + result.(Plugin::TupleType).getArity() = this.(TupleExpr).getNumberOfElements() + } + + override Type getUnexpandedType() { + result = this.getUnexpandedType0() + or + not exists(this.getUnexpandedType0()) and + result instanceof UnknownType + } + + pragma[nomagic] + TypePath getTypeArgumentPath(int i) { + result = TypePath::singleton(this.getUnexpandedType().getPositionalTypeParameter(i)) + or + // `typealias Alias = Generic` + this.getUnexpandedType() = + any(AliasType alias | + not exists(alias.getPositionalTypeParameter(_)) and + not alias.getAlias() instanceof GenericTypeExpr and + result = alias.getAlias().(ExprTypeMention).getTypeArgumentPath(i) + ) } } private class GenericTypeExprTypeMention extends TypeMentionImpl, GenericTypeExpr { - private ExprTypeMention base; + private TypeMention base; GenericTypeExprTypeMention() { base = this.getBase() } pragma[nomagic] private Type getTypeArgumentAt(int i, TypePath path) { - result = this.getTypeArgument(i).(TypeMention).getTypeAt(path) + result = this.getTypeArgument(i).(TypeMention).getUnexpandedTypeAt(path) } - override Type getTypeAt(TypePath path) { - result = base.getTypeAt(path) + override Type getUnexpandedTypeAt(TypePath path) { + result = base.getUnexpandedTypeAt(path) or + base = this.getBase() and exists(int i, TypePath prefix, TypePath suffix | - prefix = base.getTypeArgumentPath(i) and + prefix = base.(ExprTypeMention).getTypeArgumentPath(i) and result = this.getTypeArgumentAt(i, suffix) and path = prefix.append(suffix) ) } -} - -/** A class declaration mentions itself. */ -private class ClassLikeDeclarationTypeMention extends TypeMentionImpl, Identifier { - private ClassLikeDeclaration c; - - ClassLikeDeclarationTypeMention() { this = c.getNameNode() } - ClassLikeDeclarationType getRootType() { c = result.getClassLikeDeclaration() } - - ClassLikeDeclaration getClassLikeDeclaration() { result = c } - - override Type getTypeAt(TypePath path) { - result = this.getRootType() and - path.isEmpty() - or - result = this.getRootType().getATypeParameter() and - path = TypePath::singleton(result) - } + override Type getUnexpandedType() { result = base.getUnexpandedType() } } private class ModifiedTypeExprMention extends TypeMentionImpl instanceof ModifiedTypeExpr { @@ -200,7 +375,9 @@ private class ModifiedTypeExprMention extends TypeMentionImpl instanceof Modifie ModifiedTypeExprMention() { base = ModifiedTypeExpr.super.getType() } - override Type getTypeAt(TypePath path) { result = base.getTypeAt(path) } + override Type getUnexpandedType() { result = base.getUnexpandedType() } + + override Type getUnexpandedTypeAt(TypePath path) { result = base.getUnexpandedTypeAt(path) } } TypeMention getClassLikeDeclarationTypeMention(ClassLikeDeclaration c) { diff --git a/unified/ql/test/library-tests/static-name-binding/test.swift b/unified/ql/test/library-tests/static-name-binding/test.swift index 7bf86d93e76e..cfbefe3ac851 100644 --- a/unified/ql/test/library-tests/static-name-binding/test.swift +++ b/unified/ql/test/library-tests/static-name-binding/test.swift @@ -6,12 +6,15 @@ class A { } typealias BAlias = B // $ access=A.B + + enum Enum { case empty } } let x1: B = nil // $ access=top.B let x2: A.B = nil // $ access=A access=A.B let x3: A.B.C = nil // $ access=A access=A.B access=A.B.C let x4: A.BAlias.C = nil // $ access=A access=A.BAlias access=A.B.C +let x5 = A.Enum.empty // $ access=A access=A.Enum access=A.Enum.empty class D { let x1: B = nil // $ access=top.B diff --git a/unified/ql/test/library-tests/type-inference/accessors.swift b/unified/ql/test/library-tests/type-inference/accessors.swift index eee4b8e14207..43a348c81f8e 100644 --- a/unified/ql/test/library-tests/type-inference/accessors.swift +++ b/unified/ql/test/library-tests/type-inference/accessors.swift @@ -112,7 +112,7 @@ class InheritedAccessors: GenericAccessors { extension GenericAccessors { var extensionValue: T { - return stored // $ field=GenericAccessors.stored $ MISSING: type=stored:T + return stored // $ field=GenericAccessors.stored type=stored:T } } diff --git a/unified/ql/test/library-tests/type-inference/classes.swift b/unified/ql/test/library-tests/type-inference/classes.swift index 018314791416..393c0a274035 100644 --- a/unified/ql/test/library-tests/type-inference/classes.swift +++ b/unified/ql/test/library-tests/type-inference/classes.swift @@ -69,7 +69,7 @@ class Outer { } func testNestedTypes() { - let inner = Outer.Inner(value: 99) // $ type=inner:Inner target=Outer.Inner.init + let inner = Outer.Inner(value: 99) // $ type=inner:Outer.Inner target=Outer.Inner.init let v = inner.getValue() // $ type=v:Int target=Outer.Inner.getValue } diff --git a/unified/ql/test/library-tests/type-inference/generics.swift b/unified/ql/test/library-tests/type-inference/generics.swift index 99269646e864..d69ddbfbab15 100644 --- a/unified/ql/test/library-tests/type-inference/generics.swift +++ b/unified/ql/test/library-tests/type-inference/generics.swift @@ -241,7 +241,7 @@ extension MyClass: MyProtocol2 { typealias MyType = T func baz() -> T { - return value // $ field=MyClass.value $ MISSING: type=value:T + return value // $ field=MyClass.value type=value:T } } diff --git a/unified/ql/test/library-tests/type-inference/nested_types.swift b/unified/ql/test/library-tests/type-inference/nested_types.swift new file mode 100644 index 000000000000..8ee8cae78b27 --- /dev/null +++ b/unified/ql/test/library-tests/type-inference/nested_types.swift @@ -0,0 +1,274 @@ +class Base { + let baseValue: TBase + + init(baseValue: TBase) { + self.baseValue = baseValue // $ field=Base.baseValue + } + + func getBase() -> TBase { + return self.baseValue // $ field=Base.baseValue + } +} + +class Outer { + class Inner: Base { + let innerValue: TInner + let outerValue: TOuter + + init(innerValue: TInner, outerValue: TOuter) { + self.innerValue = innerValue // $ field=Outer.Inner.innerValue + self.outerValue = outerValue // $ field=Outer.Inner.outerValue + super.init(baseValue: innerValue) // $ target=Base.init + } + + convenience init(innerValue: TInner) { // name=Outer.Inner.init_conv + fatalError("Convenience initializer not implemented") + } + + func getInner() -> TInner { + return self.innerValue // $ field=Outer.Inner.innerValue + } + + func getOuter() -> TOuter { + return self.outerValue // $ field=Outer.Inner.outerValue + } + + func swap() -> Outer.Inner { + return Outer.Inner(innerValue: self.outerValue, outerValue: self.innerValue) // $ field=Outer.Inner.innerValue field=Outer.Inner.outerValue target=Outer.Inner.init $ SPURIOUS: target=Outer.Inner.init_conv + } + + func getSelf1() -> Inner { + return self + } + + func getSelf2() -> Inner { + return self + } + } + + class SubInner: Inner {} + + static func createInner(outerValue: TOuter) -> Inner { + return Inner(innerValue: 0, outerValue: outerValue) // $ target=Outer.Inner.init $ SPURIOUS: target=Outer.Inner.init_conv + } + + typealias InnerAlias = Inner + + typealias IntInner = Inner + + func f(_ x: Outer.IntInner) {} + + typealias Fixed = Outer.Inner + + func f(_ y: Fixed, _ z: Outer.Fixed) { + let outer = z.getOuter() // $ target=Outer.Inner.getOuter type=outer:Int + let inner = z.getInner() // $ target=Outer.Inner.getInner type=inner:String + } + + class Holder { + typealias InnerAlias = Inner + } + + class Holder2 { + typealias InnerAlias = Inner + } + + func f( + z: Outer.Holder.InnerAlias, + y: Outer.Holder2.InnerAlias + ) { + let a = z.getInner() // $ target=Outer.Inner.getInner type=a:Bool + let b = z.getOuter() // $ target=Outer.Inner.getOuter type=b:String + let c = y.getInner() // $ target=Outer.Inner.getInner type=c:Bool + let d = y.getOuter() // $ target=Outer.Inner.getOuter type=d:String + } + + typealias Fixed2 = Identity.IntInner> + + func f(f1: Fixed2, f2: Outer.Fixed2) { + let a = f1.getInner() // $ target=Outer.Inner.getInner type=a:Int + let b = f1.getOuter() // $ target=Outer.Inner.getOuter type=b:String + let c = f2.getInner() // $ target=Outer.Inner.getInner type=c:Int + let d = f2.getOuter() // $ target=Outer.Inner.getOuter type=d:String + } + + typealias Captured = Outer.Inner + + func f(x: Outer.Captured) { + let outer = x.getOuter() // $ target=Outer.Inner.getOuter $ MISSING: type=outer:String $ SPURIOUS: type=outer:TOuter + let inner = x.getInner() // $ target=Outer.Inner.getInner type=inner:Int + } + + typealias Rebound = Identity>> + + func f2(x: Outer.Rebound) { + let outer = x.getOuter() // $ target=Outer.Inner.getOuter type=outer:String + let inner = x.getInner() // $ target=Outer.Inner.getInner type=inner:Int + } + + typealias Pair = (Inner, Inner) + + func f3(p1: Pair, p2: Outer.Pair) { + let a = p1.0.getOuter() // $ target=Outer.Inner.getOuter field=Tuple2.0 type=a:TOuter + let b = p1.0.getInner() // $ target=Outer.Inner.getInner field=Tuple2.0 type=b:Int + let c = p2.0.getOuter() // $ target=Outer.Inner.getOuter field=Tuple2.0 type=c:Bool + let d = p2.0.getInner() // $ target=Outer.Inner.getInner field=Tuple2.0 type=d:Int + } + + enum E { case empty } +} + +let e: Outer.E = Outer.E.empty // $ field=Outer.E.empty type=.empty@Outer.E<(parent:E)>.Outer:Int + +class Foo: Outer { + func f(x: Pair, y: Outer.Pair) { + var a = x.0.getInner() // $ target=Outer.Inner.getInner field=Tuple2.0 type=a:Int + var b = x.0.getOuter() // $ target=Outer.Inner.getOuter field=Tuple2.0 $ MISSING: type=b:String -- this is an instance of variance sub typing + var c = y.0.getInner() // $ target=Outer.Inner.getInner field=Tuple2.0 type=c:Int + var d = y.0.getOuter() // $ target=Outer.Inner.getOuter field=Tuple2.0 + } +} + +func extractInner(_ inner: Outer.Inner) -> Tb { + return inner.getInner() // $ target=Outer.Inner.getInner +} + +func extractOuter(_ inner: Outer.Inner) -> Ta { + return inner.getOuter() // $ target=Outer.Inner.getOuter +} + +var inner1 = Outer.Inner(innerValue: 42, outerValue: "") // $ target=Outer.Inner.init $ SPURIOUS: target=Outer.Inner.init_conv +var x1a = inner1.getInner() // $ type=x1a:Int target=Outer.Inner.getInner +var x1b = extractInner(inner1) // $ type=x1b:Int target=extractInner +var y1a = inner1.getOuter() // $ type=y1a:String target=Outer.Inner.getOuter +var y1b = extractOuter(inner1) // $ type=y1b:String target=extractOuter +var b1 = inner1.getBase() // $ type=b1:Int target=Base.getBase + +var inner2 = Outer.Inner(innerValue: 42) // $ target=Outer.Inner.init_conv $ SPURIOUS: target=Outer.Inner.init +var x2a = inner2.getInner() // $ type=x2a:Int target=Outer.Inner.getInner +var x2b = extractInner(inner2) // $ type=x2b:Int target=extractInner +var y2a = inner2.getOuter() // $ type=y2a:String target=Outer.Inner.getOuter +let y2b = extractOuter(inner2) // $ type=y2b:String target=extractOuter +var b2 = inner2.getBase() // $ type=b2:Int target=Base.getBase + +var swapped = inner1.swap() // $ target=Outer.Inner.swap +var x3 = swapped.getInner() // $ type=x3:String target=Outer.Inner.getInner +var y3 = swapped.getOuter() // $ type=y3:Int target=Outer.Inner.getOuter +var b3 = swapped.getBase() // $ type=b3:String target=Base.getBase + +var inner4 = inner1.getSelf1() // $ target=Outer.Inner.getSelf1 +var x4 = inner4.getInner() // $ type=x4:Int target=Outer.Inner.getInner +var y4 = inner4.getOuter() // $ type=y4:String target=Outer.Inner.getOuter +var b4 = inner4.getBase() // $ type=b4:Int target=Base.getBase + +var inner5 = inner1.getSelf2() // $ target=Outer.Inner.getSelf2 +var x5 = inner5.getInner() // $ type=x5:Int target=Outer.Inner.getInner +var y5 = inner5.getOuter() // $ type=y5:String target=Outer.Inner.getOuter +var b5 = inner5.getBase() // $ type=b5:Int target=Base.getBase + +var inner6 = Outer.createInner(outerValue: false) // $ target=Outer.createInner +var x6 = inner6.getInner() // $ type=x6:Int target=Outer.Inner.getInner +var y6 = inner6.getOuter() // $ type=y6:Bool target=Outer.Inner.getOuter +var b6 = inner6.getBase() // $ type=b6:Int target=Base.getBase + +var inner7 = Outer.InnerAlias(innerValue: 0, outerValue: false) // $ target=Outer.Inner.init $ SPURIOUS: target=Outer.Inner.init_conv +var x11 = inner7.getInner() // $ type=x11:Int target=Outer.Inner.getInner +var y11 = inner7.getOuter() // $ type=y11:Bool target=Outer.Inner.getOuter + +extension Outer.Inner { + class InnerMost { + var x: TOuter + var y: TInner + + init(x: TOuter, y: TInner) { + self.x = x // $ field=Outer.Inner.InnerMost.x + self.y = y // $ field=Outer.Inner.InnerMost.y + } + + func getOuter() -> TOuter { + return self.x // $ field=Outer.Inner.InnerMost.x + } + + func getInner() -> TInner { + return self.y // $ field=Outer.Inner.InnerMost.y + } + } +} + +var innerMost = Outer.Inner.InnerMost(x: "", y: 42) // $ target=Outer.Inner.InnerMost.init +var x7 = innerMost.getInner() // $ target=Outer.Inner.InnerMost.getInner $ MISSING: type=x7:Int (https://github.com/github/codeql-team/issues/4968) +var y7 = innerMost.getOuter() // $ target=Outer.Inner.InnerMost.getOuter $ MISSING: type=y7:String (https://github.com/github/codeql-team/issues/4968) + +class SubOuter: Outer<[TSubOuter]> { + func f(_ x: Inner) -> [TSubOuter] { + let res = x.getOuter() // $ target=Outer.Inner.getOuter $ MISSING: type=res@Array:TSubOuter -- this is an instance of variance sub typing + return res + } +} + +var subOuter = SubOuter.createInner(outerValue: [42]) // $ target=Outer.createInner +var x8 = subOuter.getInner() // $ type=x8:Int target=Outer.Inner.getInner +var y8 = subOuter.getOuter() // $ type=y8@Array:Int target=Outer.Inner.getOuter + +var subInner = Outer.SubInner(innerValue: true, outerValue: 0) // $ target=Outer.Inner.init $ SPURIOUS: target=Outer.Inner.init_conv +var x9 = subInner.getInner() // $ type=x9:Bool target=Outer.Inner.getInner +var y9 = subInner.getOuter() // $ type=y9:Int target=Outer.Inner.getOuter + +let subInner2: Outer.SubInner = Outer.SubInner(innerValue: 1) // $ target=Outer.Inner.init_conv $ SPURIOUS: target=Outer.Inner.init +let x12 = subInner2.getInner() // $ target=Outer.Inner.getInner type=x12:Int +let y12 = subInner2.getOuter() // $ target=Outer.Inner.getOuter type=y12:String + +class SubInnerOutside: Outer.Inner {} + +var subInnerOutside = SubInnerOutside(innerValue: true, outerValue: false) // $ target=Outer.Inner.init $ SPURIOUS: target=Outer.Inner.init_conv +var x10 = subInnerOutside.getInner() // $ type=x10:Bool target=Outer.Inner.getInner +var y10 = subInnerOutside.getOuter() // $ type=y10:Bool target=Outer.Inner.getOuter + +class Node { + class Leaf: Node { + let x: Leaf = Leaf() // $ type=x@Node.Leaf<(parent:Leaf)>:Node target=Node.init + } +} + +class Holder { typealias Fixed = Outer.Inner } + +let holder = Holder.Fixed(innerValue: "") // $ target=Outer.Inner.init_conv $ SPURIOUS: target=Outer.Inner.init +let x13 = holder.getInner() // $ target=Outer.Inner.getInner type=x13:String +let y13 = holder.getOuter() // $ target=Outer.Inner.getOuter type=y13:Int + +class Box { + typealias IntBox = Box + + typealias Same = Box + + func f( + _ x: IntBox, + _ y: Box.Same // $ MISSING: type=y@Box:Int $ SPURIOUS: type=y@Box:T + ) {} +} + +typealias Nested = Outer.Inner + +func f(_ x: Nested) {} + +typealias Identity = T + +func f(_ x: Identity) {} + +typealias H = Outer.Holder + +typealias H2 = Outer.Holder2 + +func f(_ x: H.InnerAlias, _ y: H2.InnerAlias) { + let a = x.getInner() // $ type=a:Bool target=Outer.Inner.getInner + let b = x.getOuter() // $ type=b:String target=Outer.Inner.getOuter + let c = y.getInner() // $ type=c:Bool target=Outer.Inner.getInner + let d = y.getOuter() // $ type=d:String target=Outer.Inner.getOuter +} + +typealias G = Outer.Holder + +func f(_ x: G.InnerAlias) { + let outer = x.getOuter() // $ target=Outer.Inner.getOuter type=outer:String + let inner = x.getInner() // $ target=Outer.Inner.getInner type=inner:Bool +} diff --git a/unified/ql/test/library-tests/type-inference/type-inference.expected b/unified/ql/test/library-tests/type-inference/type-inference.expected index 4a87e1942d3b..5729a5beae73 100644 --- a/unified/ql/test/library-tests/type-inference/type-inference.expected +++ b/unified/ql/test/library-tests/type-inference/type-inference.expected @@ -95,9 +95,11 @@ inferCertainType | classes.swift:51:33:51:38 | ArrayLiteral | | {EXTERNAL LOCATION} | Array | | classes.swift:59:9:59:13 | value | | {EXTERNAL LOCATION} | Int | | classes.swift:61:10:61:14 | value | | {EXTERNAL LOCATION} | Int | -| classes.swift:62:7:62:10 | self | | classes.swift:58:3:68:3 | Inner | +| classes.swift:62:7:62:10 | self | | classes.swift:58:3:68:3 | Outer.Inner | +| classes.swift:62:7:62:10 | self | (parent:Inner) | classes.swift:57:1:69:1 | Outer | | classes.swift:62:20:62:24 | value | | {EXTERNAL LOCATION} | Int | -| classes.swift:66:14:66:17 | self | | classes.swift:58:3:68:3 | Inner | +| classes.swift:66:14:66:17 | self | | classes.swift:58:3:68:3 | Outer.Inner | +| classes.swift:66:14:66:17 | self | (parent:Inner) | classes.swift:57:1:69:1 | Outer | | classes.swift:79:7:79:11 | value | | {EXTERNAL LOCATION} | Int | | classes.swift:81:14:81:14 | v | | {EXTERNAL LOCATION} | Int | | classes.swift:82:5:82:9 | value | | {EXTERNAL LOCATION} | Int | @@ -340,6 +342,7 @@ inferCertainType | generics.swift:205:22:205:24 | ArrayLiteral | | {EXTERNAL LOCATION} | Array | | generics.swift:207:15:207:17 | ArrayLiteral | | {EXTERNAL LOCATION} | Array | | generics.swift:228:12:228:15 | self | | generics.swift:220:1:224:1 | MyProtocol2 | +| generics.swift:228:12:228:15 | self | MyType | generics.swift:221:3:221:23 | MyType | | generics.swift:233:7:233:11 | value | | generics.swift:232:15:232:15 | T | | generics.swift:235:10:235:14 | value | | generics.swift:232:15:232:15 | T | | generics.swift:236:5:236:8 | self | | generics.swift:232:1:238:1 | MyClass | @@ -433,6 +436,359 @@ inferCertainType | key_paths.swift:204:7:204:9 | arr | | {EXTERNAL LOCATION} | Array | | key_paths.swift:204:13:204:24 | ArrayLiteral | | {EXTERNAL LOCATION} | Array | | key_paths.swift:205:15:205:17 | arr | | {EXTERNAL LOCATION} | Array | +| nested_types.swift:2:9:2:17 | baseValue | | nested_types.swift:1:12:1:16 | TBase | +| nested_types.swift:4:10:4:18 | baseValue | | nested_types.swift:1:12:1:16 | TBase | +| nested_types.swift:5:9:5:12 | self | | nested_types.swift:1:1:11:1 | Base | +| nested_types.swift:5:9:5:12 | self | TBase | nested_types.swift:1:12:1:16 | TBase | +| nested_types.swift:5:26:5:34 | baseValue | | nested_types.swift:1:12:1:16 | TBase | +| nested_types.swift:9:16:9:19 | self | | nested_types.swift:1:1:11:1 | Base | +| nested_types.swift:9:16:9:19 | self | TBase | nested_types.swift:1:12:1:16 | TBase | +| nested_types.swift:15:13:15:22 | innerValue | | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:16:13:16:22 | outerValue | | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:18:14:18:23 | innerValue | | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:18:34:18:43 | outerValue | | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:19:13:19:16 | self | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:19:13:19:16 | self | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:19:13:19:16 | self | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:19:13:19:16 | self | TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:19:31:19:40 | innerValue | | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:20:13:20:16 | self | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:20:13:20:16 | self | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:20:13:20:16 | self | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:20:13:20:16 | self | TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:20:31:20:40 | outerValue | | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:21:35:21:44 | innerValue | | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:24:26:24:35 | innerValue | | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:29:20:29:23 | self | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:29:20:29:23 | self | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:29:20:29:23 | self | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:29:20:29:23 | self | TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:33:20:33:23 | self | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:33:20:33:23 | self | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:33:20:33:23 | self | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:33:20:33:23 | self | TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:37:52:37:55 | self | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:37:52:37:55 | self | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:37:52:37:55 | self | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:37:52:37:55 | self | TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:37:81:37:84 | self | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:37:81:37:84 | self | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:37:81:37:84 | self | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:37:81:37:84 | self | TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:41:20:41:23 | self | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:41:20:41:23 | self | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:41:20:41:23 | self | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:41:20:41:23 | self | TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:45:20:45:23 | self | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:45:20:45:23 | self | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:45:20:45:23 | self | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:45:20:45:23 | self | TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:51:29:51:38 | outerValue | | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:52:49:52:58 | outerValue | | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:59:14:59:14 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:59:14:59:14 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:59:14:59:14 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:59:14:59:14 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:63:14:63:14 | y | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:63:14:63:14 | y | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:63:14:63:14 | y | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:63:14:63:14 | y | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:63:26:63:26 | z | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:63:26:63:26 | z | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:63:26:63:26 | z | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:63:26:63:26 | z | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:64:21:64:21 | z | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:64:21:64:21 | z | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:64:21:64:21 | z | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:64:21:64:21 | z | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:65:21:65:21 | z | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:65:21:65:21 | z | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:65:21:65:21 | z | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:65:21:65:21 | z | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:77:9:77:9 | z | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:77:9:77:9 | z | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:77:9:77:9 | z | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:77:9:77:9 | z | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:78:9:78:9 | y | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:78:9:78:9 | y | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:78:9:78:9 | y | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:78:9:78:9 | y | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:80:17:80:17 | z | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:80:17:80:17 | z | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:80:17:80:17 | z | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:80:17:80:17 | z | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:81:17:81:17 | z | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:81:17:81:17 | z | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:81:17:81:17 | z | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:81:17:81:17 | z | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:82:17:82:17 | y | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:82:17:82:17 | y | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:82:17:82:17 | y | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:82:17:82:17 | y | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:83:17:83:17 | y | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:83:17:83:17 | y | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:83:17:83:17 | y | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:83:17:83:17 | y | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:88:12:88:13 | f1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:88:12:88:13 | f1 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:88:12:88:13 | f1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:88:12:88:13 | f1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:88:24:88:25 | f2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:88:24:88:25 | f2 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:88:24:88:25 | f2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:88:24:88:25 | f2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:89:17:89:18 | f1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:89:17:89:18 | f1 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:89:17:89:18 | f1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:89:17:89:18 | f1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:90:17:90:18 | f1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:90:17:90:18 | f1 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:90:17:90:18 | f1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:90:17:90:18 | f1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:91:17:91:18 | f2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:91:17:91:18 | f2 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:91:17:91:18 | f2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:91:17:91:18 | f2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:92:17:92:18 | f2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:92:17:92:18 | f2 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:92:17:92:18 | f2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:92:17:92:18 | f2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:97:12:97:12 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:97:12:97:12 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:97:12:97:12 | x | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:97:12:97:12 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:98:21:98:21 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:98:21:98:21 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:98:21:98:21 | x | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:98:21:98:21 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:99:21:99:21 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:99:21:99:21 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:99:21:99:21 | x | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:99:21:99:21 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:104:13:104:13 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:104:13:104:13 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:104:13:104:13 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:104:13:104:13 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:105:21:105:21 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:105:21:105:21 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:105:21:105:21 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:105:21:105:21 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:106:21:106:21 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:106:21:106:21 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:106:21:106:21 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:106:21:106:21 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:111:13:111:14 | p1 | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:111:13:111:14 | p1 | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:111:13:111:14 | p1 | T0.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:111:13:111:14 | p1 | T0.(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:111:13:111:14 | p1 | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:111:13:111:14 | p1 | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:111:13:111:14 | p1 | T1.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:111:13:111:14 | p1 | T1.(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:111:13:111:14 | p1 | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:111:23:111:24 | p2 | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:111:23:111:24 | p2 | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:111:23:111:24 | p2 | T0.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:111:23:111:24 | p2 | T0.(parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:111:23:111:24 | p2 | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:111:23:111:24 | p2 | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:111:23:111:24 | p2 | T1.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:111:23:111:24 | p2 | T1.(parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:111:23:111:24 | p2 | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:112:17:112:18 | p1 | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:112:17:112:18 | p1 | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:112:17:112:18 | p1 | T0.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:112:17:112:18 | p1 | T0.(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:112:17:112:18 | p1 | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:112:17:112:18 | p1 | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:112:17:112:18 | p1 | T1.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:112:17:112:18 | p1 | T1.(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:112:17:112:18 | p1 | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:113:17:113:18 | p1 | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:113:17:113:18 | p1 | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:113:17:113:18 | p1 | T0.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:113:17:113:18 | p1 | T0.(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:113:17:113:18 | p1 | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:113:17:113:18 | p1 | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:113:17:113:18 | p1 | T1.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:113:17:113:18 | p1 | T1.(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:113:17:113:18 | p1 | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:114:17:114:18 | p2 | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:114:17:114:18 | p2 | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:114:17:114:18 | p2 | T0.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:114:17:114:18 | p2 | T0.(parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:114:17:114:18 | p2 | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:114:17:114:18 | p2 | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:114:17:114:18 | p2 | T1.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:114:17:114:18 | p2 | T1.(parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:114:17:114:18 | p2 | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:115:17:115:18 | p2 | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:115:17:115:18 | p2 | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:115:17:115:18 | p2 | T0.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:115:17:115:18 | p2 | T0.(parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:115:17:115:18 | p2 | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:115:17:115:18 | p2 | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:115:17:115:18 | p2 | T1.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:115:17:115:18 | p2 | T1.(parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:115:17:115:18 | p2 | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:118:19:118:23 | empty | | nested_types.swift:118:5:118:25 | Outer.E | +| nested_types.swift:118:19:118:23 | empty | (parent:E) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:118:19:118:23 | empty | (parent:E).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:121:5:121:5 | e | | nested_types.swift:118:5:118:25 | Outer.E | +| nested_types.swift:121:5:121:5 | e | (parent:E) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:121:5:121:5 | e | (parent:E).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:124:12:124:12 | x | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:124:12:124:12 | x | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:124:12:124:12 | x | T0.(parent:Inner) | nested_types.swift:123:1:130:1 | Foo | +| nested_types.swift:124:12:124:12 | x | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:124:12:124:12 | x | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:124:12:124:12 | x | T1.(parent:Inner) | nested_types.swift:123:1:130:1 | Foo | +| nested_types.swift:124:12:124:12 | x | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:124:21:124:21 | y | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:124:21:124:21 | y | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:124:21:124:21 | y | T0.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:124:21:124:21 | y | T0.(parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:124:21:124:21 | y | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:124:21:124:21 | y | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:124:21:124:21 | y | T1.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:124:21:124:21 | y | T1.(parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:124:21:124:21 | y | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:125:17:125:17 | x | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:125:17:125:17 | x | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:125:17:125:17 | x | T0.(parent:Inner) | nested_types.swift:123:1:130:1 | Foo | +| nested_types.swift:125:17:125:17 | x | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:125:17:125:17 | x | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:125:17:125:17 | x | T1.(parent:Inner) | nested_types.swift:123:1:130:1 | Foo | +| nested_types.swift:125:17:125:17 | x | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:126:17:126:17 | x | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:126:17:126:17 | x | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:126:17:126:17 | x | T0.(parent:Inner) | nested_types.swift:123:1:130:1 | Foo | +| nested_types.swift:126:17:126:17 | x | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:126:17:126:17 | x | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:126:17:126:17 | x | T1.(parent:Inner) | nested_types.swift:123:1:130:1 | Foo | +| nested_types.swift:126:17:126:17 | x | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:127:17:127:17 | y | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:127:17:127:17 | y | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:127:17:127:17 | y | T0.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:127:17:127:17 | y | T0.(parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:127:17:127:17 | y | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:127:17:127:17 | y | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:127:17:127:17 | y | T1.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:127:17:127:17 | y | T1.(parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:127:17:127:17 | y | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:128:17:128:17 | y | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:128:17:128:17 | y | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:128:17:128:17 | y | T0.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:128:17:128:17 | y | T0.(parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:128:17:128:17 | y | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:128:17:128:17 | y | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:128:17:128:17 | y | T1.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:128:17:128:17 | y | T1.(parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:128:17:128:17 | y | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:132:29:132:33 | inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:132:29:132:33 | inner | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:132:29:132:33 | inner | (parent:Inner).TOuter | nested_types.swift:132:19:132:20 | Ta | +| nested_types.swift:132:29:132:33 | inner | TInner | nested_types.swift:132:23:132:24 | Tb | +| nested_types.swift:133:12:133:16 | inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:133:12:133:16 | inner | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:133:12:133:16 | inner | (parent:Inner).TOuter | nested_types.swift:132:19:132:20 | Ta | +| nested_types.swift:133:12:133:16 | inner | TInner | nested_types.swift:132:23:132:24 | Tb | +| nested_types.swift:136:29:136:33 | inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:136:29:136:33 | inner | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:136:29:136:33 | inner | (parent:Inner).TOuter | nested_types.swift:136:19:136:20 | Ta | +| nested_types.swift:136:29:136:33 | inner | TInner | nested_types.swift:136:23:136:24 | Tb | +| nested_types.swift:137:12:137:16 | inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:137:12:137:16 | inner | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:137:12:137:16 | inner | (parent:Inner).TOuter | nested_types.swift:136:19:136:20 | Ta | +| nested_types.swift:137:12:137:16 | inner | TInner | nested_types.swift:136:23:136:24 | Tb | +| nested_types.swift:184:13:184:16 | self | | nested_types.swift:179:5:195:5 | Outer.Inner.InnerMost | +| nested_types.swift:184:13:184:16 | self | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:184:13:184:16 | self | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:184:13:184:16 | self | (parent:InnerMost).(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:184:13:184:16 | self | (parent:InnerMost).TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:185:13:185:16 | self | | nested_types.swift:179:5:195:5 | Outer.Inner.InnerMost | +| nested_types.swift:185:13:185:16 | self | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:185:13:185:16 | self | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:185:13:185:16 | self | (parent:InnerMost).(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:185:13:185:16 | self | (parent:InnerMost).TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:189:20:189:23 | self | | nested_types.swift:179:5:195:5 | Outer.Inner.InnerMost | +| nested_types.swift:189:20:189:23 | self | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:189:20:189:23 | self | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:189:20:189:23 | self | (parent:InnerMost).(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:189:20:189:23 | self | (parent:InnerMost).TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:193:20:193:23 | self | | nested_types.swift:179:5:195:5 | Outer.Inner.InnerMost | +| nested_types.swift:193:20:193:23 | self | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:193:20:193:23 | self | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:193:20:193:23 | self | (parent:InnerMost).(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:193:20:193:23 | self | (parent:InnerMost).TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:203:14:203:14 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:203:14:203:14 | x | (parent:Inner) | nested_types.swift:202:1:207:1 | SubOuter | +| nested_types.swift:203:14:203:14 | x | (parent:Inner).TSubOuter | nested_types.swift:202:16:202:24 | TSubOuter | +| nested_types.swift:203:14:203:14 | x | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:204:19:204:19 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:204:19:204:19 | x | (parent:Inner) | nested_types.swift:202:1:207:1 | SubOuter | +| nested_types.swift:204:19:204:19 | x | (parent:Inner).TSubOuter | nested_types.swift:202:16:202:24 | TSubOuter | +| nested_types.swift:204:19:204:19 | x | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:209:54:209:57 | ArrayLiteral | | {EXTERNAL LOCATION} | Array | +| nested_types.swift:217:5:217:13 | subInner2 | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:217:5:217:13 | subInner2 | (parent:SubInner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:217:5:217:13 | subInner2 | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:217:5:217:13 | subInner2 | TSubInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:218:11:218:19 | subInner2 | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:218:11:218:19 | subInner2 | (parent:SubInner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:218:11:218:19 | subInner2 | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:218:11:218:19 | subInner2 | TSubInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:219:11:219:19 | subInner2 | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:219:11:219:19 | subInner2 | (parent:SubInner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:219:11:219:19 | subInner2 | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:219:11:219:19 | subInner2 | TSubInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:229:13:229:13 | x | | nested_types.swift:228:5:230:5 | Node.Leaf | +| nested_types.swift:229:13:229:13 | x | (parent:Leaf) | nested_types.swift:227:1:231:1 | Node | +| nested_types.swift:245:11:245:11 | x | | nested_types.swift:239:1:248:1 | Box | +| nested_types.swift:245:11:245:11 | x | T | {EXTERNAL LOCATION} | Int | +| nested_types.swift:246:11:246:11 | y | | nested_types.swift:239:1:248:1 | Box | +| nested_types.swift:246:11:246:11 | y | T | nested_types.swift:239:11:239:11 | T | +| nested_types.swift:252:10:252:10 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:252:10:252:10 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:252:10:252:10 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:252:10:252:10 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:256:10:256:10 | x | | {EXTERNAL LOCATION} | String | +| nested_types.swift:262:10:262:10 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:262:10:262:10 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:262:10:262:10 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:262:10:262:10 | x | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:262:35:262:35 | y | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:262:35:262:35 | y | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:262:35:262:35 | y | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:262:35:262:35 | y | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:263:13:263:13 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:263:13:263:13 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:263:13:263:13 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:263:13:263:13 | x | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:264:13:264:13 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:264:13:264:13 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:264:13:264:13 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:264:13:264:13 | x | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:265:13:265:13 | y | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:265:13:265:13 | y | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:265:13:265:13 | y | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:265:13:265:13 | y | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:266:13:266:13 | y | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:266:13:266:13 | y | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:266:13:266:13 | y | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:266:13:266:13 | y | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:271:10:271:10 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:271:10:271:10 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:271:10:271:10 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:271:10:271:10 | x | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:272:17:272:17 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:272:17:272:17 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:272:17:272:17 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:272:17:272:17 | x | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:273:17:273:17 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:273:17:273:17 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:273:17:273:17 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:273:17:273:17 | x | TInner | {EXTERNAL LOCATION} | Bool | | overload_resolution.swift:4:17:4:17 | x | | {EXTERNAL LOCATION} | Int | | overload_resolution.swift:8:17:8:17 | x | | {EXTERNAL LOCATION} | Double | | overload_resolution.swift:12:17:12:17 | x | | {EXTERNAL LOCATION} | String | @@ -889,6 +1245,8 @@ inferType | accessors.swift:107:22:107:34 | ... .observed | | {EXTERNAL LOCATION} | Int | | accessors.swift:108:11:108:18 | previous | | {EXTERNAL LOCATION} | Int | | accessors.swift:108:22:108:29 | oldValue | | {EXTERNAL LOCATION} | Int | +| accessors.swift:114:25:116:3 | Block | | accessors.swift:79:24:79:24 | T | +| accessors.swift:115:12:115:17 | stored | | accessors.swift:79:24:79:24 | T | | accessors.swift:120:7:120:15 | container | | accessors.swift:79:1:101:1 | GenericAccessors | | accessors.swift:120:7:120:15 | container | T | {EXTERNAL LOCATION} | String | | accessors.swift:120:19:120:34 | GenericAccessors | | accessors.swift:79:1:101:1 | GenericAccessors | @@ -1119,19 +1477,25 @@ inferType | classes.swift:59:9:59:13 | value | | {EXTERNAL LOCATION} | Int | | classes.swift:61:10:61:14 | value | | {EXTERNAL LOCATION} | Int | | classes.swift:61:22:63:5 | Block | | {EXTERNAL LOCATION} | Int | -| classes.swift:62:7:62:10 | self | | classes.swift:58:3:68:3 | Inner | +| classes.swift:62:7:62:10 | self | | classes.swift:58:3:68:3 | Outer.Inner | +| classes.swift:62:7:62:10 | self | (parent:Inner) | classes.swift:57:1:69:1 | Outer | | classes.swift:62:7:62:16 | ... .value | | {EXTERNAL LOCATION} | Int | | classes.swift:62:7:62:24 | ... = ... | | {EXTERNAL LOCATION} | Int | | classes.swift:62:20:62:24 | value | | {EXTERNAL LOCATION} | Int | | classes.swift:65:28:67:5 | Block | | {EXTERNAL LOCATION} | Int | -| classes.swift:66:14:66:17 | self | | classes.swift:58:3:68:3 | Inner | +| classes.swift:66:14:66:17 | self | | classes.swift:58:3:68:3 | Outer.Inner | +| classes.swift:66:14:66:17 | self | (parent:Inner) | classes.swift:57:1:69:1 | Outer | | classes.swift:66:14:66:23 | ... .value | | {EXTERNAL LOCATION} | Int | -| classes.swift:72:7:72:11 | inner | | classes.swift:58:3:68:3 | Inner | -| classes.swift:72:15:72:25 | ... .Inner | | classes.swift:58:3:68:3 | Inner | -| classes.swift:72:15:72:36 | ... .Inner(...) | | classes.swift:58:3:68:3 | Inner | +| classes.swift:72:7:72:11 | inner | | classes.swift:58:3:68:3 | Outer.Inner | +| classes.swift:72:7:72:11 | inner | (parent:Inner) | classes.swift:57:1:69:1 | Outer | +| classes.swift:72:15:72:25 | ... .Inner | | classes.swift:58:3:68:3 | Outer.Inner | +| classes.swift:72:15:72:25 | ... .Inner | (parent:Inner) | classes.swift:57:1:69:1 | Outer | +| classes.swift:72:15:72:36 | ... .Inner(...) | | classes.swift:58:3:68:3 | Outer.Inner | +| classes.swift:72:15:72:36 | ... .Inner(...) | (parent:Inner) | classes.swift:57:1:69:1 | Outer | | classes.swift:72:34:72:35 | 99 | | {EXTERNAL LOCATION} | Int | | classes.swift:73:7:73:7 | v | | {EXTERNAL LOCATION} | Int | -| classes.swift:73:11:73:15 | inner | | classes.swift:58:3:68:3 | Inner | +| classes.swift:73:11:73:15 | inner | | classes.swift:58:3:68:3 | Outer.Inner | +| classes.swift:73:11:73:15 | inner | (parent:Inner) | classes.swift:57:1:69:1 | Outer | | classes.swift:73:11:73:26 | ... .getValue(...) | | {EXTERNAL LOCATION} | Int | | classes.swift:79:7:79:11 | value | | {EXTERNAL LOCATION} | Int | | classes.swift:79:20:79:20 | 0 | | {EXTERNAL LOCATION} | Int | @@ -1568,15 +1932,17 @@ inferType | constructors.swift:77:15:77:24 | FunctionExpr | | {EXTERNAL LOCATION} | Function | | constructors.swift:77:15:77:24 | FunctionExpr | Args | {EXTERNAL LOCATION} | Tuple1 | | constructors.swift:83:13:83:14 | e1 | | constructors.swift:79:1:85:1 | E1 | -| constructors.swift:83:18:83:18 | a | | constructors.swift:79:1:85:1 | E1 | +| constructors.swift:83:18:83:18 | a | | constructors.swift:80:10:80:15 | E1.a | +| constructors.swift:83:18:83:18 | a | (parent:a) | constructors.swift:79:1:85:1 | E1 | | constructors.swift:83:18:83:21 | a(...) | | constructors.swift:79:1:85:1 | E1 | | constructors.swift:83:20:83:20 | 0 | | {EXTERNAL LOCATION} | Int | | constructors.swift:89:5:89:6 | e2 | | constructors.swift:87:1:87:27 | E2 | | constructors.swift:89:5:89:6 | e2 | A | {EXTERNAL LOCATION} | Int | | constructors.swift:89:5:89:6 | e2 | B | {EXTERNAL LOCATION} | String | -| constructors.swift:89:25:89:28 | ... .a | | constructors.swift:87:1:87:27 | E2 | -| constructors.swift:89:25:89:28 | ... .a | A | {EXTERNAL LOCATION} | Int | -| constructors.swift:89:25:89:28 | ... .a | B | {EXTERNAL LOCATION} | String | +| constructors.swift:89:25:89:28 | ... .a | | constructors.swift:87:22:87:25 | E2.a | +| constructors.swift:89:25:89:28 | ... .a | (parent:a) | constructors.swift:87:1:87:27 | E2 | +| constructors.swift:89:25:89:28 | ... .a | (parent:a).A | {EXTERNAL LOCATION} | Int | +| constructors.swift:89:25:89:28 | ... .a | (parent:a).B | {EXTERNAL LOCATION} | String | | constructors.swift:89:25:89:31 | ... .a(...) | | constructors.swift:87:1:87:27 | E2 | | constructors.swift:89:25:89:31 | ... .a(...) | A | {EXTERNAL LOCATION} | Int | | constructors.swift:89:25:89:31 | ... .a(...) | B | {EXTERNAL LOCATION} | String | @@ -1711,8 +2077,9 @@ inferType | generics.swift:53:10:53:17 | ... .failure | T | generics.swift:45:13:45:13 | T | | generics.swift:60:7:60:7 | r | | generics.swift:45:1:57:1 | Result | | generics.swift:60:7:60:7 | r | T | {EXTERNAL LOCATION} | Int | -| generics.swift:60:11:60:24 | ... .success | | generics.swift:45:1:57:1 | Result | -| generics.swift:60:11:60:24 | ... .success | T | {EXTERNAL LOCATION} | Int | +| generics.swift:60:11:60:24 | ... .success | | generics.swift:46:8:46:17 | Result.success | +| generics.swift:60:11:60:24 | ... .success | (parent:success) | generics.swift:45:1:57:1 | Result | +| generics.swift:60:11:60:24 | ... .success | (parent:success).T | {EXTERNAL LOCATION} | Int | | generics.swift:60:11:60:28 | ... .success(...) | | generics.swift:45:1:57:1 | Result | | generics.swift:60:11:60:28 | ... .success(...) | T | {EXTERNAL LOCATION} | Int | | generics.swift:60:26:60:27 | 42 | | {EXTERNAL LOCATION} | Int | @@ -2005,7 +2372,9 @@ inferType | generics.swift:215:26:215:38 | ... .none | | {EXTERNAL LOCATION} | Optional | | generics.swift:215:26:215:38 | ... .none | Wrapped | {EXTERNAL LOCATION} | Int | | generics.swift:227:22:229:3 | Block | | generics.swift:220:1:224:1 | MyProtocol2 | +| generics.swift:227:22:229:3 | Block | MyType | generics.swift:221:3:221:23 | MyType | | generics.swift:228:12:228:15 | self | | generics.swift:220:1:224:1 | MyProtocol2 | +| generics.swift:228:12:228:15 | self | MyType | generics.swift:221:3:221:23 | MyType | | generics.swift:233:7:233:11 | value | | generics.swift:232:15:232:15 | T | | generics.swift:235:10:235:14 | value | | generics.swift:232:15:232:15 | T | | generics.swift:235:20:237:3 | Block | | generics.swift:232:15:232:15 | T | @@ -2014,6 +2383,8 @@ inferType | generics.swift:236:5:236:14 | ... .value | | generics.swift:232:15:232:15 | T | | generics.swift:236:5:236:22 | ... = ... | | generics.swift:232:15:232:15 | T | | generics.swift:236:18:236:22 | value | | generics.swift:232:15:232:15 | T | +| generics.swift:243:19:245:3 | Block | | generics.swift:232:15:232:15 | T | +| generics.swift:244:12:244:16 | value | | generics.swift:232:15:232:15 | T | | generics.swift:248:32:248:32 | c | | generics.swift:248:14:248:27 | T | | generics.swift:249:10:249:10 | c | | generics.swift:248:14:248:27 | T | | generics.swift:252:32:252:32 | c | | generics.swift:252:14:252:27 | T | @@ -2336,6 +2707,864 @@ inferType | lub.swift:14:15:14:15 | 3 | | {EXTERNAL LOCATION} | Int | | lub.swift:14:19:14:19 | b | | lub.swift:5:1:7:1 | B | | lub.swift:14:23:14:23 | c | | lub.swift:9:1:9:13 | C | +| nested_types.swift:2:9:2:17 | baseValue | | nested_types.swift:1:12:1:16 | TBase | +| nested_types.swift:4:10:4:18 | baseValue | | nested_types.swift:1:12:1:16 | TBase | +| nested_types.swift:4:28:6:5 | Block | | nested_types.swift:1:12:1:16 | TBase | +| nested_types.swift:5:9:5:12 | self | | nested_types.swift:1:1:11:1 | Base | +| nested_types.swift:5:9:5:12 | self | TBase | nested_types.swift:1:12:1:16 | TBase | +| nested_types.swift:5:9:5:22 | ... .baseValue | | nested_types.swift:1:12:1:16 | TBase | +| nested_types.swift:5:9:5:34 | ... = ... | | nested_types.swift:1:12:1:16 | TBase | +| nested_types.swift:5:26:5:34 | baseValue | | nested_types.swift:1:12:1:16 | TBase | +| nested_types.swift:8:29:10:5 | Block | | nested_types.swift:1:12:1:16 | TBase | +| nested_types.swift:9:16:9:19 | self | | nested_types.swift:1:1:11:1 | Base | +| nested_types.swift:9:16:9:19 | self | TBase | nested_types.swift:1:12:1:16 | TBase | +| nested_types.swift:9:16:9:29 | ... .baseValue | | nested_types.swift:1:12:1:16 | TBase | +| nested_types.swift:15:13:15:22 | innerValue | | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:16:13:16:22 | outerValue | | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:18:14:18:23 | innerValue | | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:18:34:18:43 | outerValue | | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:18:54:22:9 | Block | | nested_types.swift:1:1:11:1 | Base | +| nested_types.swift:18:54:22:9 | Block | TBase | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:19:13:19:16 | self | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:19:13:19:16 | self | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:19:13:19:16 | self | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:19:13:19:16 | self | TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:19:13:19:27 | ... .innerValue | | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:19:13:19:40 | ... = ... | | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:19:31:19:40 | innerValue | | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:20:13:20:16 | self | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:20:13:20:16 | self | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:20:13:20:16 | self | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:20:13:20:16 | self | TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:20:13:20:27 | ... .outerValue | | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:20:13:20:40 | ... = ... | | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:20:31:20:40 | outerValue | | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:21:13:21:17 | super | | nested_types.swift:1:1:11:1 | Base | +| nested_types.swift:21:13:21:17 | super | TBase | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:21:13:21:45 | ... .init(...) | | nested_types.swift:1:1:11:1 | Base | +| nested_types.swift:21:13:21:45 | ... .init(...) | TBase | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:21:35:21:44 | innerValue | | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:24:26:24:35 | innerValue | | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:25:24:25:64 | "Convenience initializer not implemented" | | {EXTERNAL LOCATION} | String | +| nested_types.swift:28:35:30:9 | Block | | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:29:20:29:23 | self | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:29:20:29:23 | self | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:29:20:29:23 | self | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:29:20:29:23 | self | TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:29:20:29:34 | ... .innerValue | | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:32:35:34:9 | Block | | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:33:20:33:23 | self | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:33:20:33:23 | self | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:33:20:33:23 | self | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:33:20:33:23 | self | TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:33:20:33:34 | ... .outerValue | | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:36:52:38:9 | Block | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:36:52:38:9 | Block | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:36:52:38:9 | Block | (parent:Inner).TOuter | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:36:52:38:9 | Block | TInner | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:37:20:37:38 | ... .Inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:37:20:37:38 | ... .Inner | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:37:20:37:38 | ... .Inner | (parent:Inner).TOuter | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:37:20:37:38 | ... .Inner | TInner | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:37:20:37:96 | ... .Inner(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:37:20:37:96 | ... .Inner(...) | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:37:20:37:96 | ... .Inner(...) | (parent:Inner).TOuter | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:37:20:37:96 | ... .Inner(...) | TInner | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:37:52:37:55 | self | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:37:52:37:55 | self | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:37:52:37:55 | self | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:37:52:37:55 | self | TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:37:52:37:66 | ... .outerValue | | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:37:81:37:84 | self | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:37:81:37:84 | self | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:37:81:37:84 | self | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:37:81:37:84 | self | TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:37:81:37:95 | ... .innerValue | | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:40:42:42:9 | Block | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:40:42:42:9 | Block | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:40:42:42:9 | Block | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:40:42:42:9 | Block | TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:41:20:41:23 | self | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:41:20:41:23 | self | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:41:20:41:23 | self | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:41:20:41:23 | self | TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:44:34:46:9 | Block | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:44:34:46:9 | Block | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:44:34:46:9 | Block | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:44:34:46:9 | Block | TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:45:20:45:23 | self | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:45:20:45:23 | self | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:45:20:45:23 | self | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:45:20:45:23 | self | TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:51:29:51:38 | outerValue | | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:51:63:53:5 | Block | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:51:63:53:5 | Block | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:51:63:53:5 | Block | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:51:63:53:5 | Block | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:52:16:52:20 | Inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:52:16:52:20 | Inner | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:52:16:52:20 | Inner | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:52:16:52:20 | Inner | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:52:16:52:59 | Inner(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:52:16:52:59 | Inner(...) | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:52:16:52:59 | Inner(...) | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:52:16:52:59 | Inner(...) | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:52:34:52:34 | 0 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:52:49:52:58 | outerValue | | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:59:14:59:14 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:59:14:59:14 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:59:14:59:14 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:59:14:59:14 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:63:14:63:14 | y | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:63:14:63:14 | y | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:63:14:63:14 | y | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:63:14:63:14 | y | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:63:26:63:26 | z | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:63:26:63:26 | z | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:63:26:63:26 | z | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:63:26:63:26 | z | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:64:13:64:17 | outer | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:64:21:64:21 | z | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:64:21:64:21 | z | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:64:21:64:21 | z | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:64:21:64:21 | z | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:64:21:64:32 | ... .getOuter(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:65:13:65:17 | inner | | {EXTERNAL LOCATION} | String | +| nested_types.swift:65:21:65:21 | z | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:65:21:65:21 | z | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:65:21:65:21 | z | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:65:21:65:21 | z | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:65:21:65:32 | ... .getInner(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:77:9:77:9 | z | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:77:9:77:9 | z | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:77:9:77:9 | z | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:77:9:77:9 | z | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:78:9:78:9 | y | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:78:9:78:9 | y | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:78:9:78:9 | y | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:78:9:78:9 | y | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:80:13:80:13 | a | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:80:17:80:17 | z | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:80:17:80:17 | z | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:80:17:80:17 | z | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:80:17:80:17 | z | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:80:17:80:28 | ... .getInner(...) | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:81:13:81:13 | b | | {EXTERNAL LOCATION} | String | +| nested_types.swift:81:17:81:17 | z | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:81:17:81:17 | z | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:81:17:81:17 | z | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:81:17:81:17 | z | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:81:17:81:28 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:82:13:82:13 | c | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:82:17:82:17 | y | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:82:17:82:17 | y | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:82:17:82:17 | y | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:82:17:82:17 | y | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:82:17:82:28 | ... .getInner(...) | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:83:13:83:13 | d | | {EXTERNAL LOCATION} | String | +| nested_types.swift:83:17:83:17 | y | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:83:17:83:17 | y | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:83:17:83:17 | y | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:83:17:83:17 | y | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:83:17:83:28 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:88:12:88:13 | f1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:88:12:88:13 | f1 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:88:12:88:13 | f1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:88:12:88:13 | f1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:88:24:88:25 | f2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:88:24:88:25 | f2 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:88:24:88:25 | f2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:88:24:88:25 | f2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:89:13:89:13 | a | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:89:17:89:18 | f1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:89:17:89:18 | f1 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:89:17:89:18 | f1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:89:17:89:18 | f1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:89:17:89:29 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:90:13:90:13 | b | | {EXTERNAL LOCATION} | String | +| nested_types.swift:90:17:90:18 | f1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:90:17:90:18 | f1 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:90:17:90:18 | f1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:90:17:90:18 | f1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:90:17:90:29 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:91:13:91:13 | c | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:91:17:91:18 | f2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:91:17:91:18 | f2 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:91:17:91:18 | f2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:91:17:91:18 | f2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:91:17:91:29 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:92:13:92:13 | d | | {EXTERNAL LOCATION} | String | +| nested_types.swift:92:17:92:18 | f2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:92:17:92:18 | f2 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:92:17:92:18 | f2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:92:17:92:18 | f2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:92:17:92:29 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:97:12:97:12 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:97:12:97:12 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:97:12:97:12 | x | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:97:12:97:12 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:98:13:98:17 | outer | | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:98:21:98:21 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:98:21:98:21 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:98:21:98:21 | x | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:98:21:98:21 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:98:21:98:32 | ... .getOuter(...) | | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:99:13:99:17 | inner | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:99:21:99:21 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:99:21:99:21 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:99:21:99:21 | x | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:99:21:99:21 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:99:21:99:32 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:104:13:104:13 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:104:13:104:13 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:104:13:104:13 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:104:13:104:13 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:105:13:105:17 | outer | | {EXTERNAL LOCATION} | String | +| nested_types.swift:105:21:105:21 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:105:21:105:21 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:105:21:105:21 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:105:21:105:21 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:105:21:105:32 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:106:13:106:17 | inner | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:106:21:106:21 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:106:21:106:21 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:106:21:106:21 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:106:21:106:21 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:106:21:106:32 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:111:13:111:14 | p1 | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:111:13:111:14 | p1 | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:111:13:111:14 | p1 | T0.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:111:13:111:14 | p1 | T0.(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:111:13:111:14 | p1 | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:111:13:111:14 | p1 | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:111:13:111:14 | p1 | T1.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:111:13:111:14 | p1 | T1.(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:111:13:111:14 | p1 | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:111:23:111:24 | p2 | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:111:23:111:24 | p2 | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:111:23:111:24 | p2 | T0.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:111:23:111:24 | p2 | T0.(parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:111:23:111:24 | p2 | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:111:23:111:24 | p2 | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:111:23:111:24 | p2 | T1.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:111:23:111:24 | p2 | T1.(parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:111:23:111:24 | p2 | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:112:13:112:13 | a | | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:112:17:112:18 | p1 | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:112:17:112:18 | p1 | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:112:17:112:18 | p1 | T0.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:112:17:112:18 | p1 | T0.(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:112:17:112:18 | p1 | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:112:17:112:18 | p1 | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:112:17:112:18 | p1 | T1.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:112:17:112:18 | p1 | T1.(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:112:17:112:18 | p1 | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:112:17:112:20 | ... .0 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:112:17:112:20 | ... .0 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:112:17:112:20 | ... .0 | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:112:17:112:20 | ... .0 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:112:17:112:31 | ... .getOuter(...) | | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:113:13:113:13 | b | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:113:17:113:18 | p1 | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:113:17:113:18 | p1 | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:113:17:113:18 | p1 | T0.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:113:17:113:18 | p1 | T0.(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:113:17:113:18 | p1 | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:113:17:113:18 | p1 | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:113:17:113:18 | p1 | T1.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:113:17:113:18 | p1 | T1.(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:113:17:113:18 | p1 | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:113:17:113:20 | ... .0 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:113:17:113:20 | ... .0 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:113:17:113:20 | ... .0 | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:113:17:113:20 | ... .0 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:113:17:113:31 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:114:13:114:13 | c | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:114:17:114:18 | p2 | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:114:17:114:18 | p2 | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:114:17:114:18 | p2 | T0.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:114:17:114:18 | p2 | T0.(parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:114:17:114:18 | p2 | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:114:17:114:18 | p2 | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:114:17:114:18 | p2 | T1.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:114:17:114:18 | p2 | T1.(parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:114:17:114:18 | p2 | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:114:17:114:20 | ... .0 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:114:17:114:20 | ... .0 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:114:17:114:20 | ... .0 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:114:17:114:20 | ... .0 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:114:17:114:31 | ... .getOuter(...) | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:115:13:115:13 | d | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:115:17:115:18 | p2 | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:115:17:115:18 | p2 | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:115:17:115:18 | p2 | T0.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:115:17:115:18 | p2 | T0.(parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:115:17:115:18 | p2 | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:115:17:115:18 | p2 | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:115:17:115:18 | p2 | T1.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:115:17:115:18 | p2 | T1.(parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:115:17:115:18 | p2 | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:115:17:115:20 | ... .0 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:115:17:115:20 | ... .0 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:115:17:115:20 | ... .0 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:115:17:115:20 | ... .0 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:115:17:115:31 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:118:19:118:23 | empty | | nested_types.swift:118:5:118:25 | Outer.E | +| nested_types.swift:118:19:118:23 | empty | (parent:E) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:118:19:118:23 | empty | (parent:E).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:121:5:121:5 | e | | nested_types.swift:118:5:118:25 | Outer.E | +| nested_types.swift:121:5:121:5 | e | (parent:E) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:121:5:121:5 | e | (parent:E).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:121:23:121:35 | ... .empty | | nested_types.swift:118:5:118:25 | Outer.E | +| nested_types.swift:121:23:121:35 | ... .empty | (parent:E) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:121:23:121:35 | ... .empty | (parent:E).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:124:12:124:12 | x | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:124:12:124:12 | x | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:124:12:124:12 | x | T0.(parent:Inner) | nested_types.swift:123:1:130:1 | Foo | +| nested_types.swift:124:12:124:12 | x | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:124:12:124:12 | x | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:124:12:124:12 | x | T1.(parent:Inner) | nested_types.swift:123:1:130:1 | Foo | +| nested_types.swift:124:12:124:12 | x | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:124:21:124:21 | y | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:124:21:124:21 | y | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:124:21:124:21 | y | T0.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:124:21:124:21 | y | T0.(parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:124:21:124:21 | y | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:124:21:124:21 | y | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:124:21:124:21 | y | T1.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:124:21:124:21 | y | T1.(parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:124:21:124:21 | y | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:125:13:125:13 | a | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:125:17:125:17 | x | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:125:17:125:17 | x | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:125:17:125:17 | x | T0.(parent:Inner) | nested_types.swift:123:1:130:1 | Foo | +| nested_types.swift:125:17:125:17 | x | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:125:17:125:17 | x | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:125:17:125:17 | x | T1.(parent:Inner) | nested_types.swift:123:1:130:1 | Foo | +| nested_types.swift:125:17:125:17 | x | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:125:17:125:19 | ... .0 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:125:17:125:19 | ... .0 | (parent:Inner) | nested_types.swift:123:1:130:1 | Foo | +| nested_types.swift:125:17:125:19 | ... .0 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:125:17:125:30 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:126:17:126:17 | x | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:126:17:126:17 | x | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:126:17:126:17 | x | T0.(parent:Inner) | nested_types.swift:123:1:130:1 | Foo | +| nested_types.swift:126:17:126:17 | x | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:126:17:126:17 | x | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:126:17:126:17 | x | T1.(parent:Inner) | nested_types.swift:123:1:130:1 | Foo | +| nested_types.swift:126:17:126:17 | x | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:126:17:126:19 | ... .0 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:126:17:126:19 | ... .0 | (parent:Inner) | nested_types.swift:123:1:130:1 | Foo | +| nested_types.swift:126:17:126:19 | ... .0 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:127:13:127:13 | c | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:127:17:127:17 | y | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:127:17:127:17 | y | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:127:17:127:17 | y | T0.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:127:17:127:17 | y | T0.(parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:127:17:127:17 | y | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:127:17:127:17 | y | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:127:17:127:17 | y | T1.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:127:17:127:17 | y | T1.(parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:127:17:127:17 | y | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:127:17:127:19 | ... .0 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:127:17:127:19 | ... .0 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:127:17:127:19 | ... .0 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:127:17:127:19 | ... .0 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:127:17:127:30 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:128:13:128:13 | d | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:128:17:128:17 | y | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:128:17:128:17 | y | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:128:17:128:17 | y | T0.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:128:17:128:17 | y | T0.(parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:128:17:128:17 | y | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:128:17:128:17 | y | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:128:17:128:17 | y | T1.(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:128:17:128:17 | y | T1.(parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:128:17:128:17 | y | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:128:17:128:19 | ... .0 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:128:17:128:19 | ... .0 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:128:17:128:19 | ... .0 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:128:17:128:19 | ... .0 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:128:17:128:30 | ... .getOuter(...) | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:132:29:132:33 | inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:132:29:132:33 | inner | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:132:29:132:33 | inner | (parent:Inner).TOuter | nested_types.swift:132:19:132:20 | Ta | +| nested_types.swift:132:29:132:33 | inner | TInner | nested_types.swift:132:23:132:24 | Tb | +| nested_types.swift:132:63:134:1 | Block | | nested_types.swift:132:23:132:24 | Tb | +| nested_types.swift:133:12:133:16 | inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:133:12:133:16 | inner | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:133:12:133:16 | inner | (parent:Inner).TOuter | nested_types.swift:132:19:132:20 | Ta | +| nested_types.swift:133:12:133:16 | inner | TInner | nested_types.swift:132:23:132:24 | Tb | +| nested_types.swift:133:12:133:27 | ... .getInner(...) | | nested_types.swift:132:23:132:24 | Tb | +| nested_types.swift:136:29:136:33 | inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:136:29:136:33 | inner | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:136:29:136:33 | inner | (parent:Inner).TOuter | nested_types.swift:136:19:136:20 | Ta | +| nested_types.swift:136:29:136:33 | inner | TInner | nested_types.swift:136:23:136:24 | Tb | +| nested_types.swift:136:63:138:1 | Block | | nested_types.swift:136:19:136:20 | Ta | +| nested_types.swift:137:12:137:16 | inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:137:12:137:16 | inner | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:137:12:137:16 | inner | (parent:Inner).TOuter | nested_types.swift:136:19:136:20 | Ta | +| nested_types.swift:137:12:137:16 | inner | TInner | nested_types.swift:136:23:136:24 | Tb | +| nested_types.swift:137:12:137:27 | ... .getOuter(...) | | nested_types.swift:136:19:136:20 | Ta | +| nested_types.swift:140:5:140:10 | inner1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:140:5:140:10 | inner1 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:140:5:140:10 | inner1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:140:5:140:10 | inner1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:140:14:140:24 | ... .Inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:140:14:140:24 | ... .Inner | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:140:14:140:24 | ... .Inner | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:140:14:140:24 | ... .Inner | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:140:14:140:56 | ... .Inner(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:140:14:140:56 | ... .Inner(...) | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:140:14:140:56 | ... .Inner(...) | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:140:14:140:56 | ... .Inner(...) | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:140:38:140:39 | 42 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:140:54:140:55 | "" | | {EXTERNAL LOCATION} | String | +| nested_types.swift:141:5:141:7 | x1a | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:141:11:141:16 | inner1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:141:11:141:16 | inner1 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:141:11:141:16 | inner1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:141:11:141:16 | inner1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:141:11:141:27 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:142:5:142:7 | x1b | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:142:11:142:30 | extractInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:142:24:142:29 | inner1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:142:24:142:29 | inner1 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:142:24:142:29 | inner1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:142:24:142:29 | inner1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:143:5:143:7 | y1a | | {EXTERNAL LOCATION} | String | +| nested_types.swift:143:11:143:16 | inner1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:143:11:143:16 | inner1 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:143:11:143:16 | inner1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:143:11:143:16 | inner1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:143:11:143:27 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:144:5:144:7 | y1b | | {EXTERNAL LOCATION} | String | +| nested_types.swift:144:11:144:30 | extractOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:144:24:144:29 | inner1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:144:24:144:29 | inner1 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:144:24:144:29 | inner1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:144:24:144:29 | inner1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:145:5:145:6 | b1 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:145:10:145:15 | inner1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:145:10:145:15 | inner1 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:145:10:145:15 | inner1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:145:10:145:15 | inner1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:145:10:145:25 | ... .getBase(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:147:5:147:10 | inner2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:147:5:147:10 | inner2 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:147:5:147:10 | inner2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:147:5:147:10 | inner2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:147:14:147:32 | ... .Inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:147:14:147:32 | ... .Inner | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:147:14:147:32 | ... .Inner | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:147:14:147:32 | ... .Inner | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:147:14:147:48 | ... .Inner(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:147:14:147:48 | ... .Inner(...) | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:147:14:147:48 | ... .Inner(...) | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:147:14:147:48 | ... .Inner(...) | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:147:46:147:47 | 42 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:148:5:148:7 | x2a | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:148:11:148:16 | inner2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:148:11:148:16 | inner2 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:148:11:148:16 | inner2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:148:11:148:16 | inner2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:148:11:148:27 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:149:5:149:7 | x2b | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:149:11:149:30 | extractInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:149:24:149:29 | inner2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:149:24:149:29 | inner2 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:149:24:149:29 | inner2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:149:24:149:29 | inner2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:150:5:150:7 | y2a | | {EXTERNAL LOCATION} | String | +| nested_types.swift:150:11:150:16 | inner2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:150:11:150:16 | inner2 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:150:11:150:16 | inner2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:150:11:150:16 | inner2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:150:11:150:27 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:151:5:151:7 | y2b | | {EXTERNAL LOCATION} | String | +| nested_types.swift:151:11:151:30 | extractOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:151:24:151:29 | inner2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:151:24:151:29 | inner2 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:151:24:151:29 | inner2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:151:24:151:29 | inner2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:152:5:152:6 | b2 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:152:10:152:15 | inner2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:152:10:152:15 | inner2 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:152:10:152:15 | inner2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:152:10:152:15 | inner2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:152:10:152:25 | ... .getBase(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:154:5:154:11 | swapped | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:154:5:154:11 | swapped | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:154:5:154:11 | swapped | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:154:5:154:11 | swapped | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:154:15:154:20 | inner1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:154:15:154:20 | inner1 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:154:15:154:20 | inner1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:154:15:154:20 | inner1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:154:15:154:27 | ... .swap(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:154:15:154:27 | ... .swap(...) | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:154:15:154:27 | ... .swap(...) | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:154:15:154:27 | ... .swap(...) | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:155:5:155:6 | x3 | | {EXTERNAL LOCATION} | String | +| nested_types.swift:155:10:155:16 | swapped | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:155:10:155:16 | swapped | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:155:10:155:16 | swapped | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:155:10:155:16 | swapped | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:155:10:155:27 | ... .getInner(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:156:5:156:6 | y3 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:156:10:156:16 | swapped | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:156:10:156:16 | swapped | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:156:10:156:16 | swapped | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:156:10:156:16 | swapped | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:156:10:156:27 | ... .getOuter(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:157:5:157:6 | b3 | | {EXTERNAL LOCATION} | String | +| nested_types.swift:157:10:157:16 | swapped | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:157:10:157:16 | swapped | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:157:10:157:16 | swapped | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:157:10:157:16 | swapped | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:157:10:157:26 | ... .getBase(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:159:5:159:10 | inner4 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:159:5:159:10 | inner4 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:159:5:159:10 | inner4 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:159:5:159:10 | inner4 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:159:14:159:19 | inner1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:159:14:159:19 | inner1 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:159:14:159:19 | inner1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:159:14:159:19 | inner1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:159:14:159:30 | ... .getSelf1(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:159:14:159:30 | ... .getSelf1(...) | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:159:14:159:30 | ... .getSelf1(...) | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:159:14:159:30 | ... .getSelf1(...) | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:160:5:160:6 | x4 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:160:10:160:15 | inner4 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:160:10:160:15 | inner4 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:160:10:160:15 | inner4 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:160:10:160:15 | inner4 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:160:10:160:26 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:161:5:161:6 | y4 | | {EXTERNAL LOCATION} | String | +| nested_types.swift:161:10:161:15 | inner4 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:161:10:161:15 | inner4 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:161:10:161:15 | inner4 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:161:10:161:15 | inner4 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:161:10:161:26 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:162:5:162:6 | b4 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:162:10:162:15 | inner4 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:162:10:162:15 | inner4 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:162:10:162:15 | inner4 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:162:10:162:15 | inner4 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:162:10:162:25 | ... .getBase(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:164:5:164:10 | inner5 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:164:5:164:10 | inner5 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:164:5:164:10 | inner5 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:164:5:164:10 | inner5 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:164:14:164:19 | inner1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:164:14:164:19 | inner1 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:164:14:164:19 | inner1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:164:14:164:19 | inner1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:164:14:164:30 | ... .getSelf2(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:164:14:164:30 | ... .getSelf2(...) | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:164:14:164:30 | ... .getSelf2(...) | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:164:14:164:30 | ... .getSelf2(...) | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:165:5:165:6 | x5 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:165:10:165:15 | inner5 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:165:10:165:15 | inner5 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:165:10:165:15 | inner5 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:165:10:165:15 | inner5 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:165:10:165:26 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:166:5:166:6 | y5 | | {EXTERNAL LOCATION} | String | +| nested_types.swift:166:10:166:15 | inner5 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:166:10:166:15 | inner5 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:166:10:166:15 | inner5 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:166:10:166:15 | inner5 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:166:10:166:26 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:167:5:167:6 | b5 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:167:10:167:15 | inner5 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:167:10:167:15 | inner5 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:167:10:167:15 | inner5 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:167:10:167:15 | inner5 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:167:10:167:25 | ... .getBase(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:169:5:169:10 | inner6 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:169:5:169:10 | inner6 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:169:5:169:10 | inner6 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:169:5:169:10 | inner6 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:169:14:169:49 | ... .createInner(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:169:14:169:49 | ... .createInner(...) | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:169:14:169:49 | ... .createInner(...) | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:169:14:169:49 | ... .createInner(...) | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:169:44:169:48 | false | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:170:5:170:6 | x6 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:170:10:170:15 | inner6 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:170:10:170:15 | inner6 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:170:10:170:15 | inner6 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:170:10:170:15 | inner6 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:170:10:170:26 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:171:5:171:6 | y6 | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:171:10:171:15 | inner6 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:171:10:171:15 | inner6 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:171:10:171:15 | inner6 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:171:10:171:15 | inner6 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:171:10:171:26 | ... .getOuter(...) | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:172:5:172:6 | b6 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:172:10:172:15 | inner6 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:172:10:172:15 | inner6 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:172:10:172:15 | inner6 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:172:10:172:15 | inner6 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:172:10:172:25 | ... .getBase(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:174:5:174:10 | inner7 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:174:5:174:10 | inner7 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:174:5:174:10 | inner7 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:174:5:174:10 | inner7 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:174:14:174:29 | ... .InnerAlias | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:174:14:174:29 | ... .InnerAlias | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:174:14:174:29 | ... .InnerAlias | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:174:14:174:29 | ... .InnerAlias | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:174:14:174:63 | ... .InnerAlias(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:174:14:174:63 | ... .InnerAlias(...) | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:174:14:174:63 | ... .InnerAlias(...) | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:174:14:174:63 | ... .InnerAlias(...) | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:174:43:174:43 | 0 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:174:58:174:62 | false | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:175:5:175:7 | x11 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:175:11:175:16 | inner7 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:175:11:175:16 | inner7 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:175:11:175:16 | inner7 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:175:11:175:16 | inner7 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:175:11:175:27 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:176:5:176:7 | y11 | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:176:11:176:16 | inner7 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:176:11:176:16 | inner7 | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:176:11:176:16 | inner7 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:176:11:176:16 | inner7 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:176:11:176:27 | ... .getOuter(...) | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:184:13:184:16 | self | | nested_types.swift:179:5:195:5 | Outer.Inner.InnerMost | +| nested_types.swift:184:13:184:16 | self | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:184:13:184:16 | self | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:184:13:184:16 | self | (parent:InnerMost).(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:184:13:184:16 | self | (parent:InnerMost).TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:185:13:185:16 | self | | nested_types.swift:179:5:195:5 | Outer.Inner.InnerMost | +| nested_types.swift:185:13:185:16 | self | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:185:13:185:16 | self | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:185:13:185:16 | self | (parent:InnerMost).(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:185:13:185:16 | self | (parent:InnerMost).TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:189:20:189:23 | self | | nested_types.swift:179:5:195:5 | Outer.Inner.InnerMost | +| nested_types.swift:189:20:189:23 | self | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:189:20:189:23 | self | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:189:20:189:23 | self | (parent:InnerMost).(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:189:20:189:23 | self | (parent:InnerMost).TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:193:20:193:23 | self | | nested_types.swift:179:5:195:5 | Outer.Inner.InnerMost | +| nested_types.swift:193:20:193:23 | self | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:193:20:193:23 | self | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:193:20:193:23 | self | (parent:InnerMost).(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:193:20:193:23 | self | (parent:InnerMost).TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:198:5:198:13 | innerMost | | nested_types.swift:179:5:195:5 | Outer.Inner.InnerMost | +| nested_types.swift:198:5:198:13 | innerMost | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:198:5:198:13 | innerMost | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:198:17:198:37 | ... .InnerMost | | nested_types.swift:179:5:195:5 | Outer.Inner.InnerMost | +| nested_types.swift:198:17:198:37 | ... .InnerMost | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:198:17:198:37 | ... .InnerMost | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:198:17:198:51 | ... .InnerMost(...) | | nested_types.swift:179:5:195:5 | Outer.Inner.InnerMost | +| nested_types.swift:198:17:198:51 | ... .InnerMost(...) | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:198:17:198:51 | ... .InnerMost(...) | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:198:42:198:43 | "" | | {EXTERNAL LOCATION} | String | +| nested_types.swift:198:49:198:50 | 42 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:199:10:199:18 | innerMost | | nested_types.swift:179:5:195:5 | Outer.Inner.InnerMost | +| nested_types.swift:199:10:199:18 | innerMost | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:199:10:199:18 | innerMost | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:200:10:200:18 | innerMost | | nested_types.swift:179:5:195:5 | Outer.Inner.InnerMost | +| nested_types.swift:200:10:200:18 | innerMost | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:200:10:200:18 | innerMost | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:203:14:203:14 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:203:14:203:14 | x | (parent:Inner) | nested_types.swift:202:1:207:1 | SubOuter | +| nested_types.swift:203:14:203:14 | x | (parent:Inner).TSubOuter | nested_types.swift:202:16:202:24 | TSubOuter | +| nested_types.swift:203:14:203:14 | x | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:204:19:204:19 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:204:19:204:19 | x | (parent:Inner) | nested_types.swift:202:1:207:1 | SubOuter | +| nested_types.swift:204:19:204:19 | x | (parent:Inner).TSubOuter | nested_types.swift:202:16:202:24 | TSubOuter | +| nested_types.swift:204:19:204:19 | x | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:209:5:209:12 | subOuter | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:209:5:209:12 | subOuter | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:209:5:209:12 | subOuter | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Array | +| nested_types.swift:209:5:209:12 | subOuter | (parent:Inner).TOuter.Element | {EXTERNAL LOCATION} | Int | +| nested_types.swift:209:5:209:12 | subOuter | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:209:16:209:58 | ... .createInner(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:209:16:209:58 | ... .createInner(...) | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:209:16:209:58 | ... .createInner(...) | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Array | +| nested_types.swift:209:16:209:58 | ... .createInner(...) | (parent:Inner).TOuter.Element | {EXTERNAL LOCATION} | Int | +| nested_types.swift:209:16:209:58 | ... .createInner(...) | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:209:54:209:57 | ArrayLiteral | | {EXTERNAL LOCATION} | Array | +| nested_types.swift:209:54:209:57 | ArrayLiteral | Element | {EXTERNAL LOCATION} | Int | +| nested_types.swift:209:55:209:56 | 42 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:210:5:210:6 | x8 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:210:10:210:17 | subOuter | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:210:10:210:17 | subOuter | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:210:10:210:17 | subOuter | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Array | +| nested_types.swift:210:10:210:17 | subOuter | (parent:Inner).TOuter.Element | {EXTERNAL LOCATION} | Int | +| nested_types.swift:210:10:210:17 | subOuter | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:210:10:210:28 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:211:5:211:6 | y8 | | {EXTERNAL LOCATION} | Array | +| nested_types.swift:211:5:211:6 | y8 | Element | {EXTERNAL LOCATION} | Int | +| nested_types.swift:211:10:211:17 | subOuter | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:211:10:211:17 | subOuter | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:211:10:211:17 | subOuter | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Array | +| nested_types.swift:211:10:211:17 | subOuter | (parent:Inner).TOuter.Element | {EXTERNAL LOCATION} | Int | +| nested_types.swift:211:10:211:17 | subOuter | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:211:10:211:28 | ... .getOuter(...) | | {EXTERNAL LOCATION} | Array | +| nested_types.swift:211:10:211:28 | ... .getOuter(...) | Element | {EXTERNAL LOCATION} | Int | +| nested_types.swift:213:5:213:12 | subInner | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:213:5:213:12 | subInner | (parent:SubInner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:213:5:213:12 | subInner | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:213:5:213:12 | subInner | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:213:16:213:29 | ... .SubInner | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:213:16:213:29 | ... .SubInner | (parent:SubInner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:213:16:213:29 | ... .SubInner | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:213:16:213:29 | ... .SubInner | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:213:16:213:62 | ... .SubInner(...) | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:213:16:213:62 | ... .SubInner(...) | (parent:SubInner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:213:16:213:62 | ... .SubInner(...) | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:213:16:213:62 | ... .SubInner(...) | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:213:43:213:46 | true | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:213:61:213:61 | 0 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:214:5:214:6 | x9 | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:214:10:214:17 | subInner | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:214:10:214:17 | subInner | (parent:SubInner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:214:10:214:17 | subInner | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:214:10:214:17 | subInner | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:214:10:214:28 | ... .getInner(...) | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:215:5:215:6 | y9 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:215:10:215:17 | subInner | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:215:10:215:17 | subInner | (parent:SubInner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:215:10:215:17 | subInner | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:215:10:215:17 | subInner | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:215:10:215:28 | ... .getOuter(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:217:5:217:13 | subInner2 | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:217:5:217:13 | subInner2 | (parent:SubInner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:217:5:217:13 | subInner2 | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:217:5:217:13 | subInner2 | TSubInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:217:46:217:59 | ... .SubInner | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:217:46:217:59 | ... .SubInner | (parent:SubInner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:217:46:217:59 | ... .SubInner | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:217:46:217:59 | ... .SubInner | TSubInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:217:46:217:74 | ... .SubInner(...) | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:217:46:217:74 | ... .SubInner(...) | (parent:SubInner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:217:46:217:74 | ... .SubInner(...) | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:217:46:217:74 | ... .SubInner(...) | TSubInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:217:73:217:73 | 1 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:218:5:218:7 | x12 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:218:11:218:19 | subInner2 | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:218:11:218:19 | subInner2 | (parent:SubInner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:218:11:218:19 | subInner2 | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:218:11:218:19 | subInner2 | TSubInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:218:11:218:30 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:219:5:219:7 | y12 | | {EXTERNAL LOCATION} | String | +| nested_types.swift:219:11:219:19 | subInner2 | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:219:11:219:19 | subInner2 | (parent:SubInner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:219:11:219:19 | subInner2 | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:219:11:219:19 | subInner2 | TSubInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:219:11:219:30 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:223:5:223:19 | subInnerOutside | | nested_types.swift:221:1:221:70 | SubInnerOutside | +| nested_types.swift:223:5:223:19 | subInnerOutside | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:223:23:223:37 | SubInnerOutside | | nested_types.swift:221:1:221:70 | SubInnerOutside | +| nested_types.swift:223:23:223:37 | SubInnerOutside | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:223:23:223:74 | SubInnerOutside(...) | | nested_types.swift:221:1:221:70 | SubInnerOutside | +| nested_types.swift:223:23:223:74 | SubInnerOutside(...) | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:223:51:223:54 | true | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:223:69:223:73 | false | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:224:5:224:7 | x10 | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:224:11:224:25 | subInnerOutside | | nested_types.swift:221:1:221:70 | SubInnerOutside | +| nested_types.swift:224:11:224:25 | subInnerOutside | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:224:11:224:36 | ... .getInner(...) | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:225:5:225:7 | y10 | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:225:11:225:25 | subInnerOutside | | nested_types.swift:221:1:221:70 | SubInnerOutside | +| nested_types.swift:225:11:225:25 | subInnerOutside | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:225:11:225:36 | ... .getOuter(...) | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:229:13:229:13 | x | | nested_types.swift:228:5:230:5 | Node.Leaf | +| nested_types.swift:229:13:229:13 | x | (parent:Leaf) | nested_types.swift:227:1:231:1 | Node | +| nested_types.swift:229:23:229:26 | Leaf | | nested_types.swift:228:5:230:5 | Node.Leaf | +| nested_types.swift:229:23:229:26 | Leaf | (parent:Leaf) | nested_types.swift:227:1:231:1 | Node | +| nested_types.swift:229:23:229:28 | Leaf(...) | | nested_types.swift:228:5:230:5 | Node.Leaf | +| nested_types.swift:229:23:229:28 | Leaf(...) | (parent:Leaf) | nested_types.swift:227:1:231:1 | Node | +| nested_types.swift:235:5:235:10 | holder | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:235:5:235:10 | holder | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:235:5:235:10 | holder | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:235:5:235:10 | holder | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:235:14:235:25 | ... .Fixed | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:235:14:235:25 | ... .Fixed | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:235:14:235:25 | ... .Fixed | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:235:14:235:25 | ... .Fixed | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:235:14:235:41 | ... .Fixed(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:235:14:235:41 | ... .Fixed(...) | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:235:14:235:41 | ... .Fixed(...) | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:235:14:235:41 | ... .Fixed(...) | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:235:39:235:40 | "" | | {EXTERNAL LOCATION} | String | +| nested_types.swift:236:5:236:7 | x13 | | {EXTERNAL LOCATION} | String | +| nested_types.swift:236:11:236:16 | holder | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:236:11:236:16 | holder | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:236:11:236:16 | holder | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:236:11:236:16 | holder | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:236:11:236:27 | ... .getInner(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:237:5:237:7 | y13 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:237:11:237:16 | holder | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:237:11:237:16 | holder | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:237:11:237:16 | holder | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:237:11:237:16 | holder | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:237:11:237:27 | ... .getOuter(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:245:11:245:11 | x | | nested_types.swift:239:1:248:1 | Box | +| nested_types.swift:245:11:245:11 | x | T | {EXTERNAL LOCATION} | Int | +| nested_types.swift:246:11:246:11 | y | | nested_types.swift:239:1:248:1 | Box | +| nested_types.swift:246:11:246:11 | y | T | nested_types.swift:239:11:239:11 | T | +| nested_types.swift:252:10:252:10 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:252:10:252:10 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:252:10:252:10 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:252:10:252:10 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:256:10:256:10 | x | | {EXTERNAL LOCATION} | String | +| nested_types.swift:262:10:262:10 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:262:10:262:10 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:262:10:262:10 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:262:10:262:10 | x | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:262:35:262:35 | y | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:262:35:262:35 | y | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:262:35:262:35 | y | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:262:35:262:35 | y | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:263:9:263:9 | a | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:263:13:263:13 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:263:13:263:13 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:263:13:263:13 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:263:13:263:13 | x | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:263:13:263:24 | ... .getInner(...) | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:264:9:264:9 | b | | {EXTERNAL LOCATION} | String | +| nested_types.swift:264:13:264:13 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:264:13:264:13 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:264:13:264:13 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:264:13:264:13 | x | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:264:13:264:24 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:265:9:265:9 | c | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:265:13:265:13 | y | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:265:13:265:13 | y | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:265:13:265:13 | y | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:265:13:265:13 | y | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:265:13:265:24 | ... .getInner(...) | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:266:9:266:9 | d | | {EXTERNAL LOCATION} | String | +| nested_types.swift:266:13:266:13 | y | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:266:13:266:13 | y | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:266:13:266:13 | y | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:266:13:266:13 | y | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:266:13:266:24 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:271:10:271:10 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:271:10:271:10 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:271:10:271:10 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:271:10:271:10 | x | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:272:9:272:13 | outer | | {EXTERNAL LOCATION} | String | +| nested_types.swift:272:17:272:17 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:272:17:272:17 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:272:17:272:17 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:272:17:272:17 | x | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:272:17:272:28 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:273:9:273:13 | inner | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:273:17:273:17 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:273:17:273:17 | x | (parent:Inner) | nested_types.swift:13:1:119:1 | Outer | +| nested_types.swift:273:17:273:17 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:273:17:273:17 | x | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:273:17:273:28 | ... .getInner(...) | | {EXTERNAL LOCATION} | Bool | | overload_resolution.swift:4:17:4:17 | x | | {EXTERNAL LOCATION} | Int | | overload_resolution.swift:4:35:6:3 | Block | | {EXTERNAL LOCATION} | String | | overload_resolution.swift:5:12:5:16 | "int" | | {EXTERNAL LOCATION} | String | @@ -2893,8 +4122,9 @@ inferType | pattern_matching.swift:29:42:33:1 | Block | T | {EXTERNAL LOCATION} | Bool | | pattern_matching.swift:30:7:30:7 | x | | pattern_matching.swift:7:1:11:1 | PatternMatch | | pattern_matching.swift:30:7:30:7 | x | T | {EXTERNAL LOCATION} | Int | -| pattern_matching.swift:30:11:30:28 | ... .value | | pattern_matching.swift:7:1:11:1 | PatternMatch | -| pattern_matching.swift:30:11:30:28 | ... .value | T | {EXTERNAL LOCATION} | Int | +| pattern_matching.swift:30:11:30:28 | ... .value | | pattern_matching.swift:9:8:9:15 | PatternMatch.value | +| pattern_matching.swift:30:11:30:28 | ... .value | (parent:value) | pattern_matching.swift:7:1:11:1 | PatternMatch | +| pattern_matching.swift:30:11:30:28 | ... .value | (parent:value).T | {EXTERNAL LOCATION} | Int | | pattern_matching.swift:30:11:30:32 | ... .value(...) | | pattern_matching.swift:7:1:11:1 | PatternMatch | | pattern_matching.swift:30:11:30:32 | ... .value(...) | T | {EXTERNAL LOCATION} | Int | | pattern_matching.swift:30:30:30:31 | 42 | | {EXTERNAL LOCATION} | Int | @@ -3335,10 +4565,13 @@ inferType | type_constraints.swift:208:12:208:17 | values | | {EXTERNAL LOCATION} | Array | | type_constraints.swift:208:12:208:17 | values | Element | type_constraints.swift:200:20:200:20 | T | | type_constraints.swift:214:12:214:17 | values | | {EXTERNAL LOCATION} | Array | +| type_constraints.swift:214:12:214:17 | values | Element | type_constraints.swift:200:20:200:20 | T | | type_constraints.swift:214:19:214:19 | 0 | | {EXTERNAL LOCATION} | Int | | type_constraints.swift:214:24:214:29 | values | | {EXTERNAL LOCATION} | Array | +| type_constraints.swift:214:24:214:29 | values | Element | type_constraints.swift:200:20:200:20 | T | | type_constraints.swift:214:31:214:31 | 1 | | {EXTERNAL LOCATION} | Int | | type_constraints.swift:220:12:220:17 | values | | {EXTERNAL LOCATION} | Array | +| type_constraints.swift:220:12:220:17 | values | Element | type_constraints.swift:200:20:200:20 | T | | type_constraints.swift:220:35:222:5 | FunctionExpr | | {EXTERNAL LOCATION} | Function | | type_constraints.swift:227:7:227:12 | intAcc | | type_constraints.swift:200:1:210:1 | Accumulator | | type_constraints.swift:227:7:227:12 | intAcc | T | {EXTERNAL LOCATION} | Int |