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 | |
7 import 'package:kernel/ast.dart' | 9 import 'package:kernel/ast.dart' |
8 show Class, Field, Library, ListLiteral, Member, StaticGet, Typedef; | 10 show |
11 Class, | |
12 Field, | |
13 Library, | |
14 ListLiteral, | |
15 Member, | |
16 StaticGet, | |
17 StringLiteral, | |
18 Typedef; | |
19 | |
20 import '../fasta_codes.dart' show templateUnspecified; | |
9 | 21 |
10 import '../problems.dart' show unimplemented; | 22 import '../problems.dart' show unimplemented; |
11 | 23 |
12 import '../kernel/kernel_builder.dart' | 24 import '../kernel/kernel_builder.dart' |
13 show | 25 show |
14 Builder, | 26 Builder, |
15 InvalidTypeBuilder, | 27 InvalidTypeBuilder, |
16 KernelInvalidTypeBuilder, | 28 KernelInvalidTypeBuilder, |
17 KernelTypeBuilder, | 29 KernelTypeBuilder, |
18 LibraryBuilder, | 30 LibraryBuilder, |
19 Scope; | 31 Scope; |
20 | 32 |
21 import '../kernel/redirecting_factory_body.dart' show RedirectingFactoryBody; | 33 import '../kernel/redirecting_factory_body.dart' show RedirectingFactoryBody; |
22 | 34 |
23 import 'dill_class_builder.dart' show DillClassBuilder; | 35 import 'dill_class_builder.dart' show DillClassBuilder; |
24 | 36 |
25 import 'dill_member_builder.dart' show DillMemberBuilder; | 37 import 'dill_member_builder.dart' show DillMemberBuilder; |
26 | 38 |
27 import 'dill_loader.dart' show DillLoader; | 39 import 'dill_loader.dart' show DillLoader; |
28 | 40 |
29 import 'dill_typedef_builder.dart' show DillFunctionTypeAliasBuilder; | 41 import 'dill_typedef_builder.dart' show DillFunctionTypeAliasBuilder; |
30 | 42 |
31 class DillLibraryBuilder extends LibraryBuilder<KernelTypeBuilder, Library> { | 43 class DillLibraryBuilder extends LibraryBuilder<KernelTypeBuilder, Library> { |
32 final Uri uri; | 44 final Uri uri; |
33 | 45 |
34 final DillLoader loader; | 46 final DillLoader loader; |
35 | 47 |
36 Library library; | 48 Library library; |
37 | 49 |
50 /// Exports in addition to the members declared in this library. | |
51 /// | |
52 /// Each entry in the list is either two or three elements long. | |
53 /// | |
54 /// 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 | |
56 /// elements. | |
57 /// | |
58 /// The second element is the name of the exported element. | |
59 /// | |
60 /// The third element (if present) is an error message. | |
61 List<List<String>> additionalExports; | |
62 | |
38 DillLibraryBuilder(this.uri, this.loader) | 63 DillLibraryBuilder(this.uri, this.loader) |
39 : super(uri, new Scope.top(), new Scope.top()); | 64 : super(uri, new Scope.top(), new Scope.top()); |
40 | 65 |
41 Uri get fileUri => uri; | 66 Uri get fileUri => uri; |
42 | 67 |
43 @override | 68 @override |
44 Library get target => library; | 69 Library get target => library; |
45 | 70 |
46 void addClass(Class cls) { | 71 void addClass(Class cls) { |
47 DillClassBuilder classBulder = new DillClassBuilder(cls, this); | 72 DillClassBuilder classBulder = new DillClassBuilder(cls, this); |
48 addBuilder(cls.name, classBulder, cls.fileOffset); | 73 addBuilder(cls.name, classBulder, cls.fileOffset); |
49 cls.procedures.forEach(classBulder.addMember); | 74 cls.procedures.forEach(classBulder.addMember); |
50 cls.constructors.forEach(classBulder.addMember); | 75 cls.constructors.forEach(classBulder.addMember); |
51 for (Field field in cls.fields) { | 76 for (Field field in cls.fields) { |
52 if (field.name.name == "_redirecting#") { | 77 if (field.name.name == "_redirecting#") { |
53 ListLiteral initializer = field.initializer; | 78 ListLiteral initializer = field.initializer; |
54 for (StaticGet get in initializer.expressions) { | 79 for (StaticGet get in initializer.expressions) { |
55 RedirectingFactoryBody.restoreFromDill(get.target); | 80 RedirectingFactoryBody.restoreFromDill(get.target); |
56 } | 81 } |
57 initializer.expressions.clear(); | 82 initializer.expressions.clear(); |
58 } else { | 83 } else { |
59 classBulder.addMember(field); | 84 classBulder.addMember(field); |
60 } | 85 } |
61 } | 86 } |
62 } | 87 } |
63 | 88 |
64 void addMember(Member member) { | 89 void addMember(Member member) { |
65 String name = member.name.name; | 90 String name = member.name.name; |
66 if (name == "_exports#") { | 91 if (name == "_exports#") { |
67 // TODO(ahe): Add this to exportScope. | 92 Field field = member; |
68 // This is a hack / work around for storing exports in dill files. See | 93 StringLiteral string = field.initializer; |
69 // [compile_platform_dartk.dart](../analyzer/compile_platform_dartk.dart). | 94 additionalExports = JSON.decode(string.value); |
70 } else { | 95 } else { |
71 addBuilder(name, new DillMemberBuilder(member, this), member.fileOffset); | 96 addBuilder(name, new DillMemberBuilder(member, this), member.fileOffset); |
72 } | 97 } |
73 } | 98 } |
74 | 99 |
75 Builder addBuilder(String name, Builder builder, int charOffset) { | 100 Builder addBuilder(String name, Builder builder, int charOffset) { |
76 if (name == null || name.isEmpty) return null; | 101 if (name == null || name.isEmpty) return null; |
77 bool isSetter = builder.isSetter; | 102 bool isSetter = builder.isSetter; |
78 if (isSetter) { | 103 if (isSetter) { |
79 scopeBuilder.addSetter(name, builder); | 104 scopeBuilder.addSetter(name, builder); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
111 // mapping `k` to `d` is added to the exported namespace of `L` unless a | 136 // mapping `k` to `d` is added to the exported namespace of `L` unless a |
112 // top-level declaration with the name `k` exists in `L`. | 137 // top-level declaration with the name `k` exists in `L`. |
113 if (builder.parent == this) return builder; | 138 if (builder.parent == this) return builder; |
114 return new KernelInvalidTypeBuilder(name, charOffset, fileUri); | 139 return new KernelInvalidTypeBuilder(name, charOffset, fileUri); |
115 } | 140 } |
116 | 141 |
117 @override | 142 @override |
118 String get fullNameForErrors { | 143 String get fullNameForErrors { |
119 return library.name ?? "<library '${library.fileUri}'>"; | 144 return library.name ?? "<library '${library.fileUri}'>"; |
120 } | 145 } |
146 | |
147 void finalizeExports() { | |
148 if (additionalExports != null) { | |
149 for (List<String> additionalExport in additionalExports) { | |
150 Uri originUri = Uri.parse(additionalExport[0]); | |
Johnni Winther
2017/08/25 11:20:42
Test `additionalExport[0]` for `null`. Uri.parse t
Siggi Cherem (dart-lang)
2017/08/25 18:50:17
BTW - seems that flutter tools is hitting this alr
| |
151 String name = additionalExport[1]; | |
152 Builder builder; | |
153 if (originUri == null) { | |
154 builder = new KernelInvalidTypeBuilder(name, -1, null, | |
155 templateUnspecified.withArguments(additionalExport[2])); | |
156 } else { | |
157 DillLibraryBuilder library = loader.read(originUri, -1); | |
158 builder = library.exportScopeBuilder[name]; | |
Johnni Winther
2017/08/25 11:20:42
-> library?.exportScopeBuilder[name];
| |
159 if (library != null) { | |
Johnni Winther
2017/08/25 11:20:42
Remove this if statement
| |
160 builder = library.exportScopeBuilder[name]; | |
161 } | |
162 if (builder == null) { | |
163 builder = new KernelInvalidTypeBuilder(name, -1, null); | |
164 } | |
165 } | |
166 exportScopeBuilder.addMember(name, builder); | |
167 } | |
168 } | |
169 } | |
121 } | 170 } |
OLD | NEW |