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

Unified Diff: lib/src/sdk.dart

Issue 1415723007: SDK mocking for improved test throughput. (Closed) Base URL: https://github.com/dart-lang/linter.git@master
Patch Set: Created 5 years, 1 month 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « lib/src/linter.dart ('k') | test/rule_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/src/sdk.dart
diff --git a/lib/src/sdk.dart b/lib/src/sdk.dart
new file mode 100644
index 0000000000000000000000000000000000000000..9dfa1de1df5aad698347f4dd8639869d0d98973d
--- /dev/null
+++ b/lib/src/sdk.dart
@@ -0,0 +1,421 @@
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library linter.src.sdk;
+
+import 'package:analyzer/file_system/file_system.dart' as resource;
+import 'package:analyzer/file_system/memory_file_system.dart' as resource;
+import 'package:analyzer/src/context/cache.dart'
+ show AnalysisCache, CachePartition;
+import 'package:analyzer/src/context/context.dart' show AnalysisContextImpl;
+import 'package:analyzer/src/generated/engine.dart'
+ show AnalysisEngine, ChangeSet;
+import 'package:analyzer/src/generated/java_io.dart';
+import 'package:analyzer/src/generated/sdk.dart'
+ show DartSdk, LibraryMap, SdkLibrary;
+import 'package:analyzer/src/generated/sdk_io.dart' show DirectoryBasedDartSdk;
+import 'package:analyzer/src/generated/source.dart'
+ show DartUriResolver, Source, SourceFactory;
+
+/// Mock SDK for testing purposes.
+class MockSdk implements DartSdk, DirectoryBasedDartSdk {
+ static const _MockSdkLibrary LIB_CORE = const _MockSdkLibrary(
+ 'dart:core',
+ '/lib/core/core.dart',
+ '''
+library dart.core;
+
+import 'dart:async';
+
+class Object {
+ bool operator ==(other) => identical(this, other);
+ String toString() => 'a string';
+ int get hashCode => 0;
+}
+
+class Function {}
+class StackTrace {}
+class Symbol {}
+class Type {}
+
+abstract class Comparable<T> {
+ int compareTo(T other);
+}
+
+abstract class String implements Comparable<String> {
+ external factory String.fromCharCodes(Iterable<int> charCodes,
+ [int start = 0, int end]);
+ bool get isEmpty => false;
+ bool get isNotEmpty => false;
+ int get length => 0;
+ String toUpperCase();
+ List<int> get codeUnits;
+}
+
+class bool extends Object {}
+abstract class num implements Comparable<num> {
+ bool operator <(num other);
+ bool operator <=(num other);
+ bool operator >(num other);
+ bool operator >=(num other);
+ num operator +(num other);
+ num operator -(num other);
+ num operator *(num other);
+ num operator /(num other);
+ int toInt();
+ num abs();
+ int round();
+}
+abstract class int extends num {
+ bool get isEven => false;
+ int operator -();
+ external static int parse(String source,
+ { int radix,
+ int onError(String source) });
+}
+class double extends num {}
+class DateTime extends Object {}
+class Null extends Object {}
+
+class Deprecated extends Object {
+ final String expires;
+ const Deprecated(this.expires);
+}
+const Object deprecated = const Deprecated("next release");
+
+class Iterator<E> {
+ bool moveNext();
+ E get current;
+}
+
+abstract class Iterable<E> {
+ Iterator<E> get iterator;
+ bool get isEmpty;
+}
+
+abstract class List<E> implements Iterable<E> {
+ void add(E value);
+ E operator [](int index);
+ void operator []=(int index, E value);
+ Iterator<E> get iterator => null;
+ void clear();
+}
+
+abstract class Map<K, V> extends Object {
+ Iterable<K> get keys;
+}
+
+external bool identical(Object a, Object b);
+
+void print(Object object) {}
+
+class _Override {
+ const _Override();
+}
+const Object override = const _Override();
+''');
+
+ static const _MockSdkLibrary LIB_ASYNC = const _MockSdkLibrary(
+ 'dart:async',
+ '/lib/async/async.dart',
+ '''
+library dart.async;
+
+import 'dart:math';
+
+part 'stream.dart';
+
+class Future<T> {
+ factory Future.delayed(Duration duration, [T computation()]) => null;
+ factory Future.value([value]) => null;
+ static Future wait(List<Future> futures) => null;
+}
+''',
+ const <_MockSdkFile>[
+ const _MockSdkFile(
+ '/lib/async/stream.dart',
+ r'''
+part of dart.async;
+class Stream<T> {}
+abstract class StreamTransformer<S, T> {}
+''')
+ ]);
+
+ static const _MockSdkLibrary LIB_COLLECTION = const _MockSdkLibrary(
+ 'dart:collection',
+ '/lib/collection/collection.dart',
+ '''
+library dart.collection;
+
+abstract class HashMap<K, V> implements Map<K, V> {}
+''');
+
+ static const _MockSdkLibrary LIB_CONVERT = const _MockSdkLibrary(
+ 'dart:convert',
+ '/lib/convert/convert.dart',
+ '''
+library dart.convert;
+
+import 'dart:async';
+
+abstract class Converter<S, T> implements StreamTransformer {}
+class JsonDecoder extends Converter<String, Object> {}
+''');
+
+ static const _MockSdkLibrary LIB_MATH = const _MockSdkLibrary(
+ 'dart:math',
+ '/lib/math/math.dart',
+ '''
+library dart.math;
+const double E = 2.718281828459045;
+const double PI = 3.1415926535897932;
+const double LN10 = 2.302585092994046;
+num min(num a, num b) => 0;
+num max(num a, num b) => 0;
+external double cos(num x);
+external double sin(num x);
+external double sqrt(num x);
+class Random {
+ bool nextBool() => true;
+ double nextDouble() => 2.0;
+ int nextInt() => 1;
+}
+''');
+
+ static const _MockSdkLibrary LIB_HTML = const _MockSdkLibrary(
+ 'dart:html',
+ '/lib/html/dartium/html_dartium.dart',
+ '''
+library dart.html;
+class HtmlElement {}
+''');
+
+ static const List<SdkLibrary> LIBRARIES = const [
+ LIB_CORE,
+ LIB_ASYNC,
+ LIB_COLLECTION,
+ LIB_CONVERT,
+ LIB_MATH,
+ LIB_HTML,
+ ];
+
+ final resource.MemoryResourceProvider provider =
+ new resource.MemoryResourceProvider();
+
+ /**
+ * The [AnalysisContextImpl] which is used for all of the sources.
+ */
+ AnalysisContextImpl _analysisContext;
+
+ MockSdk() {
+ LIBRARIES.forEach((_MockSdkLibrary library) {
+ provider.newFile(library.path, library.content);
+ library.parts.forEach((file) {
+ provider.newFile(file.path, file.content);
+ });
+ });
+ }
+
+ @override
+ AnalysisContextImpl get context {
+ if (_analysisContext == null) {
+ _analysisContext = new _SdkAnalysisContext(this);
+ SourceFactory factory = new SourceFactory([new DartUriResolver(this)]);
+ _analysisContext.sourceFactory = factory;
+ ChangeSet changeSet = new ChangeSet();
+ for (String uri in uris) {
+ Source source = factory.forUri(uri);
+ changeSet.addedSource(source);
+ }
+ _analysisContext.applyChanges(changeSet);
+ }
+ return _analysisContext;
+ }
+
+ @override
+ JavaFile get dart2JsExecutable => null;
+
+ @override
+ String get dartiumBinaryName => null;
+
+ @override
+ JavaFile get dartiumExecutable => null;
+
+ @override
+ JavaFile get dartiumWorkingDirectory => null;
+
+ @override
+ JavaFile get directory => null;
+
+ @override
+ JavaFile get docDirectory => null;
+
+ @override
+ bool get hasDocumentation => null;
+
+ @override
+ bool get isDartiumInstalled => null;
+
+ @override
+ JavaFile get libraryDirectory => null;
+
+ @override
+ JavaFile get pubExecutable => null;
+
+ @override
+ List<SdkLibrary> get sdkLibraries => LIBRARIES;
+
+ @override
+ String get sdkVersion => throw unimplemented;
+
+ UnimplementedError get unimplemented => new UnimplementedError();
+
+ @override
+ List<String> get uris {
+ List<String> uris = <String>[];
+ for (SdkLibrary library in LIBRARIES) {
+ uris.add(library.shortName);
+ }
+ return uris;
+ }
+
+ @override
+ String get vmBinaryName => null;
+
+ @override
+ JavaFile get vmExecutable => null;
+
+ @override
+ Source fromFileUri(Uri uri) {
+ String filePath = uri.path;
+ String libPath = '/lib';
+ if (!filePath.startsWith("$libPath/")) {
+ return null;
+ }
+ for (SdkLibrary library in LIBRARIES) {
+ String libraryPath = library.path;
+ if (filePath.replaceAll('\\', '/') == libraryPath) {
+ try {
+ resource.File file = provider.getResource(uri.path);
+ Uri dartUri = Uri.parse(library.shortName);
+ return file.createSource(dartUri);
+ } catch (exception) {
+ return null;
+ }
+ }
+ if (filePath.startsWith("$libraryPath/")) {
+ String pathInLibrary = filePath.substring(libraryPath.length + 1);
+ String path = '${library.shortName}/${pathInLibrary}';
+ try {
+ resource.File file = provider.getResource(uri.path);
+ Uri dartUri = new Uri(scheme: 'dart', path: path);
+ return file.createSource(dartUri);
+ } catch (exception) {
+ return null;
+ }
+ }
+ }
+ return null;
+ }
+
+ @override
+ JavaFile getDartiumWorkingDirectory(JavaFile installDir) => null;
+
+ @override
+ JavaFile getDocFileFor(String libraryName) => null;
+
+ @override
+ SdkLibrary getSdkLibrary(String dartUri) {
+ // getSdkLibrary() is only used to determine whether a library is internal
+ // to the SDK. The mock SDK doesn't have any internals, so it's safe to
+ // return null.
+ return null;
+ }
+
+ @override
+ LibraryMap initialLibraryMap(bool useDart2jsPaths) => null;
+
+ @override
+ Source mapDartUri(String dartUri) {
+ const Map<String, String> uriToPath = const {
+ "dart:core": "/lib/core/core.dart",
+ "dart:html": "/lib/html/dartium/html_dartium.dart",
+ "dart:async": "/lib/async/async.dart",
+ "dart:async/stream.dart": "/lib/async/stream.dart",
+ "dart:collection": "/lib/collection/collection.dart",
+ "dart:convert": "/lib/convert/convert.dart",
+ "dart:math": "/lib/math/math.dart"
+ };
+
+ String path = uriToPath[dartUri];
+ if (path != null) {
+ resource.File file = provider.getResource(path);
+ Uri uri = new Uri(scheme: 'dart', path: dartUri.substring(5));
+ return file.createSource(uri);
+ }
+
+ // If we reach here then we tried to use a dartUri that's not in the
+ // table above.
+ return null;
+ }
+}
+
+class _MockSdkFile {
+ final String path;
+ final String content;
+
+ const _MockSdkFile(this.path, this.content);
+}
+
+class _MockSdkLibrary implements SdkLibrary {
+ final String shortName;
+ final String path;
+ final String content;
+ final List<_MockSdkFile> parts;
+
+ const _MockSdkLibrary(this.shortName, this.path, this.content,
+ [this.parts = const <_MockSdkFile>[]]);
+
+ @override
+ String get category => throw unimplemented;
+
+ @override
+ bool get isDart2JsLibrary => throw unimplemented;
+
+ @override
+ bool get isDocumented => throw unimplemented;
+
+ @override
+ bool get isImplementation => throw unimplemented;
+
+ @override
+ bool get isInternal => throw unimplemented;
+
+ @override
+ bool get isShared => throw unimplemented;
+
+ @override
+ bool get isVmLibrary => throw unimplemented;
+
+ UnimplementedError get unimplemented => new UnimplementedError();
+}
+
+/**
+ * An [AnalysisContextImpl] that only contains sources for a Dart SDK.
+ */
+class _SdkAnalysisContext extends AnalysisContextImpl {
+ final DartSdk sdk;
+
+ _SdkAnalysisContext(this.sdk);
+
+ @override
+ AnalysisCache createCacheFromSourceFactory(SourceFactory factory) {
+ if (factory == null) {
+ return super.createCacheFromSourceFactory(factory);
+ }
+ return new AnalysisCache(<CachePartition>[
+ AnalysisEngine.instance.partitionManager_new.forSdk(sdk)
+ ]);
+ }
+}
« no previous file with comments | « lib/src/linter.dart ('k') | test/rule_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698