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'; |
ahe
2017/08/30 14:24:52
Remove the second import of kernel/ast.dart.
scheglov
2017/08/30 16:56:49
Done.
| |
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, |
31 Scope; | 20 Scope; |
32 | 21 |
33 import '../kernel/redirecting_factory_body.dart' show RedirectingFactoryBody; | 22 import '../kernel/redirecting_factory_body.dart' show RedirectingFactoryBody; |
34 | 23 |
35 import 'dill_class_builder.dart' show DillClassBuilder; | 24 import 'dill_class_builder.dart' show DillClassBuilder; |
36 | 25 |
37 import 'dill_member_builder.dart' show DillMemberBuilder; | 26 import 'dill_member_builder.dart' show DillMemberBuilder; |
38 | 27 |
39 import 'dill_loader.dart' show DillLoader; | 28 import 'dill_loader.dart' show DillLoader; |
40 | 29 |
41 import 'dill_typedef_builder.dart' show DillFunctionTypeAliasBuilder; | 30 import 'dill_typedef_builder.dart' show DillFunctionTypeAliasBuilder; |
42 | 31 |
43 class DillLibraryBuilder extends LibraryBuilder<KernelTypeBuilder, Library> { | 32 class DillLibraryBuilder extends LibraryBuilder<KernelTypeBuilder, Library> { |
44 final Uri uri; | 33 final Uri uri; |
45 | 34 |
46 final DillLoader loader; | 35 final DillLoader loader; |
47 | 36 |
48 Library library; | 37 Library library; |
49 | 38 |
50 /// Exports in addition to the members declared in this library. | 39 /// References to nodes exported by the `export` directives, don't conflict |
ahe
2017/08/30 14:24:52
Consider this:
/// References to nodes exported b
scheglov
2017/08/30 16:56:49
Done.
| |
51 /// | 40 /// with each other, and not are hidden by local declarations. |
52 /// Each entry in the list is either two or three elements long. | 41 List<Reference> additionalExports; |
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 | 42 |
63 DillLibraryBuilder(this.uri, this.loader) | 43 DillLibraryBuilder(this.uri, this.loader) |
64 : super(uri, new Scope.top(), new Scope.top()); | 44 : super(uri, new Scope.top(), new Scope.top()); |
65 | 45 |
66 Uri get fileUri => uri; | 46 Uri get fileUri => uri; |
67 | 47 |
68 @override | 48 @override |
69 Library get target => library; | 49 Library get target => library; |
70 | 50 |
71 void addClass(Class cls) { | 51 void addClass(Class cls) { |
72 DillClassBuilder classBulder = new DillClassBuilder(cls, this); | 52 DillClassBuilder classBulder = new DillClassBuilder(cls, this); |
73 addBuilder(cls.name, classBulder, cls.fileOffset); | 53 addBuilder(cls.name, classBulder, cls.fileOffset); |
74 cls.procedures.forEach(classBulder.addMember); | 54 cls.procedures.forEach(classBulder.addMember); |
75 cls.constructors.forEach(classBulder.addMember); | 55 cls.constructors.forEach(classBulder.addMember); |
76 for (Field field in cls.fields) { | 56 for (Field field in cls.fields) { |
77 if (field.name.name == "_redirecting#") { | 57 if (field.name.name == "_redirecting#") { |
78 ListLiteral initializer = field.initializer; | 58 ListLiteral initializer = field.initializer; |
79 for (StaticGet get in initializer.expressions) { | 59 for (StaticGet get in initializer.expressions) { |
80 RedirectingFactoryBody.restoreFromDill(get.target); | 60 RedirectingFactoryBody.restoreFromDill(get.target); |
81 } | 61 } |
82 initializer.expressions.clear(); | 62 initializer.expressions.clear(); |
83 } else { | 63 } else { |
84 classBulder.addMember(field); | 64 classBulder.addMember(field); |
85 } | 65 } |
86 } | 66 } |
87 } | 67 } |
88 | 68 |
89 void addMember(Member member) { | 69 void addMember(Member member) { |
90 String name = member.name.name; | 70 String name = member.name.name; |
91 if (name == "_exports#") { | 71 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 } | 72 } |
99 | 73 |
100 Builder addBuilder(String name, Builder builder, int charOffset) { | 74 Builder addBuilder(String name, Builder builder, int charOffset) { |
101 if (name == null || name.isEmpty) return null; | 75 if (name == null || name.isEmpty) return null; |
102 bool isSetter = builder.isSetter; | 76 bool isSetter = builder.isSetter; |
103 if (isSetter) { | 77 if (isSetter) { |
104 scopeBuilder.addSetter(name, builder); | 78 scopeBuilder.addSetter(name, builder); |
105 } else { | 79 } else { |
106 scopeBuilder.addMember(name, builder); | 80 scopeBuilder.addMember(name, builder); |
107 } | 81 } |
(...skipping 30 matching lines...) Expand all Loading... | |
138 if (builder.parent == this) return builder; | 112 if (builder.parent == this) return builder; |
139 return new KernelInvalidTypeBuilder(name, charOffset, fileUri); | 113 return new KernelInvalidTypeBuilder(name, charOffset, fileUri); |
140 } | 114 } |
141 | 115 |
142 @override | 116 @override |
143 String get fullNameForErrors { | 117 String get fullNameForErrors { |
144 return library.name ?? "<library '${library.fileUri}'>"; | 118 return library.name ?? "<library '${library.fileUri}'>"; |
145 } | 119 } |
146 | 120 |
147 void finalizeExports() { | 121 void finalizeExports() { |
148 if (additionalExports != null) { | 122 for (var reference in library.additionalExports) { |
149 for (List<String> additionalExport in additionalExports) { | 123 var node = reference.node; |
150 String uriString = additionalExport[0]; | 124 Uri libraryUri; |
151 String name = additionalExport[1]; | 125 String name; |
152 Builder builder; | 126 if (node is Class) { |
153 if (uriString == null) { | 127 libraryUri = node.enclosingLibrary.importUri; |
154 builder = new KernelInvalidTypeBuilder(name, -1, null, | 128 name = node.name; |
155 templateUnspecified.withArguments(additionalExport[2])); | 129 } else if (node is Member) { |
156 } else { | 130 libraryUri = node.enclosingLibrary.importUri; |
157 DillLibraryBuilder library = loader.read(uri.resolve(uriString), -1); | 131 name = node.name.name; |
158 builder = library?.exportScopeBuilder[name] ?? | 132 } else if (node is Typedef) { |
159 new KernelInvalidTypeBuilder(name, -1, null); | 133 libraryUri = node.enclosingLibrary.importUri; |
160 } | 134 name = node.name; |
135 } else { | |
136 unimplemented('${node.runtimeType}', -1, uri); | |
137 } | |
138 var library = loader.read(libraryUri, -1); | |
139 Builder builder = library.exportScopeBuilder[name]; | |
ahe
2017/08/30 14:24:52
assert(node == builder.target);
scheglov
2017/08/30 16:56:50
Done.
| |
140 if (builder.isSetter) { | |
141 exportScopeBuilder.addSetter(name, builder); | |
142 } else { | |
161 exportScopeBuilder.addMember(name, builder); | 143 exportScopeBuilder.addMember(name, builder); |
162 } | 144 } |
163 } | 145 } |
164 } | 146 } |
165 } | 147 } |
OLD | NEW |