Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(65)

Side by Side Diff: pkg/analysis_server/lib/src/context_manager.dart

Issue 1686613002: Use different SDKs based on option settings (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 library context.directory.manager; 5 library context.directory.manager;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 import 'dart:collection'; 8 import 'dart:collection';
9 import 'dart:convert'; 9 import 'dart:convert';
10 import 'dart:core' hide Resource; 10 import 'dart:core' hide Resource;
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
299 * created, destroyed or updated, (b) inform the client when "pub list" 299 * created, destroyed or updated, (b) inform the client when "pub list"
300 * operations are in progress, and (c) determine which files should be 300 * operations are in progress, and (c) determine which files should be
301 * analyzed. 301 * analyzed.
302 * 302 *
303 * TODO(paulberry): eliminate this interface, and instead have [ContextManager] 303 * TODO(paulberry): eliminate this interface, and instead have [ContextManager]
304 * operations return data structures describing how context state should be 304 * operations return data structures describing how context state should be
305 * modified. 305 * modified.
306 */ 306 */
307 abstract class ContextManagerCallbacks { 307 abstract class ContextManagerCallbacks {
308 /** 308 /**
309 * Create and return a new analysis context, allowing [disposition] to govern 309 * Return the default analysis options to be used when creating an analysis
310 * details of how the context is to be created. 310 * context.
311 */ 311 */
312 AnalysisContext addContext(Folder folder, FolderDisposition disposition); 312 AnalysisOptions get defaultAnalysisOptions;
313
314 /**
315 * Create and return a new analysis context rooted at the given [folder], with
316 * the given analysis [options], allowing [disposition] to govern details of
317 * how the context is to be created.
318 */
319 AnalysisContext addContext(
320 Folder folder, AnalysisOptions options, FolderDisposition disposition);
313 321
314 /** 322 /**
315 * Called when the set of files associated with a context have changed (or 323 * Called when the set of files associated with a context have changed (or
316 * some of those files have been modified). [changeSet] is the set of 324 * some of those files have been modified). [changeSet] is the set of
317 * changes that need to be applied to the context. 325 * changes that need to be applied to the context.
318 */ 326 */
319 void applyChangesToContext(Folder contextFolder, ChangeSet changeSet); 327 void applyChangesToContext(Folder contextFolder, ChangeSet changeSet);
320 328
321 /** 329 /**
322 * Called when the ContextManager is about to start computing the package 330 * Called when the ContextManager is about to start computing the package
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
542 return true; 550 return true;
543 } 551 }
544 } 552 }
545 // no 553 // no
546 return false; 554 return false;
547 } 555 }
548 556
549 /** 557 /**
550 * Process [options] for the given context [info]. 558 * Process [options] for the given context [info].
551 */ 559 */
552 void processOptionsForContext(ContextInfo info, Folder folder, 560 void processOptionsForContext(ContextInfo info, Map<String, Object> options,
553 {bool optionsRemoved: false}) { 561 {bool optionsRemoved: false}) {
554 Map<String, Object> options;
555 try {
556 options = analysisOptionsProvider.getOptions(folder);
557 } catch (_) {
558 // Parse errors are reported by GenerateOptionsErrorsTask.
559 }
560
561 if (options == null && !optionsRemoved) { 562 if (options == null && !optionsRemoved) {
562 return; 563 return;
563 } 564 }
564 565
565 // In case options files are removed, revert to defaults. 566 // In case options files are removed, revert to defaults.
566 if (optionsRemoved) { 567 if (optionsRemoved) {
567 // Start with defaults. 568 // Start with defaults.
568 info.context.analysisOptions = new AnalysisOptionsImpl(); 569 info.context.analysisOptions = new AnalysisOptionsImpl();
569 570
570 // Apply inherited options. 571 // Apply inherited options.
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
605 return; 606 return;
606 } 607 }
607 608
608 // Set ignore patterns. 609 // Set ignore patterns.
609 YamlList exclude = analyzer[AnalyzerOptions.exclude]; 610 YamlList exclude = analyzer[AnalyzerOptions.exclude];
610 if (exclude != null) { 611 if (exclude != null) {
611 setIgnorePatternsForContext(info, exclude); 612 setIgnorePatternsForContext(info, exclude);
612 } 613 }
613 } 614 }
614 615
616 /**
617 * Return the options from the analysis options file in the given [folder], or
618 * `null` if there is no file in the folder or if the contents of the file are
619 * not valid YAML.
620 */
621 Map<String, Object> readOptions(Folder folder) {
622 try {
623 return analysisOptionsProvider.getOptions(folder);
624 } catch (_) {
625 // Parse errors are reported by GenerateOptionsErrorsTask.
626 }
627 return null;
628 }
629
615 @override 630 @override
616 void refresh(List<Resource> roots) { 631 void refresh(List<Resource> roots) {
617 // Destroy old contexts 632 // Destroy old contexts
618 List<ContextInfo> contextInfos = rootInfo.descendants.toList(); 633 List<ContextInfo> contextInfos = rootInfo.descendants.toList();
619 if (roots == null) { 634 if (roots == null) {
620 contextInfos.forEach(_destroyContext); 635 contextInfos.forEach(_destroyContext);
621 } else { 636 } else {
622 roots.forEach((Resource resource) { 637 roots.forEach((Resource resource) {
623 contextInfos.forEach((ContextInfo contextInfo) { 638 contextInfos.forEach((ContextInfo contextInfo) {
624 if (resource is Folder && 639 if (resource is Folder &&
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
827 _addSourceFiles(changeSet, child, info); 842 _addSourceFiles(changeSet, child, info);
828 } 843 }
829 } 844 }
830 } 845 }
831 846
832 void _checkForAnalysisOptionsUpdate( 847 void _checkForAnalysisOptionsUpdate(
833 String path, ContextInfo info, ChangeType changeType) { 848 String path, ContextInfo info, ChangeType changeType) {
834 if (AnalysisEngine.isAnalysisOptionsFileName(path, pathContext)) { 849 if (AnalysisEngine.isAnalysisOptionsFileName(path, pathContext)) {
835 var analysisContext = info.context; 850 var analysisContext = info.context;
836 if (analysisContext is context.AnalysisContextImpl) { 851 if (analysisContext is context.AnalysisContextImpl) {
837 processOptionsForContext(info, info.folder, 852 // TODO(brianwilkerson) This doesn't correctly update the source factory
853 // if the changes necessitate it (such as by changing the setting of the
854 // strong-mode option).
855 Map<String, Object> options = readOptions(info.folder);
856 processOptionsForContext(info, options,
838 optionsRemoved: changeType == ChangeType.REMOVE); 857 optionsRemoved: changeType == ChangeType.REMOVE);
839 analysisContext.invalidateCachedResults(); 858 analysisContext.invalidateCachedResults();
840 callbacks.applyChangesToContext(info.folder, new ChangeSet()); 859 callbacks.applyChangesToContext(info.folder, new ChangeSet());
841 } 860 }
842 } 861 }
843 } 862 }
844 863
845 void _checkForPackagespecUpdate( 864 void _checkForPackagespecUpdate(
846 String path, ContextInfo info, Folder folder) { 865 String path, ContextInfo info, Folder folder) {
847 // Check to see if this is the .packages file for this context and if so, 866 // Check to see if this is the .packages file for this context and if so,
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
968 987
969 FolderDisposition disposition; 988 FolderDisposition disposition;
970 List<String> dependencies = <String>[]; 989 List<String> dependencies = <String>[];
971 990
972 // Next resort to a package uri resolver. 991 // Next resort to a package uri resolver.
973 if (disposition == null) { 992 if (disposition == null) {
974 disposition = 993 disposition =
975 _computeFolderDisposition(folder, dependencies.add, packagespecFile); 994 _computeFolderDisposition(folder, dependencies.add, packagespecFile);
976 } 995 }
977 996
997 Map<String, Object> optionMap = readOptions(info.folder);
998 AnalysisOptions options =
999 new AnalysisOptionsImpl.from(callbacks.defaultAnalysisOptions);
1000 applyToAnalysisOptions(options, optionMap);
1001
978 info.setDependencies(dependencies); 1002 info.setDependencies(dependencies);
979 info.context = callbacks.addContext(folder, disposition); 1003 info.context = callbacks.addContext(folder, options, disposition);
980 info.context.name = folder.path; 1004 info.context.name = folder.path;
981 1005
982 processOptionsForContext(info, folder); 1006 processOptionsForContext(info, optionMap);
983 1007
984 return info; 1008 return info;
985 } 1009 }
986 1010
987 /** 1011 /**
988 * Potentially create a new context associated with the given [folder]. 1012 * Potentially create a new context associated with the given [folder].
989 * 1013 *
990 * If there are subfolders with 'pubspec.yaml' files, separate contexts are 1014 * If there are subfolders with 'pubspec.yaml' files, separate contexts are
991 * created for them and excluded from the context associated with the 1015 * created for them and excluded from the context associated with the
992 * [folder]. 1016 * [folder].
(...skipping 609 matching lines...) Expand 10 before | Expand all | Expand 10 after
1602 ResourceProvider resourceProvider) { 1626 ResourceProvider resourceProvider) {
1603 if (packages != null) { 1627 if (packages != null) {
1604 // Construct package map for the SdkExtUriResolver. 1628 // Construct package map for the SdkExtUriResolver.
1605 Map<String, List<Folder>> packageMap = buildPackageMap(resourceProvider); 1629 Map<String, List<Folder>> packageMap = buildPackageMap(resourceProvider);
1606 return <UriResolver>[new SdkExtUriResolver(packageMap)]; 1630 return <UriResolver>[new SdkExtUriResolver(packageMap)];
1607 } else { 1631 } else {
1608 return const <UriResolver>[]; 1632 return const <UriResolver>[];
1609 } 1633 }
1610 } 1634 }
1611 } 1635 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698