From 352e2f573b5a6d219c084290b730ed4d0e96a267 Mon Sep 17 00:00:00 2001 From: pq Date: Wed, 22 Jun 2016 14:34:30 -0700 Subject: [PATCH 1/4] Update to latest analyzer (0.27.4-alpha.14) and misc. analysis fixes. * brings in analyzer version (`0.27.4-alpha.14`) corresponding to current Dart SDK (`1.18.0-dev.2.0`). * updates analysis to use prefered API for embedder URI resolution * adds trampolines to `State` and `StatelessWidget` to allow for warning-free within-library @protected access (needed since we closed off access to @protected closures from outside subclasses). * turns off cache dependency tracking for analysis (in DDC this amounted to a 10% speed improvement). --- .../flutter/lib/src/widgets/framework.dart | 16 ++++++---- packages/flutter_test/pubspec.yaml | 2 +- .../flutter_tools/lib/src/dart/analysis.dart | 29 ++++++++++--------- packages/flutter_tools/pubspec.yaml | 2 +- 4 files changed, 29 insertions(+), 20 deletions(-) diff --git a/packages/flutter/lib/src/widgets/framework.dart b/packages/flutter/lib/src/widgets/framework.dart index 571bb7caee5..cd34b60cf42 100644 --- a/packages/flutter/lib/src/widgets/framework.dart +++ b/packages/flutter/lib/src/widgets/framework.dart @@ -326,6 +326,9 @@ abstract class StatelessWidget extends Widget { /// provides the set of inherited widgets for this location in the tree. @protected Widget build(BuildContext context); + + /// Trampoline to make the [build] closure library-accessible. + Widget _build(BuildContext context) => build(context); } /// StatefulWidgets provide the configuration for @@ -484,6 +487,9 @@ abstract class State { @protected Widget build(BuildContext context); + /// Trampoline to make the [build] closure library-accessible. + Widget _build(BuildContext context) => build(context); + /// Called when an Inherited widget in the ancestor chain has changed. Usually /// there is nothing to do here; whenever this is called, build() is also /// called. @@ -1606,7 +1612,7 @@ abstract class ComponentElement extends BuildableElement { /// Instantiation of [StatelessWidget]s. class StatelessElement extends ComponentElement { StatelessElement(StatelessWidget widget) : super(widget) { - _builder = widget.build; + _builder = widget._build; } @override @@ -1616,14 +1622,14 @@ class StatelessElement extends ComponentElement { void update(StatelessWidget newWidget) { super.update(newWidget); assert(widget == newWidget); - _builder = widget.build; + _builder = widget._build; _dirty = true; rebuild(); } @override void _reassemble() { - _builder = widget.build; + _builder = widget._build; super._reassemble(); } } @@ -1636,7 +1642,7 @@ class StatefulElement extends ComponentElement { assert(_state._element == null); _state._element = this; assert(_builder == _buildNothing); - _builder = _state.build; + _builder = _state._build; assert(_state._config == null); _state._config = widget; assert(_state._debugLifecycleState == _StateLifecycle.created); @@ -1647,7 +1653,7 @@ class StatefulElement extends ComponentElement { @override void _reassemble() { - _builder = state.build; + _builder = state._build; super._reassemble(); } diff --git a/packages/flutter_test/pubspec.yaml b/packages/flutter_test/pubspec.yaml index 7d6e8302759..0a9936f99b9 100644 --- a/packages/flutter_test/pubspec.yaml +++ b/packages/flutter_test/pubspec.yaml @@ -10,7 +10,7 @@ dependencies: # We don't actually depend on 'analyzer', but 'test' and 'flutter_tools' do. # We pin the version of analyzer we depend on to avoid version skew across our # packages. - analyzer: 0.27.4-alpha.9 + analyzer: 0.27.4-alpha.14 flutter: path: ../flutter diff --git a/packages/flutter_tools/lib/src/dart/analysis.dart b/packages/flutter_tools/lib/src/dart/analysis.dart index 1ee4e8a6b16..2a377e6baa1 100644 --- a/packages/flutter_tools/lib/src/dart/analysis.dart +++ b/packages/flutter_tools/lib/src/dart/analysis.dart @@ -14,7 +14,6 @@ import 'package:analyzer/source/error_processor.dart'; import 'package:analyzer/src/generated/engine.dart'; // ignore: implementation_imports import 'package:analyzer/src/generated/error.dart'; // ignore: implementation_imports import 'package:analyzer/src/generated/java_io.dart'; // ignore: implementation_imports -import 'package:analyzer/src/generated/sdk_io.dart'; // ignore: implementation_imports import 'package:analyzer/src/generated/source.dart'; // ignore: implementation_imports import 'package:analyzer/src/generated/source_io.dart'; // ignore: implementation_imports import 'package:analyzer/src/task/options.dart'; // ignore: implementation_imports @@ -90,30 +89,33 @@ class AnalysisDriver { List _getResolvers(InternalAnalysisContext context, Map> packageMap) { - DirectoryBasedDartSdk sdk = new DirectoryBasedDartSdk(new JavaFile(sdkDir)); + + // Locate our embedder. + EmbedderYamlLocator locator = new EmbedderYamlLocator(packageMap); + + // Create and configure an SDK. + EmbedderSdk sdk = new EmbedderSdk(locator.embedderYamls); + + // Fail fast if no URI mappings are found. + assert(sdk.libraryMap.size() > 0); + sdk.analysisOptions = context.analysisOptions; + // TODO(pq): re-enable once we have a proper story for SDK summaries // in the presence of embedders (https://github.com/dart-lang/sdk/issues/26467). sdk.useSummary = false; + + // Create our list of resolvers. List resolvers = []; - EmbedderYamlLocator yamlLocator = context.embedderYamlLocator; - yamlLocator.refresh(packageMap); - - EmbedderUriResolver embedderUriResolver = - new EmbedderUriResolver(yamlLocator.embedderYamls); - if (embedderUriResolver.length == 0) { - resolvers.add(new DartUriResolver(sdk)); - } else { - resolvers.add(embedderUriResolver); - } + resolvers.add(new DartUriResolver(sdk)); if (options.packageRootPath != null) { JavaFile packageDirectory = new JavaFile(options.packageRootPath); resolvers.add(new PackageUriResolver([packageDirectory])); } - resolvers.add(new FileUriResolver()); + resolvers.add(new file_system.ResourceUriResolver(PhysicalResourceProvider.INSTANCE)); return resolvers; } @@ -202,6 +204,7 @@ class DriverOptions extends AnalysisOptionsImpl { cacheSize = 512; lint = true; generateSdkErrors = false; + trackCacheDependencies = false; } /// The path to the dart SDK. diff --git a/packages/flutter_tools/pubspec.yaml b/packages/flutter_tools/pubspec.yaml index cbc67478a8f..31b4f417618 100644 --- a/packages/flutter_tools/pubspec.yaml +++ b/packages/flutter_tools/pubspec.yaml @@ -33,7 +33,7 @@ dependencies: test: 0.12.13+5 # Pinned in flutter_test as well. - analyzer: 0.27.4-alpha.9 + analyzer: 0.27.4-alpha.14 dev_dependencies: mockito: ^0.11.0 From dcc7b144af6e031fc04d5d646c27fb6639f76662 Mon Sep 17 00:00:00 2001 From: pq Date: Wed, 22 Jun 2016 15:25:25 -0700 Subject: [PATCH 2/4] Updated closure trampolines. --- packages/flutter/lib/src/widgets/framework.dart | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/flutter/lib/src/widgets/framework.dart b/packages/flutter/lib/src/widgets/framework.dart index cd34b60cf42..dd7f6980638 100644 --- a/packages/flutter/lib/src/widgets/framework.dart +++ b/packages/flutter/lib/src/widgets/framework.dart @@ -304,6 +304,9 @@ abstract class Widget { } } +/// The signature of build() functions. +typedef Widget _BuildFunction(BuildContext context); + /// StatelessWidgets describe a way to compose other Widgets to form reusable /// parts, which doesn't depend on anything other than the configuration /// information in the object itself. (For compositions that can change @@ -328,7 +331,7 @@ abstract class StatelessWidget extends Widget { Widget build(BuildContext context); /// Trampoline to make the [build] closure library-accessible. - Widget _build(BuildContext context) => build(context); + _BuildFunction get _build => build; } /// StatefulWidgets provide the configuration for @@ -488,7 +491,7 @@ abstract class State { Widget build(BuildContext context); /// Trampoline to make the [build] closure library-accessible. - Widget _build(BuildContext context) => build(context); + _BuildFunction get _build => build; /// Called when an Inherited widget in the ancestor chain has changed. Usually /// there is nothing to do here; whenever this is called, build() is also From b2fed16454807cbb742af44ac1aa336153e30c81 Mon Sep 17 00:00:00 2001 From: pq Date: Wed, 22 Jun 2016 15:39:27 -0700 Subject: [PATCH 3/4] _BuildFunction => WidgetBuilder --- packages/flutter/lib/src/widgets/framework.dart | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/flutter/lib/src/widgets/framework.dart b/packages/flutter/lib/src/widgets/framework.dart index dd7f6980638..b902e551c9b 100644 --- a/packages/flutter/lib/src/widgets/framework.dart +++ b/packages/flutter/lib/src/widgets/framework.dart @@ -304,9 +304,6 @@ abstract class Widget { } } -/// The signature of build() functions. -typedef Widget _BuildFunction(BuildContext context); - /// StatelessWidgets describe a way to compose other Widgets to form reusable /// parts, which doesn't depend on anything other than the configuration /// information in the object itself. (For compositions that can change @@ -331,7 +328,7 @@ abstract class StatelessWidget extends Widget { Widget build(BuildContext context); /// Trampoline to make the [build] closure library-accessible. - _BuildFunction get _build => build; + WidgetBuilder get _build => build; } /// StatefulWidgets provide the configuration for @@ -491,7 +488,7 @@ abstract class State { Widget build(BuildContext context); /// Trampoline to make the [build] closure library-accessible. - _BuildFunction get _build => build; + WidgetBuilder get _build => build; /// Called when an Inherited widget in the ancestor chain has changed. Usually /// there is nothing to do here; whenever this is called, build() is also From 1cad4f4705be274d3a3cbf6151409cd01e1ee579 Mon Sep 17 00:00:00 2001 From: pq Date: Wed, 22 Jun 2016 19:30:46 -0700 Subject: [PATCH 4/4] Fallback to a standard SDK if no embedders are found. --- .../flutter_tools/lib/src/dart/analysis.dart | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/packages/flutter_tools/lib/src/dart/analysis.dart b/packages/flutter_tools/lib/src/dart/analysis.dart index 2a377e6baa1..2b1a95b815d 100644 --- a/packages/flutter_tools/lib/src/dart/analysis.dart +++ b/packages/flutter_tools/lib/src/dart/analysis.dart @@ -14,6 +14,7 @@ import 'package:analyzer/source/error_processor.dart'; import 'package:analyzer/src/generated/engine.dart'; // ignore: implementation_imports import 'package:analyzer/src/generated/error.dart'; // ignore: implementation_imports import 'package:analyzer/src/generated/java_io.dart'; // ignore: implementation_imports +import 'package:analyzer/src/generated/sdk_io.dart'; // ignore: implementation_imports import 'package:analyzer/src/generated/source.dart'; // ignore: implementation_imports import 'package:analyzer/src/generated/source_io.dart'; // ignore: implementation_imports import 'package:analyzer/src/task/options.dart'; // ignore: implementation_imports @@ -90,25 +91,30 @@ class AnalysisDriver { List _getResolvers(InternalAnalysisContext context, Map> packageMap) { - // Locate our embedder. - EmbedderYamlLocator locator = new EmbedderYamlLocator(packageMap); - - // Create and configure an SDK. - EmbedderSdk sdk = new EmbedderSdk(locator.embedderYamls); - - // Fail fast if no URI mappings are found. - assert(sdk.libraryMap.size() > 0); - - sdk.analysisOptions = context.analysisOptions; - - // TODO(pq): re-enable once we have a proper story for SDK summaries - // in the presence of embedders (https://github.com/dart-lang/sdk/issues/26467). - sdk.useSummary = false; // Create our list of resolvers. List resolvers = []; + + // Look for an embedder. + EmbedderYamlLocator locator = new EmbedderYamlLocator(packageMap); + if (locator.embedderYamls.isNotEmpty) { + // Create and configure an embedded SDK. + EmbedderSdk sdk = new EmbedderSdk(locator.embedderYamls); + // Fail fast if no URI mappings are found. + assert(sdk.libraryMap.size() > 0); + sdk.analysisOptions = context.analysisOptions; + // TODO(pq): re-enable once we have a proper story for SDK summaries + // in the presence of embedders (https://github.com/dart-lang/sdk/issues/26467). + sdk.useSummary = false; - resolvers.add(new DartUriResolver(sdk)); + resolvers.add(new DartUriResolver(sdk)); + } else { + // Fall back to a standard SDK if no embedder is found. + DirectoryBasedDartSdk sdk = new DirectoryBasedDartSdk(new JavaFile(sdkDir)); + sdk.analysisOptions = context.analysisOptions; + + resolvers.add(new DartUriResolver(sdk)); + } if (options.packageRootPath != null) { JavaFile packageDirectory = new JavaFile(options.packageRootPath);