Chromium Code Reviews| 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.kernel_library_builder; | 5 library fasta.kernel_library_builder; |
| 6 | 6 |
| 7 import 'package:kernel/ast.dart'; | 7 import 'package:kernel/ast.dart'; |
| 8 | 8 |
| 9 import 'package:kernel/clone.dart' show | 9 import 'package:kernel/clone.dart' show |
| 10 CloneVisitor; | 10 CloneVisitor; |
| 11 | 11 |
| 12 import '../errors.dart' show | 12 import '../errors.dart' show |
| 13 internalError; | 13 internalError; |
| 14 | 14 |
| 15 import '../loader.dart' show | 15 import '../loader.dart' show |
| 16 Loader; | 16 Loader; |
| 17 | 17 |
| 18 import '../modifier.dart' show | 18 import '../modifier.dart' show |
| 19 abstractMask, | |
| 19 staticMask; | 20 staticMask; |
| 20 | 21 |
| 21 import '../source/source_library_builder.dart' show | 22 import '../source/source_library_builder.dart' show |
| 23 DeclarationBuilder, | |
| 22 SourceLibraryBuilder; | 24 SourceLibraryBuilder; |
| 23 | 25 |
| 24 import '../source/source_class_builder.dart' show | 26 import '../source/source_class_builder.dart' show |
| 25 SourceClassBuilder; | 27 SourceClassBuilder; |
| 26 | 28 |
| 27 import '../util/relativize.dart' show | 29 import '../util/relativize.dart' show |
| 28 relativizeUri; | 30 relativizeUri; |
| 29 | 31 |
| 30 import 'kernel_builder.dart' show | 32 import 'kernel_builder.dart' show |
| 31 Builder, | 33 Builder, |
| 32 ClassBuilder, | 34 ClassBuilder, |
| 33 ConstructorReferenceBuilder, | 35 ConstructorReferenceBuilder, |
| 34 DynamicTypeBuilder, | 36 DynamicTypeBuilder, |
| 35 FormalParameterBuilder, | 37 FormalParameterBuilder, |
| 36 FunctionTypeAliasBuilder, | 38 FunctionTypeAliasBuilder, |
| 39 KernelConstructorBuilder, | |
| 37 KernelEnumBuilder, | 40 KernelEnumBuilder, |
| 38 KernelFieldBuilder, | 41 KernelFieldBuilder, |
| 39 KernelFormalParameterBuilder, | 42 KernelFormalParameterBuilder, |
| 40 KernelFunctionTypeAliasBuilder, | 43 KernelFunctionTypeAliasBuilder, |
| 41 KernelInvalidTypeBuilder, | 44 KernelInvalidTypeBuilder, |
| 42 KernelMixinApplicationBuilder, | 45 KernelMixinApplicationBuilder, |
| 43 KernelNamedMixinApplicationBuilder, | 46 KernelNamedMixinApplicationBuilder, |
| 44 KernelNamedTypeBuilder, | 47 KernelNamedTypeBuilder, |
| 45 KernelProcedureBuilder, | 48 KernelProcedureBuilder, |
| 46 KernelTypeBuilder, | 49 KernelTypeBuilder, |
| 47 KernelTypeVariableBuilder, | 50 KernelTypeVariableBuilder, |
| 48 MemberBuilder, | 51 MemberBuilder, |
| 49 MetadataBuilder, | 52 MetadataBuilder, |
| 50 MixedAccessor, | 53 MixedAccessor, |
| 51 NamedMixinApplicationBuilder, | 54 NamedMixinApplicationBuilder, |
| 52 PrefixBuilder, | 55 PrefixBuilder, |
| 56 ProcedureBuilder, | |
| 57 TypeBuilder, | |
| 53 TypeVariableBuilder; | 58 TypeVariableBuilder; |
| 54 | 59 |
| 55 class KernelLibraryBuilder | 60 class KernelLibraryBuilder |
| 56 extends SourceLibraryBuilder<KernelTypeBuilder, Library> { | 61 extends SourceLibraryBuilder<KernelTypeBuilder, Library> { |
| 57 final Library library; | 62 final Library library; |
| 58 | 63 |
| 59 final List<Class> mixinApplicationClasses = <Class>[]; | 64 final List<Class> mixinApplicationClasses = <Class>[]; |
| 60 | 65 |
| 61 final List<List> argumentsWithMissingDefaultValues = <List>[]; | 66 final List<List> argumentsWithMissingDefaultValues = <List>[]; |
| 62 | 67 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 99 new List<ConstructorReferenceBuilder>.from(constructorReferences), | 104 new List<ConstructorReferenceBuilder>.from(constructorReferences), |
| 100 charOffset); | 105 charOffset); |
| 101 constructorReferences.clear(); | 106 constructorReferences.clear(); |
| 102 classMembers.forEach((String name, MemberBuilder builder) { | 107 classMembers.forEach((String name, MemberBuilder builder) { |
| 103 while (builder != null) { | 108 while (builder != null) { |
| 104 builder.parent = cls; | 109 builder.parent = cls; |
| 105 builder = builder.next; | 110 builder = builder.next; |
| 106 } | 111 } |
| 107 }); | 112 }); |
| 108 // Nested declaration began in `OutlineBuilder.beginClassDeclaration`. | 113 // Nested declaration began in `OutlineBuilder.beginClassDeclaration`. |
| 109 endNestedDeclaration().resolveTypes(typeVariables); | 114 endNestedDeclaration().resolveTypes(typeVariables, this); |
| 110 addBuilder(className, cls, charOffset); | 115 addBuilder(className, cls, charOffset); |
| 111 } | 116 } |
| 112 | 117 |
| 113 void addNamedMixinApplication( | 118 void addNamedMixinApplication( |
| 114 List<MetadataBuilder> metadata, String name, | 119 List<MetadataBuilder> metadata, String name, |
| 115 List<TypeVariableBuilder> typeVariables, int modifiers, | 120 List<TypeVariableBuilder> typeVariables, int modifiers, |
| 116 KernelTypeBuilder mixinApplication, List<KernelTypeBuilder> interfaces, | 121 KernelTypeBuilder mixinApplication, List<KernelTypeBuilder> interfaces, |
| 117 int charOffset) { | 122 int charOffset) { |
| 118 NamedMixinApplicationBuilder builder = | 123 NamedMixinApplicationBuilder builder = |
| 119 new KernelNamedMixinApplicationBuilder(metadata, name, typeVariables, | 124 new KernelNamedMixinApplicationBuilder(metadata, name, typeVariables, |
| 120 modifiers, mixinApplication, interfaces, this, charOffset); | 125 modifiers, mixinApplication, interfaces, this, charOffset); |
| 121 // Nested declaration began in `OutlineBuilder.beginNamedMixinApplication`. | 126 // Nested declaration began in `OutlineBuilder.beginNamedMixinApplication`. |
| 122 endNestedDeclaration().resolveTypes(typeVariables); | 127 endNestedDeclaration().resolveTypes(typeVariables, this); |
| 123 addBuilder(name, builder, charOffset); | 128 addBuilder(name, builder, charOffset); |
| 124 } | 129 } |
| 125 | 130 |
| 126 void addField(List<MetadataBuilder> metadata, | 131 void addField(List<MetadataBuilder> metadata, |
| 127 int modifiers, KernelTypeBuilder type, String name, int charOffset) { | 132 int modifiers, KernelTypeBuilder type, String name, int charOffset) { |
| 128 addBuilder(name, new KernelFieldBuilder( | 133 addBuilder(name, new KernelFieldBuilder( |
| 129 metadata, type, name, modifiers, this, charOffset), charOffset); | 134 metadata, type, name, modifiers, this, charOffset), charOffset); |
| 130 } | 135 } |
| 131 | 136 |
| 132 void addProcedure(List<MetadataBuilder> metadata, | 137 void addProcedure(List<MetadataBuilder> metadata, |
| 133 int modifiers, KernelTypeBuilder returnType, String name, | 138 int modifiers, KernelTypeBuilder returnType, String name, |
| 134 List<TypeVariableBuilder> typeVariables, | 139 List<TypeVariableBuilder> typeVariables, |
| 135 List<FormalParameterBuilder> formals, AsyncMarker asyncModifier, | 140 List<FormalParameterBuilder> formals, AsyncMarker asyncModifier, |
| 136 ProcedureKind kind, int charOffset, {bool isTopLevel}) { | 141 ProcedureKind kind, int charOffset, {bool isTopLevel}) { |
| 137 // Nested declaration began in `OutlineBuilder.beginMethod` or | 142 // Nested declaration began in `OutlineBuilder.beginMethod` or |
| 138 // `OutlineBuilder.beginTopLevelMethod`. | 143 // `OutlineBuilder.beginTopLevelMethod`. |
| 139 endNestedDeclaration().resolveTypes(typeVariables); | 144 endNestedDeclaration().resolveTypes(typeVariables, this); |
| 140 addBuilder(name, | 145 ProcedureBuilder procedure; |
| 141 new KernelProcedureBuilder(metadata, modifiers, returnType, name, | 146 if (!isTopLevel && isConstructorName(name, currentDeclaration.name)) { |
| 142 typeVariables, formals, asyncModifier, kind, this, charOffset), | 147 int index = name.indexOf("."); |
| 143 charOffset); | 148 name = index == -1 ? "" : name.substring(index + 1); |
| 149 procedure = new KernelConstructorBuilder(metadata, | |
| 150 modifiers & ~abstractMask, returnType, name, typeVariables, formals, | |
| 151 this, charOffset); | |
| 152 } else { | |
| 153 procedure = new KernelProcedureBuilder(metadata, modifiers, returnType, | |
| 154 name, typeVariables, formals, asyncModifier, kind, this, charOffset); | |
| 155 } | |
| 156 addBuilder(name, procedure, charOffset); | |
| 144 } | 157 } |
| 145 | 158 |
| 146 void addFactoryMethod(List<MetadataBuilder> metadata, | 159 void addFactoryMethod(List<MetadataBuilder> metadata, |
| 147 ConstructorReferenceBuilder constructorName, | 160 ConstructorReferenceBuilder constructorName, |
| 148 List<FormalParameterBuilder> formals, AsyncMarker asyncModifier, | 161 List<FormalParameterBuilder> formals, AsyncMarker asyncModifier, |
| 149 ConstructorReferenceBuilder redirectionTarget, int charOffset) { | 162 ConstructorReferenceBuilder redirectionTarget, int charOffset) { |
| 150 // Nested declaration began in `OutlineBuilder.beginFactoryMethod`. | 163 // Nested declaration began in `OutlineBuilder.beginFactoryMethod`. |
| 151 endNestedDeclaration().resolveTypes(null); | 164 DeclarationBuilder<KernelTypeBuilder> factoryDeclaration = |
| 165 endNestedDeclaration(); | |
| 152 String name = constructorName.name; | 166 String name = constructorName.name; |
| 167 int index = name.indexOf("."); | |
| 168 name = index == -1 ? "" : name.substring(index + 1); | |
| 153 assert(constructorName.suffix == null); | 169 assert(constructorName.suffix == null); |
| 154 addBuilder(name, | 170 KernelProcedureBuilder procedure = new KernelProcedureBuilder(metadata, |
| 155 new KernelProcedureBuilder(metadata, staticMask, null, name, null, | 171 staticMask, null, name, <TypeVariableBuilder>[], formals, asyncModifier, |
| 156 formals, asyncModifier, ProcedureKind.Factory, this, charOffset, | 172 ProcedureKind.Factory, this, charOffset, redirectionTarget); |
| 157 redirectionTarget), charOffset); | 173 currentDeclaration.addFactoryDeclaration(procedure, factoryDeclaration); |
| 174 addBuilder(name, procedure, charOffset); | |
| 158 } | 175 } |
| 159 | 176 |
| 160 void addEnum(List<MetadataBuilder> metadata, String name, | 177 void addEnum(List<MetadataBuilder> metadata, String name, |
| 161 List<String> constants, int charOffset) { | 178 List<String> constants, int charOffset) { |
| 162 addBuilder(name, | 179 addBuilder(name, |
| 163 new KernelEnumBuilder(metadata, name, constants, this, charOffset), | 180 new KernelEnumBuilder(metadata, name, constants, this, charOffset), |
| 164 charOffset); | 181 charOffset); |
| 165 } | 182 } |
| 166 | 183 |
| 167 void addFunctionTypeAlias(List<MetadataBuilder> metadata, | 184 void addFunctionTypeAlias(List<MetadataBuilder> metadata, |
| 168 KernelTypeBuilder returnType, String name, | 185 KernelTypeBuilder returnType, String name, |
| 169 List<TypeVariableBuilder> typeVariables, | 186 List<TypeVariableBuilder> typeVariables, |
| 170 List<FormalParameterBuilder> formals, int charOffset) { | 187 List<FormalParameterBuilder> formals, int charOffset) { |
| 171 FunctionTypeAliasBuilder typedef = new KernelFunctionTypeAliasBuilder( | 188 FunctionTypeAliasBuilder typedef = new KernelFunctionTypeAliasBuilder( |
| 172 metadata, returnType, name, typeVariables, formals, this, charOffset); | 189 metadata, returnType, name, typeVariables, formals, this, charOffset); |
| 173 // Nested declaration began in `OutlineBuilder.beginFunctionTypeAlias`. | 190 // Nested declaration began in `OutlineBuilder.beginFunctionTypeAlias`. |
| 174 endNestedDeclaration().resolveTypes(typeVariables); | 191 endNestedDeclaration().resolveTypes(typeVariables, this); |
| 175 addBuilder(name, typedef, charOffset); | 192 addBuilder(name, typedef, charOffset); |
| 176 } | 193 } |
| 177 | 194 |
| 178 KernelFormalParameterBuilder addFormalParameter( | 195 KernelFormalParameterBuilder addFormalParameter( |
| 179 List<MetadataBuilder> metadata, int modifiers, | 196 List<MetadataBuilder> metadata, int modifiers, |
| 180 KernelTypeBuilder type, String name, bool hasThis, int charOffset) { | 197 KernelTypeBuilder type, String name, bool hasThis, int charOffset) { |
| 181 return new KernelFormalParameterBuilder( | 198 return new KernelFormalParameterBuilder( |
| 182 metadata, modifiers, type, name, hasThis, this, charOffset); | 199 metadata, modifiers, type, name, hasThis, this, charOffset); |
| 183 } | 200 } |
| 184 | 201 |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 279 } | 296 } |
| 280 } | 297 } |
| 281 expression.value = | 298 expression.value = |
| 282 defaultArgumentFrom(names[expression.name].initializer) | 299 defaultArgumentFrom(names[expression.name].initializer) |
| 283 ..parent = expression; | 300 ..parent = expression; |
| 284 } | 301 } |
| 285 } | 302 } |
| 286 } | 303 } |
| 287 return argumentsWithMissingDefaultValues.length; | 304 return argumentsWithMissingDefaultValues.length; |
| 288 } | 305 } |
| 306 | |
| 307 List<TypeVariableBuilder> copyTypeVariables( | |
| 308 List<TypeVariableBuilder> original) { | |
| 309 List<TypeVariableBuilder> copy = <TypeVariableBuilder>[]; | |
| 310 for (KernelTypeVariableBuilder variable in original) { | |
| 311 var newVariable = new KernelTypeVariableBuilder( | |
|
Johnni Winther
2017/02/13 09:50:35
Add directly to [copy] and avoid the variable?
ahe
2017/02/13 14:58:53
I'd like to keep it as is, as [copy] needs to be a
| |
| 312 variable.name, this, variable.charOffset); | |
| 313 copy.add(newVariable); | |
| 314 } | |
| 315 Map<TypeVariableBuilder, TypeBuilder> substitution = | |
| 316 <TypeVariableBuilder, TypeBuilder>{}; | |
| 317 int i = 0; | |
| 318 for (KernelTypeVariableBuilder variable in original) { | |
| 319 substitution[variable] = copy[i++].asTypeBuilder(); | |
| 320 } | |
| 321 i = 0; | |
| 322 for (KernelTypeVariableBuilder variable in original) { | |
| 323 copy[i++].bound = variable.bound?.subst(substitution); | |
| 324 } | |
| 325 return copy; | |
| 326 } | |
| 289 } | 327 } |
| 328 | |
| 329 bool isConstructorName(String name, String className) { | |
| 330 if (name.startsWith(className)) { | |
| 331 if (name.length == className.length) return true; | |
| 332 if (name.startsWith(".", className.length)) return true; | |
| 333 } | |
| 334 return false; | |
| 335 } | |
| OLD | NEW |