Skip to content

Commit 2289ce1

Browse files
committed
Add import dependencies to Kernel libraries and use them to resynthesize ImportElement(s) in Analyzer.
[email protected], [email protected], [email protected], [email protected] BUG= Review-Url: https://codereview.chromium.org/2987553002 .
1 parent 000bec4 commit 2289ce1

File tree

5 files changed

+77
-125
lines changed

5 files changed

+77
-125
lines changed

pkg/analyzer/lib/src/dart/element/element.dart

Lines changed: 52 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5501,6 +5501,11 @@ class ImportElementImpl extends ElementImpl implements ImportElement {
55015501
*/
55025502
final int _linkedDependency;
55035503

5504+
/**
5505+
* The kernel of the element.
5506+
*/
5507+
final kernel.LibraryDependency _kernel;
5508+
55045509
/**
55055510
* The offset of the prefix of this import in the file that contains the this
55065511
* import directive, or `-1` if this import is synthetic.
@@ -5531,14 +5536,24 @@ class ImportElementImpl extends ElementImpl implements ImportElement {
55315536
ImportElementImpl(int offset)
55325537
: _unlinkedImport = null,
55335538
_linkedDependency = null,
5539+
_kernel = null,
55345540
super(null, offset);
55355541

5542+
/**
5543+
* Initialize using the given kernel.
5544+
*/
5545+
ImportElementImpl.forKernel(LibraryElementImpl enclosingLibrary, this._kernel)
5546+
: _unlinkedImport = null,
5547+
_linkedDependency = null,
5548+
super.forSerialized(enclosingLibrary);
5549+
55365550
/**
55375551
* Initialize using the given serialized information.
55385552
*/
55395553
ImportElementImpl.forSerialized(this._unlinkedImport, this._linkedDependency,
55405554
LibraryElementImpl enclosingLibrary)
5541-
: super.forSerialized(enclosingLibrary);
5555+
: _kernel = null,
5556+
super.forSerialized(enclosingLibrary);
55425557

55435558
@override
55445559
List<NamespaceCombinator> get combinators {
@@ -5566,6 +5581,14 @@ class ImportElementImpl extends ElementImpl implements ImportElement {
55665581

55675582
@override
55685583
LibraryElement get importedLibrary {
5584+
if (_kernel != null) {
5585+
if (_importedLibrary == null) {
5586+
Uri importedUri = _kernel.targetLibrary.importUri;
5587+
String importedUriStr = importedUri.toString();
5588+
LibraryElementImpl library = enclosingElement as LibraryElementImpl;
5589+
_importedLibrary = library._kernelContext.getLibrary(importedUriStr);
5590+
}
5591+
}
55695592
if (_linkedDependency != null) {
55705593
if (_importedLibrary == null) {
55715594
LibraryElementImpl library = enclosingElement as LibraryElementImpl;
@@ -5710,6 +5733,11 @@ abstract class KernelLibraryResynthesizerContext {
57105733
*/
57115734
InterfaceType getInterfaceType(ElementImpl context, kernel.Supertype type);
57125735

5736+
/**
5737+
* Return the [LibraryElement] for the given absolute [uriStr].
5738+
*/
5739+
LibraryElement getLibrary(String uriStr);
5740+
57135741
/**
57145742
* Return the [DartType] for the given Kernel [type], or `null` if the [type]
57155743
* does not correspond to a [DartType].
@@ -6091,21 +6119,30 @@ class LibraryElementImpl extends ElementImpl implements LibraryElement {
60916119

60926120
@override
60936121
List<ImportElement> get imports {
6094-
if (_unlinkedDefiningUnit != null && _imports == null) {
6095-
List<UnlinkedImport> unlinkedImports = _unlinkedDefiningUnit.imports;
6096-
int length = unlinkedImports.length;
6097-
if (length != 0) {
6098-
List<ImportElement> imports = new List<ImportElement>();
6099-
LinkedLibrary linkedLibrary = resynthesizerContext.linkedLibrary;
6100-
for (int i = 0; i < length; i++) {
6101-
int dependency = linkedLibrary.importDependencies[i];
6102-
ImportElementImpl importElement = new ImportElementImpl.forSerialized(
6103-
unlinkedImports[i], dependency, library);
6104-
imports.add(importElement);
6122+
if (_imports == null) {
6123+
if (_kernelContext != null) {
6124+
_imports = _kernelContext.library.dependencies
6125+
.where((k) => k.isImport)
6126+
.map((k) => new ImportElementImpl.forKernel(this, k))
6127+
.toList(growable: false);
6128+
}
6129+
if (_unlinkedDefiningUnit != null) {
6130+
List<UnlinkedImport> unlinkedImports = _unlinkedDefiningUnit.imports;
6131+
int length = unlinkedImports.length;
6132+
if (length != 0) {
6133+
List<ImportElement> imports = new List<ImportElement>();
6134+
LinkedLibrary linkedLibrary = resynthesizerContext.linkedLibrary;
6135+
for (int i = 0; i < length; i++) {
6136+
int dependency = linkedLibrary.importDependencies[i];
6137+
ImportElementImpl importElement =
6138+
new ImportElementImpl.forSerialized(
6139+
unlinkedImports[i], dependency, library);
6140+
imports.add(importElement);
6141+
}
6142+
_imports = imports;
6143+
} else {
6144+
_imports = const <ImportElement>[];
61056145
}
6106-
_imports = imports;
6107-
} else {
6108-
_imports = const <ImportElement>[];
61096146
}
61106147
}
61116148
return _imports ?? ImportElement.EMPTY_LIST;

pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart

Lines changed: 5 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -222,33 +222,18 @@ class ResynthesizeKernelStrongTest extends ResynthesizeTest {
222222
await super.test_const_invalid_topLevel();
223223
}
224224

225-
@failingTest
226-
test_const_invokeConstructor_generic_named_imported() async {
227-
await super.test_const_invokeConstructor_generic_named_imported();
228-
}
229-
230225
@failingTest
231226
test_const_invokeConstructor_generic_named_imported_withPrefix() async {
232227
await super
233228
.test_const_invokeConstructor_generic_named_imported_withPrefix();
234229
}
235230

236-
@failingTest
237-
test_const_invokeConstructor_generic_unnamed_imported() async {
238-
await super.test_const_invokeConstructor_generic_unnamed_imported();
239-
}
240-
241231
@failingTest
242232
test_const_invokeConstructor_generic_unnamed_imported_withPrefix() async {
243233
await super
244234
.test_const_invokeConstructor_generic_unnamed_imported_withPrefix();
245235
}
246236

247-
@failingTest
248-
test_const_invokeConstructor_named_imported() async {
249-
await super.test_const_invokeConstructor_named_imported();
250-
}
251-
252237
@failingTest
253238
test_const_invokeConstructor_named_imported_withPrefix() async {
254239
await super.test_const_invokeConstructor_named_imported_withPrefix();
@@ -284,11 +269,6 @@ class ResynthesizeKernelStrongTest extends ResynthesizeTest {
284269
await super.test_const_invokeConstructor_named_unresolved6();
285270
}
286271

287-
@failingTest
288-
test_const_invokeConstructor_unnamed_imported() async {
289-
await super.test_const_invokeConstructor_unnamed_imported();
290-
}
291-
292272
@failingTest
293273
test_const_invokeConstructor_unnamed_imported_withPrefix() async {
294274
await super.test_const_invokeConstructor_unnamed_imported_withPrefix();
@@ -309,11 +289,6 @@ class ResynthesizeKernelStrongTest extends ResynthesizeTest {
309289
await super.test_const_invokeConstructor_unnamed_unresolved3();
310290
}
311291

312-
@failingTest
313-
test_const_length_ofClassConstField_imported() async {
314-
await super.test_const_length_ofClassConstField_imported();
315-
}
316-
317292
@failingTest
318293
test_const_length_ofClassConstField_imported_withPrefix() async {
319294
await super.test_const_length_ofClassConstField_imported_withPrefix();
@@ -334,11 +309,6 @@ class ResynthesizeKernelStrongTest extends ResynthesizeTest {
334309
await super.test_const_length_staticMethod();
335310
}
336311

337-
@failingTest
338-
test_const_reference_staticField_imported() async {
339-
await super.test_const_reference_staticField_imported();
340-
}
341-
342312
@failingTest
343313
test_const_reference_staticField_imported_withPrefix() async {
344314
await super.test_const_reference_staticField_imported_withPrefix();
@@ -374,11 +344,6 @@ class ResynthesizeKernelStrongTest extends ResynthesizeTest {
374344
await super.test_const_reference_topLevelFunction_imported_withPrefix();
375345
}
376346

377-
@failingTest
378-
test_const_reference_topLevelVariable_imported() async {
379-
await super.test_const_reference_topLevelVariable_imported();
380-
}
381-
382347
@failingTest
383348
test_const_reference_topLevelVariable_imported_withPrefix() async {
384349
await super.test_const_reference_topLevelVariable_imported_withPrefix();
@@ -439,11 +404,6 @@ class ResynthesizeKernelStrongTest extends ResynthesizeTest {
439404
await super.test_const_topLevel_this();
440405
}
441406

442-
@failingTest
443-
test_const_topLevel_typedList_imported() async {
444-
await super.test_const_topLevel_typedList_imported();
445-
}
446-
447407
@failingTest
448408
test_const_topLevel_typedList_importedWithPrefix() async {
449409
await super.test_const_topLevel_typedList_importedWithPrefix();
@@ -805,16 +765,6 @@ class ResynthesizeKernelStrongTest extends ResynthesizeTest {
805765
await super.test_field_propagatedType_final_noDep_instance();
806766
}
807767

808-
@failingTest
809-
test_function_async() async {
810-
await super.test_function_async();
811-
}
812-
813-
@failingTest
814-
test_function_asyncStar() async {
815-
await super.test_function_asyncStar();
816-
}
817-
818768
@failingTest
819769
test_function_documented() async {
820770
await super.test_function_documented();
@@ -1015,21 +965,11 @@ class ResynthesizeKernelStrongTest extends ResynthesizeTest {
1015965
await super.test_import_self();
1016966
}
1017967

1018-
@failingTest
1019-
test_import_short_absolute() async {
1020-
await super.test_import_short_absolute();
1021-
}
1022-
1023968
@failingTest
1024969
test_import_show() async {
1025970
await super.test_import_show();
1026971
}
1027972

1028-
@failingTest
1029-
test_imports() async {
1030-
await super.test_imports();
1031-
}
1032-
1033973
@failingTest
1034974
test_inferred_function_type_for_variable_in_generic_function() async {
1035975
await super.test_inferred_function_type_for_variable_in_generic_function();
@@ -1267,16 +1207,6 @@ class ResynthesizeKernelStrongTest extends ResynthesizeTest {
12671207
await super.test_main_variable_via_export();
12681208
}
12691209

1270-
@failingTest
1271-
test_member_function_async() async {
1272-
await super.test_member_function_async();
1273-
}
1274-
1275-
@failingTest
1276-
test_member_function_asyncStar() async {
1277-
await super.test_member_function_asyncStar();
1278-
}
1279-
12801210
@failingTest
12811211
test_metadata_classDeclaration() async {
12821212
await super.test_metadata_classDeclaration();
@@ -1467,26 +1397,6 @@ class ResynthesizeKernelStrongTest extends ResynthesizeTest {
14671397
await super.test_method_type_parameter_with_function_typed_parameter();
14681398
}
14691399

1470-
@failingTest
1471-
test_nameConflict_exportedAndLocal() async {
1472-
await super.test_nameConflict_exportedAndLocal();
1473-
}
1474-
1475-
@failingTest
1476-
test_nameConflict_exportedAndLocal_exported() async {
1477-
await super.test_nameConflict_exportedAndLocal_exported();
1478-
}
1479-
1480-
@failingTest
1481-
test_nameConflict_exportedAndParted() async {
1482-
await super.test_nameConflict_exportedAndParted();
1483-
}
1484-
1485-
@failingTest
1486-
test_nameConflict_importWithRelativeUri_exportWithAbsolute() async {
1487-
await super.test_nameConflict_importWithRelativeUri_exportWithAbsolute();
1488-
}
1489-
14901400
@failingTest
14911401
test_nested_generic_functions_in_generic_class_with_function_typed_params() async {
14921402
await super
@@ -1684,11 +1594,6 @@ class ResynthesizeKernelStrongTest extends ResynthesizeTest {
16841594
await super.test_type_reference_to_import_part();
16851595
}
16861596

1687-
@failingTest
1688-
test_type_reference_to_import_part2() async {
1689-
await super.test_type_reference_to_import_part2();
1690-
}
1691-
16921597
@failingTest
16931598
test_type_reference_to_import_part_in_subdir() async {
16941599
await super.test_type_reference_to_import_part_in_subdir();
@@ -1929,21 +1834,11 @@ class ResynthesizeKernelStrongTest extends ResynthesizeTest {
19291834
await super.test_variable_getterInPart_setterInPart();
19301835
}
19311836

1932-
@failingTest
1933-
test_variable_propagatedType_final_dep_inLib() async {
1934-
await super.test_variable_propagatedType_final_dep_inLib();
1935-
}
1936-
19371837
@failingTest
19381838
test_variable_propagatedType_final_dep_inPart() async {
19391839
await super.test_variable_propagatedType_final_dep_inPart();
19401840
}
19411841

1942-
@failingTest
1943-
test_variable_propagatedType_implicit_dep() async {
1944-
await super.test_variable_propagatedType_implicit_dep();
1945-
}
1946-
19471842
@failingTest
19481843
test_variable_setterInPart_getterInPart() async {
19491844
await super.test_variable_setterInPart_getterInPart();
@@ -2266,6 +2161,11 @@ class _KernelLibraryResynthesizerContextImpl
22662161
kernelType.className.canonicalName, kernelType.typeArguments);
22672162
}
22682163

2164+
@override
2165+
LibraryElement getLibrary(String uriStr) {
2166+
return _resynthesizer.getLibrary(uriStr);
2167+
}
2168+
22692169
DartType getType(ElementImpl context, kernel.DartType kernelType) {
22702170
if (kernelType is kernel.DynamicType) return DynamicTypeImpl.instance;
22712171
if (kernelType is kernel.VoidType) return VoidTypeImpl.instance;

pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
library fasta.kernel_library_builder;
66

7+
import 'package:front_end/src/fasta/dill/dill_library_builder.dart';
8+
import 'package:front_end/src/fasta/import.dart';
79
import 'package:kernel/ast.dart';
810

911
import 'package:kernel/clone.dart' show CloneVisitor;
@@ -704,6 +706,19 @@ class KernelLibraryBuilder
704706
@override
705707
Library build(LibraryBuilder coreLibrary) {
706708
super.build(coreLibrary);
709+
for (Import import in imports) {
710+
var importedBuilder = import.imported;
711+
Library importedLibrary;
712+
if (importedBuilder is DillLibraryBuilder) {
713+
importedLibrary = importedBuilder.library;
714+
} else if (importedBuilder is KernelLibraryBuilder) {
715+
importedLibrary = importedBuilder.library;
716+
}
717+
if (importedLibrary != null) {
718+
library.addDependency(
719+
new LibraryDependency.import(importedLibrary, name: import.prefix));
720+
}
721+
}
707722
library.name = name;
708723
library.procedures.sort(compareProcedures);
709724
return library;

pkg/front_end/lib/src/kernel_generator_impl.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,10 @@ Future<CompilerResult> generateKernelInternal(
7575
}
7676

7777
// All summaries are considered external and shouldn't include source-info.
78-
dillTarget.loader.libraries.forEach((lib) => lib.isExternal = true);
78+
dillTarget.loader.libraries.forEach((lib) {
79+
lib.isExternal = true;
80+
lib.dependencies.clear();
81+
});
7982

8083
// Linked dependencies are meant to be part of the program so they are not
8184
// marked external.

pkg/kernel/lib/text/ast_to_text.dart

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -283,12 +283,9 @@ class Printer extends Visitor<Null> {
283283
endLine('import "$importPath" as $prefix;');
284284
}
285285
}
286-
for (var import in library.dependencies) {
287-
import.accept(this);
288-
}
286+
// TODO(scheglov): Do we want to print dependencies? dartbug.com/30224
289287
endLine();
290288
var inner = new Printer._inner(this, imports);
291-
library.dependencies.forEach(inner.writeNode);
292289
library.typedefs.forEach(inner.writeNode);
293290
library.classes.forEach(inner.writeNode);
294291
library.fields.forEach(inner.writeNode);

0 commit comments

Comments
 (0)