OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 import 'dart:async'; | 5 import 'dart:async'; |
6 import 'dart:collection'; | 6 import 'dart:collection'; |
7 import 'dart:convert'; | 7 import 'dart:convert'; |
8 import 'dart:core'; | 8 import 'dart:core'; |
9 | 9 |
| 10 import 'package:analysis_server/src/plugin/notification_manager.dart'; |
10 import 'package:analyzer/context/context_root.dart'; | 11 import 'package:analyzer/context/context_root.dart'; |
| 12 import 'package:analyzer/error/error.dart'; |
11 import 'package:analyzer/file_system/file_system.dart'; | 13 import 'package:analyzer/file_system/file_system.dart'; |
12 import 'package:analyzer/instrumentation/instrumentation.dart'; | 14 import 'package:analyzer/instrumentation/instrumentation.dart'; |
13 import 'package:analyzer/plugin/resolver_provider.dart'; | 15 import 'package:analyzer/plugin/resolver_provider.dart'; |
14 import 'package:analyzer/source/analysis_options_provider.dart'; | 16 import 'package:analyzer/source/analysis_options_provider.dart'; |
15 import 'package:analyzer/source/package_map_provider.dart'; | 17 import 'package:analyzer/source/package_map_provider.dart'; |
16 import 'package:analyzer/source/package_map_resolver.dart'; | 18 import 'package:analyzer/source/package_map_resolver.dart'; |
17 import 'package:analyzer/source/path_filter.dart'; | 19 import 'package:analyzer/source/path_filter.dart'; |
18 import 'package:analyzer/source/pub_package_map_provider.dart'; | 20 import 'package:analyzer/source/pub_package_map_provider.dart'; |
19 import 'package:analyzer/source/sdk_ext.dart'; | 21 import 'package:analyzer/source/sdk_ext.dart'; |
20 import 'package:analyzer/src/context/builder.dart'; | 22 import 'package:analyzer/src/context/builder.dart'; |
21 import 'package:analyzer/src/dart/analysis/driver.dart'; | 23 import 'package:analyzer/src/dart/analysis/driver.dart'; |
22 import 'package:analyzer/src/dart/sdk/sdk.dart'; | 24 import 'package:analyzer/src/dart/sdk/sdk.dart'; |
23 import 'package:analyzer/src/generated/engine.dart'; | 25 import 'package:analyzer/src/generated/engine.dart'; |
| 26 import 'package:analyzer/src/generated/java_engine.dart'; |
24 import 'package:analyzer/src/generated/java_io.dart'; | 27 import 'package:analyzer/src/generated/java_io.dart'; |
25 import 'package:analyzer/src/generated/sdk.dart'; | 28 import 'package:analyzer/src/generated/sdk.dart'; |
26 import 'package:analyzer/src/generated/source.dart'; | 29 import 'package:analyzer/src/generated/source.dart'; |
27 import 'package:analyzer/src/generated/source_io.dart'; | 30 import 'package:analyzer/src/generated/source_io.dart'; |
28 import 'package:analyzer/src/task/options.dart'; | 31 import 'package:analyzer/src/task/options.dart'; |
29 import 'package:analyzer/src/util/absolute_path.dart'; | 32 import 'package:analyzer/src/util/absolute_path.dart'; |
30 import 'package:analyzer/src/util/glob.dart'; | 33 import 'package:analyzer/src/util/glob.dart'; |
31 import 'package:analyzer/src/util/yaml.dart'; | 34 import 'package:analyzer/src/util/yaml.dart'; |
| 35 import 'package:analyzer_plugin/utilities/analyzer_converter.dart'; |
32 import 'package:package_config/packages.dart'; | 36 import 'package:package_config/packages.dart'; |
33 import 'package:package_config/packages_file.dart' as pkgfile show parse; | 37 import 'package:package_config/packages_file.dart' as pkgfile show parse; |
34 import 'package:package_config/src/packages_impl.dart' show MapPackages; | 38 import 'package:package_config/src/packages_impl.dart' show MapPackages; |
35 import 'package:path/path.dart' as pathos; | 39 import 'package:path/path.dart' as pathos; |
36 import 'package:watcher/watcher.dart'; | 40 import 'package:watcher/watcher.dart'; |
37 import 'package:yaml/yaml.dart'; | 41 import 'package:yaml/yaml.dart'; |
38 | 42 |
39 /** | 43 /** |
40 * Information tracked by the [ContextManager] for each context. | 44 * Information tracked by the [ContextManager] for each context. |
41 */ | 45 */ |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
350 * created, destroyed or updated, (b) inform the client when "pub list" | 354 * created, destroyed or updated, (b) inform the client when "pub list" |
351 * operations are in progress, and (c) determine which files should be | 355 * operations are in progress, and (c) determine which files should be |
352 * analyzed. | 356 * analyzed. |
353 * | 357 * |
354 * TODO(paulberry): eliminate this interface, and instead have [ContextManager] | 358 * TODO(paulberry): eliminate this interface, and instead have [ContextManager] |
355 * operations return data structures describing how context state should be | 359 * operations return data structures describing how context state should be |
356 * modified. | 360 * modified. |
357 */ | 361 */ |
358 abstract class ContextManagerCallbacks { | 362 abstract class ContextManagerCallbacks { |
359 /** | 363 /** |
| 364 * Return the notification manager associated with the server. |
| 365 */ |
| 366 NotificationManager get notificationManager; |
| 367 |
| 368 /** |
360 * Create and return a new analysis driver rooted at the given [folder], with | 369 * Create and return a new analysis driver rooted at the given [folder], with |
361 * the given analysis [options]. | 370 * the given analysis [options]. |
362 */ | 371 */ |
363 AnalysisDriver addAnalysisDriver( | 372 AnalysisDriver addAnalysisDriver( |
364 Folder folder, ContextRoot contextRoot, AnalysisOptions options); | 373 Folder folder, ContextRoot contextRoot, AnalysisOptions options); |
365 | 374 |
366 /** | 375 /** |
367 * Create and return a new analysis context rooted at the given [folder], with | 376 * Create and return a new analysis context rooted at the given [folder], with |
368 * the given analysis [options]. | 377 * the given analysis [options]. |
369 */ | 378 */ |
(...skipping 590 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
960 } else if (child is Folder) { | 969 } else if (child is Folder) { |
961 String shortName = child.shortName; | 970 String shortName = child.shortName; |
962 if (shortName == PACKAGES_NAME) { | 971 if (shortName == PACKAGES_NAME) { |
963 continue; | 972 continue; |
964 } | 973 } |
965 _addSourceFiles(changeSet, child, info); | 974 _addSourceFiles(changeSet, child, info); |
966 } | 975 } |
967 } | 976 } |
968 } | 977 } |
969 | 978 |
| 979 /** |
| 980 * Use the given analysis [driver] to analyze the content of the analysis |
| 981 * options file at the given [path]. |
| 982 */ |
| 983 void _analyzeAnalysisOptionsFile(AnalysisDriver driver, String path) { |
| 984 String content = driver.fsState.getFileForPath(path).content; |
| 985 List<AnalysisError> errors = |
| 986 GenerateOptionsErrorsTask.analyzeAnalysisOptions( |
| 987 resourceProvider.getFile(path).createSource(), |
| 988 content, |
| 989 driver.sourceFactory); |
| 990 AnalyzerConverter converter = new AnalyzerConverter(); |
| 991 LineInfo lineInfo = _computeLineInfo(content); |
| 992 callbacks.notificationManager.recordAnalysisErrors( |
| 993 NotificationManager.serverId, |
| 994 path, |
| 995 converter.convertAnalysisErrors(errors, |
| 996 lineInfo: lineInfo, options: driver.analysisOptions)); |
| 997 } |
| 998 |
970 void _checkForAnalysisOptionsUpdate( | 999 void _checkForAnalysisOptionsUpdate( |
971 String path, ContextInfo info, ChangeType changeType) { | 1000 String path, ContextInfo info, ChangeType changeType) { |
972 if (AnalysisEngine.isAnalysisOptionsFileName(path, pathContext)) { | 1001 if (AnalysisEngine.isAnalysisOptionsFileName(path, pathContext)) { |
973 AnalysisDriver driver = info.analysisDriver; | 1002 AnalysisDriver driver = info.analysisDriver; |
974 String contextRoot = info.folder.path; | 1003 String contextRoot = info.folder.path; |
975 ContextBuilder builder = | 1004 ContextBuilder builder = |
976 callbacks.createContextBuilder(info.folder, defaultContextOptions); | 1005 callbacks.createContextBuilder(info.folder, defaultContextOptions); |
977 AnalysisOptions options = builder.getAnalysisOptions(contextRoot, | 1006 AnalysisOptions options = builder.getAnalysisOptions(contextRoot, |
978 contextRoot: driver.contextRoot); | 1007 contextRoot: driver.contextRoot); |
979 SourceFactory factory = builder.createSourceFactory(contextRoot, options); | 1008 SourceFactory factory = builder.createSourceFactory(contextRoot, options); |
980 driver.configure(analysisOptions: options, sourceFactory: factory); | 1009 driver.configure(analysisOptions: options, sourceFactory: factory); |
981 // TODO(brianwilkerson) Set exclusion patterns. | 1010 // TODO(brianwilkerson) Set exclusion patterns. |
| 1011 _analyzeAnalysisOptionsFile(driver, path); |
982 } | 1012 } |
983 } | 1013 } |
984 | 1014 |
985 void _checkForPackagespecUpdate( | 1015 void _checkForPackagespecUpdate( |
986 String path, ContextInfo info, Folder folder) { | 1016 String path, ContextInfo info, Folder folder) { |
987 // Check to see if this is the .packages file for this context and if so, | 1017 // Check to see if this is the .packages file for this context and if so, |
988 // update the context's source factory. | 1018 // update the context's source factory. |
989 if (absolutePathContext.basename(path) == PACKAGE_SPEC_NAME) { | 1019 if (absolutePathContext.basename(path) == PACKAGE_SPEC_NAME) { |
990 String contextRoot = info.folder.path; | 1020 String contextRoot = info.folder.path; |
991 ContextBuilder builder = | 1021 ContextBuilder builder = |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1088 addDependency(dependencyPath); | 1118 addDependency(dependencyPath); |
1089 } | 1119 } |
1090 if (packageMapInfo.packageMap == null) { | 1120 if (packageMapInfo.packageMap == null) { |
1091 return new NoPackageFolderDisposition(); | 1121 return new NoPackageFolderDisposition(); |
1092 } | 1122 } |
1093 return new PackageMapDisposition(packageMapInfo.packageMap); | 1123 return new PackageMapDisposition(packageMapInfo.packageMap); |
1094 } | 1124 } |
1095 } | 1125 } |
1096 | 1126 |
1097 /** | 1127 /** |
| 1128 * Compute line information for the given [content]. |
| 1129 */ |
| 1130 LineInfo _computeLineInfo(String content) { |
| 1131 List<int> lineStarts = StringUtilities.computeLineStarts(content); |
| 1132 return new LineInfo(lineStarts); |
| 1133 } |
| 1134 |
| 1135 /** |
1098 * Create an object that can be used to find and read the analysis options | 1136 * Create an object that can be used to find and read the analysis options |
1099 * file for code being analyzed using the given [packages]. | 1137 * file for code being analyzed using the given [packages]. |
1100 */ | 1138 */ |
1101 AnalysisOptionsProvider _createAnalysisOptionsProvider(Packages packages) { | 1139 AnalysisOptionsProvider _createAnalysisOptionsProvider(Packages packages) { |
1102 Map<String, List<Folder>> packageMap = | 1140 Map<String, List<Folder>> packageMap = |
1103 new ContextBuilder(resourceProvider, null, null) | 1141 new ContextBuilder(resourceProvider, null, null) |
1104 .convertPackagesToMap(packages); | 1142 .convertPackagesToMap(packages); |
1105 List<UriResolver> resolvers = <UriResolver>[ | 1143 List<UriResolver> resolvers = <UriResolver>[ |
1106 new ResourceUriResolver(resourceProvider), | 1144 new ResourceUriResolver(resourceProvider), |
1107 new PackageMapUriResolver(resourceProvider, packageMap), | 1145 new PackageMapUriResolver(resourceProvider, packageMap), |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1146 pathContext.isWithin(includedPath, excludedPath)) | 1184 pathContext.isWithin(includedPath, excludedPath)) |
1147 .toList(); | 1185 .toList(); |
1148 processOptionsForDriver(info, options, optionMap); | 1186 processOptionsForDriver(info, options, optionMap); |
1149 ContextRoot contextRoot = | 1187 ContextRoot contextRoot = |
1150 new ContextRoot(folder.path, containedExcludedPaths); | 1188 new ContextRoot(folder.path, containedExcludedPaths); |
1151 if (optionsFile != null) { | 1189 if (optionsFile != null) { |
1152 contextRoot.optionsFilePath = optionsFile.path; | 1190 contextRoot.optionsFilePath = optionsFile.path; |
1153 } | 1191 } |
1154 info.analysisDriver = | 1192 info.analysisDriver = |
1155 callbacks.addAnalysisDriver(folder, contextRoot, options); | 1193 callbacks.addAnalysisDriver(folder, contextRoot, options); |
| 1194 if (optionsFile != null) { |
| 1195 _analyzeAnalysisOptionsFile(info.analysisDriver, optionsFile.path); |
| 1196 } |
1156 return info; | 1197 return info; |
1157 } | 1198 } |
1158 | 1199 |
1159 /** | 1200 /** |
1160 * Potentially create a new context associated with the given [folder]. | 1201 * Potentially create a new context associated with the given [folder]. |
1161 * | 1202 * |
1162 * If there are subfolders with 'pubspec.yaml' files, separate contexts are | 1203 * If there are subfolders with 'pubspec.yaml' files, separate contexts are |
1163 * created for them and excluded from the context associated with the | 1204 * created for them and excluded from the context associated with the |
1164 * [folder]. | 1205 * [folder]. |
1165 * | 1206 * |
(...skipping 717 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1883 } | 1924 } |
1884 return _embedderLocator; | 1925 return _embedderLocator; |
1885 } | 1926 } |
1886 | 1927 |
1887 @override | 1928 @override |
1888 SdkExtensionFinder getSdkExtensionFinder(ResourceProvider resourceProvider) { | 1929 SdkExtensionFinder getSdkExtensionFinder(ResourceProvider resourceProvider) { |
1889 return _sdkExtensionFinder ??= | 1930 return _sdkExtensionFinder ??= |
1890 new SdkExtensionFinder(buildPackageMap(resourceProvider)); | 1931 new SdkExtensionFinder(buildPackageMap(resourceProvider)); |
1891 } | 1932 } |
1892 } | 1933 } |
OLD | NEW |