@@ -66,6 +66,58 @@ class AnalyzerMetadataFactory implements MetadataFactory {
66
66
}
67
67
}
68
68
69
+ /// Index of metadata.
70
+ class AnalyzerMetadataIndex {
71
+ final Map <kernel.Library , List <kernel.TreeNode >> libraryNodes = {};
72
+ AnalyzerMetadataRepository repository;
73
+
74
+ /// The [library] was invalidated, flush its metadata.
75
+ void invalidate (kernel.Library library) {
76
+ var nodes = libraryNodes.remove (library);
77
+ nodes? .forEach (repository.mapping.remove);
78
+ }
79
+
80
+ /// A [newComponent] has been compiled, with new, and only new, metadata.
81
+ /// Merge the existing [repository] into the new one, and replace it.
82
+ void replaceComponent (kernel.Component newComponent) {
83
+ AnalyzerMetadataRepository newRepository =
84
+ newComponent.metadata[AnalyzerMetadataRepository .TAG ];
85
+ if (newRepository != null ) {
86
+ _indexNewMetadata (newRepository);
87
+ if (repository != null ) {
88
+ newRepository.mapping.addAll (repository.mapping);
89
+ }
90
+ repository = newRepository;
91
+ } else {
92
+ newComponent.metadata[AnalyzerMetadataRepository .TAG ] = repository;
93
+ }
94
+ }
95
+
96
+ void _indexNewMetadata (AnalyzerMetadataRepository newRepository) {
97
+ for (var node in newRepository.mapping.keys) {
98
+ var library = _enclosingLibrary (node);
99
+ assert (library != null );
100
+
101
+ var nodes = libraryNodes[library];
102
+ if (nodes == null ) {
103
+ nodes = < kernel.TreeNode > [];
104
+ libraryNodes[library] = nodes;
105
+ }
106
+
107
+ nodes.add (node);
108
+ }
109
+ }
110
+
111
+ static kernel.Library _enclosingLibrary (kernel.TreeNode node) {
112
+ for (; node != null ; node = node.parent) {
113
+ if (node is kernel.Library ) {
114
+ return node;
115
+ }
116
+ }
117
+ return null ;
118
+ }
119
+ }
120
+
69
121
/// Analyzer specific implementation of [kernel.MetadataRepository] .
70
122
class AnalyzerMetadataRepository
71
123
implements kernel.MetadataRepository <AnalyzerMetadata > {
@@ -127,17 +179,4 @@ class AnalyzerMetadataRepository
127
179
sink.writeByte (0 );
128
180
}
129
181
}
130
-
131
- /// Merge metadata from the [source] into the [destination] .
132
- static void merge (kernel.Component destination, kernel.Component source) {
133
- kernel.MetadataRepository destinationRepo = destination.metadata[TAG ];
134
- kernel.MetadataRepository sourceRepo = source.metadata[TAG ];
135
- if (sourceRepo != null ) {
136
- if (destinationRepo != null ) {
137
- destinationRepo.mapping.addAll (sourceRepo.mapping);
138
- } else {
139
- destination.metadata[TAG ] = sourceRepo;
140
- }
141
- }
142
- }
143
182
}
0 commit comments