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

Unified Diff: pkg/analysis_server/lib/src/computer/computer_outline.dart

Issue 3009713002: Add test structure to the outline from server
Patch Set: complete implementation Created 3 years, 3 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
« no previous file with comments | « no previous file | pkg/analysis_server/test/analysis/notification_outline_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analysis_server/lib/src/computer/computer_outline.dart
diff --git a/pkg/analysis_server/lib/src/computer/computer_outline.dart b/pkg/analysis_server/lib/src/computer/computer_outline.dart
index bc6174090a41728f9ee54e2b7378c4195fea8145..4a388141d9fc47aa6c3a85abef803fead18e5697 100644
--- a/pkg/analysis_server/lib/src/computer/computer_outline.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_outline.dart
@@ -90,9 +90,9 @@ class DartUnitOutlineComputer {
return unitOutline;
}
- List<Outline> _addLocalFunctionOutlines(FunctionBody body) {
+ List<Outline> _addFunctionBodyOutlines(FunctionBody body) {
List<Outline> contents = <Outline>[];
- body.accept(new _LocalFunctionOutlinesVisitor(this, contents));
+ body.accept(new _FunctionBodyOutlinesVisitor(this, contents));
return contents;
}
@@ -212,7 +212,7 @@ class DartUnitOutlineComputer {
isPrivate: isPrivate, isDeprecated: _isDeprecated(constructor)),
location: _getLocationOffsetLength(offset, length),
parameters: parametersStr);
- List<Outline> contents = _addLocalFunctionOutlines(constructor.body);
+ List<Outline> contents = _addFunctionBodyOutlines(constructor.body);
Outline outline = new Outline(element, range.offset, range.length,
children: nullIfEmpty(contents));
return outline;
@@ -274,7 +274,7 @@ class DartUnitOutlineComputer {
location: _getLocationNode(nameNode),
parameters: parametersStr,
returnType: returnTypeStr);
- List<Outline> contents = _addLocalFunctionOutlines(functionExpression.body);
+ List<Outline> contents = _addFunctionBodyOutlines(functionExpression.body);
Outline outline = new Outline(element, range.offset, range.length,
children: nullIfEmpty(contents));
return outline;
@@ -328,7 +328,7 @@ class DartUnitOutlineComputer {
location: _getLocationNode(nameNode),
parameters: parametersStr,
returnType: returnTypeStr);
- List<Outline> contents = _addLocalFunctionOutlines(method.body);
+ List<Outline> contents = _addFunctionBodyOutlines(method.body);
Outline outline = new Outline(element, range.offset, range.length,
children: nullIfEmpty(contents));
return outline;
@@ -384,14 +384,72 @@ class DartUnitOutlineComputer {
/**
* A visitor for building local function outlines.
*/
-class _LocalFunctionOutlinesVisitor extends RecursiveAstVisitor {
+class _FunctionBodyOutlinesVisitor extends RecursiveAstVisitor {
final DartUnitOutlineComputer outlineComputer;
final List<Outline> contents;
- _LocalFunctionOutlinesVisitor(this.outlineComputer, this.contents);
+ _FunctionBodyOutlinesVisitor(this.outlineComputer, this.contents);
+
+ bool isGroup(engine.ExecutableElement element) {
+ if (element is engine.FunctionElement && element.name == 'group') {
+ engine.Element parent = element.enclosingElement;
+ return parent is engine.CompilationUnitElement &&
+ parent.source.fullName.endsWith('test.dart');
+ }
+ return false;
+ }
+
+ bool isTest(engine.ExecutableElement element) {
+ if (element is engine.FunctionElement && element.name == 'test') {
+ engine.Element parent = element.enclosingElement;
+ return parent is engine.CompilationUnitElement &&
+ parent.source.fullName.endsWith('test.dart');
+ }
+ return false;
+ }
@override
visitFunctionDeclaration(FunctionDeclaration node) {
contents.add(outlineComputer._newFunctionOutline(node, false));
}
+
+ @override
+ visitMethodInvocation(MethodInvocation node) {
+ SimpleIdentifier nameNode = node.methodName;
+ engine.ExecutableElement executableElement = nameNode.bestElement;
+
+ String extractString(NodeList<Expression> arguments) {
+ if (arguments != null && arguments.length > 0) {
+ Expression argument = arguments[0];
+ if (argument is StringLiteral) {
+ String value = argument.stringValue;
+ if (value != null) {
+ return value;
+ }
+ }
+ return argument.toSource();
+ }
+ return 'unnamed';
+ }
+
+ void addOutline(String kind, [List<Outline> children]) {
+ SourceRange range = outlineComputer._getSourceRange(node);
+ String name = kind + ' ' + extractString(node.argumentList?.arguments);
+ Element element = new Element(ElementKind.UNKNOWN, name, 0,
+ location: outlineComputer._getLocationNode(nameNode));
+ contents.add(new Outline(element, range.offset, range.length,
+ children: nullIfEmpty(children)));
+ }
+
+ if (isGroup(executableElement)) {
+ List<Outline> groupContents = <Outline>[];
+ node.argumentList.accept(
+ new _FunctionBodyOutlinesVisitor(outlineComputer, groupContents));
+ addOutline('group', groupContents);
+ } else if (isTest(executableElement)) {
+ addOutline('test');
+ } else {
+ super.visitMethodInvocation(node);
+ }
+ }
}
« no previous file with comments | « no previous file | pkg/analysis_server/test/analysis/notification_outline_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698