Commit dba29aa0 authored by Siva Chandra's avatar Siva Chandra

Select the correct conditional import when building dart dependencies.

Fixes #9413.

For more info on conditional imports, see
https://github.com/munificent/dep-interface-libraries/blob/master/Proposal.md.
parent 832c0f1f
...@@ -7,6 +7,24 @@ import 'package:analyzer/analyzer.dart' as analyzer; ...@@ -7,6 +7,24 @@ import 'package:analyzer/analyzer.dart' as analyzer;
import '../base/file_system.dart'; import '../base/file_system.dart';
import '../dart/package_map.dart'; import '../dart/package_map.dart';
// List of flutter specific environment configurations.
// See https://github.com/munificent/dep-interface-libraries/blob/master/Proposal.md
// We will populate this list as required. Potentially, all of dart:* libraries
// supported by flutter would end up here.
final List<String> _configurationConstants = <String>['dart.library.io'];
String _dottedNameToString(analyzer.DottedName dottedName) {
String result = '';
for (var identifier in dottedName.components) {
if (result.isEmpty) {
result += identifier.token.lexeme;
} else {
result += '.' + identifier.token.lexeme;
}
}
return result;
}
class DartDependencySetBuilder { class DartDependencySetBuilder {
DartDependencySetBuilder(String mainScriptPath, String packagesFilePath) : DartDependencySetBuilder(String mainScriptPath, String packagesFilePath) :
_mainScriptPath = canonicalizePath(mainScriptPath), _mainScriptPath = canonicalizePath(mainScriptPath),
...@@ -27,10 +45,27 @@ class DartDependencySetBuilder { ...@@ -27,10 +45,27 @@ class DartDependencySetBuilder {
final Uri currentUri = toProcess.removeLast(); final Uri currentUri = toProcess.removeLast();
final analyzer.CompilationUnit unit = _parse(currentUri.toFilePath()); final analyzer.CompilationUnit unit = _parse(currentUri.toFilePath());
for (analyzer.Directive directive in unit.directives) { for (analyzer.Directive directive in unit.directives) {
if (!(directive is analyzer.UriBasedDirective)) if (!(directive is analyzer.UriBasedDirective)) {
continue; continue;
}
String uriAsString;
if (directive is analyzer.NamespaceDirective) {
final analyzer.NamespaceDirective namespaceDirective = directive;
// If the directive is a conditional import directive, we should
// select the imported uri based on the condition.
for (analyzer.Configuration configuration in namespaceDirective.configurations) {
if (_configurationConstants.contains(_dottedNameToString(configuration.name))) {
uriAsString = configuration.uri.stringValue;
break;
}
}
}
if (uriAsString == null) {
final analyzer.UriBasedDirective uriBasedDirective = directive; final analyzer.UriBasedDirective uriBasedDirective = directive;
final String uriAsString = uriBasedDirective.uri.stringValue; uriAsString = uriBasedDirective.uri.stringValue;
}
Uri resolvedUri = analyzer.resolveRelativeUri(currentUri, Uri.parse(uriAsString)); Uri resolvedUri = analyzer.resolveRelativeUri(currentUri, Uri.parse(uriAsString));
if (resolvedUri.scheme.startsWith('dart')) if (resolvedUri.scheme.startsWith('dart'))
continue; continue;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment