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

Unified Diff: pkg/analysis_server/lib/src/context_manager.dart

Issue 2795743002: Add context information to driver and add hooks for plugin management (Closed)
Patch Set: Created 3 years, 9 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 side-by-side diff with in-line comments
Download patch
Index: pkg/analysis_server/lib/src/context_manager.dart
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index e85b94a5d5345981655989eae3d7bbb0ca4aaf4c..686c08898d24f226190dcf4272edc50107a1d5a3 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -10,6 +10,7 @@ import 'dart:convert';
import 'dart:core';
import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analyzer/context/context_root.dart';
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/instrumentation/instrumentation.dart';
import 'package:analyzer/plugin/resolver_provider.dart';
@@ -279,6 +280,19 @@ abstract class ContextManager {
List<AnalysisContext> contextsInAnalysisRoot(Folder analysisRoot);
/**
+ * Like [getDriverFor] and [getContextFor], but returns the [Folder] which
+ * allows plugins to create & manage their own tree of drivers just like using
+ * [getDriverFor].
+ *
+ * This folder should be the root of analysis context, not just the containing
+ * folder of the path (like basename), as this is NOT just a file API.
+ *
+ * This exists at least temporarily, for plugin support until the new API is
+ * ready.
+ */
+ Folder getContextFolderFor(String path);
+
+ /**
* Return the [AnalysisContext] for the "innermost" context whose associated
* folder is or contains the given path. ("innermost" refers to the nesting
* of contexts, so if there is a context for path /foo and a context for
@@ -301,19 +315,6 @@ abstract class ContextManager {
AnalysisDriver getDriverFor(String path);
/**
- * Like [getDriverFor] and [getContextFor], but returns the [Folder] which
- * allows plugins to create & manage their own tree of drivers just like using
- * [getDriverFor].
- *
- * This folder should be the root of analysis context, not just the containing
- * folder of the path (like basename), as this is NOT just a file API.
- *
- * This exists at least temporarily, for plugin support until the new API is
- * ready.
- */
- Folder getContextFolderFor(String path);
-
- /**
* Return a list of all of the analysis drivers reachable from the given
* [analysisRoot] (the driver associated with [analysisRoot] and all of its
* descendants).
@@ -363,7 +364,8 @@ abstract class ContextManagerCallbacks {
* Create and return a new analysis driver rooted at the given [folder], with
* the given analysis [options].
*/
- AnalysisDriver addAnalysisDriver(Folder folder, AnalysisOptions options);
+ AnalysisDriver addAnalysisDriver(
+ Folder folder, ContextRoot contextRoot, AnalysisOptions options);
/**
* Create and return a new analysis context rooted at the given [folder], with
@@ -606,6 +608,10 @@ class ContextManagerImpl implements ContextManager {
*/
bool definesEmbeddedLibs(Map map) => map[_EMBEDDED_LIB_MAP_KEY] != null;
+ Folder getContextFolderFor(String path) {
+ return _getInnermostContextInfoFor(path)?.folder;
+ }
+
@override
AnalysisContext getContextFor(String path) {
return _getInnermostContextInfoFor(path)?.context;
@@ -627,10 +633,6 @@ class ContextManagerImpl implements ContextManager {
return _getInnermostContextInfoFor(path)?.analysisDriver;
}
- Folder getContextFolderFor(String path) {
- return _getInnermostContextInfoFor(path)?.folder;
- }
-
@override
List<AnalysisDriver> getDriversInAnalysisRoot(Folder analysisRoot) {
List<AnalysisDriver> drivers = <AnalysisDriver>[];
@@ -884,7 +886,7 @@ class ContextManagerImpl implements ContextManager {
ContextInfo parent = _getParentForNewContext(includedPath);
changeSubscriptions[includedFolder] =
includedFolder.changes.listen(_handleWatchEvent);
- _createContexts(parent, includedFolder, false);
+ _createContexts(parent, includedFolder, excludedPaths, false);
}
}
// remove newly excluded sources
@@ -1166,14 +1168,14 @@ class ContextManagerImpl implements ContextManager {
/**
* Create a new empty context associated with [folder], having parent
- * [parent] and using [packagespecFile] to resolve package URI's.
+ * [parent] and using [packagesFile] to resolve package URI's.
*/
- ContextInfo _createContext(
- ContextInfo parent, Folder folder, File packagespecFile) {
+ ContextInfo _createContext(ContextInfo parent, Folder folder,
+ List<String> excludedPaths, File packagesFile) {
List<String> dependencies = <String>[];
FolderDisposition disposition =
- _computeFolderDisposition(folder, dependencies.add, packagespecFile);
- ContextInfo info = new ContextInfo(this, parent, folder, packagespecFile,
+ _computeFolderDisposition(folder, dependencies.add, packagesFile);
+ ContextInfo info = new ContextInfo(this, parent, folder, packagesFile,
normalizedPackageRoots[folder.path], disposition);
Map<String, Object> optionMap =
@@ -1184,8 +1186,14 @@ class ContextManagerImpl implements ContextManager {
info.setDependencies(dependencies);
if (enableNewAnalysisDriver) {
+ String includedPath = folder.path;
+ List<String> containedExcludedPaths = excludedPaths
+ .where((String excludedPath) =>
+ pathContext.isWithin(includedPath, excludedPath))
+ .toList();
processOptionsForDriver(info, options, optionMap);
- info.analysisDriver = callbacks.addAnalysisDriver(folder, options);
+ info.analysisDriver = callbacks.addAnalysisDriver(folder,
+ new ContextRoot(folder.path, containedExcludedPaths), options);
} else {
info.context = callbacks.addContext(folder, options);
_folderMap[folder] = info.context;
@@ -1208,8 +1216,8 @@ class ContextManagerImpl implements ContextManager {
*
* [parent] should be the parent of any contexts that are created.
*/
- void _createContexts(
- ContextInfo parent, Folder folder, bool withPackageSpecOnly) {
+ void _createContexts(ContextInfo parent, Folder folder,
+ List<String> excludedPaths, bool withPackageSpecOnly) {
if (_isExcluded(folder.path) ||
folder.shortName.startsWith('.') ||
folder.shortName == 'packages') {
@@ -1227,7 +1235,7 @@ class ContextManagerImpl implements ContextManager {
createContext = false;
}
if (createContext) {
- parent = _createContext(parent, folder, packageSpec);
+ parent = _createContext(parent, folder, excludedPaths, packageSpec);
}
// Try to find subfolders with pubspecs or .packages files.
@@ -1235,7 +1243,7 @@ class ContextManagerImpl implements ContextManager {
for (Resource child in folder.getChildren()) {
if (child is Folder) {
if (!parent.ignored(child.path)) {
- _createContexts(parent, child, true);
+ _createContexts(parent, child, excludedPaths, true);
}
}
}
@@ -1278,7 +1286,8 @@ class ContextManagerImpl implements ContextManager {
*/
void _extractContext(ContextInfo oldInfo, File packagespecFile) {
Folder newFolder = packagespecFile.parent;
- ContextInfo newInfo = _createContext(oldInfo, newFolder, packagespecFile);
+ ContextInfo newInfo =
+ _createContext(oldInfo, newFolder, excludedPaths, packagespecFile);
// prepare sources to extract
Map<String, Source> extractedSources = new HashMap<String, Source>();
oldInfo.sources.forEach((path, source) {
« no previous file with comments | « pkg/analysis_server/lib/src/analysis_server.dart ('k') | pkg/analysis_server/lib/src/plugin/plugin_manager.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698