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

Unified Diff: sdk/lib/_internal/compiler/implementation/typechecker.dart

Issue 17447003: Correctly type check type variable expressions. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 6 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 side-by-side diff with in-line comments
Download patch
Index: sdk/lib/_internal/compiler/implementation/typechecker.dart
diff --git a/sdk/lib/_internal/compiler/implementation/typechecker.dart b/sdk/lib/_internal/compiler/implementation/typechecker.dart
index 49612a981971842342a9d69edd45c6157209ef70..78f4c8a92b94c4000732dc61978dc622bc0c9698 100644
--- a/sdk/lib/_internal/compiler/implementation/typechecker.dart
+++ b/sdk/lib/_internal/compiler/implementation/typechecker.dart
@@ -506,6 +506,10 @@ class TypeCheckerVisitor extends Visitor<DartType> {
*/
ElementAccess computeAccess(Send node, SourceString name, Element element,
MemberKind memberKind) {
+ if (element != null && element.isErroneous()) {
+ // An error has already been reported for this node.
+ return const DynamicAccess();
+ }
if (node.receiver != null) {
Element receiverElement = elements[node.receiver];
if (receiverElement != null) {
@@ -557,6 +561,16 @@ class TypeCheckerVisitor extends Visitor<DartType> {
} else if (element.isErroneous()) {
// foo() where foo is erroneous.
return const DynamicAccess();
+ } else if (element.impliesType()) {
+ // The literal `Foo` where Foo is a class, a typedef, or a type variable.
+ if (elements.getType(node) != null) {
+ assert(invariant(node, identical(compiler.typeClass,
+ elements.getType(node).element),
+ message: 'Expected type literal type: '
+ '${elements.getType(node)}'));
+ return new TypeLiteralAccess(element);
+ }
+ return createResolvedAccess(node, name, element);
} else if (element.isMember()) {
// foo() where foo is an instance member.
return lookupMember(node, currentClass.computeType(compiler),
@@ -569,16 +583,6 @@ class TypeCheckerVisitor extends Visitor<DartType> {
element.isField()) {
// foo() where foo is a field in the same class.
return createResolvedAccess(node, name, element);
- } else if (element.impliesType()) {
- // The literal `Foo` where Foo is a class, a typedef, or a type variable.
- if (elements.getType(node) != null) {
- assert(invariant(node, identical(compiler.typeClass,
- elements.getType(node).element),
- message: 'Expected type literal type: '
- '${elements.getType(node)}'));
- return new TypeLiteralAccess(element);
- }
- return createResolvedAccess(node, name, element);
} else if (element.isGetter() || element.isSetter()) {
return createResolvedAccess(node, name, element);
} else {

Powered by Google App Engine
This is Rietveld 408576698