| Index: pkg/analysis_server/lib/src/status/get_handler.dart
|
| diff --git a/pkg/analysis_server/lib/src/get_handler.dart b/pkg/analysis_server/lib/src/status/get_handler.dart
|
| similarity index 89%
|
| copy from pkg/analysis_server/lib/src/get_handler.dart
|
| copy to pkg/analysis_server/lib/src/status/get_handler.dart
|
| index 983f689abcd823e173ed492092bdf239b79149c0..01a330aefceacae35e0b914103a99cbefc4d8976 100644
|
| --- a/pkg/analysis_server/lib/src/get_handler.dart
|
| +++ b/pkg/analysis_server/lib/src/status/get_handler.dart
|
| @@ -2,7 +2,7 @@
|
| // for details. All rights reserved. Use of this source code is governed by a
|
| // BSD-style license that can be found in the LICENSE file.
|
|
|
| -library analysis_server.src.get_handler;
|
| +library analysis_server.src.status.get_handler;
|
|
|
| import 'dart:async';
|
| import 'dart:collection';
|
| @@ -24,13 +24,18 @@ import 'package:analysis_server/src/socket_server.dart';
|
| import 'package:analysis_server/src/status/ast_writer.dart';
|
| import 'package:analysis_server/src/status/element_writer.dart';
|
| import 'package:analyzer/file_system/file_system.dart';
|
| +import 'package:analyzer/src/context/cache.dart';
|
| import 'package:analyzer/src/generated/ast.dart';
|
| import 'package:analyzer/src/generated/element.dart';
|
| -import 'package:analyzer/src/generated/engine.dart';
|
| +import 'package:analyzer/src/generated/engine.dart'
|
| + hide AnalysisContextImpl, AnalysisTask;
|
| import 'package:analyzer/src/generated/java_engine.dart';
|
| import 'package:analyzer/src/generated/source.dart';
|
| +import 'package:analyzer/src/generated/utilities_collection.dart';
|
| import 'package:analyzer/src/generated/utilities_general.dart';
|
| -import 'package:analyzer/task/model.dart' as newTask;
|
| +import 'package:analyzer/src/task/dart.dart';
|
| +import 'package:analyzer/task/dart.dart';
|
| +import 'package:analyzer/task/model.dart';
|
| import 'package:plugin/plugin.dart';
|
|
|
| /**
|
| @@ -222,18 +227,49 @@ class GetHandler {
|
| }
|
|
|
| /**
|
| + * Return any AST structure stored in the given [entry].
|
| + */
|
| + CompilationUnit _getAnyAst(CacheEntry entry) {
|
| + CompilationUnit unit = entry.getValue(PARSED_UNIT);
|
| + if (unit != null) {
|
| + return unit;
|
| + }
|
| + unit = entry.getValue(RESOLVED_UNIT1);
|
| + if (unit != null) {
|
| + return unit;
|
| + }
|
| + unit = entry.getValue(RESOLVED_UNIT2);
|
| + if (unit != null) {
|
| + return unit;
|
| + }
|
| + unit = entry.getValue(RESOLVED_UNIT3);
|
| + if (unit != null) {
|
| + return unit;
|
| + }
|
| + unit = entry.getValue(RESOLVED_UNIT4);
|
| + if (unit != null) {
|
| + return unit;
|
| + }
|
| + unit = entry.getValue(RESOLVED_UNIT5);
|
| + if (unit != null) {
|
| + return unit;
|
| + }
|
| + return entry.getValue(RESOLVED_UNIT);
|
| + }
|
| +
|
| + /**
|
| * Return `true` if the given analysis [context] has at least one entry with
|
| * an exception.
|
| */
|
| - bool _hasException(AnalysisContextImpl context) {
|
| - bool hasException = false;
|
| - context.visitCacheItems((Source source, SourceEntry sourceEntry,
|
| - DataDescriptor rowDesc, CacheState state) {
|
| - if (sourceEntry.exception != null) {
|
| - hasException = true;
|
| + bool _hasException(InternalAnalysisContext context) {
|
| + MapIterator<AnalysisTarget, CacheEntry> iterator =
|
| + context.analysisCache.iterator();
|
| + while (iterator.moveNext()) {
|
| + if (iterator.value.exception != null) {
|
| + return true;
|
| }
|
| - });
|
| - return hasException;
|
| + }
|
| + return false;
|
| }
|
|
|
| /**
|
| @@ -306,8 +342,8 @@ class GetHandler {
|
| 'Average Time (in ms)'
|
| ], header: true);
|
|
|
| - Map<Type, int> countMap = newTask.AnalysisTask.countMap;
|
| - Map<Type, Stopwatch> stopwatchMap = newTask.AnalysisTask.stopwatchMap;
|
| + Map<Type, int> countMap = AnalysisTask.countMap;
|
| + Map<Type, Stopwatch> stopwatchMap = AnalysisTask.stopwatchMap;
|
| List<Type> taskClasses = stopwatchMap.keys.toList();
|
| taskClasses.sort((Type first, Type second) =>
|
| first.toString().compareTo(second.toString()));
|
| @@ -389,7 +425,7 @@ class GetHandler {
|
| request, 'Query parameter $SOURCE_QUERY_PARAM required');
|
| }
|
|
|
| - AnalysisContextImpl context = analysisServer.folderMap[folder];
|
| + InternalAnalysisContext context = analysisServer.folderMap[folder];
|
|
|
| _writeResponse(request, (StringBuffer buffer) {
|
| _writePage(buffer, 'Analysis Server - AST Structure', [
|
| @@ -401,12 +437,12 @@ class GetHandler {
|
| buffer.write('<p>Not found.</p>');
|
| return;
|
| }
|
| - SourceEntry entry = context.getReadableSourceEntryOrNull(source);
|
| + CacheEntry entry = context.analysisCache.get(source);
|
| if (entry == null) {
|
| buffer.write('<p>Not found.</p>');
|
| return;
|
| }
|
| - CompilationUnit ast = (entry as DartEntry).anyParsedCompilationUnit;
|
| + CompilationUnit ast = _getAnyAst(entry);
|
| if (ast == null) {
|
| buffer.write('<p>null</p>');
|
| return;
|
| @@ -448,21 +484,32 @@ class GetHandler {
|
| }
|
|
|
| List<Folder> allContexts = <Folder>[];
|
| - Map<Folder, SourceEntry> entryMap = new HashMap<Folder, SourceEntry>();
|
| + Map<Folder, List<CacheEntry>> entryMap =
|
| + new HashMap<Folder, List<CacheEntry>>();
|
| analysisServer.folderMap
|
| - .forEach((Folder folder, AnalysisContextImpl context) {
|
| + .forEach((Folder folder, InternalAnalysisContext context) {
|
| Source source = context.sourceFactory.forUri(sourceUri);
|
| if (source != null) {
|
| - SourceEntry entry = context.getReadableSourceEntryOrNull(source);
|
| - if (entry != null) {
|
| - allContexts.add(folder);
|
| - entryMap[folder] = entry;
|
| + MapIterator<AnalysisTarget, CacheEntry> iterator =
|
| + context.analysisCache.iterator();
|
| + while (iterator.moveNext()) {
|
| + if (source == iterator.key.source) {
|
| + if (!allContexts.contains(folder)) {
|
| + allContexts.add(folder);
|
| + }
|
| + List<CacheEntry> entries = entryMap[folder];
|
| + if (entries == null) {
|
| + entries = <CacheEntry>[];
|
| + entryMap[folder] = entries;
|
| + }
|
| + entries.add(iterator.value);
|
| + }
|
| }
|
| }
|
| });
|
| allContexts.sort((Folder firstFolder, Folder secondFolder) =>
|
| firstFolder.path.compareTo(secondFolder.path));
|
| - AnalysisContextImpl context = analysisServer.folderMap[folder];
|
| + InternalAnalysisContext context = analysisServer.folderMap[folder];
|
|
|
| _writeResponse(request, (StringBuffer buffer) {
|
| _writePage(buffer, 'Analysis Server - Cache Entry', [
|
| @@ -477,7 +524,7 @@ class GetHandler {
|
| } else {
|
| buffer.write('<br>');
|
| }
|
| - AnalysisContextImpl analyzingContext =
|
| + InternalAnalysisContext analyzingContext =
|
| analysisServer.folderMap[folder];
|
| if (analyzingContext == context) {
|
| buffer.write(folder.path);
|
| @@ -487,7 +534,7 @@ class GetHandler {
|
| SOURCE_QUERY_PARAM: sourceUri
|
| }, HTML_ESCAPE.convert(folder.path)));
|
| }
|
| - if (entryMap[folder].explicitlyAdded) {
|
| + if (entryMap[folder][0].explicitlyAdded) {
|
| buffer.write(' (explicit)');
|
| } else {
|
| buffer.write(' (implicit)');
|
| @@ -495,34 +542,45 @@ class GetHandler {
|
| });
|
| buffer.write('</p>');
|
|
|
| - SourceEntry entry = entryMap[folder];
|
| - if (entry == null) {
|
| + List<CacheEntry> entries = entryMap[folder];
|
| + if (entries == null) {
|
| buffer.write('<p>Not being analyzed in this context.</p>');
|
| return;
|
| }
|
| - Map<String, String> linkParameters = <String, String>{
|
| - CONTEXT_QUERY_PARAM: folder.path,
|
| - SOURCE_QUERY_PARAM: sourceUri
|
| - };
|
| -
|
| - buffer.write('<h3>Library Independent</h3>');
|
| - _writeDescriptorTable(buffer, entry.descriptors, entry.getState,
|
| - entry.getValue, linkParameters);
|
| - if (entry is DartEntry) {
|
| - for (Source librarySource in entry.containingLibraries) {
|
| - String libraryName = HTML_ESCAPE.convert(librarySource.fullName);
|
| - buffer.write('<h3>In library $libraryName:</h3>');
|
| - _writeDescriptorTable(buffer, entry.libraryDescriptors,
|
| - (DataDescriptor descriptor) =>
|
| - entry.getStateInLibrary(descriptor, librarySource),
|
| - (DataDescriptor descriptor) =>
|
| - entry.getValueInLibrary(descriptor, librarySource),
|
| - linkParameters);
|
| + for (CacheEntry entry in entries) {
|
| + Map<String, String> linkParameters = <String, String>{
|
| + CONTEXT_QUERY_PARAM: folder.path,
|
| + SOURCE_QUERY_PARAM: sourceUri
|
| + };
|
| + List<ResultDescriptor> results = entry.nonInvalidResults;
|
| + results.sort((ResultDescriptor first, ResultDescriptor second) =>
|
| + first.toString().compareTo(second.toString()));
|
| +
|
| + buffer.write('<h3>');
|
| + buffer.write(HTML_ESCAPE.convert(entry.target.toString()));
|
| + buffer.write('</h3>');
|
| + buffer.write('<dl>');
|
| + buffer.write('<dt>time</dt><dd>');
|
| + buffer.write(entry.modificationTime);
|
| + buffer.write('</dd></dl>');
|
| + for (ResultDescriptor result in results) {
|
| + ResultData data = entry.getResultData(result);
|
| + String descriptorName = HTML_ESCAPE.convert(result.toString());
|
| + String descriptorState = HTML_ESCAPE.convert(data.state.toString());
|
| + buffer.write('<dt>$descriptorName ($descriptorState)</dt><dd>');
|
| + try {
|
| + _writeValueAsHtml(buffer, data.value, linkParameters);
|
| + } catch (exception) {
|
| + buffer.write('(${HTML_ESCAPE.convert(exception.toString())})');
|
| + }
|
| + buffer.write('</dd>');
|
| }
|
| - }
|
| - if (entry.exception != null) {
|
| - buffer.write('<h3>Exception</h3>');
|
| - _writeException(buffer, entry.exception);
|
| + if (entry.exception != null) {
|
| + buffer.write('<dt>exception</dt><dd>');
|
| + _writeException(buffer, entry.exception);
|
| + buffer.write('</dd></dl>');
|
| + }
|
| + buffer.write('</dl>');
|
| }
|
| });
|
| });
|
| @@ -567,20 +625,26 @@ class GetHandler {
|
| request, 'Query parameter $DESCRIPTOR_QUERY_PARAM required');
|
| }
|
|
|
| - Folder folder = _findFolder(analysisServer, contextFilter);
|
| - AnalysisContextImpl context = analysisServer.folderMap[folder];
|
| - List<String> links = <String>[];
|
| - context.visitCacheItems((Source source, SourceEntry dartEntry,
|
| - DataDescriptor rowDesc, CacheState state) {
|
| - if (state != stateFilter || rowDesc.toString() != descriptorFilter) {
|
| - return;
|
| - }
|
| - String link = makeLink(CACHE_ENTRY_PATH, {
|
| - CONTEXT_QUERY_PARAM: folder.path,
|
| - SOURCE_QUERY_PARAM: source.uri.toString()
|
| - }, HTML_ESCAPE.convert(source.fullName));
|
| - links.add(link);
|
| - });
|
| + // TODO(brianwilkerson) Figure out how to convert the 'descriptorFilter' to
|
| + // a ResultDescriptor so that we can query the state, then uncomment the
|
| + // code below that computes and prints the list of links.
|
| +// Folder folder = _findFolder(analysisServer, contextFilter);
|
| +// InternalAnalysisContext context = analysisServer.folderMap[folder];
|
| +// List<String> links = <String>[];
|
| +// MapIterator<AnalysisTarget, CacheEntry> iterator = context.analysisCache.iterator();
|
| +// while (iterator.moveNext()) {
|
| +// Source source = iterator.key.source;
|
| +// if (source != null) {
|
| +// CacheEntry entry = iterator.value;
|
| +// if (entry.getState(result) == stateFilter) {
|
| +// String link = makeLink(CACHE_ENTRY_PATH, {
|
| +// CONTEXT_QUERY_PARAM: folder.path,
|
| +// SOURCE_QUERY_PARAM: source.uri.toString()
|
| +// }, HTML_ESCAPE.convert(source.fullName));
|
| +// links.add(link);
|
| +// }
|
| +// }
|
| +// }
|
|
|
| _writeResponse(request, (StringBuffer buffer) {
|
| _writePage(buffer, 'Analysis Server - Cache Search', [
|
| @@ -588,12 +652,13 @@ class GetHandler {
|
| 'Descriptor: ${HTML_ESCAPE.convert(descriptorFilter)}',
|
| 'State: ${HTML_ESCAPE.convert(stateQueryParam)}'
|
| ], (StringBuffer buffer) {
|
| - buffer.write('<p>${links.length} files found</p>');
|
| - buffer.write('<ul>');
|
| - links.forEach((String link) {
|
| - buffer.write('<li>$link</li>');
|
| - });
|
| - buffer.write('</ul>');
|
| + buffer.write('<p>Cache search is not yet implemented.</p>');
|
| +// buffer.write('<p>${links.length} files found</p>');
|
| +// buffer.write('<ul>');
|
| +// links.forEach((String link) {
|
| +// buffer.write('<li>$link</li>');
|
| +// });
|
| +// buffer.write('</ul>');
|
| });
|
| });
|
| }
|
| @@ -705,30 +770,35 @@ class GetHandler {
|
| List<String> implicitNames = <String>[];
|
| Map<String, String> links = new HashMap<String, String>();
|
| List<CaughtException> exceptions = <CaughtException>[];
|
| - AnalysisContextImpl context = analysisServer.folderMap[folder];
|
| + InternalAnalysisContext context = analysisServer.folderMap[folder];
|
| priorityNames = context.prioritySources
|
| .map((Source source) => source.fullName)
|
| .toList();
|
| - context.visitCacheItems((Source source, SourceEntry sourceEntry,
|
| - DataDescriptor rowDesc, CacheState state) {
|
| - String sourceName = source.fullName;
|
| - if (!links.containsKey(sourceName)) {
|
| - CaughtException exception = sourceEntry.exception;
|
| - if (exception != null) {
|
| - exceptions.add(exception);
|
| - }
|
| - String link = makeLink(CACHE_ENTRY_PATH, {
|
| - CONTEXT_QUERY_PARAM: folder.path,
|
| - SOURCE_QUERY_PARAM: source.uri.toString()
|
| - }, sourceName, exception != null);
|
| - if (sourceEntry.explicitlyAdded) {
|
| - explicitNames.add(sourceName);
|
| - } else {
|
| - implicitNames.add(sourceName);
|
| + MapIterator<AnalysisTarget, CacheEntry> iterator =
|
| + context.analysisCache.iterator();
|
| + while (iterator.moveNext()) {
|
| + Source source = iterator.key.source;
|
| + if (source != null) {
|
| + CacheEntry entry = iterator.value;
|
| + String sourceName = source.fullName;
|
| + if (!links.containsKey(sourceName)) {
|
| + CaughtException exception = entry.exception;
|
| + if (exception != null) {
|
| + exceptions.add(exception);
|
| + }
|
| + String link = makeLink(CACHE_ENTRY_PATH, {
|
| + CONTEXT_QUERY_PARAM: folder.path,
|
| + SOURCE_QUERY_PARAM: source.uri.toString()
|
| + }, sourceName, exception != null);
|
| + if (entry.explicitlyAdded) {
|
| + explicitNames.add(sourceName);
|
| + } else {
|
| + implicitNames.add(sourceName);
|
| + }
|
| + links[sourceName] = link;
|
| }
|
| - links[sourceName] = link;
|
| }
|
| - });
|
| + }
|
| explicitNames.sort();
|
| implicitNames.sort();
|
|
|
| @@ -821,7 +891,7 @@ class GetHandler {
|
| request, 'Query parameter $SOURCE_QUERY_PARAM required');
|
| }
|
|
|
| - AnalysisContextImpl context = analysisServer.folderMap[folder];
|
| + InternalAnalysisContext context = analysisServer.folderMap[folder];
|
|
|
| _writeResponse(request, (StringBuffer buffer) {
|
| _writePage(buffer, 'Analysis Server - Element Model', [
|
| @@ -833,12 +903,12 @@ class GetHandler {
|
| buffer.write('<p>Not found.</p>');
|
| return;
|
| }
|
| - SourceEntry entry = context.getReadableSourceEntryOrNull(source);
|
| + CacheEntry entry = context.analysisCache.get(source);
|
| if (entry == null) {
|
| buffer.write('<p>Not found.</p>');
|
| return;
|
| }
|
| - LibraryElement element = entry.getValue(DartEntry.ELEMENT);
|
| + LibraryElement element = entry.getValue(LIBRARY_ELEMENT);
|
| if (element == null) {
|
| buffer.write('<p>null</p>');
|
| return;
|
| @@ -1184,33 +1254,6 @@ class GetHandler {
|
| }
|
|
|
| /**
|
| - * Generate a table showing the cache values corresponding to the given
|
| - * [descriptors], using [getState] to get the cache state corresponding to
|
| - * each descriptor, and [getValue] to get the cached value corresponding to
|
| - * each descriptor. Append the resulting HTML to the given [buffer]. The
|
| - * [linkParameters] will be used if the value is too large to be displayed on
|
| - * the current page and needs to be linked to a separate page.
|
| - */
|
| - void _writeDescriptorTable(StringBuffer buffer,
|
| - List<DataDescriptor> descriptors, CacheState getState(DataDescriptor),
|
| - dynamic getValue(DataDescriptor), Map<String, String> linkParameters) {
|
| - buffer.write('<dl>');
|
| - for (DataDescriptor descriptor in descriptors) {
|
| - String descriptorName = HTML_ESCAPE.convert(descriptor.toString());
|
| - String descriptorState =
|
| - HTML_ESCAPE.convert(getState(descriptor).toString());
|
| - buffer.write('<dt>$descriptorName ($descriptorState)</dt><dd>');
|
| - try {
|
| - _writeValueAsHtml(buffer, getValue(descriptor), linkParameters);
|
| - } catch (exception) {
|
| - buffer.write('(${HTML_ESCAPE.convert(exception.toString())})');
|
| - }
|
| - buffer.write('</dd>');
|
| - }
|
| - buffer.write('</dl>');
|
| - }
|
| -
|
| - /**
|
| * Write the status of the edit domain (on the main status page) to the given
|
| * [buffer].
|
| */
|
|
|