| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | |
| 2 // for details. All rights reserved. Use of this source code is governed by a | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 | |
| 5 /// Common logic needed to provide a Dart SDK to the analyzer's resolver. This | |
| 6 /// includes logic to determine where the sdk is located in the filesystem, and | |
| 7 /// definitions to provide mock sdks. | |
| 8 library dev_compiler.src.checker.dart_sdk; | |
| 9 | |
| 10 import 'package:analyzer/src/generated/engine.dart'; | |
| 11 import 'package:analyzer/src/generated/sdk.dart'; | |
| 12 import 'package:analyzer/src/generated/source.dart'; | |
| 13 | |
| 14 /// Dart SDK which contains a mock implementation of the SDK libraries. May be | |
| 15 /// used to speed up execution when most of the core libraries is not needed. | |
| 16 class MockDartSdk implements DartSdk { | |
| 17 final Map<Uri, _MockSdkSource> _sources = {}; | |
| 18 final bool reportMissing; | |
| 19 final Map<String, SdkLibrary> _libs = {}; | |
| 20 final String sdkVersion = '0'; | |
| 21 List<String> get uris => _sources.keys.map((uri) => '$uri').toList(); | |
| 22 final AnalysisContext context = new SdkAnalysisContext(); | |
| 23 DartUriResolver _resolver; | |
| 24 DartUriResolver get resolver => _resolver; | |
| 25 | |
| 26 MockDartSdk(Map<String, String> sources, {this.reportMissing}) { | |
| 27 sources.forEach((uriString, contents) { | |
| 28 var uri = Uri.parse(uriString); | |
| 29 _sources[uri] = new _MockSdkSource(uri, contents); | |
| 30 _libs[uriString] = new SdkLibraryImpl(uri.path) | |
| 31 ..setDart2JsLibrary() | |
| 32 ..setVmLibrary(); | |
| 33 }); | |
| 34 _resolver = new DartUriResolver(this); | |
| 35 context.sourceFactory = new SourceFactory([_resolver]); | |
| 36 } | |
| 37 | |
| 38 List<SdkLibrary> get sdkLibraries => _libs.values.toList(); | |
| 39 SdkLibrary getSdkLibrary(String dartUri) => _libs[dartUri]; | |
| 40 Source mapDartUri(String dartUri) => _getSource(Uri.parse(dartUri)); | |
| 41 | |
| 42 Source fromEncoding(UriKind kind, Uri uri) { | |
| 43 if (kind != UriKind.DART_URI) { | |
| 44 throw new UnsupportedError('expected dart: uri kind, got $kind.'); | |
| 45 } | |
| 46 return _getSource(uri); | |
| 47 } | |
| 48 | |
| 49 Source _getSource(Uri uri) { | |
| 50 var src = _sources[uri]; | |
| 51 if (src == null) { | |
| 52 if (reportMissing) print('warning: missing mock for $uri.'); | |
| 53 _sources[uri] = | |
| 54 src = new _MockSdkSource(uri, 'library dart.${uri.path};'); | |
| 55 } | |
| 56 return src; | |
| 57 } | |
| 58 | |
| 59 @override | |
| 60 Source fromFileUri(Uri uri) { | |
| 61 throw new UnsupportedError('MockDartSdk.fromFileUri'); | |
| 62 } | |
| 63 } | |
| 64 | |
| 65 class _MockSdkSource implements Source { | |
| 66 /// Absolute URI which this source can be imported from. | |
| 67 final Uri uri; | |
| 68 final String _contents; | |
| 69 | |
| 70 _MockSdkSource(this.uri, this._contents); | |
| 71 | |
| 72 bool exists() => true; | |
| 73 | |
| 74 int get hashCode => uri.hashCode; | |
| 75 | |
| 76 final int modificationStamp = 1; | |
| 77 | |
| 78 TimestampedData<String> get contents => | |
| 79 new TimestampedData(modificationStamp, _contents); | |
| 80 | |
| 81 String get encoding => "${uriKind.encoding}$uri"; | |
| 82 | |
| 83 Source get source => this; | |
| 84 | |
| 85 String get fullName => shortName; | |
| 86 | |
| 87 String get shortName => uri.path; | |
| 88 | |
| 89 UriKind get uriKind => UriKind.DART_URI; | |
| 90 | |
| 91 bool get isInSystemLibrary => true; | |
| 92 | |
| 93 Source resolveRelative(Uri relativeUri) => | |
| 94 throw new UnsupportedError('not expecting relative urls in dart: mocks'); | |
| 95 | |
| 96 Uri resolveRelativeUri(Uri relativeUri) => | |
| 97 throw new UnsupportedError('not expecting relative urls in dart: mocks'); | |
| 98 } | |
| 99 | |
| 100 /// Sample mock SDK sources. | |
| 101 final Map<String, String> mockSdkSources = { | |
| 102 // The list of types below is derived from: | |
| 103 // * types we use via our smoke queries, including HtmlElement and | |
| 104 // types from `_typeHandlers` (deserialize.dart) | |
| 105 // * types that are used internally by the resolver (see | |
| 106 // _initializeFrom in resolver.dart). | |
| 107 'dart:core': ''' | |
| 108 library dart.core; | |
| 109 | |
| 110 void print(Object o) {} | |
| 111 | |
| 112 class Object { | |
| 113 int get hashCode {} | |
| 114 Type get runtimeType {} | |
| 115 String toString(){} | |
| 116 } | |
| 117 class Function {} | |
| 118 class StackTrace {} | |
| 119 class Symbol {} | |
| 120 class Type {} | |
| 121 | |
| 122 class String {} | |
| 123 class bool {} | |
| 124 class num { | |
| 125 num operator +(num other) {} | |
| 126 } | |
| 127 class int extends num { | |
| 128 int operator-() {} | |
| 129 } | |
| 130 class double extends num {} | |
| 131 class DateTime {} | |
| 132 class Null {} | |
| 133 | |
| 134 class Deprecated { | |
| 135 final String expires; | |
| 136 const Deprecated(this.expires); | |
| 137 } | |
| 138 const Object deprecated = const Deprecated("next release"); | |
| 139 class _Override { const _Override(); } | |
| 140 const Object override = const _Override(); | |
| 141 class _Proxy { const _Proxy(); } | |
| 142 const Object proxy = const _Proxy(); | |
| 143 | |
| 144 class Iterable<E> {} | |
| 145 class List<E> implements Iterable<E> { | |
| 146 List([int length]); | |
| 147 List.filled(int length, E fill); | |
| 148 } | |
| 149 class Map<K, V> { | |
| 150 Iterable<K> get keys {} | |
| 151 } | |
| 152 ''', | |
| 153 'dart:async': ''' | |
| 154 class Future<T> { | |
| 155 Future then(callback) {} | |
| 156 } | |
| 157 class Stream<T> {} | |
| 158 ''', | |
| 159 'dart:html': ''' | |
| 160 library dart.html; | |
| 161 class HtmlElement {} | |
| 162 ''', | |
| 163 }; | |
| OLD | NEW |