Skip to content

Commit 17e15ee

Browse files
bwilkersoncommit-bot@chromium.org
authored andcommitted
Add outline support for extensions
Change-Id: I1b7145e899614b3d73d3fc2bfbe3dd7f773d38d2 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/109880 Commit-Queue: Brian Wilkerson <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]>
1 parent 41263a4 commit 17e15ee

File tree

10 files changed

+97
-4
lines changed

10 files changed

+97
-4
lines changed

pkg/analysis_server/doc/api.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3713,7 +3713,7 @@ <h2 class="domain"><a name="types">Types</a></h2>
37133713
An enumeration of the kinds of elements.
37143714
</p>
37153715

3716-
<dl><dt class="value">CLASS</dt><dt class="value">CLASS_TYPE_ALIAS</dt><dt class="value">COMPILATION_UNIT</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">CONSTRUCTOR_INVOCATION</dt><dt class="value">ENUM</dt><dt class="value">ENUM_CONSTANT</dt><dt class="value">FIELD</dt><dt class="value">FILE</dt><dt class="value">FUNCTION</dt><dt class="value">FUNCTION_INVOCATION</dt><dt class="value">FUNCTION_TYPE_ALIAS</dt><dt class="value">GETTER</dt><dt class="value">LABEL</dt><dt class="value">LIBRARY</dt><dt class="value">LOCAL_VARIABLE</dt><dt class="value">METHOD</dt><dt class="value">MIXIN</dt><dt class="value">PARAMETER</dt><dt class="value">PREFIX</dt><dt class="value">SETTER</dt><dt class="value">TOP_LEVEL_VARIABLE</dt><dt class="value">TYPE_PARAMETER</dt><dt class="value">UNIT_TEST_GROUP</dt><dt class="value">UNIT_TEST_TEST</dt><dt class="value">UNKNOWN</dt></dl></dd><dt class="typeDefinition"><a name="type_ExecutableFile">ExecutableFile: object</a></dt><dd>
3716+
<dl><dt class="value">CLASS</dt><dt class="value">CLASS_TYPE_ALIAS</dt><dt class="value">COMPILATION_UNIT</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">CONSTRUCTOR_INVOCATION</dt><dt class="value">ENUM</dt><dt class="value">ENUM_CONSTANT</dt><dt class="value">EXTENSION</dt><dt class="value">FIELD</dt><dt class="value">FILE</dt><dt class="value">FUNCTION</dt><dt class="value">FUNCTION_INVOCATION</dt><dt class="value">FUNCTION_TYPE_ALIAS</dt><dt class="value">GETTER</dt><dt class="value">LABEL</dt><dt class="value">LIBRARY</dt><dt class="value">LOCAL_VARIABLE</dt><dt class="value">METHOD</dt><dt class="value">MIXIN</dt><dt class="value">PARAMETER</dt><dt class="value">PREFIX</dt><dt class="value">SETTER</dt><dt class="value">TOP_LEVEL_VARIABLE</dt><dt class="value">TYPE_PARAMETER</dt><dt class="value">UNIT_TEST_GROUP</dt><dt class="value">UNIT_TEST_TEST</dt><dt class="value">UNKNOWN</dt></dl></dd><dt class="typeDefinition"><a name="type_ExecutableFile">ExecutableFile: object</a></dt><dd>
37173717
<p>
37183718
A description of an executable file.
37193719
</p>

pkg/analysis_server/lib/src/computer/computer_outline.dart

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ class DartUnitOutlineComputer {
4242
constantOutlines.add(_newEnumConstant(constant));
4343
}
4444
unitContents.add(_newEnumOutline(enumDeclaration, constantOutlines));
45+
} else if (unitMember is ExtensionDeclaration) {
46+
unitContents.add(_newExtensionOutline(
47+
unitMember, _outlinesForMembers(unitMember.members)));
4548
} else if (unitMember is TopLevelVariableDeclaration) {
4649
TopLevelVariableDeclaration fieldDeclaration = unitMember;
4750
VariableDeclarationList fields = fieldDeclaration.variables;
@@ -92,7 +95,6 @@ class DartUnitOutlineComputer {
9295
}
9396

9497
Outline _newClassOutline(ClassDeclaration node, List<Outline> classContents) {
95-
node.firstTokenAfterCommentAndMetadata;
9698
SimpleIdentifier nameNode = node.name;
9799
String name = nameNode.name;
98100
Element element = new Element(
@@ -175,6 +177,21 @@ class DartUnitOutlineComputer {
175177
return _nodeOutline(node, element, children);
176178
}
177179

180+
Outline _newExtensionOutline(
181+
ExtensionDeclaration node, List<Outline> extensionContents) {
182+
SimpleIdentifier nameNode = node.name;
183+
String name = nameNode?.name ?? '';
184+
Element element = new Element(
185+
ElementKind.EXTENSION,
186+
name,
187+
Element.makeFlags(
188+
isPrivate: Identifier.isPrivateName(name),
189+
isDeprecated: _isDeprecated(node)),
190+
location: _getLocationNode(nameNode ?? node.extendedType),
191+
typeParameters: _getTypeParametersStr(node.typeParameters));
192+
return _nodeOutline(node, element, extensionContents);
193+
}
194+
178195
Outline _newFunctionOutline(FunctionDeclaration function, bool isStatic) {
179196
TypeAnnotation returnType = function.returnType;
180197
SimpleIdentifier nameNode = function.name;

pkg/analysis_server/test/integration/support/protocol_matchers.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,7 @@ final Matcher isElementDeclaration =
470470
* CONSTRUCTOR_INVOCATION
471471
* ENUM
472472
* ENUM_CONSTANT
473+
* EXTENSION
473474
* FIELD
474475
* FILE
475476
* FUNCTION
@@ -499,6 +500,7 @@ final Matcher isElementKind = new MatchesEnum("ElementKind", [
499500
"CONSTRUCTOR_INVOCATION",
500501
"ENUM",
501502
"ENUM_CONSTANT",
503+
"EXTENSION",
502504
"FIELD",
503505
"FILE",
504506
"FUNCTION",

pkg/analysis_server/test/src/computer/outline_computer_test.dart

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import 'dart:async';
66

77
import 'package:analysis_server/src/computer/computer_outline.dart';
8+
import 'package:analyzer/src/dart/analysis/experiments.dart';
89
import 'package:analyzer_plugin/protocol/protocol_common.dart';
910
import 'package:meta/meta.dart';
1011
import 'package:test/test.dart';
@@ -413,6 +414,68 @@ enum MyEnum {
413414
}
414415
}
415416

417+
test_extension_named() async {
418+
createAnalysisOptionsFile(experiments: [EnableString.extension_methods]);
419+
Outline unitOutline = await _computeOutline('''
420+
extension MyExt on String {
421+
int get halfLength => length ~/ 2;
422+
void writeOn(StringBuffer b) {
423+
b.write(this);
424+
}
425+
}
426+
''');
427+
List<Outline> topOutlines = unitOutline.children;
428+
expect(topOutlines, hasLength(1));
429+
// MyExt
430+
{
431+
Outline outline_MyExt = topOutlines[0];
432+
Element element_MyExt = outline_MyExt.element;
433+
expect(element_MyExt.kind, ElementKind.EXTENSION);
434+
expect(element_MyExt.name, 'MyExt');
435+
{
436+
Location location = element_MyExt.location;
437+
expect(location.offset, testCode.indexOf('MyExt on'));
438+
expect(location.length, 'MyExt'.length);
439+
}
440+
expect(element_MyExt.parameters, null);
441+
expect(element_MyExt.returnType, null);
442+
// StringUtilities children
443+
List<Outline> outlines_MyExt = outline_MyExt.children;
444+
expect(outlines_MyExt, hasLength(2));
445+
}
446+
}
447+
448+
test_extension_unnamed() async {
449+
createAnalysisOptionsFile(experiments: [EnableString.extension_methods]);
450+
Outline unitOutline = await _computeOutline('''
451+
extension on String {
452+
int get halfLength => length ~/ 2;
453+
void writeOn(StringBuffer b) {
454+
b.write(this);
455+
}
456+
}
457+
''');
458+
List<Outline> topOutlines = unitOutline.children;
459+
expect(topOutlines, hasLength(1));
460+
// MyExt
461+
{
462+
Outline outline_MyExt = topOutlines[0];
463+
Element element_MyExt = outline_MyExt.element;
464+
expect(element_MyExt.kind, ElementKind.EXTENSION);
465+
expect(element_MyExt.name, '');
466+
{
467+
Location location = element_MyExt.location;
468+
expect(location.offset, testCode.indexOf('String'));
469+
expect(location.length, 'String'.length);
470+
}
471+
expect(element_MyExt.parameters, null);
472+
expect(element_MyExt.returnType, null);
473+
// StringUtilities children
474+
List<Outline> outlines_MyExt = outline_MyExt.children;
475+
expect(outlines_MyExt, hasLength(2));
476+
}
477+
}
478+
416479
test_genericTypeAlias_incomplete() async {
417480
Outline unitOutline = await _computeOutline('''
418481
typedef F = Object;

pkg/analysis_server/tool/spec/generated/java/types/ElementKind.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ public class ElementKind {
2929

3030
public static final String ENUM_CONSTANT = "ENUM_CONSTANT";
3131

32+
public static final String EXTENSION = "EXTENSION";
33+
3234
public static final String FIELD = "FIELD";
3335

3436
public static final String FILE = "FILE";

pkg/analyzer/lib/src/dart/ast/ast.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3906,7 +3906,7 @@ class ExtensionDeclarationImpl extends CompilationUnitMemberImpl
39063906
}
39073907

39083908
@override
3909-
Token get firstTokenAfterCommentAndMetadata => name.beginToken;
3909+
Token get firstTokenAfterCommentAndMetadata => extensionKeyword;
39103910

39113911
@override
39123912
NodeList<ClassMember> get members => _members;

pkg/analyzer_plugin/doc/api.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1291,7 +1291,7 @@ <h2 class="domain"><a name="types">Types</a></h2>
12911291
An enumeration of the kinds of elements.
12921292
</p>
12931293

1294-
<dl><dt class="value">CLASS</dt><dt class="value">CLASS_TYPE_ALIAS</dt><dt class="value">COMPILATION_UNIT</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">CONSTRUCTOR_INVOCATION</dt><dt class="value">ENUM</dt><dt class="value">ENUM_CONSTANT</dt><dt class="value">FIELD</dt><dt class="value">FILE</dt><dt class="value">FUNCTION</dt><dt class="value">FUNCTION_INVOCATION</dt><dt class="value">FUNCTION_TYPE_ALIAS</dt><dt class="value">GETTER</dt><dt class="value">LABEL</dt><dt class="value">LIBRARY</dt><dt class="value">LOCAL_VARIABLE</dt><dt class="value">METHOD</dt><dt class="value">MIXIN</dt><dt class="value">PARAMETER</dt><dt class="value">PREFIX</dt><dt class="value">SETTER</dt><dt class="value">TOP_LEVEL_VARIABLE</dt><dt class="value">TYPE_PARAMETER</dt><dt class="value">UNIT_TEST_GROUP</dt><dt class="value">UNIT_TEST_TEST</dt><dt class="value">UNKNOWN</dt></dl></dd><dt class="typeDefinition"><a name="type_FilePath">FilePath: String</a></dt><dd>
1294+
<dl><dt class="value">CLASS</dt><dt class="value">CLASS_TYPE_ALIAS</dt><dt class="value">COMPILATION_UNIT</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">CONSTRUCTOR_INVOCATION</dt><dt class="value">ENUM</dt><dt class="value">ENUM_CONSTANT</dt><dt class="value">EXTENSION</dt><dt class="value">FIELD</dt><dt class="value">FILE</dt><dt class="value">FUNCTION</dt><dt class="value">FUNCTION_INVOCATION</dt><dt class="value">FUNCTION_TYPE_ALIAS</dt><dt class="value">GETTER</dt><dt class="value">LABEL</dt><dt class="value">LIBRARY</dt><dt class="value">LOCAL_VARIABLE</dt><dt class="value">METHOD</dt><dt class="value">MIXIN</dt><dt class="value">PARAMETER</dt><dt class="value">PREFIX</dt><dt class="value">SETTER</dt><dt class="value">TOP_LEVEL_VARIABLE</dt><dt class="value">TYPE_PARAMETER</dt><dt class="value">UNIT_TEST_GROUP</dt><dt class="value">UNIT_TEST_TEST</dt><dt class="value">UNKNOWN</dt></dl></dd><dt class="typeDefinition"><a name="type_FilePath">FilePath: String</a></dt><dd>
12951295

12961296
<p>
12971297
The absolute, normalized path of a file.

pkg/analyzer_plugin/lib/protocol/protocol_common.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1903,6 +1903,7 @@ class Element implements HasToJson {
19031903
* CONSTRUCTOR_INVOCATION
19041904
* ENUM
19051905
* ENUM_CONSTANT
1906+
* EXTENSION
19061907
* FIELD
19071908
* FILE
19081909
* FUNCTION
@@ -1944,6 +1945,8 @@ class ElementKind implements Enum {
19441945

19451946
static const ElementKind ENUM_CONSTANT = const ElementKind._("ENUM_CONSTANT");
19461947

1948+
static const ElementKind EXTENSION = const ElementKind._("EXTENSION");
1949+
19471950
static const ElementKind FIELD = const ElementKind._("FIELD");
19481951

19491952
static const ElementKind FILE = const ElementKind._("FILE");
@@ -2000,6 +2003,7 @@ class ElementKind implements Enum {
20002003
CONSTRUCTOR_INVOCATION,
20012004
ENUM,
20022005
ENUM_CONSTANT,
2006+
EXTENSION,
20032007
FIELD,
20042008
FILE,
20052009
FUNCTION,
@@ -2042,6 +2046,8 @@ class ElementKind implements Enum {
20422046
return ENUM;
20432047
case "ENUM_CONSTANT":
20442048
return ENUM_CONSTANT;
2049+
case "EXTENSION":
2050+
return EXTENSION;
20452051
case "FIELD":
20462052
return FIELD;
20472053
case "FILE":

pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,7 @@ final Matcher isElement =
271271
* CONSTRUCTOR_INVOCATION
272272
* ENUM
273273
* ENUM_CONSTANT
274+
* EXTENSION
274275
* FIELD
275276
* FILE
276277
* FUNCTION
@@ -300,6 +301,7 @@ final Matcher isElementKind = new MatchesEnum("ElementKind", [
300301
"CONSTRUCTOR_INVOCATION",
301302
"ENUM",
302303
"ENUM_CONSTANT",
304+
"EXTENSION",
303305
"FIELD",
304306
"FILE",
305307
"FUNCTION",

pkg/analyzer_plugin/tool/spec/common_types_spec.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,7 @@ <h1>Common Types</h1>
530530
<value><code>CONSTRUCTOR_INVOCATION</code></value>
531531
<value><code>ENUM</code></value>
532532
<value><code>ENUM_CONSTANT</code></value>
533+
<value><code>EXTENSION</code></value>
533534
<value><code>FIELD</code></value>
534535
<value><code>FILE</code></value>
535536
<value><code>FUNCTION</code></value>

0 commit comments

Comments
 (0)