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

Side by Side Diff: pkg/kernel/lib/transformations/reify/analysis/program_analysis.dart

Issue 2697873007: Merge the work on Generic Types Reification from 'dart-lang/reify' repo (Closed)
Patch Set: Create and use common 'kernel/runtime' directory Created 3 years, 10 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 library kernel.transformation.reify.analysis.program_analysis;
6
7 import '../asts.dart';
8 import 'package:kernel/ast.dart';
9
10 // TODO(karlklose): keep all predicates and derived information here and move
11 // the actual data to a builder class.
12 class ProgramKnowledge {
13 Map<Member, Set<TypeParameter>> _usedTypeVariables =
14 <Member, Set<TypeParameter>>{};
15
16 Map<Member, Set<DartType>> isTests = <Member, Set<DartType>>{};
17
18 Set<Class> _classTests;
19
20 /// Contains all classes that are used as the declaration of a type expression
21 /// in a type test.
22 Set<Class> get classTests {
23 if (_classTests == null) {
24 _classTests = isTests.values
25 .expand((set) => set)
26 .where((DartType type) => type is InterfaceType)
27 .map((DartType type) => (type as InterfaceType).classNode)
28 .toSet();
29 }
30 return _classTests;
31 }
32
33 recordTypeVariableUse(Expression expression, TypeParameter parameter) {
34 // TODO(karlklose): also record expression.
35 add(_usedTypeVariables, getEnclosingMember(expression), parameter);
36 }
37
38 Set<TypeParameter> usedParameters(Member member) {
39 return _usedTypeVariables[member] ?? new Set<TypeParameter>();
40 }
41
42 void recordIsTest(IsExpression node, DartType type) {
43 add(isTests, getEnclosingMember(node), type);
44 }
45
46 add(Map<dynamic, Set> map, key, value) {
47 map.putIfAbsent(key, () => new Set()).add(value);
48 }
49 }
50
51 typedef bool LibraryFilter(Library library);
52
53 class ProgramAnalysis extends Visitor {
54 final ProgramKnowledge knowledge;
55 final LibraryFilter analyzeLibrary;
56
57 ProgramAnalysis(this.knowledge, this.analyzeLibrary);
58
59 defaultTreeNode(TreeNode node) => node.visitChildren(this);
60
61 visitLibrary(Library library) {
62 if (!analyzeLibrary(library)) {
63 return;
64 }
65 super.visitLibrary(library);
66 }
67
68 handleTypeReference(TreeNode node, DartType type) {
69 typeVariables(type).forEach((TypeParameter parameter) {
70 knowledge.recordTypeVariableUse(node, parameter);
71 });
72 }
73
74 handleInstantiation(InvocationExpression node) {
75 node.arguments.types.forEach((DartType type) {
76 handleTypeReference(node, type);
77 });
78 }
79
80 visitIsExpression(IsExpression node) {
81 knowledge.recordIsTest(node, node.type);
82 handleTypeReference(node, node.type);
83 node.visitChildren(this);
84 }
85
86 visitConstructorInvocation(ConstructorInvocation node) {
87 handleInstantiation(node);
88 node.visitChildren(this);
89 }
90
91 visitStaticInvocation(StaticInvocation node) {
92 if (node.target.kind == ProcedureKind.Factory) {
93 handleInstantiation(node);
94 }
95 node.visitChildren(this);
96 }
97 }
98
99 bool _analyzeAll(Library library) => true;
100
101 ProgramKnowledge analyze(Program program,
102 {LibraryFilter analyzeLibrary: _analyzeAll}) {
103 ProgramKnowledge knowledge = new ProgramKnowledge();
104 program.accept(new ProgramAnalysis(knowledge, analyzeLibrary));
105 return knowledge;
106 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698