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.dill_library_builder; | 5 library fasta.dill_library_builder; |
| 6 | 6 |
| 7 import 'dart:convert' show JSON; | |
| 8 | |
| 9 import 'package:kernel/ast.dart' | 7 import 'package:kernel/ast.dart' |
| 10 show | 8 show Class, Field, Library, ListLiteral, Member, StaticGet, Typedef; |
| 11 Class, | 9 import 'package:kernel/ast.dart'; |
| 12 Field, | |
| 13 Library, | |
| 14 ListLiteral, | |
| 15 Member, | |
| 16 StaticGet, | |
| 17 StringLiteral, | |
| 18 Typedef; | |
| 19 | |
| 20 import '../fasta_codes.dart' show templateUnspecified; | |
| 21 | 10 |
| 22 import '../problems.dart' show unimplemented; | 11 import '../problems.dart' show unimplemented; |
| 23 | 12 |
| 24 import '../kernel/kernel_builder.dart' | 13 import '../kernel/kernel_builder.dart' |
| 25 show | 14 show |
| 26 Builder, | 15 Builder, |
| 27 InvalidTypeBuilder, | 16 InvalidTypeBuilder, |
| 28 KernelInvalidTypeBuilder, | 17 KernelInvalidTypeBuilder, |
| 29 KernelTypeBuilder, | 18 KernelTypeBuilder, |
| 30 LibraryBuilder, | 19 LibraryBuilder, |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 50 /// Exports in addition to the members declared in this library. | 39 /// Exports in addition to the members declared in this library. |
| 51 /// | 40 /// |
| 52 /// Each entry in the list is either two or three elements long. | 41 /// Each entry in the list is either two or three elements long. |
| 53 /// | 42 /// |
| 54 /// The first element is the library URI, if it is null, this is an ambiguous | 43 /// The first element is the library URI, if it is null, this is an ambiguous |
| 55 /// export and the list has three elements. Otherwise the list has two | 44 /// export and the list has three elements. Otherwise the list has two |
| 56 /// elements. | 45 /// elements. |
| 57 /// | 46 /// |
| 58 /// The second element is the name of the exported element. | 47 /// The second element is the name of the exported element. |
| 59 /// | 48 /// |
| 60 /// The third element (if present) is an error message. | 49 /// The third element (if present) is an error message. |
|
ahe
2017/08/29 11:04:23
This documentation should be updated.
scheglov
2017/08/29 15:16:26
Done.
| |
| 61 List<List<String>> additionalExports; | 50 List<Reference> additionalExports; |
| 62 | 51 |
| 63 DillLibraryBuilder(this.uri, this.loader) | 52 DillLibraryBuilder(this.uri, this.loader) |
| 64 : super(uri, new Scope.top(), new Scope.top()); | 53 : super(uri, new Scope.top(), new Scope.top()); |
| 65 | 54 |
| 66 Uri get fileUri => uri; | 55 Uri get fileUri => uri; |
| 67 | 56 |
| 68 @override | 57 @override |
| 69 Library get target => library; | 58 Library get target => library; |
| 70 | 59 |
| 71 void addClass(Class cls) { | 60 void addClass(Class cls) { |
| 72 DillClassBuilder classBulder = new DillClassBuilder(cls, this); | 61 DillClassBuilder classBulder = new DillClassBuilder(cls, this); |
| 73 addBuilder(cls.name, classBulder, cls.fileOffset); | 62 addBuilder(cls.name, classBulder, cls.fileOffset); |
| 74 cls.procedures.forEach(classBulder.addMember); | 63 cls.procedures.forEach(classBulder.addMember); |
| 75 cls.constructors.forEach(classBulder.addMember); | 64 cls.constructors.forEach(classBulder.addMember); |
| 76 for (Field field in cls.fields) { | 65 for (Field field in cls.fields) { |
| 77 if (field.name.name == "_redirecting#") { | 66 if (field.name.name == "_redirecting#") { |
| 78 ListLiteral initializer = field.initializer; | 67 ListLiteral initializer = field.initializer; |
| 79 for (StaticGet get in initializer.expressions) { | 68 for (StaticGet get in initializer.expressions) { |
| 80 RedirectingFactoryBody.restoreFromDill(get.target); | 69 RedirectingFactoryBody.restoreFromDill(get.target); |
| 81 } | 70 } |
| 82 initializer.expressions.clear(); | 71 initializer.expressions.clear(); |
| 83 } else { | 72 } else { |
| 84 classBulder.addMember(field); | 73 classBulder.addMember(field); |
| 85 } | 74 } |
| 86 } | 75 } |
| 87 } | 76 } |
| 88 | 77 |
| 89 void addMember(Member member) { | 78 void addMember(Member member) { |
| 90 String name = member.name.name; | 79 String name = member.name.name; |
| 91 if (name == "_exports#") { | 80 addBuilder(name, new DillMemberBuilder(member, this), member.fileOffset); |
| 92 Field field = member; | |
| 93 StringLiteral string = field.initializer; | |
| 94 additionalExports = JSON.decode(string.value); | |
| 95 } else { | |
| 96 addBuilder(name, new DillMemberBuilder(member, this), member.fileOffset); | |
| 97 } | |
| 98 } | 81 } |
| 99 | 82 |
| 100 Builder addBuilder(String name, Builder builder, int charOffset) { | 83 Builder addBuilder(String name, Builder builder, int charOffset) { |
| 101 if (name == null || name.isEmpty) return null; | 84 if (name == null || name.isEmpty) return null; |
| 102 bool isSetter = builder.isSetter; | 85 bool isSetter = builder.isSetter; |
| 103 if (isSetter) { | 86 if (isSetter) { |
| 104 scopeBuilder.addSetter(name, builder); | 87 scopeBuilder.addSetter(name, builder); |
| 105 } else { | 88 } else { |
| 106 scopeBuilder.addMember(name, builder); | 89 scopeBuilder.addMember(name, builder); |
| 107 } | 90 } |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 138 if (builder.parent == this) return builder; | 121 if (builder.parent == this) return builder; |
| 139 return new KernelInvalidTypeBuilder(name, charOffset, fileUri); | 122 return new KernelInvalidTypeBuilder(name, charOffset, fileUri); |
| 140 } | 123 } |
| 141 | 124 |
| 142 @override | 125 @override |
| 143 String get fullNameForErrors { | 126 String get fullNameForErrors { |
| 144 return library.name ?? "<library '${library.fileUri}'>"; | 127 return library.name ?? "<library '${library.fileUri}'>"; |
| 145 } | 128 } |
| 146 | 129 |
| 147 void finalizeExports() { | 130 void finalizeExports() { |
| 148 if (additionalExports != null) { | 131 for (var reference in library.additionalExports) { |
| 149 for (List<String> additionalExport in additionalExports) { | 132 var node = reference.node; |
| 150 String uriString = additionalExport[0]; | 133 if (node is Class) { |
| 151 String name = additionalExport[1]; | 134 exportScopeBuilder.addMember( |
| 152 Builder builder; | 135 node.name, new DillClassBuilder(node, this)); |
|
ahe
2017/08/29 11:04:23
This code has two problems:
1. It creates new bui
scheglov
2017/08/29 15:16:26
How to get existing builders, when we already have
scheglov
2017/08/29 16:56:56
I fixed (1), and do nothing for (2) because (if I
| |
| 153 if (uriString == null) { | 136 } else if (node is Member) { |
| 154 builder = new KernelInvalidTypeBuilder(name, -1, null, | 137 exportScopeBuilder.addMember( |
| 155 templateUnspecified.withArguments(additionalExport[2])); | 138 node.name.name, new DillMemberBuilder(node, this)); |
| 156 } else { | 139 } else if (node is Typedef) { |
| 157 DillLibraryBuilder library = loader.read(uri.resolve(uriString), -1); | 140 exportScopeBuilder.addMember( |
| 158 builder = library?.exportScopeBuilder[name] ?? | 141 node.name, new DillFunctionTypeAliasBuilder(node, this)); |
| 159 new KernelInvalidTypeBuilder(name, -1, null); | 142 } else { |
| 160 } | 143 throw new UnimplementedError('${node.runtimeType}'); |
|
ahe
2017/08/29 11:04:23
You should use one of the methods from ../problems
scheglov
2017/08/29 15:16:26
Done.
| |
| 161 exportScopeBuilder.addMember(name, builder); | |
| 162 } | 144 } |
| 163 } | 145 } |
| 164 } | 146 } |
| 165 } | 147 } |
| OLD | NEW |