| 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 staticMask; | 19 staticMask; |
| 20 | 20 |
| 21 import '../source/source_library_builder.dart' show | 21 import '../source/source_library_builder.dart' show |
| 22 SourceLibraryBuilder; | 22 SourceLibraryBuilder; |
| 23 | 23 |
| 24 import '../source/source_class_builder.dart' show | 24 import '../source/source_class_builder.dart' show |
| 25 SourceClassBuilder; | 25 SourceClassBuilder; |
| 26 | 26 |
| 27 import '../util/relativize.dart' show |
| 28 relativizeUri; |
| 29 |
| 27 import 'kernel_builder.dart' show | 30 import 'kernel_builder.dart' show |
| 28 Builder, | 31 Builder, |
| 29 ClassBuilder, | 32 ClassBuilder, |
| 30 ConstructorReferenceBuilder, | 33 ConstructorReferenceBuilder, |
| 31 DynamicTypeBuilder, | 34 DynamicTypeBuilder, |
| 32 EnumBuilder, | 35 EnumBuilder, |
| 33 FieldBuilder, | 36 FieldBuilder, |
| 34 FormalParameterBuilder, | 37 FormalParameterBuilder, |
| 35 FunctionTypeAliasBuilder, | 38 FunctionTypeAliasBuilder, |
| 36 KernelEnumBuilder, | 39 KernelEnumBuilder, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 54 | 57 |
| 55 class KernelLibraryBuilder | 58 class KernelLibraryBuilder |
| 56 extends SourceLibraryBuilder<KernelTypeBuilder, Library> { | 59 extends SourceLibraryBuilder<KernelTypeBuilder, Library> { |
| 57 final Library library; | 60 final Library library; |
| 58 | 61 |
| 59 final List<Class> mixinApplicationClasses = <Class>[]; | 62 final List<Class> mixinApplicationClasses = <Class>[]; |
| 60 | 63 |
| 61 final List<List> argumentsWithMissingDefaultValues = <List>[]; | 64 final List<List> argumentsWithMissingDefaultValues = <List>[]; |
| 62 | 65 |
| 63 KernelLibraryBuilder(Uri uri, Uri fileUri, Loader loader) | 66 KernelLibraryBuilder(Uri uri, Uri fileUri, Loader loader) |
| 64 : library = new Library(uri), | 67 : library = new Library(uri, fileUri: relativizeUri(fileUri)), |
| 65 super(loader, fileUri); | 68 super(loader, fileUri); |
| 66 | 69 |
| 67 Uri get uri => library.importUri; | 70 Uri get uri => library.importUri; |
| 68 | 71 |
| 69 KernelTypeBuilder addNamedType(String name, | 72 KernelTypeBuilder addNamedType(String name, |
| 70 List<KernelTypeBuilder> arguments) { | 73 List<KernelTypeBuilder> arguments, int charOffset) { |
| 71 KernelNamedTypeBuilder type = | 74 KernelNamedTypeBuilder type = |
| 72 new KernelNamedTypeBuilder(name, arguments); | 75 new KernelNamedTypeBuilder(name, arguments, charOffset, fileUri); |
| 73 if (identical(name, "dynamic")) { | 76 if (identical(name, "dynamic")) { |
| 74 // TODO(ahe): Make const. | 77 type.builder = |
| 75 type.builder = new DynamicTypeBuilder(const DynamicType()); | 78 new DynamicTypeBuilder(const DynamicType(), this, charOffset); |
| 76 } else { | 79 } else { |
| 77 addType(type); | 80 addType(type); |
| 78 } | 81 } |
| 79 return type; | 82 return type; |
| 80 } | 83 } |
| 81 | 84 |
| 82 KernelTypeBuilder addMixinApplication(KernelTypeBuilder supertype, | 85 KernelTypeBuilder addMixinApplication(KernelTypeBuilder supertype, |
| 83 List<KernelTypeBuilder> mixins) { | 86 List<KernelTypeBuilder> mixins, int charOffset) { |
| 84 KernelTypeBuilder type = | 87 KernelTypeBuilder type = new KernelMixinApplicationBuilder( |
| 85 new KernelMixinApplicationBuilder(supertype, mixins); | 88 supertype, mixins, charOffset, fileUri); |
| 86 return addType(type); | 89 return addType(type); |
| 87 } | 90 } |
| 88 | 91 |
| 89 KernelTypeBuilder addVoidType() { | 92 KernelTypeBuilder addVoidType(int charOffset) { |
| 90 return new KernelNamedTypeBuilder("void", null); | 93 return new KernelNamedTypeBuilder("void", null, charOffset, fileUri); |
| 91 } | 94 } |
| 92 | 95 |
| 93 ClassBuilder addClass(List<MetadataBuilder> metadata, | 96 ClassBuilder addClass(List<MetadataBuilder> metadata, |
| 94 int modifiers, String className, | 97 int modifiers, String className, |
| 95 List<TypeVariableBuilder> typeVariables, KernelTypeBuilder supertype, | 98 List<TypeVariableBuilder> typeVariables, KernelTypeBuilder supertype, |
| 96 List<KernelTypeBuilder> interfaces) { | 99 List<KernelTypeBuilder> interfaces, int charOffset) { |
| 97 ClassBuilder cls = new SourceClassBuilder(metadata, modifiers, className, | 100 ClassBuilder cls = new SourceClassBuilder(metadata, modifiers, className, |
| 98 typeVariables, supertype, interfaces, classMembers, declarationTypes, | 101 typeVariables, supertype, interfaces, classMembers, declarationTypes, |
| 99 this, | 102 this, |
| 100 new List<ConstructorReferenceBuilder>.from(constructorReferences)); | 103 new List<ConstructorReferenceBuilder>.from(constructorReferences), |
| 104 charOffset); |
| 101 constructorReferences.clear(); | 105 constructorReferences.clear(); |
| 102 classMembers.forEach((String name, MemberBuilder builder) { | 106 classMembers.forEach((String name, MemberBuilder builder) { |
| 103 while (builder != null) { | 107 while (builder != null) { |
| 104 builder.parent = cls; | 108 builder.parent = cls; |
| 105 builder = builder.next; | 109 builder = builder.next; |
| 106 } | 110 } |
| 107 }); | 111 }); |
| 108 // Nested declaration began in `OutlineBuilder.beginClassDeclaration`. | 112 // Nested declaration began in `OutlineBuilder.beginClassDeclaration`. |
| 109 endNestedDeclaration(); | 113 endNestedDeclaration(); |
| 110 return addBuilder(className, cls); | 114 return addBuilder(className, cls); |
| 111 } | 115 } |
| 112 | 116 |
| 113 NamedMixinApplicationBuilder addNamedMixinApplication( | 117 NamedMixinApplicationBuilder addNamedMixinApplication( |
| 114 List<MetadataBuilder> metadata, String name, | 118 List<MetadataBuilder> metadata, String name, |
| 115 List<TypeVariableBuilder> typeVariables, int modifiers, | 119 List<TypeVariableBuilder> typeVariables, int modifiers, |
| 116 KernelTypeBuilder mixinApplication, List<KernelTypeBuilder> interfaces) { | 120 KernelTypeBuilder mixinApplication, List<KernelTypeBuilder> interfaces, |
| 121 int charOffset) { |
| 117 NamedMixinApplicationBuilder builder = | 122 NamedMixinApplicationBuilder builder = |
| 118 new KernelNamedMixinApplicationBuilder(metadata, name, typeVariables, | 123 new KernelNamedMixinApplicationBuilder(metadata, name, typeVariables, |
| 119 modifiers, mixinApplication, interfaces, declarationTypes, this); | 124 modifiers, mixinApplication, interfaces, declarationTypes, this, |
| 125 charOffset); |
| 120 // Nested declaration began in `OutlineBuilder.beginNamedMixinApplication`. | 126 // Nested declaration began in `OutlineBuilder.beginNamedMixinApplication`. |
| 121 endNestedDeclaration(); | 127 endNestedDeclaration(); |
| 122 return addBuilder(name, builder); | 128 return addBuilder(name, builder); |
| 123 } | 129 } |
| 124 | 130 |
| 125 FieldBuilder addField(List<MetadataBuilder> metadata, | 131 FieldBuilder addField(List<MetadataBuilder> metadata, |
| 126 int modifiers, KernelTypeBuilder type, String name) { | 132 int modifiers, KernelTypeBuilder type, String name, int charOffset) { |
| 127 return addBuilder(name, | 133 return addBuilder(name, new KernelFieldBuilder( |
| 128 new KernelFieldBuilder(metadata, type, name, modifiers)); | 134 metadata, type, name, modifiers, this, charOffset)); |
| 129 } | 135 } |
| 130 | 136 |
| 131 ProcedureBuilder addProcedure(List<MetadataBuilder> metadata, | 137 ProcedureBuilder addProcedure(List<MetadataBuilder> metadata, |
| 132 int modifiers, KernelTypeBuilder returnType, String name, | 138 int modifiers, KernelTypeBuilder returnType, String name, |
| 133 List<TypeVariableBuilder> typeVariables, | 139 List<TypeVariableBuilder> typeVariables, |
| 134 List<FormalParameterBuilder> formals, AsyncMarker asyncModifier, | 140 List<FormalParameterBuilder> formals, AsyncMarker asyncModifier, |
| 135 ProcedureKind kind) { | 141 ProcedureKind kind, int charOffset) { |
| 136 // Nested declaration began in `OutlineBuilder.beginMethod` or | 142 // Nested declaration began in `OutlineBuilder.beginMethod` or |
| 137 // `OutlineBuilder.beginTopLevelMethod`. | 143 // `OutlineBuilder.beginTopLevelMethod`. |
| 138 endNestedDeclaration().resolveTypes(typeVariables); | 144 endNestedDeclaration().resolveTypes(typeVariables); |
| 139 return addBuilder(name, | 145 return addBuilder(name, |
| 140 new KernelProcedureBuilder(metadata, modifiers, returnType, name, | 146 new KernelProcedureBuilder(metadata, modifiers, returnType, name, |
| 141 typeVariables, formals, asyncModifier, kind)); | 147 typeVariables, formals, asyncModifier, kind, this, charOffset)); |
| 142 } | 148 } |
| 143 | 149 |
| 144 void addFactoryMethod(List<MetadataBuilder> metadata, | 150 void addFactoryMethod(List<MetadataBuilder> metadata, |
| 145 ConstructorReferenceBuilder constructorName, | 151 ConstructorReferenceBuilder constructorName, |
| 146 List<FormalParameterBuilder> formals, AsyncMarker asyncModifier, | 152 List<FormalParameterBuilder> formals, AsyncMarker asyncModifier, |
| 147 ConstructorReferenceBuilder redirectionTarget) { | 153 ConstructorReferenceBuilder redirectionTarget, int charOffset) { |
| 148 String name = constructorName.name; | 154 String name = constructorName.name; |
| 149 assert(constructorName.suffix == null); | 155 assert(constructorName.suffix == null); |
| 150 addBuilder(name, | 156 addBuilder(name, |
| 151 new KernelProcedureBuilder(metadata, staticMask, null, name, null, | 157 new KernelProcedureBuilder(metadata, staticMask, null, name, null, |
| 152 formals, asyncModifier, ProcedureKind.Factory, redirectionTarget)); | 158 formals, asyncModifier, ProcedureKind.Factory, this, charOffset, |
| 159 redirectionTarget)); |
| 153 } | 160 } |
| 154 | 161 |
| 155 EnumBuilder addEnum(List<MetadataBuilder> metadata, String name, | 162 EnumBuilder addEnum(List<MetadataBuilder> metadata, String name, |
| 156 List<String> constants) { | 163 List<String> constants, int charOffset) { |
| 157 return addBuilder(name, | 164 return addBuilder(name, |
| 158 new KernelEnumBuilder(metadata, name, constants, this)); | 165 new KernelEnumBuilder(metadata, name, constants, this, charOffset)); |
| 159 } | 166 } |
| 160 | 167 |
| 161 FunctionTypeAliasBuilder addFunctionTypeAlias(List<MetadataBuilder> metadata, | 168 FunctionTypeAliasBuilder addFunctionTypeAlias(List<MetadataBuilder> metadata, |
| 162 KernelTypeBuilder returnType, String name, | 169 KernelTypeBuilder returnType, String name, |
| 163 List<TypeVariableBuilder> typeVariables, | 170 List<TypeVariableBuilder> typeVariables, |
| 164 List<FormalParameterBuilder> formals) { | 171 List<FormalParameterBuilder> formals, int charOffset) { |
| 165 FunctionTypeAliasBuilder typedef = new KernelFunctionTypeAliasBuilder( | 172 FunctionTypeAliasBuilder typedef = new KernelFunctionTypeAliasBuilder( |
| 166 metadata, returnType, name, typeVariables, formals, declarationTypes, | 173 metadata, returnType, name, typeVariables, formals, declarationTypes, |
| 167 this); | 174 this, charOffset); |
| 168 // Nested declaration began in `OutlineBuilder.beginFunctionTypeAlias`. | 175 // Nested declaration began in `OutlineBuilder.beginFunctionTypeAlias`. |
| 169 endNestedDeclaration(); | 176 endNestedDeclaration(); |
| 170 return addBuilder(name, typedef); | 177 return addBuilder(name, typedef); |
| 171 } | 178 } |
| 172 | 179 |
| 173 KernelFormalParameterBuilder addFormalParameter( | 180 KernelFormalParameterBuilder addFormalParameter( |
| 174 List<MetadataBuilder> metadata, int modifiers, | 181 List<MetadataBuilder> metadata, int modifiers, |
| 175 KernelTypeBuilder type, String name, bool hasThis) { | 182 KernelTypeBuilder type, String name, bool hasThis, int charOffset) { |
| 176 return new KernelFormalParameterBuilder( | 183 return new KernelFormalParameterBuilder( |
| 177 metadata, modifiers, type, name, hasThis); | 184 metadata, modifiers, type, name, hasThis, this, charOffset); |
| 178 } | 185 } |
| 179 | 186 |
| 180 KernelTypeVariableBuilder addTypeVariable(String name, | 187 KernelTypeVariableBuilder addTypeVariable(String name, |
| 181 KernelTypeBuilder bound) { | 188 KernelTypeBuilder bound, int charOffset) { |
| 182 return new KernelTypeVariableBuilder(name, bound); | 189 return new KernelTypeVariableBuilder(name, this, charOffset, bound); |
| 183 } | 190 } |
| 184 | 191 |
| 185 void buildBuilder(Builder builder) { | 192 void buildBuilder(Builder builder) { |
| 186 if (builder is SourceClassBuilder) { | 193 if (builder is SourceClassBuilder) { |
| 187 Class cls = builder.build(this); | 194 Class cls = builder.build(this); |
| 188 library.addClass(cls); | 195 library.addClass(cls); |
| 189 Class superclass = cls.superclass; | 196 Class superclass = cls.superclass; |
| 190 if (superclass != null && superclass.isMixinApplication) { | 197 if (superclass != null && superclass.isMixinApplication) { |
| 191 List<Class> mixinApplications = <Class>[]; | 198 List<Class> mixinApplications = <Class>[]; |
| 192 mixinApplicationClasses.add(cls); | 199 mixinApplicationClasses.add(cls); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 219 } | 226 } |
| 220 } | 227 } |
| 221 | 228 |
| 222 Library build() { | 229 Library build() { |
| 223 super.build(); | 230 super.build(); |
| 224 library.name = name; | 231 library.name = name; |
| 225 return library; | 232 return library; |
| 226 } | 233 } |
| 227 | 234 |
| 228 Builder buildAmbiguousBuilder( | 235 Builder buildAmbiguousBuilder( |
| 229 String name, Builder builder, Builder other) { | 236 String name, Builder builder, Builder other, int charOffset) { |
| 230 if (builder.next == null && other.next == null) { | 237 if (builder.next == null && other.next == null) { |
| 231 if (builder.isGetter && other.isSetter) { | 238 if (builder.isGetter && other.isSetter) { |
| 232 return new MixedAccessor(builder, other); | 239 return new MixedAccessor(builder, other, this); |
| 233 } else if (builder.isSetter && other.isGetter) { | 240 } else if (builder.isSetter && other.isGetter) { |
| 234 return new MixedAccessor(other, builder); | 241 return new MixedAccessor(other, builder, this); |
| 235 } | 242 } |
| 236 } | 243 } |
| 237 return new KernelInvalidTypeBuilder(name, this); | 244 return new KernelInvalidTypeBuilder(name, charOffset, fileUri); |
| 238 } | 245 } |
| 239 | 246 |
| 240 void addArgumentsWithMissingDefaultValues(Arguments arguments, | 247 void addArgumentsWithMissingDefaultValues(Arguments arguments, |
| 241 FunctionNode function) { | 248 FunctionNode function) { |
| 242 assert(partOfLibrary == null); | 249 assert(partOfLibrary == null); |
| 243 argumentsWithMissingDefaultValues.add([arguments, function]); | 250 argumentsWithMissingDefaultValues.add([arguments, function]); |
| 244 } | 251 } |
| 245 | 252 |
| 246 int finishStaticInvocations() { | 253 int finishStaticInvocations() { |
| 247 CloneVisitor cloner; | 254 CloneVisitor cloner; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 275 } | 282 } |
| 276 expression.value = | 283 expression.value = |
| 277 defaultArgumentFrom(names[expression.name].initializer) | 284 defaultArgumentFrom(names[expression.name].initializer) |
| 278 ..parent = expression; | 285 ..parent = expression; |
| 279 } | 286 } |
| 280 } | 287 } |
| 281 } | 288 } |
| 282 return argumentsWithMissingDefaultValues.length; | 289 return argumentsWithMissingDefaultValues.length; |
| 283 } | 290 } |
| 284 } | 291 } |
| OLD | NEW |