Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2016, 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 library analyzer.src.context_factory; | |
| 6 | |
| 7 import 'dart:convert'; | |
| 8 import 'dart:core' hide Resource; | |
| 9 | |
| 10 import 'package:analyzer/file_system/file_system.dart'; | |
| 11 import 'package:analyzer/src/generated/sdk.dart'; | |
| 12 import 'package:yaml/yaml.dart'; | |
| 13 import 'package:analyzer/src/generated/engine.dart'; | |
| 14 import 'dart:io' as io; | |
| 15 | |
| 16 /// (Placeholder) | |
| 17 abstract class ContextFactory { | |
| 18 /// Create an analysis context for the given [source] directory or file, with | |
| 19 /// the given [defaultOptions]. | |
| 20 AnalysisContext createContext( | |
| 21 io.FileSystemEntity source, AnalysisOptions defaultOptions); | |
| 22 } | |
| 23 | |
| 24 /// Processes package maps, extracting SDK embedders and extenders, creating a | |
| 25 /// consolidated [libraryMap]. | |
| 26 class PackageMapProcessor { | |
| 27 static const String _EMBEDDED_LIB_MAP_KEY = 'embedded_libs'; | |
| 28 static const String _EMBEDDER_FILE_NAME = '_embedder.yaml'; | |
| 29 static const String _SDK_EXT_NAME = '_sdkext'; | |
| 30 | |
| 31 /// Map of processed embedder libraries. | |
| 32 final LibraryMap embeddedLibraries = new LibraryMap(); | |
| 33 | |
| 34 /// Map of processed SDK extension libraries. | |
| 35 final LibraryMap extendedLibraries = new LibraryMap(); | |
| 36 | |
| 37 /// Combined map of processed libraries. | |
| 38 LibraryMap get libraryMap { | |
| 39 LibraryMap libraryMap = new LibraryMap(); | |
| 40 for (String uri in embeddedLibraries.uris) { | |
| 41 libraryMap.setLibrary(uri, embeddedLibraries.getLibrary(uri)); | |
| 42 } | |
| 43 // Extenders extend but do not override. | |
| 44 for (String uri in extendedLibraries.uris) { | |
|
Brian Wilkerson
2016/06/07 20:48:48
It would be more efficient to add the extensions t
pquitslund
2016/06/07 20:59:58
Done.
| |
| 45 if (embeddedLibraries.getLibrary(uri) == null) { | |
| 46 libraryMap.setLibrary(uri, extendedLibraries.getLibrary(uri)); | |
| 47 } | |
| 48 } | |
| 49 return libraryMap; | |
| 50 } | |
| 51 | |
| 52 /// Create a processor for the given [packageMap]. | |
| 53 PackageMapProcessor(Map<String, List<Folder>> packageMap) { | |
| 54 packageMap?.forEach(_processPackage); | |
| 55 } | |
| 56 | |
| 57 /// Whether the package map contains an SDK embedder. | |
| 58 bool get hasEmbedder => embeddedLibraries.size() > 0; | |
| 59 | |
| 60 /// Whether the package map contains an SDK extension. | |
| 61 bool get hasSdkExtension => extendedLibraries.size() > 0; | |
| 62 | |
| 63 void _processEmbedderYaml(String embedderYaml, Folder libDir) { | |
| 64 try { | |
| 65 YamlNode map = loadYaml(embedderYaml); | |
| 66 if (map is YamlMap) { | |
| 67 YamlNode embedded_libs = map[_EMBEDDED_LIB_MAP_KEY]; | |
| 68 if (embedded_libs is YamlMap) { | |
| 69 embedded_libs.forEach( | |
| 70 (k, v) => _processMapping(embeddedLibraries, k, v, libDir)); | |
| 71 } | |
| 72 } | |
| 73 } catch (_) { | |
| 74 // Ignored. | |
| 75 } | |
| 76 } | |
| 77 | |
| 78 void _processMapping( | |
| 79 LibraryMap libraryMap, String name, String file, Folder libDir) { | |
| 80 if (!_hasDartPrefix(name)) { | |
| 81 // SDK libraries must begin with 'dart:'. | |
| 82 return; | |
| 83 } | |
| 84 if (libraryMap.getLibrary(name) != null) { | |
| 85 // Libraries can't be redefined. | |
| 86 return; | |
| 87 } | |
| 88 String libPath = libDir.canonicalizePath(file); | |
| 89 SdkLibraryImpl library = new SdkLibraryImpl(name)..path = libPath; | |
| 90 libraryMap.setLibrary(name, library); | |
| 91 } | |
| 92 | |
| 93 void _processPackage(String name, List<Folder> libDirs) { | |
| 94 for (Folder libDir in libDirs) { | |
| 95 String embedderYaml = _readEmbedderYaml(libDir); | |
| 96 if (embedderYaml != null) { | |
| 97 _processEmbedderYaml(embedderYaml, libDir); | |
| 98 } | |
| 99 String sdkExt = _readDotSdkExt(libDir); | |
| 100 if (sdkExt != null) { | |
| 101 _processSdkExt(sdkExt, libDir); | |
| 102 } | |
| 103 } | |
| 104 } | |
| 105 | |
| 106 void _processSdkExt(String sdkExtJSON, Folder libDir) { | |
| 107 try { | |
| 108 var sdkExt = JSON.decode(sdkExtJSON); | |
| 109 if (sdkExt is Map) { | |
| 110 sdkExt.forEach( | |
| 111 (k, v) => _processMapping(extendedLibraries, k, v, libDir)); | |
| 112 } | |
| 113 } catch (_) { | |
| 114 // Ignored. | |
| 115 } | |
| 116 } | |
| 117 | |
| 118 static bool _hasDartPrefix(String uri) => | |
| 119 uri.startsWith(DartSdk.DART_LIBRARY_PREFIX); | |
| 120 | |
| 121 static String _readDotSdkExt(Folder libDir) => | |
| 122 _safeRead(libDir.getChild(_SDK_EXT_NAME)); | |
| 123 | |
| 124 static String _readEmbedderYaml(Folder libDir) => | |
| 125 _safeRead(libDir.getChild(_EMBEDDER_FILE_NAME)); | |
| 126 | |
| 127 static String _safeRead(Resource file) { | |
| 128 try { | |
| 129 if (file is File) { | |
| 130 return file.readAsStringSync(); | |
| 131 } | |
| 132 } on FileSystemException { | |
| 133 // File can't be read. | |
| 134 } | |
| 135 return null; | |
| 136 } | |
| 137 } | |
| OLD | NEW |