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

Side by Side Diff: pkg/kernel/lib/ast.dart

Issue 2988373002: Store parts in Kernel Library, resynthesize parts in Analyzer. (Closed)
Patch Set: Fixes for review comments. Created 3 years, 4 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
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
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
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
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
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;
OLDNEW
« no previous file with comments | « pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart ('k') | pkg/kernel/lib/binary/ast_from_binary.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698