| OLD | NEW | 
|---|
| 1 // Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file | 
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a | 
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. | 
| 4 | 4 | 
| 5 library fasta.class_builder; | 5 library fasta.class_builder; | 
| 6 | 6 | 
|  | 7 import '../errors.dart' show internalError; | 
|  | 8 | 
| 7 import 'builder.dart' | 9 import 'builder.dart' | 
| 8     show | 10     show | 
| 9         Builder, | 11         Builder, | 
| 10         ConstructorReferenceBuilder, | 12         ConstructorReferenceBuilder, | 
| 11         LibraryBuilder, | 13         LibraryBuilder, | 
| 12         MetadataBuilder, | 14         MetadataBuilder, | 
|  | 15         MixinApplicationBuilder, | 
|  | 16         NamedTypeBuilder, | 
| 13         TypeBuilder, | 17         TypeBuilder, | 
| 14         TypeDeclarationBuilder, | 18         TypeDeclarationBuilder, | 
| 15         TypeVariableBuilder; | 19         TypeVariableBuilder; | 
| 16 | 20 | 
| 17 import 'scope.dart' show AmbiguousBuilder, Scope; | 21 import 'scope.dart' show AmbiguousBuilder, Scope; | 
| 18 | 22 | 
| 19 abstract class ClassBuilder<T extends TypeBuilder, R> | 23 abstract class ClassBuilder<T extends TypeBuilder, R> | 
| 20     extends TypeDeclarationBuilder<T, R> { | 24     extends TypeDeclarationBuilder<T, R> { | 
| 21   final List<TypeVariableBuilder> typeVariables; | 25   final List<TypeVariableBuilder> typeVariables; | 
| 22 | 26 | 
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 93     if (builder == null) { | 97     if (builder == null) { | 
| 94       return null; | 98       return null; | 
| 95     } else if (isSetter && builder.isGetter) { | 99     } else if (isSetter && builder.isGetter) { | 
| 96       return null; | 100       return null; | 
| 97     } else { | 101     } else { | 
| 98       return builder.isInstanceMember ? null : builder; | 102       return builder.isInstanceMember ? null : builder; | 
| 99     } | 103     } | 
| 100   } | 104   } | 
| 101 | 105 | 
| 102   Builder findConstructorOrFactory(String name); | 106   Builder findConstructorOrFactory(String name); | 
|  | 107 | 
|  | 108   /// Returns a map which maps the type variables of [superclass] to their | 
|  | 109   /// respective values as defined by the superclass clause of this class (and | 
|  | 110   /// its superclasses). | 
|  | 111   /// | 
|  | 112   /// It's assumed that [superclass] is a superclass of this class. | 
|  | 113   /// | 
|  | 114   /// For example, given: | 
|  | 115   /// | 
|  | 116   ///     class Box<T> {} | 
|  | 117   ///     class BeatBox extends Box<Beat> {} | 
|  | 118   ///     class Beat {} | 
|  | 119   /// | 
|  | 120   /// We have: | 
|  | 121   /// | 
|  | 122   ///     [[BeatBox]].getSubstitutionMap([[Box]]) -> {[[Box::T]]: Beat]]}. | 
|  | 123   /// | 
|  | 124   /// This method returns null if the map is empty, and it's an error if | 
|  | 125   /// [superclass] isn't a superclass. | 
|  | 126   Map<TypeVariableBuilder, TypeBuilder> getSubstitutionMap( | 
|  | 127       ClassBuilder superclass, | 
|  | 128       Uri fileUri, | 
|  | 129       int charOffset, | 
|  | 130       TypeBuilder dynamicType) { | 
|  | 131     TypeBuilder supertype = this.supertype; | 
|  | 132     Map<TypeVariableBuilder, TypeBuilder> substitutionMap; | 
|  | 133     List arguments; | 
|  | 134     List variables; | 
|  | 135     Builder builder; | 
|  | 136     while (builder != superclass) { | 
|  | 137       if (supertype is NamedTypeBuilder) { | 
|  | 138         NamedTypeBuilder t = supertype; | 
|  | 139         builder = t.builder; | 
|  | 140         arguments = t.arguments; | 
|  | 141         if (builder is ClassBuilder) { | 
|  | 142           variables = builder.typeVariables; | 
|  | 143           if (builder != superclass) { | 
|  | 144             supertype = builder.supertype; | 
|  | 145           } | 
|  | 146         } | 
|  | 147       } else if (supertype is MixinApplicationBuilder) { | 
|  | 148         MixinApplicationBuilder t = supertype; | 
|  | 149         supertype = t.supertype; | 
|  | 150       } else { | 
|  | 151         internalError("Superclass not found.", fileUri, charOffset); | 
|  | 152       } | 
|  | 153       if (variables != null) { | 
|  | 154         Map<TypeVariableBuilder, TypeBuilder> directSubstitutionMap = | 
|  | 155             <TypeVariableBuilder, TypeBuilder>{}; | 
|  | 156         arguments ??= const []; | 
|  | 157         for (int i = 0; i < variables.length; i++) { | 
|  | 158           TypeBuilder argument = | 
|  | 159               arguments.length < i ? arguments[i] : dynamicType; | 
|  | 160           if (substitutionMap != null) { | 
|  | 161             argument = argument.subst(substitutionMap); | 
|  | 162           } | 
|  | 163           directSubstitutionMap[variables[i]] = argument; | 
|  | 164         } | 
|  | 165         substitutionMap = directSubstitutionMap; | 
|  | 166       } | 
|  | 167     } | 
|  | 168     return substitutionMap; | 
|  | 169   } | 
| 103 } | 170 } | 
| OLD | NEW | 
|---|