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

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

Issue 2988373002: Store parts in Kernel Library, resynthesize parts in Analyzer. (Closed)
Patch Set: 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 final List<LibraryPart> parts;
Siggi Cherem (dart-lang) 2017/08/02 23:06:23 should we add @informational to this field?
scheglov 2017/08/03 00:16:35 Acknowledged.
272 final List<Typedef> typedefs; 273 final List<Typedef> typedefs;
273 final List<Class> classes; 274 final List<Class> classes;
274 final List<Procedure> procedures; 275 final List<Procedure> procedures;
275 final List<Field> fields; 276 final List<Field> fields;
276 277
277 Library(this.importUri, 278 Library(this.importUri,
278 {this.name, 279 {this.name,
279 this.isExternal: false, 280 this.isExternal: false,
280 List<Expression> annotations, 281 List<Expression> annotations,
281 List<LibraryDependency> dependencies, 282 List<LibraryDependency> dependencies,
283 List<LibraryPart> parts,
282 List<Typedef> typedefs, 284 List<Typedef> typedefs,
283 List<Class> classes, 285 List<Class> classes,
284 List<Procedure> procedures, 286 List<Procedure> procedures,
285 List<Field> fields, 287 List<Field> fields,
286 this.fileUri, 288 this.fileUri,
287 Reference reference}) 289 Reference reference})
288 : this.annotations = annotations ?? <Expression>[], 290 : this.annotations = annotations ?? <Expression>[],
289 this.dependencies = dependencies ?? <LibraryDependency>[], 291 this.dependencies = dependencies ?? <LibraryDependency>[],
292 this.parts = parts ?? <LibraryPart>[],
290 this.typedefs = typedefs ?? <Typedef>[], 293 this.typedefs = typedefs ?? <Typedef>[],
291 this.classes = classes ?? <Class>[], 294 this.classes = classes ?? <Class>[],
292 this.procedures = procedures ?? <Procedure>[], 295 this.procedures = procedures ?? <Procedure>[],
293 this.fields = fields ?? <Field>[], 296 this.fields = fields ?? <Field>[],
294 super(reference) { 297 super(reference) {
295 setParents(this.dependencies, this); 298 setParents(this.dependencies, this);
299 setParents(this.parts, this);
296 setParents(this.typedefs, this); 300 setParents(this.typedefs, this);
297 setParents(this.classes, this); 301 setParents(this.classes, this);
298 setParents(this.procedures, this); 302 setParents(this.procedures, this);
299 setParents(this.fields, this); 303 setParents(this.fields, this);
300 } 304 }
301 305
302 /// Returns the top-level fields and procedures defined in this library. 306 /// Returns the top-level fields and procedures defined in this library.
303 /// 307 ///
304 /// This getter is for convenience, not efficiency. Consider manually 308 /// This getter is for convenience, not efficiency. Consider manually
305 /// iterating the members to speed up code in production. 309 /// 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) { 350 for (var class_ in classes) {
347 canonicalName.getChild(class_.name).bindTo(class_.reference); 351 canonicalName.getChild(class_.name).bindTo(class_.reference);
348 class_.computeCanonicalNames(); 352 class_.computeCanonicalNames();
349 } 353 }
350 } 354 }
351 355
352 void addDependency(LibraryDependency node) { 356 void addDependency(LibraryDependency node) {
353 dependencies.add(node..parent = this); 357 dependencies.add(node..parent = this);
354 } 358 }
355 359
360 void addPart(LibraryPart node) {
361 parts.add(node..parent = this);
362 }
363
356 accept(TreeVisitor v) => v.visitLibrary(this); 364 accept(TreeVisitor v) => v.visitLibrary(this);
357 365
358 visitChildren(Visitor v) { 366 visitChildren(Visitor v) {
359 visitList(dependencies, v); 367 visitList(dependencies, v);
368 visitList(parts, v);
360 visitList(typedefs, v); 369 visitList(typedefs, v);
361 visitList(classes, v); 370 visitList(classes, v);
362 visitList(procedures, v); 371 visitList(procedures, v);
363 visitList(fields, v); 372 visitList(fields, v);
364 } 373 }
365 374
366 transformChildren(Transformer v) { 375 transformChildren(Transformer v) {
367 transformList(dependencies, v, this); 376 transformList(dependencies, v, this);
368 transformList(typedefs, v, this); 377 transformList(typedefs, v, this);
369 transformList(classes, v, this); 378 transformList(classes, v, this);
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
456 visitList(annotations, v); 465 visitList(annotations, v);
457 visitList(combinators, v); 466 visitList(combinators, v);
458 } 467 }
459 468
460 transformChildren(Transformer v) { 469 transformChildren(Transformer v) {
461 transformList(annotations, v, this); 470 transformList(annotations, v, this);
462 transformList(combinators, v, this); 471 transformList(combinators, v, this);
463 } 472 }
464 } 473 }
465 474
475 /// A part declaration in a library.
476 ///
477 /// part <url>;
478 ///
479 /// optionally with metadata.
480 class LibraryPart extends TreeNode {
481 final List<Expression> annotations;
482 final String fileUri;
483
484 LibraryPart(List<Expression> annotations, String fileUri)
485 : this.byReference(annotations, fileUri);
486
487 LibraryPart.byReference(this.annotations, this.fileUri) {
488 setParents(annotations, this);
489 }
490
491 void addAnnotation(Expression annotation) {
492 annotations.add(annotation..parent = this);
493 }
494
495 accept(TreeVisitor v) => v.visitLibraryPart(this);
496
497 visitChildren(Visitor v) {
498 visitList(annotations, v);
499 }
500
501 transformChildren(Transformer v) {
502 transformList(annotations, v, this);
503 }
504 }
505
466 /// A `show` or `hide` clause for an import or export. 506 /// A `show` or `hide` clause for an import or export.
467 class Combinator extends TreeNode { 507 class Combinator extends TreeNode {
468 bool isShow; 508 bool isShow;
469 final List<String> names; 509 final List<String> names;
470 510
471 LibraryDependency get dependency => parent; 511 LibraryDependency get dependency => parent;
472 512
473 Combinator(this.isShow, this.names); 513 Combinator(this.isShow, this.names);
474 Combinator.show(this.names) : isShow = true; 514 Combinator.show(this.names) : isShow = true;
475 Combinator.hide(this.names) : isShow = false; 515 Combinator.hide(this.names) : isShow = false;
(...skipping 4215 matching lines...) Expand 10 before | Expand all | Expand 10 after
4691 if (typedef_.canonicalName == null) { 4731 if (typedef_.canonicalName == null) {
4692 throw '$typedef_ has no canonical name'; 4732 throw '$typedef_ has no canonical name';
4693 } 4733 }
4694 return typedef_.canonicalName; 4734 return typedef_.canonicalName;
4695 } 4735 }
4696 4736
4697 /// Annotation describing information which is not part of Dart semantics; in 4737 /// Annotation describing information which is not part of Dart semantics; in
4698 /// other words, if this information (or any information it refers to) changes, 4738 /// other words, if this information (or any information it refers to) changes,
4699 /// static analysis and runtime behavior of the library are unaffected. 4739 /// static analysis and runtime behavior of the library are unaffected.
4700 const informative = null; 4740 const informative = null;
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698