|  | // Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | /*element: main:[null]*/ | 
|  | main() { | 
|  | thisExact(); | 
|  | thisSubclass(); | 
|  | thisSubclassExact(); | 
|  | thisSubtype(); | 
|  | thisSubtypeExact(); | 
|  | thisSubtypeMixedIn(); | 
|  | thisSubtypeExactMixedIn(); | 
|  | } | 
|  |  | 
|  | //////////////////////////////////////////////////////////////////////////////// | 
|  | /// Return `this` of a class with no subclasses. | 
|  | //////////////////////////////////////////////////////////////////////////////// | 
|  |  | 
|  | /*element: Class1.:[exact=Class1]*/ | 
|  | class Class1 { | 
|  | /*element: Class1.method:[exact=Class1]*/ | 
|  | method() => this; | 
|  | } | 
|  |  | 
|  | /*element: thisExact:[exact=Class1]*/ | 
|  | thisExact() => new Class1(). /*invoke: [exact=Class1]*/ method(); | 
|  |  | 
|  | //////////////////////////////////////////////////////////////////////////////// | 
|  | /// Return `this` of a class with an instantiated subclass. | 
|  | //////////////////////////////////////////////////////////////////////////////// | 
|  |  | 
|  | /*element: Class2a.:[exact=Class2a]*/ | 
|  | class Class2a { | 
|  | /*element: Class2a.method:[subclass=Class2a]*/ | 
|  | method() => this; | 
|  | } | 
|  |  | 
|  | /*element: Class2b.:[exact=Class2b]*/ | 
|  | class Class2b extends Class2a {} | 
|  |  | 
|  | /*element: thisSubclass:[subclass=Class2a]*/ | 
|  | thisSubclass() { | 
|  | new Class2b(); | 
|  | return new Class2a(). /*invoke: [exact=Class2a]*/ method(); | 
|  | } | 
|  |  | 
|  | //////////////////////////////////////////////////////////////////////////////// | 
|  | /// Return `this` of a class with no instantiated subclasses. | 
|  | //////////////////////////////////////////////////////////////////////////////// | 
|  |  | 
|  | /*element: Class3a.:[exact=Class3a]*/ | 
|  | class Class3a { | 
|  | /*element: Class3a.method:[exact=Class3a]*/ | 
|  | method() => this; | 
|  | } | 
|  |  | 
|  | class Class3b extends Class3a {} | 
|  |  | 
|  | /*element: thisSubclassExact:[exact=Class3a]*/ | 
|  | thisSubclassExact() { | 
|  | return new Class3a(). /*invoke: [exact=Class3a]*/ method(); | 
|  | } | 
|  |  | 
|  | //////////////////////////////////////////////////////////////////////////////// | 
|  | /// Return `this` of a class that is mixed into an instantiated class. | 
|  | //////////////////////////////////////////////////////////////////////////////// | 
|  |  | 
|  | /*element: Class4a.:[exact=Class4a]*/ | 
|  | class Class4a { | 
|  | /*element: Class4a.method:[subtype=Class4a]*/ | 
|  | method() => this; | 
|  | } | 
|  |  | 
|  | /*element: Class4b.:[exact=Class4b]*/ | 
|  | class Class4b extends Object with Class4a {} | 
|  |  | 
|  | /*element: thisSubtype:[subtype=Class4a]*/ | 
|  | thisSubtype() { | 
|  | new Class4b(); | 
|  | return new Class4a(). /*invoke: [exact=Class4a]*/ method(); | 
|  | } | 
|  |  | 
|  | //////////////////////////////////////////////////////////////////////////////// | 
|  | /// Return `this` of a class that is mixed into an uninstantiated class. | 
|  | //////////////////////////////////////////////////////////////////////////////// | 
|  |  | 
|  | /*element: Class5a.:[exact=Class5a]*/ | 
|  | class Class5a { | 
|  | /*element: Class5a.method:[exact=Class5a]*/ | 
|  | method() => this; | 
|  | } | 
|  |  | 
|  | class Class5b extends Object with Class5a {} | 
|  |  | 
|  | /*element: thisSubtypeExact:[exact=Class5a]*/ | 
|  | thisSubtypeExact() { | 
|  | return new Class5a(). /*invoke: [exact=Class5a]*/ method(); | 
|  | } | 
|  |  | 
|  | //////////////////////////////////////////////////////////////////////////////// | 
|  | /// Return `this` of a mixed in class that is itself instantiated. | 
|  | //////////////////////////////////////////////////////////////////////////////// | 
|  |  | 
|  | /*element: Class6a.:[exact=Class6a]*/ | 
|  | class Class6a { | 
|  | /*element: Class6a.method:[subtype=Class6a]*/ | 
|  | method() => this; | 
|  | } | 
|  |  | 
|  | /*element: Class6b.:[exact=Class6b]*/ | 
|  | class Class6b extends Object with Class6a {} | 
|  |  | 
|  | /*element: thisSubtypeMixedIn:[subtype=Class6a]*/ | 
|  | thisSubtypeMixedIn() { | 
|  | new Class6a(); | 
|  | return new Class6b(). /*invoke: [exact=Class6b]*/ method(); | 
|  | } | 
|  |  | 
|  | //////////////////////////////////////////////////////////////////////////////// | 
|  | /// Return `this` of a mixed in class that is itself uninstantiated. | 
|  | //////////////////////////////////////////////////////////////////////////////// | 
|  |  | 
|  | class Class7a { | 
|  | /*element: Class7a.method:[exact=Class7b]*/ | 
|  | method() => this; | 
|  | } | 
|  |  | 
|  | /*element: Class7b.:[exact=Class7b]*/ | 
|  | class Class7b extends Object with Class7a {} | 
|  |  | 
|  | /*element: thisSubtypeExactMixedIn:[exact=Class7b]*/ | 
|  | thisSubtypeExactMixedIn() { | 
|  | return new Class7b(). /*invoke: [exact=Class7b]*/ method(); | 
|  | } |