Split AnalysisServerWrapper into Dart and Flutter (#591)
diff --git a/benchmark/bench.dart b/benchmark/bench.dart
index 77692e8..f7ed1c1 100644
--- a/benchmark/bench.dart
+++ b/benchmark/bench.dart
@@ -33,15 +33,14 @@
});
final benchmarks = <Benchmark>[
- AnalyzerBenchmark('hello', sampleCode, flutterWebManager),
- AnalyzerBenchmark('hellohtml', sampleCodeWeb, flutterWebManager),
- AnalyzerBenchmark('sunflower', _sunflower, flutterWebManager),
- AnalyzerBenchmark('spinning_square', _spinningSquare, flutterWebManager),
- AnalysisServerBenchmark('hello', sampleCode, flutterWebManager),
- AnalysisServerBenchmark('hellohtml', sampleCodeWeb, flutterWebManager),
- AnalysisServerBenchmark('sunflower', _sunflower, flutterWebManager),
- AnalysisServerBenchmark(
- 'spinning_square', _spinningSquare, flutterWebManager),
+ AnalyzerBenchmark('hello', sampleCode),
+ AnalyzerBenchmark('hellohtml', sampleCodeWeb),
+ AnalyzerBenchmark('sunflower', _sunflower),
+ AnalyzerBenchmark('spinning_square', _spinningSquare),
+ AnalysisServerBenchmark('hello', sampleCode),
+ AnalysisServerBenchmark('hellohtml', sampleCodeWeb),
+ AnalysisServerBenchmark('sunflower', _sunflower),
+ AnalysisServerBenchmark('spinning_square', _spinningSquare),
Dart2jsBenchmark('hello', sampleCode, compiler),
Dart2jsBenchmark('hellohtml', sampleCodeWeb, compiler),
Dart2jsBenchmark('sunflower', _sunflower, compiler),
@@ -61,9 +60,10 @@
AnalysisServerWrapper analysisServer;
AnalyzerBenchmark(
- String name, this.source, FlutterWebManager flutterWebManager)
- : super('analyzer.$name') {
- analysisServer = AnalysisServerWrapper(sdkPath, flutterWebManager);
+ String name,
+ this.source,
+ ) : super('analyzer.$name') {
+ analysisServer = DartAnalysisServerWrapper();
}
@override
@@ -110,9 +110,8 @@
final String source;
final AnalysisServerWrapper analysisServer;
- AnalysisServerBenchmark(
- String name, this.source, FlutterWebManager flutterWebManager)
- : analysisServer = AnalysisServerWrapper(sdkPath, flutterWebManager),
+ AnalysisServerBenchmark(String name, this.source)
+ : analysisServer = DartAnalysisServerWrapper(),
super('completion.$name');
@override
diff --git a/lib/services_cloud_run.dart b/lib/services_cloud_run.dart
index 9ec1e37..6e6b034 100644
--- a/lib/services_cloud_run.dart
+++ b/lib/services_cloud_run.dart
@@ -13,7 +13,6 @@
import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart' as shelf;
-import 'src/common.dart';
import 'src/common_server_api.dart';
import 'src/common_server_impl.dart';
import 'src/flutter_web.dart';
@@ -41,7 +40,6 @@
}
final redisServerUri = result['redis-url'] as String;
- final sdk = sdkPath;
Logger.root.level = Level.FINER;
Logger.root.onRecord.listen((LogRecord record) {
@@ -56,19 +54,18 @@
_logger.info('''Initializing dart-services:
port: $port
- sdkPath: $sdkPath
+ sdkPath: ${SdkManager.sdk.sdkPath}
redisServerUri: $redisServerUri
Cloud Run Environment variables:
$cloudRunEnvVars''');
- final server = await EndpointsServer.serve(sdk, port, redisServerUri);
+ final server = await EndpointsServer.serve(port, redisServerUri);
_logger.info('Listening on port ${server.port}');
}
class EndpointsServer {
- static Future<EndpointsServer> serve(
- String sdkPath, int port, String redisServerUri) {
- final endpointsServer = EndpointsServer._(sdkPath, port, redisServerUri);
+ static Future<EndpointsServer> serve(int port, String redisServerUri) {
+ final endpointsServer = EndpointsServer._(port, redisServerUri);
return shelf
.serve(endpointsServer.handler, InternetAddress.anyIPv4, port)
@@ -88,11 +85,8 @@
CommonServerApi commonServerApi;
FlutterWebManager flutterWebManager;
- EndpointsServer._(String sdkPath, this.port, this.redisServerUri) {
- flutterWebManager = FlutterWebManager(SdkManager.flutterSdk);
+ EndpointsServer._(this.port, this.redisServerUri) {
final commonServerImpl = CommonServerImpl(
- sdkPath,
- flutterWebManager,
_ServerContainer(),
redisServerUri == null
? InMemoryCache()
diff --git a/lib/services_dev.dart b/lib/services_dev.dart
index 1706490..2b48a3c 100644
--- a/lib/services_dev.dart
+++ b/lib/services_dev.dart
@@ -13,11 +13,9 @@
import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart' as shelf;
-import 'src/common.dart';
import 'src/common_server_api.dart';
import 'src/common_server_impl.dart';
import 'src/flutter_web.dart';
-import 'src/sdk_manager.dart';
import 'src/server_cache.dart';
import 'src/shelf_cors.dart' as shelf_cors;
@@ -36,22 +34,20 @@
exit(1);
}
- final sdk = sdkPath;
-
Logger.root.level = Level.FINER;
Logger.root.onRecord.listen((LogRecord record) {
print(record);
if (record.stackTrace != null) print(record.stackTrace);
});
- EndpointsServer.serve(sdk, port).then((EndpointsServer server) {
+ EndpointsServer.serve(port).then((EndpointsServer server) {
_logger.info('Listening on port ${server.port}');
});
}
class EndpointsServer {
- static Future<EndpointsServer> serve(String sdkPath, int port) {
- final endpointsServer = EndpointsServer._(sdkPath, port);
+ static Future<EndpointsServer> serve(int port) {
+ final endpointsServer = EndpointsServer._(port);
return shelf
.serve(endpointsServer.handler, InternetAddress.anyIPv4, port)
@@ -70,11 +66,8 @@
CommonServerApi commonServerApi;
FlutterWebManager flutterWebManager;
- EndpointsServer._(String sdkPath, this.port) {
- flutterWebManager = FlutterWebManager(SdkManager.flutterSdk);
+ EndpointsServer._(this.port) {
final commonServerImpl = CommonServerImpl(
- sdkPath,
- flutterWebManager,
_ServerContainer(),
_Cache(),
);
diff --git a/lib/services_gae.dart b/lib/services_gae.dart
index 1a003b6..5dfd8b6 100644
--- a/lib/services_gae.dart
+++ b/lib/services_gae.dart
@@ -12,10 +12,8 @@
import 'package:logging/logging.dart';
import 'package:shelf/shelf_io.dart' as shelf_io;
-import 'src/common.dart';
import 'src/common_server_api.dart';
import 'src/common_server_impl.dart';
-import 'src/flutter_web.dart';
import 'src/sdk_manager.dart';
import 'src/server_cache.dart';
@@ -33,9 +31,7 @@
var gaePort = 8080;
if (args.isNotEmpty) gaePort = int.parse(args[0]);
- final sdk = sdkPath;
-
- if (sdk == null) {
+ if (SdkManager.sdk.sdkPath == null) {
throw 'No Dart SDK is available; set the DART_SDK env var.';
}
@@ -51,34 +47,30 @@
});
log.info('''Initializing dart-services:
port: $gaePort
- sdkPath: $sdkPath
+ sdkPath: ${SdkManager.sdk?.sdkPath}
REDIS_SERVER_URI: ${io.Platform.environment['REDIS_SERVER_URI']}
GAE_VERSION: ${io.Platform.environment['GAE_VERSION']}
''');
- final server = GaeServer(sdk, io.Platform.environment['REDIS_SERVER_URI']);
+ final server = GaeServer(io.Platform.environment['REDIS_SERVER_URI']);
server.start(gaePort);
}
class GaeServer {
- final String sdkPath;
final String redisServerUri;
bool discoveryEnabled;
CommonServerImpl commonServerImpl;
CommonServerApi commonServerApi;
- GaeServer(this.sdkPath, this.redisServerUri) {
+ GaeServer(this.redisServerUri) {
hierarchicalLoggingEnabled = true;
recordStackTraceAtLevel = Level.SEVERE;
_logger.level = Level.ALL;
discoveryEnabled = false;
- final flutterWebManager = FlutterWebManager(SdkManager.flutterSdk);
commonServerImpl = CommonServerImpl(
- sdkPath,
- flutterWebManager,
GaeServerContainer(),
redisServerUri == null
? InMemoryCache()
diff --git a/lib/src/analysis_server.dart b/lib/src/analysis_server.dart
index 7e03974..d719e36 100644
--- a/lib/src/analysis_server.dart
+++ b/lib/src/analysis_server.dart
@@ -18,6 +18,7 @@
import 'protos/dart_services.pb.dart' as proto;
import 'pub.dart';
import 'scheduler.dart';
+import 'sdk_manager.dart';
final Logger _logger = Logger('analysis_server');
@@ -32,25 +33,48 @@
// Use very long timeouts to ensure that the server has enough time to restart.
const Duration _ANALYSIS_SERVER_TIMEOUT = Duration(seconds: 35);
-class AnalysisServerWrapper {
- final String sdkPath;
+class FlutterAnalysisServerWrapper extends AnalysisServerWrapper {
final FlutterWebManager flutterWebManager;
+ FlutterAnalysisServerWrapper(this.flutterWebManager)
+ : super(SdkManager.flutterSdk.sdkPath);
+
+ @override
+ String get _sourceDirPath => flutterWebManager.projectDirectory.path;
+}
+
+class DartAnalysisServerWrapper extends AnalysisServerWrapper {
+ Directory _tempProject;
+ DartAnalysisServerWrapper() : super(SdkManager.sdk.sdkPath);
+
+ @override
+ Future<AnalysisServer> init() async {
+ _tempProject = await Directory.systemTemp.createTemp('DartAnalysisWrapper');
+ return super.init();
+ }
+
+ @override
+ String get _sourceDirPath => _tempProject.path;
+
+ @override
+ Future shutdown() =>
+ _tempProject.delete(recursive: true).then((value) => super.shutdown());
+}
+
+abstract class AnalysisServerWrapper {
+ final String sdkPath;
+ final TaskScheduler serverScheduler = TaskScheduler();
+
Future<AnalysisServer> _init;
- String mainPath;
- TaskScheduler serverScheduler;
/// Instance to handle communication with the server.
AnalysisServer analysisServer;
- AnalysisServerWrapper(this.sdkPath, this.flutterWebManager) {
- _logger.info('AnalysisServerWrapper ctor');
- mainPath = _getPathFromName(kMainDart);
+ AnalysisServerWrapper(this.sdkPath);
- serverScheduler = TaskScheduler();
- }
+ String get mainPath => _getPathFromName(kMainDart);
- String get _sourceDirPath => flutterWebManager.projectDirectory.path;
+ String get _sourceDirPath;
Future<AnalysisServer> init() {
if (_init == null) {
@@ -243,8 +267,7 @@
Future<proto.AnalysisResults> analyze(String source) {
var sources = <String, String>{kMainDart: source};
- _logger
- .fine('analyzeMulti: Scheduler queue: ${serverScheduler.queueCount}');
+ _logger.fine('analyze: Scheduler queue: ${serverScheduler.queueCount}');
return serverScheduler
.schedule(ClosureTask<proto.AnalysisResults>(() async {
diff --git a/lib/src/common.dart b/lib/src/common.dart
index 5aa8bfb..27e0be8 100644
--- a/lib/src/common.dart
+++ b/lib/src/common.dart
@@ -6,8 +6,6 @@
import 'dart:io';
-import 'sdk_manager.dart';
-
const kMainDart = 'main.dart';
const kBootstrapDart = 'bootstrap.dart';
@@ -166,5 +164,3 @@
}
return str;
}
-
-String get sdkPath => SdkManager.sdk.sdkPath;
diff --git a/lib/src/common_server_impl.dart b/lib/src/common_server_impl.dart
index 787440a..f9351fb 100644
--- a/lib/src/common_server_impl.dart
+++ b/lib/src/common_server_impl.dart
@@ -36,17 +36,16 @@
}
class CommonServerImpl {
- final String sdkPath;
- final FlutterWebManager flutterWebManager;
final ServerContainer container;
final ServerCache cache;
+ FlutterWebManager flutterWebManager;
Compiler compiler;
- AnalysisServerWrapper analysisServer;
+ AnalysisServerWrapper dartAnalysisServer;
AnalysisServerWrapper flutterAnalysisServer;
bool get analysisServersRunning =>
- analysisServer.analysisServer != null &&
+ dartAnalysisServer.analysisServer != null &&
flutterAnalysisServer.analysisServer != null;
// If non-null, this value indicates that the server is starting/restarting
@@ -62,8 +61,6 @@
DateTime.now().difference(_restartingSince).inMinutes < 30);
CommonServerImpl(
- this.sdkPath,
- this.flutterWebManager,
this.container,
this.cache,
) {
@@ -73,21 +70,21 @@
Future<void> init() async {
log.info('Beginning CommonServer init().');
- analysisServer = AnalysisServerWrapper(sdkPath, flutterWebManager);
- flutterAnalysisServer = AnalysisServerWrapper(
- flutterWebManager.flutterSdk.sdkPath, flutterWebManager);
+ flutterWebManager = FlutterWebManager(SdkManager.flutterSdk);
+ dartAnalysisServer = DartAnalysisServerWrapper();
+ flutterAnalysisServer = FlutterAnalysisServerWrapper(flutterWebManager);
compiler =
Compiler(SdkManager.sdk, SdkManager.flutterSdk, flutterWebManager);
- await analysisServer.init();
+ await dartAnalysisServer.init();
log.info('Dart analysis server initialized.');
await flutterAnalysisServer.init();
log.info('Flutter analysis server initialized.');
- unawaited(analysisServer.onExit.then((int code) {
- log.severe('analysisServer exited, code: $code');
+ unawaited(dartAnalysisServer.onExit.then((int code) {
+ log.severe('dartAnalysisServer exited, code: $code');
if (code != 0) {
exit(code);
}
@@ -104,7 +101,7 @@
await flutterWebManager.warmup();
await compiler.warmup();
- await analysisServer.warmup();
+ await dartAnalysisServer.warmup();
await flutterAnalysisServer.warmup();
}
@@ -121,9 +118,10 @@
_restartingSince = DateTime.now();
return Future.wait(<Future<dynamic>>[
- analysisServer.shutdown(),
+ dartAnalysisServer.shutdown(),
flutterAnalysisServer.shutdown(),
compiler.dispose(),
+ flutterWebManager.dispose(),
Future<dynamic>.sync(cache.shutdown)
]).timeout(const Duration(minutes: 1));
}
@@ -459,7 +457,7 @@
final imports = getAllImportsFor(source);
return flutterWebManager.usesFlutterWeb(imports)
? flutterAnalysisServer
- : analysisServer;
+ : dartAnalysisServer;
}
}
diff --git a/lib/src/flutter_web.dart b/lib/src/flutter_web.dart
index 5a6c6bb..1330f82 100644
--- a/lib/src/flutter_web.dart
+++ b/lib/src/flutter_web.dart
@@ -24,9 +24,7 @@
_init();
}
- void dispose() {
- _projectDirectory.deleteSync(recursive: true);
- }
+ Future<void> dispose() => _projectDirectory.delete(recursive: true);
Directory get projectDirectory => _projectDirectory;
diff --git a/pubspec.lock b/pubspec.lock
index 484128c..ced6f73 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -357,7 +357,7 @@
name: meta
url: "https://pub.dartlang.org"
source: hosted
- version: "1.2.2"
+ version: "1.2.3"
mime:
dependency: transitive
description:
diff --git a/test/analysis_server_test.dart b/test/analysis_server_test.dart
index ac72d57..00560df 100644
--- a/test/analysis_server_test.dart
+++ b/test/analysis_server_test.dart
@@ -62,12 +62,10 @@
void defineTests() {
AnalysisServerWrapper analysisServer;
- FlutterWebManager flutterWebManager;
group('Platform SDK analysis_server', () {
setUp(() async {
- flutterWebManager = FlutterWebManager(SdkManager.flutterSdk);
- analysisServer = AnalysisServerWrapper(sdkPath, flutterWebManager);
+ analysisServer = DartAnalysisServerWrapper();
await analysisServer.init();
});
@@ -191,10 +189,11 @@
});
group('Flutter cached SDK analysis_server', () {
+ FlutterWebManager flutterWebManager;
+
setUp(() async {
flutterWebManager = FlutterWebManager(SdkManager.flutterSdk);
- analysisServer = AnalysisServerWrapper(
- SdkManager.flutterSdk.sdkPath, flutterWebManager);
+ analysisServer = FlutterAnalysisServerWrapper(flutterWebManager);
await analysisServer.init();
});
diff --git a/test/common_server_api_protobuf_test.dart b/test/common_server_api_protobuf_test.dart
index c4aa222..a9aae8f 100644
--- a/test/common_server_api_protobuf_test.dart
+++ b/test/common_server_api_protobuf_test.dart
@@ -10,8 +10,6 @@
import 'package:dart_services/src/common.dart';
import 'package:dart_services/src/common_server_impl.dart';
import 'package:dart_services/src/common_server_api.dart';
-import 'package:dart_services/src/flutter_web.dart';
-import 'package:dart_services/src/sdk_manager.dart';
import 'package:dart_services/src/server_cache.dart';
import 'package:dart_services/src/protos/dart_services.pb.dart' as proto;
import 'package:logging/logging.dart';
@@ -58,7 +56,6 @@
void defineTests() {
CommonServerApi commonServerApi;
CommonServerImpl commonServerImpl;
- FlutterWebManager flutterWebManager;
MockContainer container;
MockCache cache;
@@ -93,9 +90,7 @@
setUpAll(() async {
container = MockContainer();
cache = MockCache();
- flutterWebManager = FlutterWebManager(SdkManager.flutterSdk);
- commonServerImpl =
- CommonServerImpl(sdkPath, flutterWebManager, container, cache);
+ commonServerImpl = CommonServerImpl(container, cache);
commonServerApi = CommonServerApi(commonServerImpl);
await commonServerImpl.init();
diff --git a/test/common_server_api_test.dart b/test/common_server_api_test.dart
index 08e9839..bd4d1b0 100644
--- a/test/common_server_api_test.dart
+++ b/test/common_server_api_test.dart
@@ -10,8 +10,6 @@
import 'package:dart_services/src/common.dart';
import 'package:dart_services/src/common_server_impl.dart';
import 'package:dart_services/src/common_server_api.dart';
-import 'package:dart_services/src/flutter_web.dart';
-import 'package:dart_services/src/sdk_manager.dart';
import 'package:dart_services/src/server_cache.dart';
import 'package:logging/logging.dart';
import 'package:mock_request/mock_request.dart';
@@ -58,7 +56,6 @@
void defineTests() {
CommonServerApi commonServerApi;
CommonServerImpl commonServerImpl;
- FlutterWebManager flutterWebManager;
MockContainer container;
MockCache cache;
@@ -93,9 +90,7 @@
setUpAll(() async {
container = MockContainer();
cache = MockCache();
- flutterWebManager = FlutterWebManager(SdkManager.flutterSdk);
- commonServerImpl =
- CommonServerImpl(sdkPath, flutterWebManager, container, cache);
+ commonServerImpl = CommonServerImpl(container, cache);
commonServerApi = CommonServerApi(commonServerImpl);
await commonServerImpl.init();
diff --git a/test/flutter_analysis_server_test.dart b/test/flutter_analysis_server_test.dart
index 64d86a5..6e551c7 100644
--- a/test/flutter_analysis_server_test.dart
+++ b/test/flutter_analysis_server_test.dart
@@ -211,8 +211,7 @@
await SdkManager.flutterSdk.init();
flutterWebManager = FlutterWebManager(SdkManager.flutterSdk);
await flutterWebManager.warmup();
- analysisServer = AnalysisServerWrapper(
- SdkManager.flutterSdk.sdkPath, flutterWebManager);
+ analysisServer = FlutterAnalysisServerWrapper(flutterWebManager);
await analysisServer.init();
await analysisServer.warmup();
});
@@ -247,8 +246,7 @@
Compiler(SdkManager.sdk, SdkManager.flutterSdk, flutterWebManager);
await compiler.warmup();
- analysisServer = AnalysisServerWrapper(
- SdkManager.flutterSdk.sdkPath, flutterWebManager);
+ analysisServer = FlutterAnalysisServerWrapper(flutterWebManager);
await analysisServer.init();
await analysisServer.warmup();
});
@@ -280,13 +278,11 @@
flutterWebManager = FlutterWebManager(SdkManager.flutterSdk);
await flutterWebManager.warmup();
- flutterAnalysisServer = AnalysisServerWrapper(
- SdkManager.flutterSdk.sdkPath, flutterWebManager);
+ flutterAnalysisServer = FlutterAnalysisServerWrapper(flutterWebManager);
await flutterAnalysisServer.init();
await flutterAnalysisServer.warmup();
- dartAnalysisServer =
- AnalysisServerWrapper(SdkManager.sdk.sdkPath, flutterWebManager);
+ dartAnalysisServer = DartAnalysisServerWrapper();
await dartAnalysisServer.init();
await dartAnalysisServer.warmup();
});
@@ -310,7 +306,6 @@
group('CommonServerImpl flutter analyze', () {
CommonServerImpl commonServerImpl;
- FlutterWebManager flutterWebManager;
_MockContainer container;
_MockCache cache;
@@ -319,24 +314,21 @@
await SdkManager.flutterSdk.init();
container = _MockContainer();
cache = _MockCache();
- flutterWebManager = FlutterWebManager(SdkManager.flutterSdk);
- commonServerImpl =
- CommonServerImpl(sdkPath, flutterWebManager, container, cache);
+ commonServerImpl = CommonServerImpl(container, cache);
await commonServerImpl.init();
});
tearDown(() async {
await commonServerImpl.shutdown();
- await flutterWebManager.dispose();
});
- test('analyze counter app', () async {
+ test('counter app', () async {
final results =
await commonServerImpl.analyze(SourceRequest()..source = counter);
expect(results.issues, isEmpty);
});
- test('analyze Draggable Physics sample', () async {
+ test('Draggable Physics sample', () async {
final results = await commonServerImpl
.analyze(SourceRequest()..source = draggableAndPhysics);
expect(results.issues, isEmpty);
diff --git a/tool/fuzz_driver.dart b/tool/fuzz_driver.dart
index 8a14f2a..6059e17 100644
--- a/tool/fuzz_driver.dart
+++ b/tool/fuzz_driver.dart
@@ -64,7 +64,6 @@
if (args.length >= 4) iterations = int.parse(args[3]);
if (args.length >= 5) commandToRun = args[4];
if (args.length >= 6) dumpServerComms = args[5].toLowerCase() == 'true';
- final sdk = sdkPath;
// Load the list of files.
var fileEntities = <io.FileSystemEntity>[];
@@ -81,10 +80,10 @@
final sw = Stopwatch()..start();
print('About to setuptools');
- print(sdk);
+ print(SdkManager.sdk.sdkPath);
// Warm up the services.
- await setupTools(sdk);
+ await setupTools(SdkManager.sdk.sdkPath);
print('Setup tools done');
@@ -106,7 +105,7 @@
print('FAILED: ${fse.path}');
// Try and re-cycle the services for the next test after the crash
- await setupTools(sdk);
+ await setupTools(SdkManager.sdk.sdkPath);
}
}
@@ -127,12 +126,10 @@
container = MockContainer();
cache = MockCache();
- commonServerImpl =
- CommonServerImpl(sdkPath, flutterWebManager, container, cache);
+ commonServerImpl = CommonServerImpl(container, cache);
await commonServerImpl.init();
- analysisServer =
- analysis_server.AnalysisServerWrapper(sdkPath, flutterWebManager);
+ analysisServer = analysis_server.DartAnalysisServerWrapper();
await analysisServer.init();
print('Warming up analysis server');