From 2fcced5553851aec42938892b7ef82de90fa413f Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 21 Oct 2026 13:47:58 +0200 Subject: [PATCH] Unified: Type inference for nested types --- .../lib/codeql/unified/internal/AstExtra.qll | 29 + .../codeql/unified/internal/ExprPositions.qll | 23 +- .../unified/internal/ExprPositionsPlugin.qll | 2 + .../internal/ExprPositionsPluginSwift.qll | 4 +- .../lib/codeql/unified/internal/FacadeAst.qll | 5 + .../unified/internal/StaticNameBinding.qll | 15 + .../unified/internal/typeinference/Type.qll | 30 +- .../typeinference/TypeAbstraction.qll | 5 +- .../internal/typeinference/TypeInference.qll | 64 +- .../typeinference/TypeInferencePlugin.qll | 27 - .../TypeInferencePluginSwift.qll | 25 - .../internal/typeinference/TypeMention.qll | 149 +++- .../type-inference/classes.swift | 2 +- .../type-inference/generics.swift | 2 +- .../type-inference/nested_types.swift | 191 ++++ .../type-inference/type-inference.expected | 815 +++++++++++++++++- .../type-inference/variance.swift | 19 + 17 files changed, 1275 insertions(+), 132 deletions(-) create mode 100644 unified/ql/test/library-tests/type-inference/nested_types.swift create mode 100644 unified/ql/test/library-tests/type-inference/variance.swift 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 820e6a277eae..4fdcc7052a9e 100644 --- a/unified/ql/lib/codeql/unified/internal/ExprPositions.qll +++ b/unified/ql/lib/codeql/unified/internal/ExprPositions.qll @@ -3,9 +3,11 @@ 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, + * and where omission of type arguments implicitly refer to the type + * parameters of the type being accessed (provided that they are in scope). */ -predicate isInTypeContext(Expr expr) { +predicate isInTypeContextWithImplicitTypeArgs(Expr expr) { expr = any(TypeCastExpr n).getType() or expr = any(TypeTestExpr n).getType() @@ -36,11 +38,26 @@ predicate isInTypeContext(Expr expr) { or expr.getParent() instanceof TypeConstraint or + any(ExprPositionsPlugin p).isInTypeContextWithImplicitTypeArgs(expr) + or + isInTypeContextWithImplicitTypeArgs(expr.getEnclosingExpr()) +} + +private predicate isInTypeContextWithoutImplicitTypeArgs(Expr expr) { exists(NameBinding::getTypeFromRef(expr)) or any(ExprPositionsPlugin p).isInTypeContext(expr) or - isInTypeContext(expr.getEnclosingExpr()) + isInTypeContextWithoutImplicitTypeArgs(expr.getEnclosingExpr()) +} + +/** + * Holds if `expr` appears in a context where it must refer to a type. + */ +predicate isInTypeContext(Expr expr) { + isInTypeContextWithImplicitTypeArgs(expr) + or + isInTypeContextWithoutImplicitTypeArgs(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 8877439ea5dc..086743a6c567 100644 --- a/unified/ql/lib/codeql/unified/internal/ExprPositionsPlugin.qll +++ b/unified/ql/lib/codeql/unified/internal/ExprPositionsPlugin.qll @@ -7,4 +7,6 @@ private module Plugins { class ExprPositionsPlugin extends Unit { predicate isInTypeContext(Expr e) { none() } + + predicate isInTypeContextWithImplicitTypeArgs(Expr e) { none() } } diff --git a/unified/ql/lib/codeql/unified/internal/ExprPositionsPluginSwift.qll b/unified/ql/lib/codeql/unified/internal/ExprPositionsPluginSwift.qll index f4f5d2a9ca72..e17b4e43a1a3 100644 --- a/unified/ql/lib/codeql/unified/internal/ExprPositionsPluginSwift.qll +++ b/unified/ql/lib/codeql/unified/internal/ExprPositionsPluginSwift.qll @@ -2,5 +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 isInTypeContextWithImplicitTypeArgs(Expr e) { + e = any(GenericTypeExpr g).getBase() + } } diff --git a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll index c9a0c1b8ca82..4bb19858c21e 100644 --- a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll +++ b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll @@ -50,6 +50,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 diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 58fd36fc5512..6d2fdeb57a67 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -826,6 +826,21 @@ Identifier getTypeFromRef(AstNode access) { ) } +/** + * Gets the type being accessed by `access`, where type aliases are resolved, if any. + */ +Identifier getTypeFromRefAliasesResolved(AstNode access) { + exists(Identifier i | i = getTypeFromRef(access) | + not i = any(TypeAliasDeclaration t).getNameNode() and + result = i + or + exists(TypeAliasDeclaration alias | + i = alias.getNameNode() and + result = getTypeFromRefAliasesResolved(alias.getType()) + ) + ) +} + /** * Gets the name of the implicit receiver parameter in scope at `callable` (possibly declared by an outer callable). * diff --git a/unified/ql/lib/codeql/unified/internal/typeinference/Type.qll b/unified/ql/lib/codeql/unified/internal/typeinference/Type.qll index 181e129fc955..3d826390564c 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() } } @@ -214,6 +223,25 @@ 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 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`. */ diff --git a/unified/ql/lib/codeql/unified/internal/typeinference/TypeAbstraction.qll b/unified/ql/lib/codeql/unified/internal/typeinference/TypeAbstraction.qll index cde6a2449e2d..835dae13460b 100644 --- a/unified/ql/lib/codeql/unified/internal/typeinference/TypeAbstraction.qll +++ b/unified/ql/lib/codeql/unified/internal/typeinference/TypeAbstraction.qll @@ -15,5 +15,8 @@ abstract class TypeAbstraction extends AstNode { */ private class ClassLikeDeclarationTypeAbstraction extends TypeAbstraction instanceof Unified::ClassLikeDeclaration { - override TypeParameter getATypeParameter() { this = result.getDeclaringItem() } + override TypeParameter getATypeParameter() { + // 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..c037262e7baf 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,8 +496,9 @@ module Input3 implements InputSig3 { } Callable getTargetViaStaticNameBinding() { - exists(NameBinding b | b = getStaticBindingTargetFromRef(this.getCallee()) | + exists(NameBinding b | // object creation (including enum constructors): `String(42)`, `Optional.Some(42)` + b = getTypeFromRefAliasesResolved(this.getCallee()) and exists(ClassLikeDeclaration cls | cls.getNameNode() = b and result.isInstanceMemberOf(cls, _) and @@ -501,6 +506,7 @@ module Input3 implements InputSig3 { ) or // call without explicit receiver: `foo(42)` + b = getStaticBindingTargetFromRef(this.getCallee()) and result.getNameNode() = b ) } @@ -659,10 +665,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 +712,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 +730,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 +755,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/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..62b431b2702a 100644 --- a/unified/ql/lib/codeql/unified/internal/typeinference/TypeInferencePluginSwift.qll +++ b/unified/ql/lib/codeql/unified/internal/typeinference/TypeInferencePluginSwift.qll @@ -108,17 +108,6 @@ private class EnumConstructor extends EnumCaseConstructor { 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 +158,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..67cf21fac3eb 100644 --- a/unified/ql/lib/codeql/unified/internal/typeinference/TypeMention.qll +++ b/unified/ql/lib/codeql/unified/internal/typeinference/TypeMention.qll @@ -9,25 +9,86 @@ final class TypeMention = TypeMentionImpl; /** An AST node that mentions a type. */ abstract private class TypeMentionImpl extends AstNode { + /** + * 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 type mentioned at `path`. */ pragma[nomagic] abstract Type getTypeAt(TypePath path); - /** - * Gets the type mentioned at the root of this type mention. - */ - final Type getType() { result = this.getTypeAt(TypePath::nil()) } + /** Gets the explicit qualifier of this type mention, if any. */ + abstract TypeMention getQualifier(); + + /** Holds if this type mention has an explicit qualifier. */ + abstract predicate hasQualifier(); } 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 Type getTypeAtImpl(TypePath path); + + final override Type getTypeAt(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 + exists(TypeMention qualifier, ClassLikeDeclaration cls, TypePath suffix | + qualifier = this.getQualifier() and + cls = this.getType().(ClassLikeDeclarationType).getClassLikeDeclaration() and + path = TypePath::cons(TParentTypeParameterType(cls), suffix) and + qualifier.getType().(ClassLikeDeclarationType).getClassLikeDeclaration().getABaseClass*() = + cls.getEnclosingClassResolved() and + result = qualifier.getTypeAt(suffix) + ) + 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` + // } + // } + // ``` + not this.hasQualifier() and + not exists(TypeAliasDeclaration alias | + this = alias.getType() or + this = alias.getType().(GenericTypeExpr).getBase() + ) and + exists( + ClassLikeDeclarationType rootType, ClassLikeDeclaration parent, ParentTypeParameterType tp, + TypePath suffix + | + rootType = this.getType() and + tp = TParentTypeParameterType(rootType.getClassLikeDeclaration()) and + path = TypePath::cons(tp, suffix) and + parent = this.getEnclosingClassResolved+() and + result = parent.getNameNode().(TypeMention).getTypeAt(suffix) + | + parent = tp.getParent() + or + not tp.getParent() = this.getEnclosingClassResolved+() and + parent.getABaseClass+() = tp.getParent() + ) + } } /** @@ -49,7 +110,24 @@ private class AliasExprTypeMention extends ExprTypeMentionImpl { ) } - override Type getTypeAt(TypePath path) { + private predicate aliasHasQualifier() { alias.getType().(TypeMention).hasQualifier() } + + override TypeMention getQualifier() { + result = alias.getType().(TypeMention).getQualifier() + or + not this.aliasHasQualifier() and + result = this.(MemberAccessExpr).getBase() + } + + override predicate hasQualifier() { + alias.getType().(TypeMention).hasQualifier() + or + this instanceof MemberAccessExpr + } + + override Type getType() { result = alias.getType().(TypeMention).getType() } + + override Type getTypeAtImpl(TypePath path) { result = alias.getType().(TypeMention).getTypeAt(path) and not result = this.getAliasTypeParameter(_) } @@ -63,18 +141,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 +154,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 +162,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( @@ -148,7 +219,30 @@ private class NonAliasExprTypeMention extends ExprTypeMentionImpl { path = TypePath::cons(tt.getPositionalTypeParameter(i), suffix) ) ) + or + // A mention of a generic type without explicit type arguments and within + // the scope of the type, implicitly mentions all type parameters (including + // at the identifer that introduces the type): + // + // ```swift + // class Generic { + // let x: Generic // short-hand for `Generic + // } + // ``` + not this = any(GenericTypeExpr g).getBase() and + exists(ClassLikeDeclarationType rootType | + rootType = this.getType() and + (isInTypeContextWithImplicitTypeArgs(this) or this = rootType.getNameNode()) and + rootType.getClassLikeDeclaration() = this.getEnclosingClassResolved+() and + result = rootType.getATypeParameter() and + path = TypePath::singleton(result) and + not result instanceof ParentTypeParameterType + ) } + + override TypeMention getQualifier() { result = this.(MemberAccessExpr).getBase() } + + override predicate hasQualifier() { this instanceof MemberAccessExpr } } private class GenericTypeExprTypeMention extends TypeMentionImpl, GenericTypeExpr { @@ -170,25 +264,12 @@ private class GenericTypeExprTypeMention extends TypeMentionImpl, GenericTypeExp path = prefix.append(suffix) ) } -} - -/** A class declaration mentions itself. */ -private class ClassLikeDeclarationTypeMention extends TypeMentionImpl, Identifier { - private ClassLikeDeclaration c; - ClassLikeDeclarationTypeMention() { this = c.getNameNode() } + override Type getType() { result = base.getType() } - ClassLikeDeclarationType getRootType() { c = result.getClassLikeDeclaration() } + override TypeMention getQualifier() { result = this.getBase().(TypeMention).getQualifier() } - ClassLikeDeclaration getClassLikeDeclaration() { result = c } - - override Type getTypeAt(TypePath path) { - result = this.getRootType() and - path.isEmpty() - or - result = this.getRootType().getATypeParameter() and - path = TypePath::singleton(result) - } + override predicate hasQualifier() { this.getBase().(TypeMention).hasQualifier() } } 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..7d2cc5c301a6 --- /dev/null +++ b/unified/ql/test/library-tests/type-inference/nested_types.swift @@ -0,0 +1,191 @@ +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 + } + + func f(z: Outer.Holder.InnerAlias) { + let a = z.getInner() // $ target=Outer.Inner.getInner $ MISSING: type=a:Bool + let b = z.getOuter() // $ target=Outer.Inner.getOuter $ MISSING: type=b:String + } +} + +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 $ SPURIOUS: target=Outer.Inner.init_conv +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 +} 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 1ffd1d078e97..375e10679dbe 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,141 @@ 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:76: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:76: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:76: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:76: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:76: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:76: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:76: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:76: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:76: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:76: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:76: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:76: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:76: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:72:12:72:12 | z | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:73:17:73:17 | z | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:74:17:74:17 | z | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:78:29:78:33 | inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:78:29:78:33 | inner | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:78:29:78:33 | inner | (parent:Inner).TOuter | nested_types.swift:78:19:78:20 | Ta | +| nested_types.swift:78:29:78:33 | inner | TInner | nested_types.swift:78:23:78:24 | Tb | +| nested_types.swift:79:12:79:16 | inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:79:12:79:16 | inner | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:79:12:79:16 | inner | (parent:Inner).TOuter | nested_types.swift:78:19:78:20 | Ta | +| nested_types.swift:79:12:79:16 | inner | TInner | nested_types.swift:78:23:78:24 | Tb | +| nested_types.swift:82:29:82:33 | inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:82:29:82:33 | inner | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:82:29:82:33 | inner | (parent:Inner).TOuter | nested_types.swift:82:19:82:20 | Ta | +| nested_types.swift:82:29:82:33 | inner | TInner | nested_types.swift:82:23:82:24 | Tb | +| nested_types.swift:83:12:83:16 | inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:83:12:83:16 | inner | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:83:12:83:16 | inner | (parent:Inner).TOuter | nested_types.swift:82:19:82:20 | Ta | +| nested_types.swift:83:12:83:16 | inner | TInner | nested_types.swift:82:23:82:24 | Tb | +| nested_types.swift:130:13:130:16 | self | | nested_types.swift:125:5:141:5 | Outer.Inner.InnerMost | +| nested_types.swift:130:13:130:16 | self | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:130:13:130:16 | self | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:130:13:130:16 | self | (parent:InnerMost).(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:130:13:130:16 | self | (parent:InnerMost).TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:131:13:131:16 | self | | nested_types.swift:125:5:141:5 | Outer.Inner.InnerMost | +| nested_types.swift:131:13:131:16 | self | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:131:13:131:16 | self | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:131:13:131:16 | self | (parent:InnerMost).(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:131:13:131:16 | self | (parent:InnerMost).TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:135:20:135:23 | self | | nested_types.swift:125:5:141:5 | Outer.Inner.InnerMost | +| nested_types.swift:135:20:135:23 | self | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:135:20:135:23 | self | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:135:20:135:23 | self | (parent:InnerMost).(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:135:20:135:23 | self | (parent:InnerMost).TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:139:20:139:23 | self | | nested_types.swift:125:5:141:5 | Outer.Inner.InnerMost | +| nested_types.swift:139:20:139:23 | self | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:139:20:139:23 | self | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:139:20:139:23 | self | (parent:InnerMost).(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:139:20:139:23 | self | (parent:InnerMost).TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:149:14:149:14 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:149:14:149:14 | x | (parent:Inner) | nested_types.swift:148:1:153:1 | SubOuter | +| nested_types.swift:149:14:149:14 | x | (parent:Inner).TSubOuter | nested_types.swift:148:16:148:24 | TSubOuter | +| nested_types.swift:149:14:149:14 | x | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:150:19:150:19 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:150:19:150:19 | x | (parent:Inner) | nested_types.swift:148:1:153:1 | SubOuter | +| nested_types.swift:150:19:150:19 | x | (parent:Inner).TSubOuter | nested_types.swift:148:16:148:24 | TSubOuter | +| nested_types.swift:150:19:150:19 | x | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:155:54:155:57 | ArrayLiteral | | {EXTERNAL LOCATION} | Array | +| nested_types.swift:163:5:163:13 | subInner2 | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:163:5:163:13 | subInner2 | (parent:SubInner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:163:5:163:13 | subInner2 | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:163:5:163:13 | subInner2 | TSubInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:164:11:164:19 | subInner2 | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:164:11:164:19 | subInner2 | (parent:SubInner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:164:11:164:19 | subInner2 | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:164:11:164:19 | subInner2 | TSubInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:165:11:165:19 | subInner2 | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:165:11:165:19 | subInner2 | (parent:SubInner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:165:11:165:19 | subInner2 | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:165:11:165:19 | subInner2 | TSubInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:175:13:175:13 | x | | nested_types.swift:174:5:176:5 | Node.Leaf | +| nested_types.swift:175:13:175:13 | x | (parent:Leaf) | nested_types.swift:173:1:177:1 | Node | +| nested_types.swift:190:14:190:14 | x | | nested_types.swift:185:1:191:1 | Box | +| nested_types.swift:190:14:190:14 | x | T | {EXTERNAL LOCATION} | Int | +| nested_types.swift:190:27:190:27 | y | | nested_types.swift:185:1:191:1 | Box | +| nested_types.swift:190:27:190:27 | y | T | nested_types.swift:185:11:185:11 | T | | 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 +823,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 +1000,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 +1431,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 +1576,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 +1871,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 +1882,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 +2206,563 @@ 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:76: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:76: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:76: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:76: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:76: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:76: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:76: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:76: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:76: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:76: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:76: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:76: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:76: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:76: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:76: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:76: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:76: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:76: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:76: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:76: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:76: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:72:12:72:12 | z | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:73:17:73:17 | z | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:74:17:74:17 | z | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:78:29:78:33 | inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:78:29:78:33 | inner | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:78:29:78:33 | inner | (parent:Inner).TOuter | nested_types.swift:78:19:78:20 | Ta | +| nested_types.swift:78:29:78:33 | inner | TInner | nested_types.swift:78:23:78:24 | Tb | +| nested_types.swift:78:63:80:1 | Block | | nested_types.swift:78:23:78:24 | Tb | +| nested_types.swift:79:12:79:16 | inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:79:12:79:16 | inner | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:79:12:79:16 | inner | (parent:Inner).TOuter | nested_types.swift:78:19:78:20 | Ta | +| nested_types.swift:79:12:79:16 | inner | TInner | nested_types.swift:78:23:78:24 | Tb | +| nested_types.swift:79:12:79:27 | ... .getInner(...) | | nested_types.swift:78:23:78:24 | Tb | +| nested_types.swift:82:29:82:33 | inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:82:29:82:33 | inner | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:82:29:82:33 | inner | (parent:Inner).TOuter | nested_types.swift:82:19:82:20 | Ta | +| nested_types.swift:82:29:82:33 | inner | TInner | nested_types.swift:82:23:82:24 | Tb | +| nested_types.swift:82:63:84:1 | Block | | nested_types.swift:82:19:82:20 | Ta | +| nested_types.swift:83:12:83:16 | inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:83:12:83:16 | inner | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:83:12:83:16 | inner | (parent:Inner).TOuter | nested_types.swift:82:19:82:20 | Ta | +| nested_types.swift:83:12:83:16 | inner | TInner | nested_types.swift:82:23:82:24 | Tb | +| nested_types.swift:83:12:83:27 | ... .getOuter(...) | | nested_types.swift:82:19:82:20 | Ta | +| nested_types.swift:86:5:86:10 | inner1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:86:5:86:10 | inner1 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:86:5:86:10 | inner1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:86:5:86:10 | inner1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:86:14:86:24 | ... .Inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:86:14:86:24 | ... .Inner | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:86:14:86:24 | ... .Inner | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:86:14:86:24 | ... .Inner | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:86:14:86:56 | ... .Inner(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:86:14:86:56 | ... .Inner(...) | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:86:14:86:56 | ... .Inner(...) | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:86:14:86:56 | ... .Inner(...) | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:86:38:86:39 | 42 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:86:54:86:55 | "" | | {EXTERNAL LOCATION} | String | +| nested_types.swift:87:5:87:7 | x1a | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:87:11:87:16 | inner1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:87:11:87:16 | inner1 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:87:11:87:16 | inner1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:87:11:87:16 | inner1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:87:11:87:27 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:88:5:88:7 | x1b | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:88:11:88:30 | extractInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:88:24:88:29 | inner1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:88:24:88:29 | inner1 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:88:24:88:29 | inner1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:88:24:88:29 | inner1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:89:5:89:7 | y1a | | {EXTERNAL LOCATION} | String | +| nested_types.swift:89:11:89:16 | inner1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:89:11:89:16 | inner1 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:89:11:89:16 | inner1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:89:11:89:16 | inner1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:89:11:89:27 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:90:5:90:7 | y1b | | {EXTERNAL LOCATION} | String | +| nested_types.swift:90:11:90:30 | extractOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:90:24:90:29 | inner1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:90:24:90:29 | inner1 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:90:24:90:29 | inner1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:90:24:90:29 | inner1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:91:5:91:6 | b1 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:91:10:91:15 | inner1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:91:10:91:15 | inner1 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:91:10:91:15 | inner1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:91:10:91:15 | inner1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:91:10:91:25 | ... .getBase(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:93:5:93:10 | inner2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:93:5:93:10 | inner2 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:93:5:93:10 | inner2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:93:5:93:10 | inner2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:93:14:93:32 | ... .Inner | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:93:14:93:32 | ... .Inner | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:93:14:93:32 | ... .Inner | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:93:14:93:32 | ... .Inner | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:93:14:93:48 | ... .Inner(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:93:14:93:48 | ... .Inner(...) | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:93:14:93:48 | ... .Inner(...) | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:93:14:93:48 | ... .Inner(...) | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:93:46:93:47 | 42 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:94:5:94:7 | x2a | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:94:11:94:16 | inner2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:94:11:94:16 | inner2 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:94:11:94:16 | inner2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:94:11:94:16 | inner2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:94:11:94:27 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:95:5:95:7 | x2b | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:95:11:95:30 | extractInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:95:24:95:29 | inner2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:95:24:95:29 | inner2 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:95:24:95:29 | inner2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:95:24:95:29 | inner2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:96:5:96:7 | y2a | | {EXTERNAL LOCATION} | String | +| nested_types.swift:96:11:96:16 | inner2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:96:11:96:16 | inner2 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:96:11:96:16 | inner2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:96:11:96:16 | inner2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:96:11:96:27 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:97:5:97:7 | y2b | | {EXTERNAL LOCATION} | String | +| nested_types.swift:97:11:97:30 | extractOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:97:24:97:29 | inner2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:97:24:97:29 | inner2 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:97:24:97:29 | inner2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:97:24:97:29 | inner2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:98:5:98:6 | b2 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:98:10:98:15 | inner2 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:98:10:98:15 | inner2 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:98:10:98:15 | inner2 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:98:10:98:15 | inner2 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:98:10:98:25 | ... .getBase(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:100:5:100:11 | swapped | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:100:5:100:11 | swapped | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:100:5:100:11 | swapped | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:100:5:100:11 | swapped | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:100:15:100:20 | inner1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:100:15:100:20 | inner1 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:100:15:100:20 | inner1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:100:15:100:20 | inner1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:100:15:100:27 | ... .swap(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:100:15:100:27 | ... .swap(...) | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:100:15:100:27 | ... .swap(...) | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:100:15:100:27 | ... .swap(...) | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:101:5:101:6 | x3 | | {EXTERNAL LOCATION} | String | +| nested_types.swift:101:10:101:16 | swapped | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:101:10:101:16 | swapped | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:101:10:101:16 | swapped | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:101:10:101:16 | swapped | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:101:10:101:27 | ... .getInner(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:102:5:102:6 | y3 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:102:10:102:16 | swapped | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:102:10:102:16 | swapped | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:102:10:102:16 | swapped | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:102:10:102:16 | swapped | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:102:10:102:27 | ... .getOuter(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:103:5:103:6 | b3 | | {EXTERNAL LOCATION} | String | +| nested_types.swift:103:10:103:16 | swapped | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:103:10:103:16 | swapped | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:103:10:103:16 | swapped | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:103:10:103:16 | swapped | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:103:10:103:26 | ... .getBase(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:105:5:105:10 | inner4 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:105:5:105:10 | inner4 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:105:5:105:10 | inner4 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:105:5:105:10 | inner4 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:105:14:105:19 | inner1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:105:14:105:19 | inner1 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:105:14:105:19 | inner1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:105:14:105:19 | inner1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:105:14:105:30 | ... .getSelf1(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:105:14:105:30 | ... .getSelf1(...) | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:105:14:105:30 | ... .getSelf1(...) | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:105:14:105:30 | ... .getSelf1(...) | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:106:5:106:6 | x4 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:106:10:106:15 | inner4 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:106:10:106:15 | inner4 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:106:10:106:15 | inner4 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:106:10:106:15 | inner4 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:106:10:106:26 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:107:5:107:6 | y4 | | {EXTERNAL LOCATION} | String | +| nested_types.swift:107:10:107:15 | inner4 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:107:10:107:15 | inner4 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:107:10:107:15 | inner4 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:107:10:107:15 | inner4 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:107:10:107:26 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:108:5:108:6 | b4 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:108:10:108:15 | inner4 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:108:10:108:15 | inner4 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:108:10:108:15 | inner4 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:108:10:108:15 | inner4 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:108:10:108:25 | ... .getBase(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:110:5:110:10 | inner5 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:110:5:110:10 | inner5 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:110:5:110:10 | inner5 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:110:5:110:10 | inner5 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:110:14:110:19 | inner1 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:110:14:110:19 | inner1 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:110:14:110:19 | inner1 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:110:14:110:19 | inner1 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:110:14:110:30 | ... .getSelf2(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:110:14:110:30 | ... .getSelf2(...) | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:110:14:110:30 | ... .getSelf2(...) | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:110:14:110:30 | ... .getSelf2(...) | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:111:5:111:6 | x5 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:111:10:111:15 | inner5 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:111:10:111:15 | inner5 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:111:10:111:15 | inner5 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:111:10:111:15 | inner5 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:111:10:111:26 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:112:5:112:6 | y5 | | {EXTERNAL LOCATION} | String | +| nested_types.swift:112:10:112:15 | inner5 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:112:10:112:15 | inner5 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:112:10:112:15 | inner5 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:112:10:112:15 | inner5 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:112:10:112:26 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:113:5:113:6 | b5 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:113:10:113:15 | inner5 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:113:10:113:15 | inner5 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:113:10:113:15 | inner5 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:113:10:113:15 | inner5 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:113:10:113:25 | ... .getBase(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:115:5:115:10 | inner6 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:115:5:115:10 | inner6 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:115:5:115:10 | inner6 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:115:5:115:10 | inner6 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:115:14:115:49 | ... .createInner(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:115:14:115:49 | ... .createInner(...) | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:115:14:115:49 | ... .createInner(...) | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:115:14:115:49 | ... .createInner(...) | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:115:44:115:48 | false | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:116:5:116:6 | x6 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:116:10:116:15 | inner6 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:116:10:116:15 | inner6 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:116:10:116:15 | inner6 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:116:10:116:15 | inner6 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:116:10:116:26 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:117:5:117:6 | y6 | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:117:10:117:15 | inner6 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:117:10:117:15 | inner6 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:117:10:117:15 | inner6 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:117:10:117:15 | inner6 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:117:10:117:26 | ... .getOuter(...) | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:118:5:118:6 | b6 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:118:10:118:15 | inner6 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:118:10:118:15 | inner6 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:118:10:118:15 | inner6 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:118:10:118:15 | inner6 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:118:10:118:25 | ... .getBase(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:120:5:120:10 | inner7 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:120:5:120:10 | inner7 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:120:5:120:10 | inner7 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:120:5:120:10 | inner7 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:120:14:120:29 | ... .InnerAlias | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:120:14:120:29 | ... .InnerAlias | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:120:14:120:29 | ... .InnerAlias | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:120:14:120:29 | ... .InnerAlias | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:120:14:120:63 | ... .InnerAlias(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:120:14:120:63 | ... .InnerAlias(...) | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:120:14:120:63 | ... .InnerAlias(...) | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:120:14:120:63 | ... .InnerAlias(...) | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:120:43:120:43 | 0 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:120:58:120:62 | false | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:121:5:121:7 | x11 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:121:11:121:16 | inner7 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:121:11:121:16 | inner7 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:121:11:121:16 | inner7 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:121:11:121:16 | inner7 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:121:11:121:27 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:122:5:122:7 | y11 | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:122:11:122:16 | inner7 | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:122:11:122:16 | inner7 | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:122:11:122:16 | inner7 | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:122:11:122:16 | inner7 | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:122:11:122:27 | ... .getOuter(...) | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:130:13:130:16 | self | | nested_types.swift:125:5:141:5 | Outer.Inner.InnerMost | +| nested_types.swift:130:13:130:16 | self | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:130:13:130:16 | self | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:130:13:130:16 | self | (parent:InnerMost).(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:130:13:130:16 | self | (parent:InnerMost).TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:131:13:131:16 | self | | nested_types.swift:125:5:141:5 | Outer.Inner.InnerMost | +| nested_types.swift:131:13:131:16 | self | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:131:13:131:16 | self | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:131:13:131:16 | self | (parent:InnerMost).(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:131:13:131:16 | self | (parent:InnerMost).TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:135:20:135:23 | self | | nested_types.swift:125:5:141:5 | Outer.Inner.InnerMost | +| nested_types.swift:135:20:135:23 | self | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:135:20:135:23 | self | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:135:20:135:23 | self | (parent:InnerMost).(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:135:20:135:23 | self | (parent:InnerMost).TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:139:20:139:23 | self | | nested_types.swift:125:5:141:5 | Outer.Inner.InnerMost | +| nested_types.swift:139:20:139:23 | self | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:139:20:139:23 | self | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:139:20:139:23 | self | (parent:InnerMost).(parent:Inner).TOuter | nested_types.swift:13:13:13:18 | TOuter | +| nested_types.swift:139:20:139:23 | self | (parent:InnerMost).TInner | nested_types.swift:14:17:14:22 | TInner | +| nested_types.swift:144:5:144:13 | innerMost | | nested_types.swift:125:5:141:5 | Outer.Inner.InnerMost | +| nested_types.swift:144:5:144:13 | innerMost | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:144:5:144:13 | innerMost | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:144:17:144:37 | ... .InnerMost | | nested_types.swift:125:5:141:5 | Outer.Inner.InnerMost | +| nested_types.swift:144:17:144:37 | ... .InnerMost | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:144:17:144:37 | ... .InnerMost | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:144:17:144:51 | ... .InnerMost(...) | | nested_types.swift:125:5:141:5 | Outer.Inner.InnerMost | +| nested_types.swift:144:17:144:51 | ... .InnerMost(...) | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:144:17:144:51 | ... .InnerMost(...) | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:144:42:144:43 | "" | | {EXTERNAL LOCATION} | String | +| nested_types.swift:144:49:144:50 | 42 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:145:10:145:18 | innerMost | | nested_types.swift:125:5:141:5 | Outer.Inner.InnerMost | +| nested_types.swift:145:10:145:18 | innerMost | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:145:10:145:18 | innerMost | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:146:10:146:18 | innerMost | | nested_types.swift:125:5:141:5 | Outer.Inner.InnerMost | +| nested_types.swift:146:10:146:18 | innerMost | (parent:InnerMost) | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:146:10:146:18 | innerMost | (parent:InnerMost).(parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:149:14:149:14 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:149:14:149:14 | x | (parent:Inner) | nested_types.swift:148:1:153:1 | SubOuter | +| nested_types.swift:149:14:149:14 | x | (parent:Inner).TSubOuter | nested_types.swift:148:16:148:24 | TSubOuter | +| nested_types.swift:149:14:149:14 | x | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:150:19:150:19 | x | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:150:19:150:19 | x | (parent:Inner) | nested_types.swift:148:1:153:1 | SubOuter | +| nested_types.swift:150:19:150:19 | x | (parent:Inner).TSubOuter | nested_types.swift:148:16:148:24 | TSubOuter | +| nested_types.swift:150:19:150:19 | x | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:155:5:155:12 | subOuter | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:155:5:155:12 | subOuter | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:155:5:155:12 | subOuter | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Array | +| nested_types.swift:155:5:155:12 | subOuter | (parent:Inner).TOuter.Element | {EXTERNAL LOCATION} | Int | +| nested_types.swift:155:5:155:12 | subOuter | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:155:16:155:58 | ... .createInner(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:155:16:155:58 | ... .createInner(...) | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:155:16:155:58 | ... .createInner(...) | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Array | +| nested_types.swift:155:16:155:58 | ... .createInner(...) | (parent:Inner).TOuter.Element | {EXTERNAL LOCATION} | Int | +| nested_types.swift:155:16:155:58 | ... .createInner(...) | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:155:54:155:57 | ArrayLiteral | | {EXTERNAL LOCATION} | Array | +| nested_types.swift:155:54:155:57 | ArrayLiteral | Element | {EXTERNAL LOCATION} | Int | +| nested_types.swift:155:55:155:56 | 42 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:156:5:156:6 | x8 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:156:10:156:17 | subOuter | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:156:10:156:17 | subOuter | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:156:10:156:17 | subOuter | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Array | +| nested_types.swift:156:10:156:17 | subOuter | (parent:Inner).TOuter.Element | {EXTERNAL LOCATION} | Int | +| nested_types.swift:156:10:156:17 | subOuter | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:156:10:156:28 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:157:5:157:6 | y8 | | {EXTERNAL LOCATION} | Array | +| nested_types.swift:157:5:157:6 | y8 | Element | {EXTERNAL LOCATION} | Int | +| nested_types.swift:157:10:157:17 | subOuter | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:157:10:157:17 | subOuter | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:157:10:157:17 | subOuter | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Array | +| nested_types.swift:157:10:157:17 | subOuter | (parent:Inner).TOuter.Element | {EXTERNAL LOCATION} | Int | +| nested_types.swift:157:10:157:17 | subOuter | TInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:157:10:157:28 | ... .getOuter(...) | | {EXTERNAL LOCATION} | Array | +| nested_types.swift:157:10:157:28 | ... .getOuter(...) | Element | {EXTERNAL LOCATION} | Int | +| nested_types.swift:159:5:159:12 | subInner | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:159:5:159:12 | subInner | (parent:SubInner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:159:5:159:12 | subInner | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:159:5:159:12 | subInner | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:159:16:159:29 | ... .SubInner | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:159:16:159:29 | ... .SubInner | (parent:SubInner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:159:16:159:29 | ... .SubInner | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:159:16:159:29 | ... .SubInner | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:159:16:159:62 | ... .SubInner(...) | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:159:16:159:62 | ... .SubInner(...) | (parent:SubInner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:159:16:159:62 | ... .SubInner(...) | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:159:16:159:62 | ... .SubInner(...) | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:159:43:159:46 | true | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:159:61:159:61 | 0 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:160:5:160:6 | x9 | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:160:10:160:17 | subInner | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:160:10:160:17 | subInner | (parent:SubInner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:160:10:160:17 | subInner | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:160:10:160:17 | subInner | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:160:10:160:28 | ... .getInner(...) | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:161:5:161:6 | y9 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:161:10:161:17 | subInner | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:161:10:161:17 | subInner | (parent:SubInner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:161:10:161:17 | subInner | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:161:10:161:17 | subInner | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:161:10:161:28 | ... .getOuter(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:163:5:163:13 | subInner2 | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:163:5:163:13 | subInner2 | (parent:SubInner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:163:5:163:13 | subInner2 | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:163:5:163:13 | subInner2 | TSubInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:163:46:163:59 | ... .SubInner | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:163:46:163:59 | ... .SubInner | (parent:SubInner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:163:46:163:59 | ... .SubInner | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:163:46:163:59 | ... .SubInner | TSubInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:163:46:163:74 | ... .SubInner(...) | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:163:46:163:74 | ... .SubInner(...) | (parent:SubInner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:163:46:163:74 | ... .SubInner(...) | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:163:46:163:74 | ... .SubInner(...) | TSubInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:163:73:163:73 | 1 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:164:5:164:7 | x12 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:164:11:164:19 | subInner2 | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:164:11:164:19 | subInner2 | (parent:SubInner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:164:11:164:19 | subInner2 | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:164:11:164:19 | subInner2 | TSubInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:164:11:164:30 | ... .getInner(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:165:5:165:7 | y12 | | {EXTERNAL LOCATION} | String | +| nested_types.swift:165:11:165:19 | subInner2 | | nested_types.swift:49:5:49:50 | Outer.SubInner | +| nested_types.swift:165:11:165:19 | subInner2 | (parent:SubInner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:165:11:165:19 | subInner2 | (parent:SubInner).TOuter | {EXTERNAL LOCATION} | String | +| nested_types.swift:165:11:165:19 | subInner2 | TSubInner | {EXTERNAL LOCATION} | Int | +| nested_types.swift:165:11:165:30 | ... .getOuter(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:169:5:169:19 | subInnerOutside | | nested_types.swift:167:1:167:70 | SubInnerOutside | +| nested_types.swift:169:5:169:19 | subInnerOutside | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:169:23:169:37 | SubInnerOutside | | nested_types.swift:167:1:167:70 | SubInnerOutside | +| nested_types.swift:169:23:169:37 | SubInnerOutside | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:169:23:169:74 | SubInnerOutside(...) | | nested_types.swift:167:1:167:70 | SubInnerOutside | +| nested_types.swift:169:23:169:74 | SubInnerOutside(...) | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:169:51:169:54 | true | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:169:69:169:73 | false | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:170:5:170:7 | x10 | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:170:11:170:25 | subInnerOutside | | nested_types.swift:167:1:167:70 | SubInnerOutside | +| nested_types.swift:170:11:170:25 | subInnerOutside | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:170:11:170:36 | ... .getInner(...) | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:171:5:171:7 | y10 | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:171:11:171:25 | subInnerOutside | | nested_types.swift:167:1:167:70 | SubInnerOutside | +| nested_types.swift:171:11:171:25 | subInnerOutside | TSubInner | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:171:11:171:36 | ... .getOuter(...) | | {EXTERNAL LOCATION} | Bool | +| nested_types.swift:175:13:175:13 | x | | nested_types.swift:174:5:176:5 | Node.Leaf | +| nested_types.swift:175:13:175:13 | x | (parent:Leaf) | nested_types.swift:173:1:177:1 | Node | +| nested_types.swift:175:23:175:26 | Leaf | | nested_types.swift:174:5:176:5 | Node.Leaf | +| nested_types.swift:175:23:175:26 | Leaf | (parent:Leaf) | nested_types.swift:173:1:177:1 | Node | +| nested_types.swift:175:23:175:28 | Leaf(...) | | nested_types.swift:174:5:176:5 | Node.Leaf | +| nested_types.swift:175:23:175:28 | Leaf(...) | (parent:Leaf) | nested_types.swift:173:1:177:1 | Node | +| nested_types.swift:181:5:181:10 | holder | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:181:5:181:10 | holder | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:181:5:181:10 | holder | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:181:5:181:10 | holder | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:181:14:181:25 | ... .Fixed | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:181:14:181:25 | ... .Fixed | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:181:14:181:25 | ... .Fixed | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:181:14:181:25 | ... .Fixed | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:181:14:181:41 | ... .Fixed(...) | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:181:14:181:41 | ... .Fixed(...) | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:181:14:181:41 | ... .Fixed(...) | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:181:14:181:41 | ... .Fixed(...) | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:181:39:181:40 | "" | | {EXTERNAL LOCATION} | String | +| nested_types.swift:182:5:182:7 | x13 | | {EXTERNAL LOCATION} | String | +| nested_types.swift:182:11:182:16 | holder | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:182:11:182:16 | holder | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:182:11:182:16 | holder | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:182:11:182:16 | holder | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:182:11:182:27 | ... .getInner(...) | | {EXTERNAL LOCATION} | String | +| nested_types.swift:183:5:183:7 | y13 | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:183:11:183:16 | holder | | nested_types.swift:14:5:47:5 | Outer.Inner | +| nested_types.swift:183:11:183:16 | holder | (parent:Inner) | nested_types.swift:13:1:76:1 | Outer | +| nested_types.swift:183:11:183:16 | holder | (parent:Inner).TOuter | {EXTERNAL LOCATION} | Int | +| nested_types.swift:183:11:183:16 | holder | TInner | {EXTERNAL LOCATION} | String | +| nested_types.swift:183:11:183:27 | ... .getOuter(...) | | {EXTERNAL LOCATION} | Int | +| nested_types.swift:190:14:190:14 | x | | nested_types.swift:185:1:191:1 | Box | +| nested_types.swift:190:14:190:14 | x | T | {EXTERNAL LOCATION} | Int | +| nested_types.swift:190:27:190:27 | y | | nested_types.swift:185:1:191:1 | Box | +| nested_types.swift:190:27:190:27 | y | T | nested_types.swift:185:11:185:11 | T | | 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 +3320,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 | @@ -3022,10 +3759,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 | @@ -3113,4 +3853,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 +}