312 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
		
		
			
		
	
	
			312 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| 
								 | 
							
								library test.src.mock_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/generated/engine.dart';
							 | 
						||
| 
								 | 
							
								import 'package:analyzer/src/generated/sdk.dart';
							 | 
						||
| 
								 | 
							
								import 'package:analyzer/src/generated/source.dart';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class MockSdk implements DartSdk {
							 | 
						||
| 
								 | 
							
								  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';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class Future<T> {
							 | 
						||
| 
								 | 
							
								  factory Future.delayed(Duration duration, [T computation()]) => null;
							 | 
						||
| 
								 | 
							
								  factory Future.value([value]) => null;
							 | 
						||
| 
								 | 
							
								  static Future wait(List<Future> futures) => null;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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 [AnalysisContext] which is used for all of the sources.
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  InternalAnalysisContext _analysisContext;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  MockSdk() {
							 | 
						||
| 
								 | 
							
								    LIBRARIES.forEach((_MockSdkLibrary library) {
							 | 
						||
| 
								 | 
							
								      provider.newFile(library.path, library.content);
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @override
							 | 
						||
| 
								 | 
							
								  AnalysisContext get context {
							 | 
						||
| 
								 | 
							
								    if (_analysisContext == null) {
							 | 
						||
| 
								 | 
							
								      _analysisContext = new SdkAnalysisContext();
							 | 
						||
| 
								 | 
							
								      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
							 | 
						||
| 
								 | 
							
								  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
							 | 
						||
| 
								 | 
							
								  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
							 | 
						||
| 
								 | 
							
								  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
							 | 
						||
| 
								 | 
							
								  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: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 _MockSdkLibrary implements SdkLibrary {
							 | 
						||
| 
								 | 
							
								  final String shortName;
							 | 
						||
| 
								 | 
							
								  final String path;
							 | 
						||
| 
								 | 
							
								  final String content;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const _MockSdkLibrary(this.shortName, this.path, this.content);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @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();
							 | 
						||
| 
								 | 
							
								}
							 |