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

Side by Side Diff: lib/compiler/implementation/elements/elements.dart

Issue 10832136: Skeleton typedef type implementation (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Rebased and updated cf. comments Created 8 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 #library('elements'); 5 #library('elements');
6 6
7 #import('dart:uri'); 7 #import('dart:uri');
8 8
9 #import('../tree/tree.dart'); 9 #import('../tree/tree.dart');
10 #import('../scanner/scannerlib.dart'); 10 #import('../scanner/scannerlib.dart');
(...skipping 473 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 Type computeType(Compiler compiler) => compiler.types.dynamicType; 484 Type computeType(Compiler compiler) => compiler.types.dynamicType;
485 485
486 Token position() => firstPosition; 486 Token position() => firstPosition;
487 487
488 PrefixElement cloneTo(Element enclosing, DiagnosticListener listener) { 488 PrefixElement cloneTo(Element enclosing, DiagnosticListener listener) {
489 return new PrefixElement(name, enclosing, firstPosition); 489 return new PrefixElement(name, enclosing, firstPosition);
490 } 490 }
491 } 491 }
492 492
493 class TypedefElement extends Element implements TypeDeclarationElement { 493 class TypedefElement extends Element implements TypeDeclarationElement {
494 Type cachedType;
495 Typedef cachedNode; 494 Typedef cachedNode;
495 TypedefType cachedType;
496 Type alias;
497
498 bool isResolved = false;
499 bool isBeingResolved = false;
496 500
497 TypedefElement(SourceString name, Element enclosing) 501 TypedefElement(SourceString name, Element enclosing)
498 : super(name, ElementKind.TYPEDEF, enclosing); 502 : super(name, ElementKind.TYPEDEF, enclosing);
499 503
500 Type computeType(Compiler compiler) { 504 /**
505 * Function signature for a typedef of a function type. The signature is
506 * kept to provide full information about parameter names through the mirror
507 * system.
508 *
509 * The [functionSignature] is not available until the typedef element has been
510 * resolved.
511 */
512 FunctionSignature functionSignature;
513
514 TypedefType computeType(Compiler compiler) {
501 if (cachedType !== null) return cachedType; 515 if (cachedType !== null) return cachedType;
502 cachedType = new FunctionType(null, null, this); 516 Typedef node = parseNode(compiler);
503 cachedType.initializeFrom( 517 Link<Type> parameters =
504 compiler.computeFunctionType(this, compiler.resolveTypedef(this))); 518 TypeDeclarationElement.createTypeVariables(this, node.typeParameters);
519 cachedType = new TypedefType(this, parameters);
520 compiler.resolveTypedef(this);
505 return cachedType; 521 return cachedType;
506 } 522 }
507 523
508 Link<Type> get typeVariables() => const EmptyLink<Type>(); 524 Link<Type> get typeVariables() => cachedType.typeArguments;
509 525
510 Scope buildScope() => 526 Scope buildScope() =>
511 new TypeDeclarationScope(enclosingElement.buildScope(), this); 527 new TypeDeclarationScope(enclosingElement.buildScope(), this);
512 528
513 TypedefElement cloneTo(Element enclosing, DiagnosticListener listener) { 529 TypedefElement cloneTo(Element enclosing, DiagnosticListener listener) {
514 TypedefElement result = new TypedefElement(name, enclosing); 530 TypedefElement result = new TypedefElement(name, enclosing);
515 return result; 531 return result;
516 } 532 }
517 } 533 }
518 534
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
651 } 667 }
652 assert(type != null); 668 assert(type != null);
653 return type; 669 return type;
654 } 670 }
655 671
656 Token position() => cachedNode.getBeginToken(); 672 Token position() => cachedNode.getBeginToken();
657 673
658 VariableListElement cloneTo(Element enclosing, DiagnosticListener listener) { 674 VariableListElement cloneTo(Element enclosing, DiagnosticListener listener) {
659 VariableListElement result; 675 VariableListElement result;
660 if (cachedNode !== null) { 676 if (cachedNode !== null) {
661 result = new VariableListElement(cachedNode, kind, enclosing); 677 result = new VariableListElement.node(cachedNode, kind, enclosing);
662 } else { 678 } else {
663 result = new VariableListElement(kind, modifiers, enclosing); 679 result = new VariableListElement(kind, modifiers, enclosing);
664 } 680 }
665 return result; 681 return result;
666 } 682 }
667 } 683 }
668 684
669 class ForeignElement extends Element { 685 class ForeignElement extends Element {
670 ForeignElement(SourceString name, ContainerElement enclosingElement) 686 ForeignElement(SourceString name, ContainerElement enclosingElement)
671 : super(name, ElementKind.FOREIGN, enclosingElement); 687 : super(name, ElementKind.FOREIGN, enclosingElement);
(...skipping 810 matching lines...) Expand 10 before | Expand all | Expand 10 after
1482 : super(name, ElementKind.TYPE_VARIABLE, enclosing); 1498 : super(name, ElementKind.TYPE_VARIABLE, enclosing);
1483 1499
1484 TypeVariableType computeType(compiler) => type; 1500 TypeVariableType computeType(compiler) => type;
1485 1501
1486 Node parseNode(compiler) => cachedNode; 1502 Node parseNode(compiler) => cachedNode;
1487 1503
1488 String toString() => "${enclosingElement.toString()}.${name.slowToString()}"; 1504 String toString() => "${enclosingElement.toString()}.${name.slowToString()}";
1489 1505
1490 TypeVariableElement cloneTo(Element enclosing, DiagnosticListener listener) { 1506 TypeVariableElement cloneTo(Element enclosing, DiagnosticListener listener) {
1491 TypeVariableElement result = 1507 TypeVariableElement result =
1492 new TypeVariableElement(name, enclosing, node, type, bound); 1508 new TypeVariableElement(name, enclosing, cachedNode, type, bound);
1493 return result; 1509 return result;
1494 } 1510 }
1495 } 1511 }
OLDNEW
« no previous file with comments | « lib/compiler/implementation/compiler.dart ('k') | lib/compiler/implementation/js_backend/native_emitter.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698