Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(110)

Side by Side Diff: pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart

Issue 3009573002: Serialize exports scopes. (Closed)
Patch Set: Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698