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();
 | 
						|
}
 |