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

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: 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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698