OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 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 | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 /// ----------------------------------------------------------------------- | 5 /// ----------------------------------------------------------------------- |
6 /// ERROR HANDLING | 6 /// ERROR HANDLING |
7 /// ----------------------------------------------------------------------- | 7 /// ----------------------------------------------------------------------- |
8 /// | 8 /// |
9 /// As a rule of thumb, errors that can be detected statically are handled by | 9 /// As a rule of thumb, errors that can be detected statically are handled by |
10 /// the frontend, typically by translating the erroneous code into a 'throw' or | 10 /// the frontend, typically by translating the erroneous code into a 'throw' or |
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
262 /// other than [ClassLevel.Body]. Members in an external library have no | 262 /// other than [ClassLevel.Body]. Members in an external library have no |
263 /// body, but have their typed interface present. | 263 /// body, but have their typed interface present. |
264 /// | 264 /// |
265 /// If the libary is non-external, then its classes are at [ClassLevel.Body] | 265 /// If the libary is non-external, then its classes are at [ClassLevel.Body] |
266 /// and all members are loaded. | 266 /// and all members are loaded. |
267 bool isExternal; | 267 bool isExternal; |
268 | 268 |
269 String name; | 269 String name; |
270 final List<Expression> annotations; | 270 final List<Expression> annotations; |
271 final List<LibraryDependency> dependencies; | 271 final List<LibraryDependency> dependencies; |
| 272 @informative |
| 273 final List<LibraryPart> parts; |
272 final List<Typedef> typedefs; | 274 final List<Typedef> typedefs; |
273 final List<Class> classes; | 275 final List<Class> classes; |
274 final List<Procedure> procedures; | 276 final List<Procedure> procedures; |
275 final List<Field> fields; | 277 final List<Field> fields; |
276 | 278 |
277 Library(this.importUri, | 279 Library(this.importUri, |
278 {this.name, | 280 {this.name, |
279 this.isExternal: false, | 281 this.isExternal: false, |
280 List<Expression> annotations, | 282 List<Expression> annotations, |
281 List<LibraryDependency> dependencies, | 283 List<LibraryDependency> dependencies, |
| 284 List<LibraryPart> parts, |
282 List<Typedef> typedefs, | 285 List<Typedef> typedefs, |
283 List<Class> classes, | 286 List<Class> classes, |
284 List<Procedure> procedures, | 287 List<Procedure> procedures, |
285 List<Field> fields, | 288 List<Field> fields, |
286 this.fileUri, | 289 this.fileUri, |
287 Reference reference}) | 290 Reference reference}) |
288 : this.annotations = annotations ?? <Expression>[], | 291 : this.annotations = annotations ?? <Expression>[], |
289 this.dependencies = dependencies ?? <LibraryDependency>[], | 292 this.dependencies = dependencies ?? <LibraryDependency>[], |
| 293 this.parts = parts ?? <LibraryPart>[], |
290 this.typedefs = typedefs ?? <Typedef>[], | 294 this.typedefs = typedefs ?? <Typedef>[], |
291 this.classes = classes ?? <Class>[], | 295 this.classes = classes ?? <Class>[], |
292 this.procedures = procedures ?? <Procedure>[], | 296 this.procedures = procedures ?? <Procedure>[], |
293 this.fields = fields ?? <Field>[], | 297 this.fields = fields ?? <Field>[], |
294 super(reference) { | 298 super(reference) { |
295 setParents(this.dependencies, this); | 299 setParents(this.dependencies, this); |
| 300 setParents(this.parts, this); |
296 setParents(this.typedefs, this); | 301 setParents(this.typedefs, this); |
297 setParents(this.classes, this); | 302 setParents(this.classes, this); |
298 setParents(this.procedures, this); | 303 setParents(this.procedures, this); |
299 setParents(this.fields, this); | 304 setParents(this.fields, this); |
300 } | 305 } |
301 | 306 |
302 /// Returns the top-level fields and procedures defined in this library. | 307 /// Returns the top-level fields and procedures defined in this library. |
303 /// | 308 /// |
304 /// This getter is for convenience, not efficiency. Consider manually | 309 /// This getter is for convenience, not efficiency. Consider manually |
305 /// iterating the members to speed up code in production. | 310 /// iterating the members to speed up code in production. |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
346 for (var class_ in classes) { | 351 for (var class_ in classes) { |
347 canonicalName.getChild(class_.name).bindTo(class_.reference); | 352 canonicalName.getChild(class_.name).bindTo(class_.reference); |
348 class_.computeCanonicalNames(); | 353 class_.computeCanonicalNames(); |
349 } | 354 } |
350 } | 355 } |
351 | 356 |
352 void addDependency(LibraryDependency node) { | 357 void addDependency(LibraryDependency node) { |
353 dependencies.add(node..parent = this); | 358 dependencies.add(node..parent = this); |
354 } | 359 } |
355 | 360 |
| 361 void addPart(LibraryPart node) { |
| 362 parts.add(node..parent = this); |
| 363 } |
| 364 |
356 accept(TreeVisitor v) => v.visitLibrary(this); | 365 accept(TreeVisitor v) => v.visitLibrary(this); |
357 | 366 |
358 visitChildren(Visitor v) { | 367 visitChildren(Visitor v) { |
359 visitList(dependencies, v); | 368 visitList(dependencies, v); |
| 369 visitList(parts, v); |
360 visitList(typedefs, v); | 370 visitList(typedefs, v); |
361 visitList(classes, v); | 371 visitList(classes, v); |
362 visitList(procedures, v); | 372 visitList(procedures, v); |
363 visitList(fields, v); | 373 visitList(fields, v); |
364 } | 374 } |
365 | 375 |
366 transformChildren(Transformer v) { | 376 transformChildren(Transformer v) { |
367 transformList(dependencies, v, this); | 377 transformList(dependencies, v, this); |
| 378 transformList(parts, v, this); |
368 transformList(typedefs, v, this); | 379 transformList(typedefs, v, this); |
369 transformList(classes, v, this); | 380 transformList(classes, v, this); |
370 transformList(procedures, v, this); | 381 transformList(procedures, v, this); |
371 transformList(fields, v, this); | 382 transformList(fields, v, this); |
372 } | 383 } |
373 | 384 |
374 static int _libraryIdCounter = 0; | 385 static int _libraryIdCounter = 0; |
375 int _libraryId = ++_libraryIdCounter; | 386 int _libraryId = ++_libraryIdCounter; |
376 | 387 |
377 int compareTo(Library other) => _libraryId - other._libraryId; | 388 int compareTo(Library other) => _libraryId - other._libraryId; |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
456 visitList(annotations, v); | 467 visitList(annotations, v); |
457 visitList(combinators, v); | 468 visitList(combinators, v); |
458 } | 469 } |
459 | 470 |
460 transformChildren(Transformer v) { | 471 transformChildren(Transformer v) { |
461 transformList(annotations, v, this); | 472 transformList(annotations, v, this); |
462 transformList(combinators, v, this); | 473 transformList(combinators, v, this); |
463 } | 474 } |
464 } | 475 } |
465 | 476 |
| 477 /// A part declaration in a library. |
| 478 /// |
| 479 /// part <url>; |
| 480 /// |
| 481 /// optionally with metadata. |
| 482 class LibraryPart extends TreeNode { |
| 483 final List<Expression> annotations; |
| 484 final String fileUri; |
| 485 |
| 486 LibraryPart(List<Expression> annotations, String fileUri) |
| 487 : this.byReference(annotations, fileUri); |
| 488 |
| 489 LibraryPart.byReference(this.annotations, this.fileUri) { |
| 490 setParents(annotations, this); |
| 491 } |
| 492 |
| 493 void addAnnotation(Expression annotation) { |
| 494 annotations.add(annotation..parent = this); |
| 495 } |
| 496 |
| 497 accept(TreeVisitor v) => v.visitLibraryPart(this); |
| 498 |
| 499 visitChildren(Visitor v) { |
| 500 visitList(annotations, v); |
| 501 } |
| 502 |
| 503 transformChildren(Transformer v) { |
| 504 transformList(annotations, v, this); |
| 505 } |
| 506 } |
| 507 |
466 /// A `show` or `hide` clause for an import or export. | 508 /// A `show` or `hide` clause for an import or export. |
467 class Combinator extends TreeNode { | 509 class Combinator extends TreeNode { |
468 bool isShow; | 510 bool isShow; |
469 final List<String> names; | 511 final List<String> names; |
470 | 512 |
471 LibraryDependency get dependency => parent; | 513 LibraryDependency get dependency => parent; |
472 | 514 |
473 Combinator(this.isShow, this.names); | 515 Combinator(this.isShow, this.names); |
474 Combinator.show(this.names) : isShow = true; | 516 Combinator.show(this.names) : isShow = true; |
475 Combinator.hide(this.names) : isShow = false; | 517 Combinator.hide(this.names) : isShow = false; |
(...skipping 4215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4691 if (typedef_.canonicalName == null) { | 4733 if (typedef_.canonicalName == null) { |
4692 throw '$typedef_ has no canonical name'; | 4734 throw '$typedef_ has no canonical name'; |
4693 } | 4735 } |
4694 return typedef_.canonicalName; | 4736 return typedef_.canonicalName; |
4695 } | 4737 } |
4696 | 4738 |
4697 /// Annotation describing information which is not part of Dart semantics; in | 4739 /// Annotation describing information which is not part of Dart semantics; in |
4698 /// other words, if this information (or any information it refers to) changes, | 4740 /// other words, if this information (or any information it refers to) changes, |
4699 /// static analysis and runtime behavior of the library are unaffected. | 4741 /// static analysis and runtime behavior of the library are unaffected. |
4700 const informative = null; | 4742 const informative = null; |
OLD | NEW |