OLD | NEW |
| (Empty) |
1 // Copyright (c) 2013, 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 part of dart2js.mirrors; | |
6 | |
7 | |
8 class Dart2JsLibraryMirror | |
9 extends Dart2JsElementMirror | |
10 with ObjectMirrorMixin, ContainerMixin | |
11 implements LibrarySourceMirror { | |
12 List<LibraryDependencySourceMirror> _libraryDependencies; | |
13 | |
14 Dart2JsLibraryMirror(Dart2JsMirrorSystem system, LibraryElement library) | |
15 : super(system, library); | |
16 | |
17 Function operator [](Symbol name) { | |
18 throw new UnsupportedError('LibraryMirror.operator [] unsupported.'); | |
19 } | |
20 | |
21 LibraryElement get _element => super._element; | |
22 | |
23 Uri get uri => _element.canonicalUri; | |
24 | |
25 DeclarationMirror get owner => null; | |
26 | |
27 bool get isPrivate => false; | |
28 | |
29 LibraryMirror library() => this; | |
30 | |
31 /** | |
32 * Returns the library name (for libraries with a library tag) or the script | |
33 * file name (for scripts without a library tag). The latter case is used to | |
34 * provide a 'library name' for scripts, to use for instance in dartdoc. | |
35 */ | |
36 String get _simpleNameString { | |
37 if (_element.libraryTag != null) { | |
38 return _element.libraryTag.name.toString(); | |
39 } else { | |
40 // Use the file name as script name. | |
41 String path = _element.canonicalUri.path; | |
42 return path.substring(path.lastIndexOf('/') + 1); | |
43 } | |
44 } | |
45 | |
46 Symbol get qualifiedName => simpleName; | |
47 | |
48 void _forEachElement(f(Element element)) => _element.forEachLocalMember(f); | |
49 | |
50 Iterable<Dart2JsDeclarationMirror> _getDeclarationMirrors(Element element) { | |
51 if (element.isClass || element.isTypedef) { | |
52 return [mirrorSystem._getTypeDeclarationMirror(element)]; | |
53 } else { | |
54 return super._getDeclarationMirrors(element); | |
55 } | |
56 } | |
57 | |
58 Map<Symbol, MethodMirror> get topLevelMembers => null; | |
59 | |
60 /** | |
61 * Computes the first token of this library using the first library tag as | |
62 * indicator. | |
63 */ | |
64 Token getBeginToken() { | |
65 if (_element.libraryTag != null) { | |
66 return _element.libraryTag.getBeginToken(); | |
67 } else if (!_element.tags.isEmpty) { | |
68 return _element.tags.first.getBeginToken(); | |
69 } | |
70 return null; | |
71 } | |
72 | |
73 /** | |
74 * Computes the first token of this library using the last library tag as | |
75 * indicator. | |
76 */ | |
77 Token getEndToken() { | |
78 if (!_element.tags.isEmpty) { | |
79 return _element.tags.last.getEndToken(); | |
80 } | |
81 return null; | |
82 } | |
83 | |
84 void _ensureLibraryDependenciesAnalyzed() { | |
85 if (_libraryDependencies == null) { | |
86 _libraryDependencies = <LibraryDependencySourceMirror>[]; | |
87 for (LibraryTag node in _element.tags) { | |
88 LibraryDependency libraryDependency = node.asLibraryDependency(); | |
89 if (libraryDependency != null) { | |
90 LibraryElement targetLibraryElement = | |
91 _element.getLibraryFromTag(libraryDependency); | |
92 assert(targetLibraryElement != null); | |
93 LibraryMirror targetLibrary = | |
94 mirrorSystem._getLibrary(targetLibraryElement); | |
95 _libraryDependencies.add(new Dart2JsLibraryDependencyMirror( | |
96 libraryDependency, this, targetLibrary)); | |
97 } | |
98 } | |
99 } | |
100 } | |
101 | |
102 List<LibraryDependencyMirror> get libraryDependencies { | |
103 _ensureLibraryDependenciesAnalyzed(); | |
104 return _libraryDependencies; | |
105 } | |
106 } | |
107 | |
108 class Dart2JsLibraryDependencyMirror implements LibraryDependencySourceMirror { | |
109 final LibraryDependency _node; | |
110 final Dart2JsLibraryMirror _sourceLibrary; | |
111 final Dart2JsLibraryMirror _targetLibrary; | |
112 List<CombinatorMirror> _combinators; | |
113 | |
114 Dart2JsLibraryDependencyMirror(this._node, | |
115 this._sourceLibrary, | |
116 this._targetLibrary); | |
117 | |
118 SourceLocation get location { | |
119 return new Dart2JsSourceLocation( | |
120 _sourceLibrary._element.entryCompilationUnit.script, | |
121 _sourceLibrary.mirrorSystem.compiler.spanFromNode(_node)); | |
122 } | |
123 | |
124 List<CombinatorMirror> get combinators { | |
125 if (_combinators == null) { | |
126 _combinators = <CombinatorMirror>[]; | |
127 if (_node.combinators != null) { | |
128 for (Combinator combinator in _node.combinators.nodes) { | |
129 List<String> identifiers = <String>[]; | |
130 for (Identifier identifier in combinator.identifiers.nodes) { | |
131 identifiers.add(identifier.source); | |
132 } | |
133 _combinators.add(new Dart2JsCombinatorMirror( | |
134 identifiers, isShow: combinator.isShow)); | |
135 } | |
136 } | |
137 } | |
138 return _combinators; | |
139 } | |
140 | |
141 LibraryMirror get sourceLibrary => _sourceLibrary; | |
142 | |
143 LibraryMirror get targetLibrary => _targetLibrary; | |
144 | |
145 /*String*/ get prefix { | |
146 Import import = _node.asImport(); | |
147 if (import != null && import.prefix != null) { | |
148 return import.prefix.source; | |
149 } | |
150 return null; | |
151 } | |
152 | |
153 bool get isImport => _node.asImport() != null; | |
154 | |
155 bool get isExport => _node.asExport() != null; | |
156 | |
157 List<InstanceMirror> get metadata => const <InstanceMirror>[]; | |
158 } | |
159 | |
160 class Dart2JsCombinatorMirror implements CombinatorSourceMirror { | |
161 final List/*<String>*/ identifiers; | |
162 final bool isShow; | |
163 | |
164 Dart2JsCombinatorMirror(this.identifiers, {bool isShow: true}) | |
165 : this.isShow = isShow; | |
166 | |
167 bool get isHide => !isShow; | |
168 } | |
169 | |
170 class Dart2JsSourceLocation implements SourceLocation { | |
171 final Script _script; | |
172 final SourceSpan _span; | |
173 int _line; | |
174 int _column; | |
175 | |
176 Dart2JsSourceLocation(this._script, this._span); | |
177 | |
178 int _computeLine() { | |
179 var sourceFile = _script.file; | |
180 if (sourceFile != null) { | |
181 return sourceFile.getLine(offset) + 1; | |
182 } | |
183 var index = 0; | |
184 var lineNumber = 0; | |
185 while (index <= offset && index < sourceText.length) { | |
186 index = sourceText.indexOf('\n', index) + 1; | |
187 if (index <= 0) break; | |
188 lineNumber++; | |
189 } | |
190 return lineNumber; | |
191 } | |
192 | |
193 int get line { | |
194 if (_line == null) { | |
195 _line = _computeLine(); | |
196 } | |
197 return _line; | |
198 } | |
199 | |
200 int _computeColumn() { | |
201 if (length == 0) return 0; | |
202 | |
203 var sourceFile = _script.file; | |
204 if (sourceFile != null) { | |
205 return sourceFile.getColumn(sourceFile.getLine(offset), offset) + 1; | |
206 } | |
207 int index = offset - 1; | |
208 var columnNumber = 0; | |
209 while (0 <= index && index < sourceText.length) { | |
210 columnNumber++; | |
211 var codeUnit = sourceText.codeUnitAt(index); | |
212 if (codeUnit == $CR || codeUnit == $LF) { | |
213 break; | |
214 } | |
215 index--; | |
216 } | |
217 return columnNumber; | |
218 } | |
219 | |
220 int get column { | |
221 if (_column == null) { | |
222 _column = _computeColumn(); | |
223 } | |
224 return _column; | |
225 } | |
226 | |
227 int get offset => _span.begin; | |
228 | |
229 int get length => _span.end - _span.begin; | |
230 | |
231 String get text => _script.text.substring(_span.begin, _span.end); | |
232 | |
233 Uri get sourceUri => _script.resourceUri; | |
234 | |
235 String get sourceText => _script.text; | |
236 } | |
OLD | NEW |