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 library kernel.ast_from_binary; | 4 library kernel.ast_from_binary; |
5 | 5 |
6 import 'dart:convert'; | 6 import 'dart:convert'; |
7 import 'dart:typed_data'; | 7 import 'dart:typed_data'; |
8 | 8 |
9 import '../ast.dart'; | 9 import '../ast.dart'; |
10 import '../transformations/flags.dart'; | 10 import '../transformations/flags.dart'; |
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
306 } | 306 } |
307 | 307 |
308 Reference readMemberReference({bool allowNull: false}) { | 308 Reference readMemberReference({bool allowNull: false}) { |
309 var name = readCanonicalNameReference(); | 309 var name = readCanonicalNameReference(); |
310 if (name == null && !allowNull) { | 310 if (name == null && !allowNull) { |
311 throw 'Expected a member reference to be valid but was `null`.'; | 311 throw 'Expected a member reference to be valid but was `null`.'; |
312 } | 312 } |
313 return name?.getReference(); | 313 return name?.getReference(); |
314 } | 314 } |
315 | 315 |
| 316 Reference readTypedefReference() { |
| 317 return readCanonicalNameReference().getReference(); |
| 318 } |
| 319 |
316 Name readName() { | 320 Name readName() { |
317 String text = readStringReference(); | 321 String text = readStringReference(); |
318 if (text.isNotEmpty && text[0] == '_') { | 322 if (text.isNotEmpty && text[0] == '_') { |
319 return new Name.byReference(text, readLibraryReference()); | 323 return new Name.byReference(text, readLibraryReference()); |
320 } else { | 324 } else { |
321 return new Name(text); | 325 return new Name(text); |
322 } | 326 } |
323 } | 327 } |
324 | 328 |
325 Library readLibrary(Program program) { | 329 Library readLibrary(Program program) { |
(...skipping 17 matching lines...) Expand all Loading... |
343 if (shouldWriteData) { | 347 if (shouldWriteData) { |
344 library.isExternal = isExternal; | 348 library.isExternal = isExternal; |
345 library.name = name; | 349 library.name = name; |
346 library.fileUri = fileUri; | 350 library.fileUri = fileUri; |
347 } | 351 } |
348 | 352 |
349 _readDeferredImports(library); | 353 _readDeferredImports(library); |
350 | 354 |
351 debugPath.add(library.name ?? library.importUri?.toString() ?? 'library'); | 355 debugPath.add(library.name ?? library.importUri?.toString() ?? 'library'); |
352 | 356 |
| 357 _mergeNamedNodeList(library.typedefs, readTypedef, library); |
353 _mergeNamedNodeList(library.classes, readClass, library); | 358 _mergeNamedNodeList(library.classes, readClass, library); |
354 _mergeNamedNodeList(library.fields, readField, library); | 359 _mergeNamedNodeList(library.fields, readField, library); |
355 _mergeNamedNodeList(library.procedures, readProcedure, library); | 360 _mergeNamedNodeList(library.procedures, readProcedure, library); |
356 | 361 |
357 debugPath.removeLast(); | 362 debugPath.removeLast(); |
358 _currentLibrary = null; | 363 _currentLibrary = null; |
359 return library; | 364 return library; |
360 } | 365 } |
361 | 366 |
362 void _readDeferredImports(Library library) { | 367 void _readDeferredImports(Library library) { |
363 int length = readUInt(); | 368 int length = readUInt(); |
364 if (library.isExternal) { | 369 if (library.isExternal) { |
365 assert(length == 0); | 370 assert(length == 0); |
366 return; | 371 return; |
367 } | 372 } |
368 library.deferredImports.length = length; | 373 library.deferredImports.length = length; |
369 for (int i = 0; i < length; ++i) { | 374 for (int i = 0; i < length; ++i) { |
370 library.deferredImports[i] = new DeferredImport.byReference( | 375 library.deferredImports[i] = new DeferredImport.byReference( |
371 readLibraryReference(), readStringReference()) | 376 readLibraryReference(), readStringReference()) |
372 ..parent = library; | 377 ..parent = library; |
373 } | 378 } |
374 } | 379 } |
375 | 380 |
| 381 Typedef readTypedef() { |
| 382 var canonicalName = readCanonicalNameReference(); |
| 383 var reference = canonicalName.getReference(); |
| 384 Typedef node = reference.node; |
| 385 bool shouldWriteData = node == null || _isReadingLibraryImplementation; |
| 386 if (node == null) { |
| 387 node = new Typedef(null, null, reference: reference); |
| 388 } |
| 389 int fileOffset = readOffset(); |
| 390 String name = readStringReference(); |
| 391 String fileUri = readUriReference(); |
| 392 readAndPushTypeParameterList(node.typeParameters, node); |
| 393 var type = readDartType(); |
| 394 typeParameterStack.length = 0; |
| 395 if (shouldWriteData) { |
| 396 node.fileOffset = fileOffset; |
| 397 node.name = name; |
| 398 node.fileUri = fileUri; |
| 399 node.type = type; |
| 400 } |
| 401 return node; |
| 402 } |
| 403 |
376 Class readClass() { | 404 Class readClass() { |
377 int tag = readByte(); | 405 int tag = readByte(); |
378 assert(tag == Tag.Class); | 406 assert(tag == Tag.Class); |
379 var canonicalName = readCanonicalNameReference(); | 407 var canonicalName = readCanonicalNameReference(); |
380 var reference = canonicalName.getReference(); | 408 var reference = canonicalName.getReference(); |
381 Class node = reference.node; | 409 Class node = reference.node; |
382 bool shouldWriteData = node == null || _isReadingLibraryImplementation; | 410 bool shouldWriteData = node == null || _isReadingLibraryImplementation; |
383 if (node == null) { | 411 if (node == null) { |
384 node = new Class(reference: reference)..level = ClassLevel.Temporary; | 412 node = new Class(reference: reference)..level = ClassLevel.Temporary; |
385 } | 413 } |
(...skipping 626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1012 return new NamedType(readStringReference(), readDartType()); | 1040 return new NamedType(readStringReference(), readDartType()); |
1013 } | 1041 } |
1014 | 1042 |
1015 DartType readDartTypeOption() { | 1043 DartType readDartTypeOption() { |
1016 return readAndCheckOptionTag() ? readDartType() : null; | 1044 return readAndCheckOptionTag() ? readDartType() : null; |
1017 } | 1045 } |
1018 | 1046 |
1019 DartType readDartType() { | 1047 DartType readDartType() { |
1020 int tag = readByte(); | 1048 int tag = readByte(); |
1021 switch (tag) { | 1049 switch (tag) { |
| 1050 case Tag.TypedefType: |
| 1051 return new TypedefType.byReference( |
| 1052 readTypedefReference(), readDartTypeList()); |
1022 case Tag.VectorType: | 1053 case Tag.VectorType: |
1023 return const VectorType(); | 1054 return const VectorType(); |
1024 case Tag.BottomType: | 1055 case Tag.BottomType: |
1025 return const BottomType(); | 1056 return const BottomType(); |
1026 case Tag.InvalidType: | 1057 case Tag.InvalidType: |
1027 return const InvalidType(); | 1058 return const InvalidType(); |
1028 case Tag.DynamicType: | 1059 case Tag.DynamicType: |
1029 return const DynamicType(); | 1060 return const DynamicType(); |
1030 case Tag.VoidType: | 1061 case Tag.VoidType: |
1031 return const VoidType(); | 1062 return const VoidType(); |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1127 ..fileOffset = offset | 1158 ..fileOffset = offset |
1128 ..fileEqualsOffset = fileEqualsOffset; | 1159 ..fileEqualsOffset = fileEqualsOffset; |
1129 } | 1160 } |
1130 | 1161 |
1131 int readOffset() { | 1162 int readOffset() { |
1132 // Offset is saved as unsigned, | 1163 // Offset is saved as unsigned, |
1133 // but actually ranges from -1 and up (thus the -1) | 1164 // but actually ranges from -1 and up (thus the -1) |
1134 return readUInt() - 1; | 1165 return readUInt() - 1; |
1135 } | 1166 } |
1136 } | 1167 } |
OLD | NEW |