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

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

Issue 3008763002: Store actual Reference(s) for additional exports. (Closed)
Patch Set: Get existing Builder(s) for NamedNode(s). 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
« no previous file with comments | « no previous file | pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
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
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 }
OLDNEW
« no previous file with comments | « no previous file | pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698