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

Unified Diff: pkg/analysis_server/lib/src/domains/analysis/implemented_dart.dart

Issue 1368793003: The 'analysis.implemented' notification implementation. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 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
Index: pkg/analysis_server/lib/src/domains/analysis/implemented_dart.dart
diff --git a/pkg/analysis_server/lib/src/domains/analysis/implemented_dart.dart b/pkg/analysis_server/lib/src/domains/analysis/implemented_dart.dart
new file mode 100644
index 0000000000000000000000000000000000000000..44dcc2391f2f9913b789dffa7cd572110b0afebe
--- /dev/null
+++ b/pkg/analysis_server/lib/src/domains/analysis/implemented_dart.dart
@@ -0,0 +1,73 @@
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
+// 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 domains.analysis.implemented_dart;
+
+import 'package:analysis_server/src/protocol_server.dart' as protocol;
+import 'package:analysis_server/src/services/search/hierarchy.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analyzer/src/generated/element.dart';
+
+class ImplementedComputer {
+ final SearchEngine searchEngine;
+ final CompilationUnitElement unitElement;
+
+ List<protocol.ImplementedClass> classes = <protocol.ImplementedClass>[];
+ List<protocol.ImplementedMember> members = <protocol.ImplementedMember>[];
+
+ Set<ClassElement> subtypes;
+
+ ImplementedComputer(this.searchEngine, this.unitElement);
+
+ compute() async {
+ for (ClassElement type in unitElement.types) {
+ subtypes = await getSubClasses(searchEngine, type);
+ if (subtypes.isNotEmpty) {
+ _addImplementedClass(type);
+ }
+ type.accessors.forEach(_addMemberIfImplemented);
+ type.fields.forEach(_addMemberIfImplemented);
+ type.methods.forEach(_addMemberIfImplemented);
+ }
+ }
+
+ void _addImplementedClass(ClassElement type) {
+ String name = type.name;
+ if (name != null) {
+ int offset = type.nameOffset;
+ int length = name.length;
+ classes.add(new protocol.ImplementedClass(offset, length));
+ }
+ }
+
+ void _addImplementedMember(Element member) {
+ String name = member.displayName;
+ if (name != null) {
+ int offset = member.nameOffset;
+ int length = name.length;
+ members.add(new protocol.ImplementedMember(offset, length));
+ }
+ }
+
+ void _addMemberIfImplemented(Element element) {
+ if (!element.isSynthetic) {
+ String name = element.displayName;
+ if (name != null && _hasOverride(name)) {
+ _addImplementedMember(element);
+ }
+ }
+ }
+
+ bool _hasOverride(String name) {
+ for (ClassElement subtype in subtypes) {
+ if (subtype.getMethod(name) != null) {
+ return true;
+ }
+ if (subtype.getField(name) != null) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
« no previous file with comments | « pkg/analysis_server/lib/src/constants.dart ('k') | pkg/analysis_server/lib/src/operation/operation_analysis.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698