diff --git a/unified/ql/lib/codeql/unified/internal/AstExtra.qll b/unified/ql/lib/codeql/unified/internal/AstExtra.qll index f2182698f6d0..5ccc16295192 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 getEnum() { 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 getEnum() { result = this.getEnumCaseClass().getEnum() } + } + + /** + * 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 getEnum() { result = enum } } } diff --git a/unified/ql/lib/codeql/unified/internal/ExprPositions.qll b/unified/ql/lib/codeql/unified/internal/ExprPositions.qll index 3edc36cc1eb2..2c2b0bc29e41 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/typeinference/Type.qll b/unified/ql/lib/codeql/unified/internal/typeinference/Type.qll index 181e129fc955..4c0d105c9554 100644 --- a/unified/ql/lib/codeql/unified/internal/typeinference/Type.qll +++ b/unified/ql/lib/codeql/unified/internal/typeinference/Type.qll @@ -38,6 +38,12 @@ predicate associatedTypeParameterInherited( name = a.getName() } +private predicate isNestedType(ClassLikeDeclaration nested, ClassLikeDeclaration parent) { + exists(nested.getNameNode()) and + exists(parent.getNameNode()) and + parent.getAMemberIncludingExtensions() = nested +} + cached newtype TType = TClassLikeDeclarationType(ClassLikeDeclaration c) { @@ -56,6 +62,7 @@ newtype TType = ) { associatedTypeParameter(c, a, inherited) } or + TParentTypeParameterType(ClassLikeDeclaration c) { isNestedType(c, _) } or TUnknownType() or TUnknownTypeTypeParameter(int i) { i in [0 .. 20] } @@ -112,9 +119,11 @@ class ClassLikeDeclarationType extends TypeImpl, TClassLikeDeclarationType { result = super.getATypeParameter() or result = TAssociatedTypeParameterType(c, _, _) + or + result = TParentTypeParameterType(c) } - override string toString() { result = c.getName() } + override string toString() { result = c.getQualifiedName() } override Location getLocation() { result = c.getLocation() } } @@ -156,6 +165,8 @@ class ClosureParameterPseudoType extends PseudoType, TClosureParameterPseudoType /** A type parameter. */ abstract class TypeParameter extends TypeImpl { + abstract AstNode getScope(); + override TypeParameter getPositionalTypeParameter(int i) { none() } abstract AstNode getDeclaringItem(); @@ -178,6 +189,12 @@ class TypeParameterType extends TypeParameter, TTypeParameterType { Unified::TypeParameter getTypeParameter() { result = typeParam } + override AstNode getScope() { + result = typeParam.getParent() + or + result.(ClassLikeDeclaration).resolve().getEnclosingClassResolved*() = typeParam.getParent() + } + override ClassLikeDeclaration getDeclaringItem() { typeParam = result.getATypeParameter() } override Identifier getNameNode() { result = typeParam.getNameNode() } @@ -199,6 +216,8 @@ class AssociatedTypeParameterType extends TypeParameter, TAssociatedTypeParamete Unified::AssociatedTypeDeclaration getAssociatedTypeDeclaration() { result = assocTypeDecl } + override AstNode getScope() { result.(ClassLikeDeclaration).resolve() = c } + override ClassLikeDeclaration getDeclaringItem() { result = c } override Identifier getNameNode() { result = assocTypeDecl.getNameNode() } @@ -214,6 +233,27 @@ class AssociatedTypeParameterType extends TypeParameter, TAssociatedTypeParamete } } +/** + * A special type parameter used to represent the parent type of a nested class. + */ +class ParentTypeParameterType extends TypeParameter, TParentTypeParameterType { + private Unified::ClassLikeDeclaration c; + + ParentTypeParameterType() { this = TParentTypeParameterType(c) } + + ClassLikeDeclaration getParent() { isNestedType(c, result) } + + override AstNode getScope() { none() } + + override ClassLikeDeclaration getDeclaringItem() { result = c } + + override Identifier getNameNode() { none() } + + override string toString() { result = "(parent:" + c.getName() + ")" } + + override Location getLocation() { result = c.getLocation() } +} + /** * A type parameter of the special `UnknownType`. */ @@ -222,6 +262,8 @@ class UnknownTypeTypeParameter extends TypeParameter, TUnknownTypeTypeParameter UnknownTypeTypeParameter() { this = TUnknownTypeTypeParameter(i) } + override AstNode getScope() { none() } + override AstNode getDeclaringItem() { none() } override Identifier getNameNode() { none() } 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 c5572af2ae34..86fc81b6220a 100644 --- a/unified/ql/lib/codeql/unified/internal/typeinference/TypeInference.qll +++ b/unified/ql/lib/codeql/unified/internal/typeinference/TypeInference.qll @@ -64,6 +64,13 @@ private module Input1 implements InputSig1 { kind = 3 and tp0 = TUnknownTypeTypeParameter(id1) and id2 = 0 + or + kind = 4 and + exists(ClassLikeDeclaration c | + tp0 = TParentTypeParameterType(c) and + id1 = idOfTypeParameterAstNode(c) and + id2 = 0 + ) | tp0 order by kind, id1, id2 ) @@ -389,9 +396,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) @@ -405,9 +409,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() } @@ -492,15 +496,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 ) } @@ -659,10 +669,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() + ) } /** @@ -696,11 +716,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 @@ -710,18 +734,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) ) ) } @@ -734,8 +759,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() } diff --git a/unified/ql/lib/codeql/unified/internal/typeinference/TypeInferenceConsistency.qll b/unified/ql/lib/codeql/unified/internal/typeinference/TypeInferenceConsistency.qll index 20aa749a7216..6631533b2b95 100644 --- a/unified/ql/lib/codeql/unified/internal/typeinference/TypeInferenceConsistency.qll +++ b/unified/ql/lib/codeql/unified/internal/typeinference/TypeInferenceConsistency.qll @@ -10,6 +10,7 @@ import TypeInference::Consistency query predicate illFormedTypeMention(TypeMention tm) { Consistency::illFormedTypeMention(tm) and + not tm.(AliasExprTypeMention).isTypeParameterAlias(_) and tm.fromSource() } @@ -17,3 +18,8 @@ query predicate nonUniqueCertainType(AstNode n, TypePath path) { Consistency::nonUniqueCertainType(n, path) and n.fromSource() } + +query predicate typeParameterEscape(AstNode n, TypePath path, TypeParameter tp) { + tp = inferType(n, path) and + not n.getParent*() = tp.getScope() +} 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 aa48459feeb0..abd27a97c51f 100644 --- a/unified/ql/lib/codeql/unified/internal/typeinference/TypeMention.qll +++ b/unified/ql/lib/codeql/unified/internal/typeinference/TypeMention.qll @@ -9,48 +9,276 @@ final class TypeMention = TypeMentionImpl; /** An AST node that mentions a type. */ abstract private class TypeMentionImpl extends AstNode { + abstract TypeMention resolve(); + + /** + * Gets the type mentioned at the root of this type mention. + * + * This is the same as `this.getTypeAt(TypePath::nil())`, but does not depend + * on the full `getTypeAt` relation. + */ + abstract Type getType(); + + /** + * Gets the class-like declaration mentioned by this type mention, if any. + */ + ClassLikeDeclaration getClassLikeDeclaration() { + result = this.getType().(ClassLikeDeclarationType).getClassLikeDeclaration() + } + + /** + * Gets the type mentioned explicitly at `path`. + * + * This predicate is an internal implementation detail; use `getTypeAt` instead. + */ + pragma[nomagic] + abstract Type getExplicitTypeAt(TypePath path); + + pragma[nomagic] + private ClassLikeDeclaration getImplicitEnclosingCand(TypePath path, ParentTypeParameterType tp) { + exists(ClassLikeDeclaration nested | + nested = this.getExplicitTypeAt(path).(ClassLikeDeclarationType).getClassLikeDeclaration() and + tp = TParentTypeParameterType(nested) and + not exists(this.getExplicitTypeAt(path.append(TypePath::singleton(tp)))) and + result = this.getEnclosingClassResolved+() + ) + } + /** * Gets the type mentioned at `path`. */ + Type getTypeAt(TypePath path) { + result = this.getExplicitTypeAt(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.getImplicitEnclosingCand(prefix, tp) and + parent = tp.getParent() and + path = prefix.append(TypePath::cons(tp, suffix)) and + result = encl.getNameNode().(TypeMention).getTypeAt(suffix) + | + encl = parent + or + not parent = this.getImplicitEnclosingCand(_, _) 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 + // } + // ``` + exists(TypePath prefix, ClassLikeDeclarationType t | + t = this.getTypeAt(prefix) and + forex(TypeParameter tp | + tp = t.getATypeParameter() and not tp instanceof ParentTypeParameterType + | + not exists(this.getExplicitTypeAt(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() + ) + } + + /** + * Gets an explicit qualifier that may refer to the parent type of this nested + * type, if any. + */ + abstract TypeMention getAParentQualifierCand(); + + /** + * Same as `exists(this.getAParentQualifierCand())`, but avoids non-monotonicity. + */ + abstract predicate hasParentQualifierCand(); + pragma[nomagic] - abstract Type getTypeAt(TypePath path); + private predicate isValidParentType0(ClassLikeDeclaration cls) { + this.hasParentQualifierCand() and + cls = + this.getType() + .(ClassLikeDeclarationType) + .getClassLikeDeclaration() + .getEnclosingClassResolved() + or + this.isValidParentType0(cls.getABaseClass()) + } /** - * Gets the type mentioned at the root of this type mention. + * Holds if `qualifier` mentions a type that is a (sub type of) the parent type + * of this nested type. */ - final Type getType() { result = this.getTypeAt(TypePath::nil()) } + bindingset[this, qualifier] + pragma[inline_late] + predicate isValidParentType(TypeMention qualifier) { + this.isValidParentType0(qualifier.getClassLikeDeclaration().getEnclosingClassResolved*()) + } + + /** + * Gets the qualifier that corresponds to the parent type of this nested type, + * if any. + */ + final TypeMention getParentQualifier() { + result = this.getAParentQualifierCand() and + this.isValidParentType(result) + } + + /** + * Same as `exists(this.getParentQualifier())`, but avoids non-monotonicity. + */ + abstract predicate hasParentQualifier(); } final class ExprTypeMention = ExprTypeMentionImpl; abstract private class ExprTypeMentionImpl extends TypeMentionImpl, Expr { - ExprTypeMentionImpl() { isInTypeContext(this) and not this instanceof GenericTypeExpr } + ExprTypeMentionImpl() { + isInTypeContext(this) and + not this instanceof GenericTypeExpr and + not this = any(MemberAccessExpr mae).getMemberNameNode() + } pragma[nomagic] abstract TypePath getTypeArgumentPath(int i); + + abstract TypeMention getAlias(); + + final override TypeMention getAParentQualifierCand() { + exists(MemberAccessExpr mae | result = mae.getBase() | + mae = this and + ( + not this.getAlias().hasParentQualifierCand() + or + exists(TypeMention cand | + cand = this.getAlias().getAParentQualifierCand() and + not cand.hasParentQualifierCand() and + not this.isValidParentType(cand) + ) + ) + or + exists(TypeMention mid, TypeMention tm | + mid = this.getAParentQualifierCand() and + not this.isValidParentType(mid) and + tm = [mid, mid.(ExprTypeMention).getAlias()] and + mae = [tm, tm.(GenericTypeExpr).getBase().(TypeMention)] + ) + ) + } + + final override predicate hasParentQualifierCand() { + this.getAlias().hasParentQualifierCand() + or + this instanceof MemberAccessExpr + } + + final override predicate hasParentQualifier() { + this.getAlias().hasParentQualifier() + or + this.isValidParentType(this.getAParentQualifierCand()) + } + + abstract Type getTypeAtImpl(TypePath path); + + pragma[nomagic] + private ClassLikeDeclaration getQualifierTypeAt(TypePath path) { + result = + this.getParentQualifier() + .getExplicitTypeAt(path) + .(ClassLikeDeclarationType) + .getClassLikeDeclaration() and + forall(TypeParameter tp | tp = path.getElement(_) | tp instanceof ParentTypeParameterType) + } + + pragma[nomagic] + private predicate isNestedClass(ParentTypeParameterType tp, ClassLikeDeclaration parent) { + tp = TParentTypeParameterType(this.getClassLikeDeclaration()) and + parent = tp.getParent() + } + + final override Type getExplicitTypeAt(TypePath path) { + // recursion guard to check that `getType` does not recursively depend on `getTypeAt` + (exists(this.getType()) implies any()) and + result = this.getTypeAtImpl(path) + or + // A mention of a nested type with an explicit qualifier + exists(TypeMention qualifier, ParentTypeParameterType tp, TypePath prefix, TypePath suffix | + qualifier = this.getParentQualifier() and + this.isNestedClass(tp, this.getQualifierTypeAt(prefix)) and + path = TypePath::cons(tp, suffix) and + result = qualifier.getExplicitTypeAt(prefix.appendInverse(suffix)) + ) + } } /** * A type mention that resolves via an alias (aliases are expanded). */ -private class AliasExprTypeMention extends ExprTypeMentionImpl { +class AliasExprTypeMention extends ExprTypeMentionImpl { private TypeAliasDeclaration alias; AliasExprTypeMention() { alias.getNameNode() = getTypeFromRef(this) } - private TypeParameterType getAliasTypeParameter(int i) { + TypeParameterType getAliasTypeParameter(int i) { result.getTypeParameter() = alias.getTypeParameter(i) } override TypePath getTypeArgumentPath(int i) { exists(TypeParameterType tp | tp = this.getAliasTypeParameter(i) and - tp = alias.getType().(TypeMention).getTypeAt(result) + tp = alias.getType().(TypeMention).getExplicitTypeAt(result) + or + // `typealias Alias = Generic`, where `Generic` has positional type parameters + not exists(this.getAliasTypeParameter(_)) and + not alias.getType() instanceof GenericTypeExpr and + exists(Type root | + root = this.getType() and + tp = root.getPositionalTypeParameter(i) and + result = TypePath::singleton(tp) + ) ) } - override Type getTypeAt(TypePath path) { - result = alias.getType().(TypeMention).getTypeAt(path) and + /** + * Holds if this alias is of the form `typealias Alias = Ti`. + */ + pragma[nomagic] + predicate isTypeParameterAlias(int i) { + exists(TypeParameterType tp | + tp = this.getAliasTypeParameter(i) and + tp = alias.getType().(TypeMention).getType() + ) + } + + override TypeMention resolve() { result = this } + + override TypeMention getAlias() { result = alias.getType() } + + override Type getType() { + result = alias.getType().(TypeMention).getType() and + not result = this.getAliasTypeParameter(_) + } + + override Type getTypeAtImpl(TypePath path) { + result = alias.getType().(TypeMention).getExplicitTypeAt(path) and not result = this.getAliasTypeParameter(_) } } @@ -63,18 +291,11 @@ private class NonAliasExprTypeMention extends ExprTypeMentionImpl { 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 ( not result instanceof AssociatedTypeParameterType or - result = TAssociatedTypeParameterType(this.getEnclosingClass(), _, _) + result = TAssociatedTypeParameterType(this.getEnclosingClass().resolve(), _, _) ) ) or @@ -83,7 +304,7 @@ private class NonAliasExprTypeMention extends ExprTypeMentionImpl { result.(Plugin::TupleType).getArity() = this.(TupleExpr).getNumberOfElements() } - Type getRootType() { + override Type getType() { result = this.getRootType0() or not exists(this.getRootType0()) and @@ -91,11 +312,11 @@ private class NonAliasExprTypeMention extends ExprTypeMentionImpl { } override TypePath getTypeArgumentPath(int i) { - result = TypePath::singleton(this.getRootType().getPositionalTypeParameter(i)) + result = TypePath::singleton(this.getType().getPositionalTypeParameter(i)) } - override Type getTypeAt(TypePath path) { - result = this.getRootType() and + override Type getTypeAtImpl(TypePath path) { + result = this.getType() and path.isEmpty() or exists( @@ -122,7 +343,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).getExplicitTypeAt(suffix) ) ) or @@ -133,62 +354,74 @@ 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).getExplicitTypeAt(suffix) ) or prefix = Plugin::getFunctionExprReturnTypePath(t) and - result = fe.getReturnType().(TypeMention).getTypeAt(suffix) + result = fe.getReturnType().(TypeMention).getExplicitTypeAt(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).getExplicitTypeAt(suffix) and path = TypePath::cons(tt.getPositionalTypeParameter(i), suffix) ) ) } + + override TypeMention resolve() { result = this } + + override TypeMention getAlias() { none() } } private class GenericTypeExprTypeMention extends TypeMentionImpl, GenericTypeExpr { - private ExprTypeMention base; + private TypeMention base; - GenericTypeExprTypeMention() { base = this.getBase() } + GenericTypeExprTypeMention() { + base = this.getBase() and + base.getType() = any(Type t | not t = base.(AliasExprTypeMention).getAliasTypeParameter(_)) + or + exists(int i | + this.getBase().(AliasExprTypeMention).isTypeParameterAlias(i) and + base = this.getTypeArgument(i) + ) + } pragma[nomagic] private Type getTypeArgumentAt(int i, TypePath path) { - result = this.getTypeArgument(i).(TypeMention).getTypeAt(path) + result = this.getTypeArgument(i).(TypeMention).getExplicitTypeAt(path) } - override Type getTypeAt(TypePath path) { - result = base.getTypeAt(path) + override Type getExplicitTypeAt(TypePath path) { + result = base.getExplicitTypeAt(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; + override TypeMention resolve() { + exists(int i | + this.getBase().(AliasExprTypeMention).isTypeParameterAlias(i) and + result = this.getTypeArgument(i).(TypeMention).resolve() + ) + or + base = this.getBase() and + result = this + } - ClassLikeDeclarationTypeMention() { this = c.getNameNode() } + override Type getType() { result = base.getType() } - ClassLikeDeclarationType getRootType() { c = result.getClassLikeDeclaration() } + override TypeMention getAParentQualifierCand() { result = base.getAParentQualifierCand() } - ClassLikeDeclaration getClassLikeDeclaration() { result = c } + override predicate hasParentQualifierCand() { base.hasParentQualifierCand() } - override Type getTypeAt(TypePath path) { - result = this.getRootType() and - path.isEmpty() - or - result = this.getRootType().getATypeParameter() and - path = TypePath::singleton(result) - } + override predicate hasParentQualifier() { base.hasParentQualifier() } } TypeMention getClassLikeDeclarationTypeMention(ClassLikeDeclaration c) { 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..45737a9fc8d7 --- /dev/null +++ b/unified/ql/test/library-tests/type-inference/nested_types.swift @@ -0,0 +1,266 @@ +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(fixed2: Fixed2) { + let a = fixed2.getInner() // $ target=Outer.Inner.getInner type=a:Int + let b = fixed2.getOuter() // $ target=Outer.Inner.getOuter type=b: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(p: Pair) { + let outer = p.0.getOuter() // $ target=Outer.Inner.getOuter field=Tuple2.0 type=outer:TOuter + let inner = p.0.getInner() // $ target=Outer.Inner.getInner field=Tuple2.0 type=inner: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 $ MISSING: type=d:Bool -- this is an instance of variance sub typing + } +} + +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 3ce1618a9164..89910bcb5431 100644 --- a/unified/ql/test/library-tests/type-inference/type-inference.expected +++ b/unified/ql/test/library-tests/type-inference/type-inference.expected @@ -40,9 +40,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 | @@ -273,6 +275,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 | @@ -366,6 +369,308 @@ 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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:17 | fixed2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:88:12:88:17 | fixed2 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:88:12:88:17 | fixed2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:88:12:88:17 | fixed2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:89:17:89:22 | fixed2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:89:17:89:22 | fixed2 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:89:17:89:22 | fixed2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:89:17:89:22 | fixed2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:90:17:90:22 | fixed2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:90:17:90:22 | fixed2 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:90:17:90:22 | fixed2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:90:17:90:22 | fixed2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:95:12:95:12 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:95:12:95:12 | x | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:95:12:95:12 | x | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:95:12:95:12 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:96:21:96:21 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:96:21:96:21 | x | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:96:21:96:21 | x | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:96:21:96:21 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:97:21:97:21 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:97:21:97:21 | x | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:97:21:97:21 | x | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:97:21:97:21 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:102:13:102:13 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:102:13:102:13 | x | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:102:13:102:13 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:102:13:102:13 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:103:21:103:21 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:103:21:103:21 | x | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:103:21:103:21 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:103:21:103:21 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:104:21:104:21 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:104:21:104:21 | x | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:104:21:104:21 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:104:21:104:21 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:109:13:109:13 | p | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:109:13:109:13 | p | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:109:13:109:13 | p | T0.(parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:109:13:109:13 | p | T0.(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:109:13:109:13 | p | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:109:13:109:13 | p | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:109:13:109:13 | p | T1.(parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:109:13:109:13 | p | T1.(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:109:13:109:13 | p | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:110:21:110:21 | p | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:110:21:110:21 | p | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:110:21:110:21 | p | T0.(parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:110:21:110:21 | p | T0.(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:110:21:110:21 | p | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:110:21:110:21 | p | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:110:21:110:21 | p | T1.(parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:110:21:110:21 | p | T1.(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:110:21:110:21 | p | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:111:21:111:21 | p | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:111:21:111:21 | p | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:111:21:111:21 | p | T0.(parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:111:21:111:21 | p | T0.(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:111:21:111:21 | p | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:111:21:111:21 | p | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:111:21:111:21 | p | T1.(parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:111:21:111:21 | p | T1.(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:111:21:111:21 | p | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:116:12:116:12 | x | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:116:12:116:12 | x | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:116:12:116:12 | x | T0.(parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:116:12:116:12 | x | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:116:12:116:12 | x | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:116:12:116:12 | x | T1.(parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:116:12:116:12 | x | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:116:21:116:21 | y | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:116:21:116:21 | y | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:116:21:116:21 | y | T0.(parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:116:21:116:21 | y | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:116:21:116:21 | y | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:116:21:116:21 | y | T1.(parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:116:21:116:21 | y | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:117:17:117:17 | x | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:117:17:117:17 | x | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:117:17:117:17 | x | T0.(parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:117:17:117:17 | x | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:117:17:117:17 | x | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:117:17:117:17 | x | T1.(parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:117:17:117:17 | x | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:118:17:118:17 | x | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:118:17:118:17 | x | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:118:17:118:17 | x | T0.(parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:118:17:118:17 | x | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:118:17:118:17 | x | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:118:17:118:17 | x | T1.(parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:118:17:118:17 | x | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:119:17:119:17 | y | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:119:17:119:17 | y | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:119:17:119:17 | y | T0.(parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:119:17:119:17 | y | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:119:17:119:17 | y | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:119:17:119:17 | y | T1.(parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:119:17:119:17 | y | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:120:17:120:17 | y | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:120:17:120:17 | y | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:120:17:120:17 | y | T0.(parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:120:17:120:17 | y | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:120:17:120:17 | y | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:120:17:120:17 | y | T1.(parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:120:17:120:17 | y | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:124:29:124:33 | inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:124:29:124:33 | inner | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:124:29:124:33 | inner | (parent:Inner).TOuter | nested_types.swift:124:19:124:20 | Ta | +| nested_types.swift:124:29:124:33 | inner | TInner | nested_types.swift:124:23:124:24 | Tb | +| nested_types.swift:125:12:125:16 | inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:125:12:125:16 | inner | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:125:12:125:16 | inner | (parent:Inner).TOuter | nested_types.swift:124:19:124:20 | Ta | +| nested_types.swift:125:12:125:16 | inner | TInner | nested_types.swift:124:23:124:24 | Tb | +| nested_types.swift:128:29:128:33 | inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:128:29:128:33 | inner | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:128:29:128:33 | inner | (parent:Inner).TOuter | nested_types.swift:128:19:128:20 | Ta | +| nested_types.swift:128:29:128:33 | inner | TInner | nested_types.swift:128:23:128:24 | Tb | +| nested_types.swift:129:12:129:16 | inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:129:12:129:16 | inner | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:129:12:129:16 | inner | (parent:Inner).TOuter | nested_types.swift:128:19:128:20 | Ta | +| nested_types.swift:129:12:129:16 | inner | TInner | nested_types.swift:128:23:128:24 | Tb | +| nested_types.swift:176:13:176:16 | self | | nested_types.swift:171:5:187:5 | Outer.Inner.InnerMost | +| nested_types.swift:176:13:176:16 | self | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:176:13:176:16 | self | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:176:13:176:16 | self | (parent:InnerMost).(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:176:13:176:16 | self | (parent:InnerMost).TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:177:13:177:16 | self | | nested_types.swift:171:5:187:5 | Outer.Inner.InnerMost | +| nested_types.swift:177:13:177:16 | self | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:177:13:177:16 | self | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:177:13:177:16 | self | (parent:InnerMost).(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:177:13:177:16 | self | (parent:InnerMost).TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:181:20:181:23 | self | | nested_types.swift:171:5:187:5 | Outer.Inner.InnerMost | +| nested_types.swift:181:20:181:23 | self | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:181:20:181:23 | self | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:181:20:181:23 | self | (parent:InnerMost).(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:181:20:181:23 | self | (parent:InnerMost).TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:185:20:185:23 | self | | nested_types.swift:171:5:187:5 | Outer.Inner.InnerMost | +| nested_types.swift:185:20:185:23 | self | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:185:20:185:23 | self | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:185:20:185:23 | self | (parent:InnerMost).(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:185:20:185:23 | self | (parent:InnerMost).TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:195:14:195:14 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:195:14:195:14 | x | (parent:Inner) | nested_types.swift:194:1:199:1 | SubOuter | +| nested_types.swift:195:14:195:14 | x | (parent:Inner).TSubOuter | nested_types.swift:194:16:194:24 | TSubOuter | +| nested_types.swift:195:14:195:14 | x | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:196:19:196:19 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:196:19:196:19 | x | (parent:Inner) | nested_types.swift:194:1:199:1 | SubOuter | +| nested_types.swift:196:19:196:19 | x | (parent:Inner).TSubOuter | nested_types.swift:194:16:194:24 | TSubOuter | +| nested_types.swift:196:19:196:19 | x | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:201:54:201:57 | ArrayLiteral | | {EXTERNAL LOCATION} | Array | +| nested_types.swift:209:5:209:13 | subInner2 | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:209:5:209:13 | subInner2 | (parent:SubInner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:209:5:209:13 | subInner2 | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:209:5:209:13 | subInner2 | TSubInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:210:11:210:19 | subInner2 | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:210:11:210:19 | subInner2 | (parent:SubInner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:210:11:210:19 | subInner2 | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:210:11:210:19 | subInner2 | TSubInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:211:11:211:19 | subInner2 | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:211:11:211:19 | subInner2 | (parent:SubInner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:211:11:211:19 | subInner2 | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:211:11:211:19 | subInner2 | TSubInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:221:13:221:13 | x | | nested_types.swift:220:5:222:5 | Node.Leaf | +| nested_types.swift:221:13:221:13 | x | (parent:Leaf) | nested_types.swift:219:1:223:1 | Node | +| nested_types.swift:237:11:237:11 | x | | nested_types.swift:231:1:240:1 | Box | +| nested_types.swift:237:11:237:11 | x | T | {EXTERNAL LOCATION} | Int | +| nested_types.swift:238:11:238:11 | y | | nested_types.swift:231:1:240:1 | Box | +| nested_types.swift:238:11:238:11 | y | T | nested_types.swift:231:11:231:11 | T | +| nested_types.swift:244:10:244:10 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:244:10:244:10 | x | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:244:10:244:10 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:244:10:244:10 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:248:10:248:10 | x | | {EXTERNAL LOCATION} | String | +| nested_types.swift:254:10:254:10 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:254:10:254:10 | x | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:254:10:254:10 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:254:10:254:10 | x | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:254:35:254:35 | y | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:254:35:254:35 | y | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:254:35:254:35 | y | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:254:35:254:35 | y | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:255:13:255:13 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:255:13:255:13 | x | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:255:13:255:13 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:255:13:255:13 | x | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:256:13:256:13 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:256:13:256:13 | x | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:256:13:256:13 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:256:13:256:13 | x | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:257:13:257:13 | y | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:257:13:257:13 | y | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:257:13:257:13 | y | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:257:13:257:13 | y | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:258:13:258:13 | y | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:258:13:258:13 | y | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:258:13:258:13 | y | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:258:13:258:13 | y | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:263:10:263:10 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:263:10:263:10 | x | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:263:10:263:10 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:263:10:263:10 | x | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:264:17:264:17 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:264:17:264:17 | x | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:264:17:264:17 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:264:17:264:17 | x | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:265:17:265:17 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:265:17:265:17 | x | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:265:17:265:17 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:265:17:265: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 | @@ -685,6 +990,34 @@ inferCertainType | type_constraints.swift:256:14:256:18 | upper | | type_constraints.swift:254:12:254:24 | T | | type_constraints.swift:256:29:256:33 | upper | | type_constraints.swift:254:12:254:24 | T | | type_constraints.swift:257:10:257:14 | value | | type_constraints.swift:254:12:254:24 | T | +| variance.swift:7:18:7:18 | f | | {EXTERNAL LOCATION} | Function | +| variance.swift:7:18:7:18 | f | Args | {EXTERNAL LOCATION} | Tuple1 | +| variance.swift:7:18:7:18 | f | Args.T0 | variance.swift:5:1:5:21 | B | +| variance.swift:7:18:7:18 | f | Args.T0.Tb | variance.swift:7:10:7:11 | T1 | +| variance.swift:7:18:7:18 | f | Return | variance.swift:3:1:3:14 | A | +| variance.swift:7:18:7:18 | f | Return.Ta | variance.swift:7:14:7:15 | T2 | +| variance.swift:11:5:11:7 | lam | | {EXTERNAL LOCATION} | Function | +| variance.swift:11:5:11:7 | lam | Args | {EXTERNAL LOCATION} | Tuple1 | +| variance.swift:11:5:11:7 | lam | Args.T0 | variance.swift:3:1:3:14 | A | +| variance.swift:11:5:11:7 | lam | Args.T0.Ta | {EXTERNAL LOCATION} | Int | +| variance.swift:11:5:11:7 | lam | Return | variance.swift:5:1:5:21 | B | +| variance.swift:11:5:11:7 | lam | Return.Tb | {EXTERNAL LOCATION} | String | +| variance.swift:11:11:11:53 | FunctionExpr | | {EXTERNAL LOCATION} | Function | +| variance.swift:11:11:11:53 | FunctionExpr | Args | {EXTERNAL LOCATION} | Tuple1 | +| variance.swift:11:11:11:53 | FunctionExpr | Args.T0 | variance.swift:3:1:3:14 | A | +| variance.swift:11:11:11:53 | FunctionExpr | Args.T0.Ta | {EXTERNAL LOCATION} | Int | +| variance.swift:11:11:11:53 | FunctionExpr | Return | variance.swift:5:1:5:21 | B | +| variance.swift:11:11:11:53 | FunctionExpr | Return.Tb | {EXTERNAL LOCATION} | String | +| variance.swift:11:14:11:14 | a | | variance.swift:3:1:3:14 | A | +| variance.swift:11:14:11:14 | a | Ta | {EXTERNAL LOCATION} | Int | +| variance.swift:13:16:13:18 | lam | | {EXTERNAL LOCATION} | Function | +| variance.swift:13:16:13:18 | lam | Args | {EXTERNAL LOCATION} | Tuple1 | +| variance.swift:13:16:13:18 | lam | Args.T0 | variance.swift:3:1:3:14 | A | +| variance.swift:13:16:13:18 | lam | Args.T0.Ta | {EXTERNAL LOCATION} | Int | +| variance.swift:13:16:13:18 | lam | Return | variance.swift:5:1:5:21 | B | +| variance.swift:13:16:13:18 | lam | Return.Tb | {EXTERNAL LOCATION} | String | +| variance.swift:18:7:18:7 | x | | variance.swift:3:1:3:14 | A | +| variance.swift:18:7:18:7 | x | Ta | {EXTERNAL LOCATION} | Int | inferType | basics.swift:1:5:1:16 | topLevelDecl | | {EXTERNAL LOCATION} | Int | | basics.swift:1:25:1:25 | 0 | | {EXTERNAL LOCATION} | Int | @@ -834,19 +1167,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 | @@ -1259,15 +1598,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 | @@ -1402,8 +1743,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 | @@ -1696,7 +2038,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 | @@ -1705,6 +2049,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 | @@ -2027,6 +2373,790 @@ 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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:113: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:17 | fixed2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:88:12:88:17 | fixed2 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:88:12:88:17 | fixed2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:88:12:88:17 | fixed2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:89:13:89:13 | a | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:89:17:89:22 | fixed2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:89:17:89:22 | fixed2 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:89:17:89:22 | fixed2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:89:17:89:22 | fixed2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:89:17:89:33 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:90:13:90:13 | b | | {EXTERNAL LOCATION} | String | +| nested_types.swift:90:17:90:22 | fixed2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:90:17:90:22 | fixed2 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:90:17:90:22 | fixed2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:90:17:90:22 | fixed2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:90:17:90:33 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:95:12:95:12 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:95:12:95:12 | x | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:95:12:95:12 | x | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:95:12:95:12 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:96:13:96:17 | outer | | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:96:21:96:21 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:96:21:96:21 | x | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:96:21:96:21 | x | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:96:21:96:21 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:96:21:96:32 | ... .getOuter(...) | | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:97:13:97:17 | inner | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:97:21:97:21 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:97:21:97:21 | x | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:97:21:97:21 | x | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:97:21:97:21 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:97:21:97:32 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:102:13:102:13 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:102:13:102:13 | x | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:102:13:102:13 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:102:13:102:13 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:103:13:103:17 | outer | | {EXTERNAL LOCATION} | String | +| nested_types.swift:103:21:103:21 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:103:21:103:21 | x | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:103:21:103:21 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:103:21:103:21 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:103:21:103:32 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:104:13:104:17 | inner | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:104:21:104:21 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:104:21:104:21 | x | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:104:21:104:21 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:104:21:104:21 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:104:21:104:32 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:109:13:109:13 | p | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:109:13:109:13 | p | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:109:13:109:13 | p | T0.(parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:109:13:109:13 | p | T0.(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:109:13:109:13 | p | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:109:13:109:13 | p | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:109:13:109:13 | p | T1.(parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:109:13:109:13 | p | T1.(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:109:13:109:13 | p | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:110:13:110:17 | outer | | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:110:21:110:21 | p | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:110:21:110:21 | p | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:110:21:110:21 | p | T0.(parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:110:21:110:21 | p | T0.(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:110:21:110:21 | p | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:110:21:110:21 | p | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:110:21:110:21 | p | T1.(parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:110:21:110:21 | p | T1.(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:110:21:110:21 | p | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:110:21:110:23 | ... .0 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:110:21:110:23 | ... .0 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:110:21:110:23 | ... .0 | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:110:21:110:23 | ... .0 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:110:21:110:34 | ... .getOuter(...) | | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:111:13:111:17 | inner | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:111:21:111:21 | p | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:111:21:111:21 | p | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:111:21:111:21 | p | T0.(parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:111:21:111:21 | p | T0.(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:111:21:111:21 | p | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:111:21:111:21 | p | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:111:21:111:21 | p | T1.(parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:111:21:111:21 | p | T1.(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:111:21:111:21 | p | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:111:21:111:23 | ... .0 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:111:21:111:23 | ... .0 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:111:21:111:23 | ... .0 | (parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:111:21:111:23 | ... .0 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:111:21:111:34 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:116:12:116:12 | x | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:116:12:116:12 | x | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:116:12:116:12 | x | T0.(parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:116:12:116:12 | x | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:116:12:116:12 | x | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:116:12:116:12 | x | T1.(parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:116:12:116:12 | x | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:116:21:116:21 | y | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:116:21:116:21 | y | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:116:21:116:21 | y | T0.(parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:116:21:116:21 | y | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:116:21:116:21 | y | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:116:21:116:21 | y | T1.(parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:116:21:116:21 | y | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:117:13:117:13 | a | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:117:17:117:17 | x | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:117:17:117:17 | x | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:117:17:117:17 | x | T0.(parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:117:17:117:17 | x | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:117:17:117:17 | x | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:117:17:117:17 | x | T1.(parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:117:17:117:17 | x | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:117:17:117:19 | ... .0 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:117:17:117:19 | ... .0 | (parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:117:17:117:19 | ... .0 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:117:17:117:30 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:118:17:118:17 | x | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:118:17:118:17 | x | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:118:17:118:17 | x | T0.(parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:118:17:118:17 | x | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:118:17:118:17 | x | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:118:17:118:17 | x | T1.(parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:118:17:118:17 | x | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:118:17:118:19 | ... .0 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:118:17:118:19 | ... .0 | (parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:118:17:118:19 | ... .0 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:119:13:119:13 | c | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:119:17:119:17 | y | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:119:17:119:17 | y | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:119:17:119:17 | y | T0.(parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:119:17:119:17 | y | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:119:17:119:17 | y | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:119:17:119:17 | y | T1.(parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:119:17:119:17 | y | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:119:17:119:19 | ... .0 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:119:17:119:19 | ... .0 | (parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:119:17:119:19 | ... .0 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:119:17:119:30 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:120:17:120:17 | y | | {EXTERNAL LOCATION} | Tuple2 | +| nested_types.swift:120:17:120:17 | y | T0 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:120:17:120:17 | y | T0.(parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:120:17:120:17 | y | T0.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:120:17:120:17 | y | T1 | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:120:17:120:17 | y | T1.(parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:120:17:120:17 | y | T1.TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:120:17:120:19 | ... .0 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:120:17:120:19 | ... .0 | (parent:Inner) | nested_types.swift:115:1:122:1 | Foo | +| nested_types.swift:120:17:120:19 | ... .0 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:124:29:124:33 | inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:124:29:124:33 | inner | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:124:29:124:33 | inner | (parent:Inner).TOuter | nested_types.swift:124:19:124:20 | Ta | +| nested_types.swift:124:29:124:33 | inner | TInner | nested_types.swift:124:23:124:24 | Tb | +| nested_types.swift:124:63:126:1 | Block | | nested_types.swift:124:23:124:24 | Tb | +| nested_types.swift:125:12:125:16 | inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:125:12:125:16 | inner | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:125:12:125:16 | inner | (parent:Inner).TOuter | nested_types.swift:124:19:124:20 | Ta | +| nested_types.swift:125:12:125:16 | inner | TInner | nested_types.swift:124:23:124:24 | Tb | +| nested_types.swift:125:12:125:27 | ... .getInner(...) | | nested_types.swift:124:23:124:24 | Tb | +| nested_types.swift:128:29:128:33 | inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:128:29:128:33 | inner | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:128:29:128:33 | inner | (parent:Inner).TOuter | nested_types.swift:128:19:128:20 | Ta | +| nested_types.swift:128:29:128:33 | inner | TInner | nested_types.swift:128:23:128:24 | Tb | +| nested_types.swift:128:63:130:1 | Block | | nested_types.swift:128:19:128:20 | Ta | +| nested_types.swift:129:12:129:16 | inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:129:12:129:16 | inner | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:129:12:129:16 | inner | (parent:Inner).TOuter | nested_types.swift:128:19:128:20 | Ta | +| nested_types.swift:129:12:129:16 | inner | TInner | nested_types.swift:128:23:128:24 | Tb | +| nested_types.swift:129:12:129:27 | ... .getOuter(...) | | nested_types.swift:128:19:128:20 | Ta | +| nested_types.swift:132:5:132:10 | inner1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:132:5:132:10 | inner1 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:132:5:132:10 | inner1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:132:5:132:10 | inner1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:132:14:132:24 | ... .Inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:132:14:132:24 | ... .Inner | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:132:14:132:24 | ... .Inner | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:132:14:132:24 | ... .Inner | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:132:14:132:56 | ... .Inner(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:132:14:132:56 | ... .Inner(...) | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:132:14:132:56 | ... .Inner(...) | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:132:14:132:56 | ... .Inner(...) | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:132:38:132:39 | 42 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:132:54:132:55 | "" | | {EXTERNAL LOCATION} | String | +| nested_types.swift:133:5:133:7 | x1a | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:133:11:133:16 | inner1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:133:11:133:16 | inner1 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:133:11:133:16 | inner1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:133:11:133:16 | inner1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:133:11:133:27 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:134:5:134:7 | x1b | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:134:11:134:30 | extractInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:134:24:134:29 | inner1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:134:24:134:29 | inner1 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:134:24:134:29 | inner1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:134:24:134:29 | inner1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:135:5:135:7 | y1a | | {EXTERNAL LOCATION} | String | +| nested_types.swift:135:11:135:16 | inner1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:135:11:135:16 | inner1 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:135:11:135:16 | inner1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:135:11:135:16 | inner1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:135:11:135:27 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:136:5:136:7 | y1b | | {EXTERNAL LOCATION} | String | +| nested_types.swift:136:11:136:30 | extractOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:136:24:136:29 | inner1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:136:24:136:29 | inner1 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:136:24:136:29 | inner1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:136:24:136:29 | inner1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:137:5:137:6 | b1 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:137:10:137:15 | inner1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:137:10:137:15 | inner1 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:137:10:137:15 | inner1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:137:10:137:15 | inner1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:137:10:137:25 | ... .getBase(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:139:5:139:10 | inner2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:139:5:139:10 | inner2 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:139:5:139:10 | inner2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:139:5:139:10 | inner2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:139:14:139:32 | ... .Inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:139:14:139:32 | ... .Inner | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:139:14:139:32 | ... .Inner | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:139:14:139:32 | ... .Inner | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:139:14:139:48 | ... .Inner(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:139:14:139:48 | ... .Inner(...) | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:139:14:139:48 | ... .Inner(...) | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:139:14:139:48 | ... .Inner(...) | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:139:46:139:47 | 42 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:140:5:140:7 | x2a | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:140:11:140:16 | inner2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:140:11:140:16 | inner2 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:140:11:140:16 | inner2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:140:11:140:16 | inner2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:140:11:140:27 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:141:5:141:7 | x2b | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:141:11:141:30 | extractInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:141:24:141:29 | inner2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:141:24:141:29 | inner2 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:141:24:141:29 | inner2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:141:24:141:29 | inner2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:142:5:142:7 | y2a | | {EXTERNAL LOCATION} | String | +| nested_types.swift:142:11:142:16 | inner2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:142:11:142:16 | inner2 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:142:11:142:16 | inner2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:142:11:142:16 | inner2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:142:11:142:27 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:143:5:143:7 | y2b | | {EXTERNAL LOCATION} | String | +| nested_types.swift:143:11:143:30 | extractOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:143:24:143:29 | inner2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:143:24:143:29 | inner2 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:143:24:143:29 | inner2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:143:24:143:29 | inner2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:144:5:144:6 | b2 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:144:10:144:15 | inner2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:144:10:144:15 | inner2 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:144:10:144:15 | inner2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:144:10:144:15 | inner2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:144:10:144:25 | ... .getBase(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:146:5:146:11 | swapped | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:146:5:146:11 | swapped | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:146:5:146:11 | swapped | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:146:5:146:11 | swapped | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:146:15:146:20 | inner1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:146:15:146:20 | inner1 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:146:15:146:20 | inner1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:146:15:146:20 | inner1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:146:15:146:27 | ... .swap(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:146:15:146:27 | ... .swap(...) | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:146:15:146:27 | ... .swap(...) | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:146:15:146:27 | ... .swap(...) | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:147:5:147:6 | x3 | | {EXTERNAL LOCATION} | String | +| nested_types.swift:147:10:147:16 | swapped | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:147:10:147:16 | swapped | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:147:10:147:16 | swapped | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:147:10:147:16 | swapped | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:147:10:147:27 | ... .getInner(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:148:5:148:6 | y3 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:148:10:148:16 | swapped | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:148:10:148:16 | swapped | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:148:10:148:16 | swapped | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:148:10:148:16 | swapped | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:148:10:148:27 | ... .getOuter(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:149:5:149:6 | b3 | | {EXTERNAL LOCATION} | String | +| nested_types.swift:149:10:149:16 | swapped | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:149:10:149:16 | swapped | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:149:10:149:16 | swapped | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:149:10:149:16 | swapped | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:149:10:149:26 | ... .getBase(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:151:5:151:10 | inner4 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:151:5:151:10 | inner4 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:151:5:151:10 | inner4 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:151:5:151:10 | inner4 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:151:14:151:19 | inner1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:151:14:151:19 | inner1 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:151:14:151:19 | inner1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:151:14:151:19 | inner1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:151:14:151:30 | ... .getSelf1(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:151:14:151:30 | ... .getSelf1(...) | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:151:14:151:30 | ... .getSelf1(...) | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:151:14:151:30 | ... .getSelf1(...) | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:152:5:152:6 | x4 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:152:10:152:15 | inner4 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:152:10:152:15 | inner4 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:152:10:152:15 | inner4 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:152:10:152:15 | inner4 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:152:10:152:26 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:153:5:153:6 | y4 | | {EXTERNAL LOCATION} | String | +| nested_types.swift:153:10:153:15 | inner4 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:153:10:153:15 | inner4 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:153:10:153:15 | inner4 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:153:10:153:15 | inner4 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:153:10:153:26 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:154:5:154:6 | b4 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:154:10:154:15 | inner4 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:154:10:154:15 | inner4 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:154:10:154:15 | inner4 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:154:10:154:15 | inner4 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:154:10:154:25 | ... .getBase(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:156:5:156:10 | inner5 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:156:5:156:10 | inner5 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:156:5:156:10 | inner5 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:156:5:156:10 | inner5 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:156:14:156:19 | inner1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:156:14:156:19 | inner1 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:156:14:156:19 | inner1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:156:14:156:19 | inner1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:156:14:156:30 | ... .getSelf2(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:156:14:156:30 | ... .getSelf2(...) | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:156:14:156:30 | ... .getSelf2(...) | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:156:14:156:30 | ... .getSelf2(...) | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:157:5:157:6 | x5 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:157:10:157:15 | inner5 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:157:10:157:15 | inner5 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:157:10:157:15 | inner5 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:157:10:157:15 | inner5 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:157:10:157:26 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:158:5:158:6 | y5 | | {EXTERNAL LOCATION} | String | +| nested_types.swift:158:10:158:15 | inner5 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:158:10:158:15 | inner5 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:158:10:158:15 | inner5 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:158:10:158:15 | inner5 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:158:10:158:26 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:159:5:159:6 | b5 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:159:10:159:15 | inner5 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:159:10:159:15 | inner5 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:159:10:159:15 | inner5 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:159:10:159:15 | inner5 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:159:10:159:25 | ... .getBase(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:161:5:161:10 | inner6 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:161:5:161:10 | inner6 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:161:5:161:10 | inner6 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:161:5:161:10 | inner6 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:161:14:161:49 | ... .createInner(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:161:14:161:49 | ... .createInner(...) | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:161:14:161:49 | ... .createInner(...) | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:161:14:161:49 | ... .createInner(...) | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:161:44:161:48 | false | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:162:5:162:6 | x6 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:162:10:162:15 | inner6 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:162:10:162:15 | inner6 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:162:10:162:15 | inner6 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:162:10:162:15 | inner6 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:162:10:162:26 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:163:5:163:6 | y6 | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:163:10:163:15 | inner6 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:163:10:163:15 | inner6 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:163:10:163:15 | inner6 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:163:10:163:15 | inner6 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:163:10:163:26 | ... .getOuter(...) | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:164:5:164:6 | b6 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:164:10:164:15 | inner6 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:164:10:164:15 | inner6 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:164:10:164:15 | inner6 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:164:10:164:15 | inner6 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:164:10:164:25 | ... .getBase(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:166:5:166:10 | inner7 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:166:5:166:10 | inner7 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:166:5:166:10 | inner7 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:166:5:166:10 | inner7 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:166:14:166:29 | ... .InnerAlias | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:166:14:166:29 | ... .InnerAlias | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:166:14:166:29 | ... .InnerAlias | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:166:14:166:29 | ... .InnerAlias | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:166:14:166:63 | ... .InnerAlias(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:166:14:166:63 | ... .InnerAlias(...) | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:166:14:166:63 | ... .InnerAlias(...) | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:166:14:166:63 | ... .InnerAlias(...) | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:166:43:166:43 | 0 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:166:58:166:62 | false | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:167:5:167:7 | x11 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:167:11:167:16 | inner7 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:167:11:167:16 | inner7 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:167:11:167:16 | inner7 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:167:11:167:16 | inner7 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:167:11:167:27 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:168:5:168:7 | y11 | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:168:11:168:16 | inner7 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:168:11:168:16 | inner7 | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:168:11:168:16 | inner7 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:168:11:168:16 | inner7 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:168:11:168:27 | ... .getOuter(...) | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:176:13:176:16 | self | | nested_types.swift:171:5:187:5 | Outer.Inner.InnerMost | +| nested_types.swift:176:13:176:16 | self | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:176:13:176:16 | self | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:176:13:176:16 | self | (parent:InnerMost).(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:176:13:176:16 | self | (parent:InnerMost).TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:177:13:177:16 | self | | nested_types.swift:171:5:187:5 | Outer.Inner.InnerMost | +| nested_types.swift:177:13:177:16 | self | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:177:13:177:16 | self | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:177:13:177:16 | self | (parent:InnerMost).(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:177:13:177:16 | self | (parent:InnerMost).TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:181:20:181:23 | self | | nested_types.swift:171:5:187:5 | Outer.Inner.InnerMost | +| nested_types.swift:181:20:181:23 | self | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:181:20:181:23 | self | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:181:20:181:23 | self | (parent:InnerMost).(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:181:20:181:23 | self | (parent:InnerMost).TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:185:20:185:23 | self | | nested_types.swift:171:5:187:5 | Outer.Inner.InnerMost | +| nested_types.swift:185:20:185:23 | self | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:185:20:185:23 | self | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:185:20:185:23 | self | (parent:InnerMost).(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:185:20:185:23 | self | (parent:InnerMost).TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:190:5:190:13 | innerMost | | nested_types.swift:171:5:187:5 | Outer.Inner.InnerMost | +| nested_types.swift:190:5:190:13 | innerMost | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:190:5:190:13 | innerMost | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:190:17:190:37 | ... .InnerMost | | nested_types.swift:171:5:187:5 | Outer.Inner.InnerMost | +| nested_types.swift:190:17:190:37 | ... .InnerMost | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:190:17:190:37 | ... .InnerMost | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:190:17:190:51 | ... .InnerMost(...) | | nested_types.swift:171:5:187:5 | Outer.Inner.InnerMost | +| nested_types.swift:190:17:190:51 | ... .InnerMost(...) | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:190:17:190:51 | ... .InnerMost(...) | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:190:42:190:43 | "" | | {EXTERNAL LOCATION} | String | +| nested_types.swift:190:49:190:50 | 42 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:191:10:191:18 | innerMost | | nested_types.swift:171:5:187:5 | Outer.Inner.InnerMost | +| nested_types.swift:191:10:191:18 | innerMost | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:191:10:191:18 | innerMost | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:192:10:192:18 | innerMost | | nested_types.swift:171:5:187:5 | Outer.Inner.InnerMost | +| nested_types.swift:192:10:192:18 | innerMost | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:192:10:192:18 | innerMost | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:195:14:195:14 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:195:14:195:14 | x | (parent:Inner) | nested_types.swift:194:1:199:1 | SubOuter | +| nested_types.swift:195:14:195:14 | x | (parent:Inner).TSubOuter | nested_types.swift:194:16:194:24 | TSubOuter | +| nested_types.swift:195:14:195:14 | x | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:196:19:196:19 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:196:19:196:19 | x | (parent:Inner) | nested_types.swift:194:1:199:1 | SubOuter | +| nested_types.swift:196:19:196:19 | x | (parent:Inner).TSubOuter | nested_types.swift:194:16:194:24 | TSubOuter | +| nested_types.swift:196:19:196:19 | x | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:201:5:201:12 | subOuter | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:201:5:201:12 | subOuter | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:201:5:201:12 | subOuter | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Array | +| nested_types.swift:201:5:201:12 | subOuter | (parent:Inner).TOuter.Element | {EXTERNAL LOCATION} | Int | +| nested_types.swift:201:5:201:12 | subOuter | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:201:16:201:58 | ... .createInner(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:201:16:201:58 | ... .createInner(...) | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:201:16:201:58 | ... .createInner(...) | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Array | +| nested_types.swift:201:16:201:58 | ... .createInner(...) | (parent:Inner).TOuter.Element | {EXTERNAL LOCATION} | Int | +| nested_types.swift:201:16:201:58 | ... .createInner(...) | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:201:54:201:57 | ArrayLiteral | | {EXTERNAL LOCATION} | Array | +| nested_types.swift:201:54:201:57 | ArrayLiteral | Element | {EXTERNAL LOCATION} | Int | +| nested_types.swift:201:55:201:56 | 42 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:202:5:202:6 | x8 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:202:10:202:17 | subOuter | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:202:10:202:17 | subOuter | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:202:10:202:17 | subOuter | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Array | +| nested_types.swift:202:10:202:17 | subOuter | (parent:Inner).TOuter.Element | {EXTERNAL LOCATION} | Int | +| nested_types.swift:202:10:202:17 | subOuter | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:202:10:202:28 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:203:5:203:6 | y8 | | {EXTERNAL LOCATION} | Array | +| nested_types.swift:203:5:203:6 | y8 | Element | {EXTERNAL LOCATION} | Int | +| nested_types.swift:203:10:203:17 | subOuter | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:203:10:203:17 | subOuter | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:203:10:203:17 | subOuter | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Array | +| nested_types.swift:203:10:203:17 | subOuter | (parent:Inner).TOuter.Element | {EXTERNAL LOCATION} | Int | +| nested_types.swift:203:10:203:17 | subOuter | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:203:10:203:28 | ... .getOuter(...) | | {EXTERNAL LOCATION} | Array | +| nested_types.swift:203:10:203:28 | ... .getOuter(...) | Element | {EXTERNAL LOCATION} | Int | +| nested_types.swift:205:5:205:12 | subInner | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:205:5:205:12 | subInner | (parent:SubInner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:205:5:205:12 | subInner | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:205:5:205:12 | subInner | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:205:16:205:29 | ... .SubInner | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:205:16:205:29 | ... .SubInner | (parent:SubInner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:205:16:205:29 | ... .SubInner | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:205:16:205:29 | ... .SubInner | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:205:16:205:62 | ... .SubInner(...) | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:205:16:205:62 | ... .SubInner(...) | (parent:SubInner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:205:16:205:62 | ... .SubInner(...) | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:205:16:205:62 | ... .SubInner(...) | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:205:43:205:46 | true | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:205:61:205:61 | 0 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:206:5:206:6 | x9 | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:206:10:206:17 | subInner | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:206:10:206:17 | subInner | (parent:SubInner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:206:10:206:17 | subInner | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:206:10:206:17 | subInner | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:206:10:206:28 | ... .getInner(...) | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:207:5:207:6 | y9 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:207:10:207:17 | subInner | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:207:10:207:17 | subInner | (parent:SubInner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:207:10:207:17 | subInner | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:207:10:207:17 | subInner | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:207:10:207:28 | ... .getOuter(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:209:5:209:13 | subInner2 | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:209:5:209:13 | subInner2 | (parent:SubInner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:209:5:209:13 | subInner2 | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:209:5:209:13 | subInner2 | TSubInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:209:46:209:59 | ... .SubInner | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:209:46:209:59 | ... .SubInner | (parent:SubInner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:209:46:209:59 | ... .SubInner | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:209:46:209:59 | ... .SubInner | TSubInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:209:46:209:74 | ... .SubInner(...) | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:209:46:209:74 | ... .SubInner(...) | (parent:SubInner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:209:46:209:74 | ... .SubInner(...) | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:209:46:209:74 | ... .SubInner(...) | TSubInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:209:73:209:73 | 1 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:210:5:210:7 | x12 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:210:11:210:19 | subInner2 | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:210:11:210:19 | subInner2 | (parent:SubInner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:210:11:210:19 | subInner2 | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:210:11:210:19 | subInner2 | TSubInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:210:11:210:30 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:211:5:211:7 | y12 | | {EXTERNAL LOCATION} | String | +| nested_types.swift:211:11:211:19 | subInner2 | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:211:11:211:19 | subInner2 | (parent:SubInner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:211:11:211:19 | subInner2 | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:211:11:211:19 | subInner2 | TSubInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:211:11:211:30 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:215:5:215:19 | subInnerOutside | | nested_types.swift:213:1:213:70 | SubInnerOutside | +| nested_types.swift:215:5:215:19 | subInnerOutside | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:215:23:215:37 | SubInnerOutside | | nested_types.swift:213:1:213:70 | SubInnerOutside | +| nested_types.swift:215:23:215:37 | SubInnerOutside | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:215:23:215:74 | SubInnerOutside(...) | | nested_types.swift:213:1:213:70 | SubInnerOutside | +| nested_types.swift:215:23:215:74 | SubInnerOutside(...) | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:215:51:215:54 | true | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:215:69:215:73 | false | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:216:5:216:7 | x10 | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:216:11:216:25 | subInnerOutside | | nested_types.swift:213:1:213:70 | SubInnerOutside | +| nested_types.swift:216:11:216:25 | subInnerOutside | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:216:11:216:36 | ... .getInner(...) | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:217:5:217:7 | y10 | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:217:11:217:25 | subInnerOutside | | nested_types.swift:213:1:213:70 | SubInnerOutside | +| nested_types.swift:217:11:217:25 | subInnerOutside | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:217:11:217:36 | ... .getOuter(...) | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:221:13:221:13 | x | | nested_types.swift:220:5:222:5 | Node.Leaf | +| nested_types.swift:221:13:221:13 | x | (parent:Leaf) | nested_types.swift:219:1:223:1 | Node | +| nested_types.swift:221:23:221:26 | Leaf | | nested_types.swift:220:5:222:5 | Node.Leaf | +| nested_types.swift:221:23:221:26 | Leaf | (parent:Leaf) | nested_types.swift:219:1:223:1 | Node | +| nested_types.swift:221:23:221:28 | Leaf(...) | | nested_types.swift:220:5:222:5 | Node.Leaf | +| nested_types.swift:221:23:221:28 | Leaf(...) | (parent:Leaf) | nested_types.swift:219:1:223:1 | Node | +| nested_types.swift:227:5:227:10 | holder | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:227:5:227:10 | holder | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:227:5:227:10 | holder | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:227:5:227:10 | holder | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:227:14:227:25 | ... .Fixed | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:227:14:227:25 | ... .Fixed | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:227:14:227:25 | ... .Fixed | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:227:14:227:25 | ... .Fixed | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:227:14:227:41 | ... .Fixed(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:227:14:227:41 | ... .Fixed(...) | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:227:14:227:41 | ... .Fixed(...) | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:227:14:227:41 | ... .Fixed(...) | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:227:39:227:40 | "" | | {EXTERNAL LOCATION} | String | +| nested_types.swift:228:5:228:7 | x13 | | {EXTERNAL LOCATION} | String | +| nested_types.swift:228:11:228:16 | holder | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:228:11:228:16 | holder | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:228:11:228:16 | holder | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:228:11:228:16 | holder | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:228:11:228:27 | ... .getInner(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:229:5:229:7 | y13 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:229:11:229:16 | holder | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:229:11:229:16 | holder | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:229:11:229:16 | holder | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:229:11:229:16 | holder | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:229:11:229:27 | ... .getOuter(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:237:11:237:11 | x | | nested_types.swift:231:1:240:1 | Box | +| nested_types.swift:237:11:237:11 | x | T | {EXTERNAL LOCATION} | Int | +| nested_types.swift:238:11:238:11 | y | | nested_types.swift:231:1:240:1 | Box | +| nested_types.swift:238:11:238:11 | y | T | nested_types.swift:231:11:231:11 | T | +| nested_types.swift:244:10:244:10 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:244:10:244:10 | x | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:244:10:244:10 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:244:10:244:10 | x | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:248:10:248:10 | x | | {EXTERNAL LOCATION} | String | +| nested_types.swift:254:10:254:10 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:254:10:254:10 | x | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:254:10:254:10 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:254:10:254:10 | x | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:254:35:254:35 | y | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:254:35:254:35 | y | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:254:35:254:35 | y | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:254:35:254:35 | y | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:255:9:255:9 | a | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:255:13:255:13 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:255:13:255:13 | x | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:255:13:255:13 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:255:13:255:13 | x | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:255:13:255:24 | ... .getInner(...) | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:256:9:256:9 | b | | {EXTERNAL LOCATION} | String | +| nested_types.swift:256:13:256:13 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:256:13:256:13 | x | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:256:13:256:13 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:256:13:256:13 | x | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:256:13:256:24 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:257:9:257:9 | c | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:257:13:257:13 | y | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:257:13:257:13 | y | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:257:13:257:13 | y | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:257:13:257:13 | y | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:257:13:257:24 | ... .getInner(...) | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:258:9:258:9 | d | | {EXTERNAL LOCATION} | String | +| nested_types.swift:258:13:258:13 | y | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:258:13:258:13 | y | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:258:13:258:13 | y | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:258:13:258:13 | y | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:258:13:258:24 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:263:10:263:10 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:263:10:263:10 | x | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:263:10:263:10 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:263:10:263:10 | x | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:264:9:264:13 | outer | | {EXTERNAL LOCATION} | String | +| nested_types.swift:264:17:264:17 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:264:17:264:17 | x | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:264:17:264:17 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:264:17:264:17 | x | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:264:17:264:28 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:265:9:265:13 | inner | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:265:17:265:17 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:265:17:265:17 | x | (parent:Inner) | nested_types.swift:13:1:113:1 | Outer | +| nested_types.swift:265:17:265:17 | x | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:265:17:265:17 | x | TInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:265:17:265: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 | @@ -2584,8 +3714,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 | @@ -3026,10 +4157,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 | @@ -3117,4 +4251,47 @@ inferType | type_constraints.swift:263:18:263:20 | "m" | | {EXTERNAL LOCATION} | String | | type_constraints.swift:263:28:263:30 | "a" | | {EXTERNAL LOCATION} | String | | type_constraints.swift:263:38:263:40 | "z" | | {EXTERNAL LOCATION} | String | +| variance.swift:7:18:7:18 | f | | {EXTERNAL LOCATION} | Function | +| variance.swift:7:18:7:18 | f | Args | {EXTERNAL LOCATION} | Tuple1 | +| variance.swift:7:18:7:18 | f | Args.T0 | variance.swift:5:1:5:21 | B | +| variance.swift:7:18:7:18 | f | Args.T0.Tb | variance.swift:7:10:7:11 | T1 | +| variance.swift:7:18:7:18 | f | Return | variance.swift:3:1:3:14 | A | +| variance.swift:7:18:7:18 | f | Return.Ta | variance.swift:7:14:7:15 | T2 | +| variance.swift:11:5:11:7 | lam | | {EXTERNAL LOCATION} | Function | +| variance.swift:11:5:11:7 | lam | Args | {EXTERNAL LOCATION} | Tuple1 | +| variance.swift:11:5:11:7 | lam | Args.T0 | variance.swift:3:1:3:14 | A | +| variance.swift:11:5:11:7 | lam | Args.T0.Ta | {EXTERNAL LOCATION} | Int | +| variance.swift:11:5:11:7 | lam | Return | variance.swift:5:1:5:21 | B | +| variance.swift:11:5:11:7 | lam | Return.Tb | {EXTERNAL LOCATION} | String | +| variance.swift:11:11:11:53 | FunctionExpr | | {EXTERNAL LOCATION} | Function | +| variance.swift:11:11:11:53 | FunctionExpr | Args | {EXTERNAL LOCATION} | Tuple1 | +| variance.swift:11:11:11:53 | FunctionExpr | Args.T0 | variance.swift:3:1:3:14 | A | +| variance.swift:11:11:11:53 | FunctionExpr | Args.T0.Ta | {EXTERNAL LOCATION} | Int | +| variance.swift:11:11:11:53 | FunctionExpr | Return | variance.swift:5:1:5:21 | B | +| variance.swift:11:11:11:53 | FunctionExpr | Return.Tb | {EXTERNAL LOCATION} | String | +| variance.swift:11:14:11:14 | a | | variance.swift:3:1:3:14 | A | +| variance.swift:11:14:11:14 | a | Ta | {EXTERNAL LOCATION} | Int | +| variance.swift:11:41:11:49 | GenericTypeExpr | | variance.swift:5:1:5:21 | B | +| variance.swift:11:41:11:49 | GenericTypeExpr | Tb | {EXTERNAL LOCATION} | String | +| variance.swift:11:41:11:51 | ...(...) | | variance.swift:5:1:5:21 | B | +| variance.swift:11:41:11:51 | ...(...) | Tb | {EXTERNAL LOCATION} | String | +| variance.swift:11:41:11:51 | Block | | variance.swift:5:1:5:21 | B | +| variance.swift:11:41:11:51 | Block | Tb | {EXTERNAL LOCATION} | String | +| variance.swift:13:5:13:5 | x | | {EXTERNAL LOCATION} | Tuple2 | +| variance.swift:13:9:13:19 | foo(...) | | {EXTERNAL LOCATION} | Tuple2 | +| variance.swift:13:16:13:18 | lam | | {EXTERNAL LOCATION} | Function | +| variance.swift:13:16:13:18 | lam | Args | {EXTERNAL LOCATION} | Tuple1 | +| variance.swift:13:16:13:18 | lam | Args.T0 | variance.swift:3:1:3:14 | A | +| variance.swift:13:16:13:18 | lam | Args.T0.Ta | {EXTERNAL LOCATION} | Int | +| variance.swift:13:16:13:18 | lam | Return | variance.swift:5:1:5:21 | B | +| variance.swift:13:16:13:18 | lam | Return.Tb | {EXTERNAL LOCATION} | String | +| variance.swift:15:23:15:29 | Block | | variance.swift:5:1:5:21 | B | +| variance.swift:15:23:15:29 | Block | Tb | variance.swift:15:10:15:10 | T | +| variance.swift:15:25:15:25 | B | | variance.swift:5:1:5:21 | B | +| variance.swift:15:25:15:25 | B | Tb | variance.swift:15:10:15:10 | T | +| variance.swift:15:25:15:27 | B(...) | | variance.swift:5:1:5:21 | B | +| variance.swift:15:25:15:27 | B(...) | Tb | variance.swift:15:10:15:10 | T | +| variance.swift:18:7:18:7 | x | | variance.swift:3:1:3:14 | A | +| variance.swift:18:7:18:7 | x | Ta | {EXTERNAL LOCATION} | Int | +| variance.swift:18:19:18:23 | bar(...) | | variance.swift:5:1:5:21 | B | testFailures diff --git a/unified/ql/test/library-tests/type-inference/variance.swift b/unified/ql/test/library-tests/type-inference/variance.swift new file mode 100644 index 000000000000..11d19d3b6054 --- /dev/null +++ b/unified/ql/test/library-tests/type-inference/variance.swift @@ -0,0 +1,19 @@ +// variance is not currently supported + +class A {} + +class B: A {} + +func foo(f: (B) -> A) -> (T1, T2) { + fatalError() // placeholder implementation +} + +let lam = { (a: A) -> B in B() } // $ target=A.init + +let x = foo(f: lam) // $ target=foo $ MISSING: type=x@Tuple2:Int type=x@Tuple2:String + +func bar() -> B { B() } // $ target=A.init + +func baz() { + let x: A = bar() // $ target=bar $ MISSING: type=bar(...)@B:Int +}