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

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

Issue 10105027: Remove SimpleType. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 8 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
« no previous file with comments | « lib/compiler/implementation/resolver.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 class TypeCheckerTask extends CompilerTask { 5 class TypeCheckerTask extends CompilerTask {
6 TypeCheckerTask(Compiler compiler) : super(compiler); 6 TypeCheckerTask(Compiler compiler) : super(compiler);
7 String get name() => "Type checker"; 7 String get name() => "Type checker";
8 8
9 static final bool LOG_FAILURES = false; 9 static final bool LOG_FAILURES = false;
10 10
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 } 58 }
59 59
60 String toString() => stringName; 60 String toString() => stringName;
61 } 61 }
62 62
63 class InterfaceType implements Type { 63 class InterfaceType implements Type {
64 final SourceString name; 64 final SourceString name;
65 final Element element; 65 final Element element;
66 final Link<Type> arguments; 66 final Link<Type> arguments;
67 67
68 const InterfaceType(this.name, this.element, this.arguments); 68 const InterfaceType(this.name, this.element,
69 [this.arguments = const EmptyLink<Type>()]);
69 70
70 toString() { 71 toString() {
71 StringBuffer sb = new StringBuffer(); 72 StringBuffer sb = new StringBuffer();
72 sb.add(name.slowToString()); 73 sb.add(name.slowToString());
73 if (!arguments.isEmpty()) { 74 if (!arguments.isEmpty()) {
74 sb.add('<'); 75 sb.add('<');
75 arguments.printOn(sb); 76 arguments.printOn(sb);
76 sb.add('>'); 77 sb.add('>');
77 } 78 }
78 return sb.toString(); 79 return sb.toString();
79 } 80 }
80 } 81 }
81 82
82 // TODO(karlklose): merge into InterfaceType as a named constructor.
83 class SimpleType extends InterfaceType {
84 const SimpleType(SourceString name, Element element)
85 : super(name, element, const EmptyLink<Type>());
86 String toString() => name.slowToString();
87 }
88
89 class FunctionType implements Type { 83 class FunctionType implements Type {
90 final Element element; 84 final Element element;
91 final Type returnType; 85 final Type returnType;
92 final Link<Type> parameterTypes; 86 final Link<Type> parameterTypes;
93 87
94 const FunctionType(Type this.returnType, Link<Type> this.parameterTypes, 88 const FunctionType(Type this.returnType, Link<Type> this.parameterTypes,
95 Element this.element); 89 Element this.element);
96 90
97 toString() { 91 toString() {
98 StringBuffer sb = new StringBuffer(); 92 StringBuffer sb = new StringBuffer();
(...skipping 10 matching lines...) Expand all
109 class Types { 103 class Types {
110 static final VOID = const SourceString('void'); 104 static final VOID = const SourceString('void');
111 static final INT = const SourceString('int'); 105 static final INT = const SourceString('int');
112 static final DOUBLE = const SourceString('double'); 106 static final DOUBLE = const SourceString('double');
113 static final DYNAMIC = const SourceString('Dynamic'); 107 static final DYNAMIC = const SourceString('Dynamic');
114 static final STRING = const SourceString('String'); 108 static final STRING = const SourceString('String');
115 static final BOOL = const SourceString('bool'); 109 static final BOOL = const SourceString('bool');
116 static final OBJECT = const SourceString('Object'); 110 static final OBJECT = const SourceString('Object');
117 static final LIST = const SourceString('List'); 111 static final LIST = const SourceString('List');
118 112
119 final SimpleType voidType; 113 final InterfaceType voidType;
120 final SimpleType dynamicType; 114 final InterfaceType dynamicType;
121 115
122 Types() : this.with(new LibraryElement(new Script(null, null))); 116 Types() : this.with(new LibraryElement(new Script(null, null)));
123 117
124 Types.with(LibraryElement library) 118 Types.with(LibraryElement library)
125 : voidType = new SimpleType(VOID, new ClassElement(VOID, library)), 119 : voidType = new InterfaceType(VOID, new ClassElement(VOID, library)),
126 dynamicType = new SimpleType(DYNAMIC, new ClassElement(DYNAMIC, library)); 120 dynamicType = new InterfaceType(DYNAMIC, new ClassElement(DYNAMIC, library ));
127 121
128 Type lookup(SourceString s) { 122 Type lookup(SourceString s) {
129 if (VOID == s) { 123 if (VOID == s) {
130 return voidType; 124 return voidType;
131 } else if (DYNAMIC == s || s.stringValue === 'var') { 125 } else if (DYNAMIC == s || s.stringValue === 'var') {
132 return dynamicType; 126 return dynamicType;
133 } 127 }
134 return null; 128 return null;
135 } 129 }
136 130
137 /** Returns true if t is a subtype of s */ 131 /** Returns true if t is a subtype of s */
138 bool isSubtype(Type t, Type s) { 132 bool isSubtype(Type t, Type s) {
139 if (t === s || t === dynamicType || s === dynamicType || 133 if (t === s || t === dynamicType || s === dynamicType ||
140 s.name == OBJECT) return true; 134 s.name == OBJECT) return true;
141 if (t is SimpleType) { 135 if (t is InterfaceType) {
142 if (s is !SimpleType) return false; 136 if (s is !InterfaceType) return false;
143 ClassElement tc = t.element; 137 ClassElement tc = t.element;
144 for (Link<Type> supertypes = tc.allSupertypes; 138 for (Link<Type> supertypes = tc.allSupertypes;
145 supertypes != null && !supertypes.isEmpty(); 139 supertypes != null && !supertypes.isEmpty();
146 supertypes = supertypes.tail) { 140 supertypes = supertypes.tail) {
147 Type supertype = supertypes.head; 141 Type supertype = supertypes.head;
148 if (supertype.element === s.element) return true; 142 if (supertype.element === s.element) return true;
149 } 143 }
150 return false; 144 return false;
151 } else if (t is FunctionType) { 145 } else if (t is FunctionType) {
152 if (s is !FunctionType) return false; 146 if (s is !FunctionType) return false;
(...skipping 596 matching lines...) Expand 10 before | Expand all | Expand 10 after
749 } 743 }
750 744
751 visitCatchBlock(CatchBlock node) { 745 visitCatchBlock(CatchBlock node) {
752 fail(node); 746 fail(node);
753 } 747 }
754 748
755 visitTypedef(Typedef node) { 749 visitTypedef(Typedef node) {
756 fail(node); 750 fail(node);
757 } 751 }
758 } 752 }
OLDNEW
« no previous file with comments | « lib/compiler/implementation/resolver.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698