Index: pkg/front_end/lib/src/fasta/kernel/body_builder.dart |
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart |
index 57e8858fe234e05653e2e4fa61a3ca5e19e40d7b..a6b3de29a67de0a280f3543f2cfb7e3d096c540d 100644 |
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart |
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart |
@@ -181,22 +181,6 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper { |
Expression toValue(Object node) { |
if (node is FastaAccessor) { |
return node.buildSimpleRead(); |
- } else if (node is TypeVariableBuilder) { |
- TypeParameterType type = node.buildTypesWithBuiltArguments(library, null); |
- if (!isInstanceContext && type.parameter.parent is Class) { |
- return buildCompileTimeError( |
- "Type variables can only be used in instance methods."); |
- } else { |
- if (constantExpressionRequired) { |
- addCompileTimeError(-1, |
- "Type variable can't be used as a constant expression $type."); |
- } |
- return new TypeLiteral(type); |
- } |
- } else if (node is TypeDeclarationBuilder) { |
- return new TypeLiteral(node.buildTypesWithBuiltArguments(library, null)); |
- } else if (node is KernelTypeBuilder) { |
- return new TypeLiteral(node.build(library)); |
} else if (node is Expression) { |
return node; |
} else if (node is PrefixBuilder) { |
@@ -926,7 +910,7 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper { |
addCompileTimeError( |
offsetForToken(token), "Not a constant expression."); |
} |
- return builder; |
+ return new TypeDeclarationAccessor(this, builder, name, token); |
} else if (builder.isLocal) { |
if (constantExpressionRequired && |
!builder.isConst && |
@@ -1231,7 +1215,7 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper { |
debugEvent("AssignmentExpression"); |
Expression value = popForValue(); |
var accessor = pop(); |
- if (accessor is TypeDeclarationBuilder || accessor is! FastaAccessor) { |
+ if (accessor is! FastaAccessor) { |
push(buildCompileTimeError("Can't assign to this.", token.charOffset)); |
} else { |
push(new DelayedAssignment( |
@@ -1428,7 +1412,7 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper { |
Builder builder = scope.lookup(name, charOffset, uri); |
if (builder == null) { |
warning("Type not found: '$name'.", charOffset); |
- return const DynamicType(); |
+ return const InvalidType(); |
} else { |
return kernelTypeFromBuilder(builder, arguments, charOffset); |
} |
@@ -1439,9 +1423,7 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper { |
if (constantExpressionRequired && builder is TypeVariableBuilder) { |
addCompileTimeError(charOffset, "Not a constant expression."); |
} |
- if (builder is TypeDeclarationBuilder) { |
- return builder.buildTypesWithBuiltArguments(library, arguments); |
- } else if (builder.hasProblem) { |
+ if (builder.hasProblem) { |
ProblemBuilder problem = builder; |
addCompileTimeError(charOffset, problem.message); |
} else { |
@@ -1449,7 +1431,7 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper { |
"Not a type: '${builder.fullNameForErrors}'.", charOffset); |
} |
// TODO(ahe): Create an error somehow. |
- return const DynamicType(); |
+ return const InvalidType(); |
} |
@override |
@@ -1480,7 +1462,7 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper { |
name = scopeLookup(builder.exports, suffix, beginToken, |
isQualified: true, prefix: builder); |
} else { |
- push(const DynamicType()); |
+ push(const InvalidType()); |
addCompileTimeError(beginToken.charOffset, |
"Can't be used as a type: '${debugName(prefix, suffix)}'."); |
return; |
@@ -1489,18 +1471,12 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper { |
if (name is Identifier) { |
name = name.name; |
} |
- if (name is FastaAccessor) { |
+ if (name is TypeDeclarationAccessor) { |
+ push(name.buildType(arguments)); |
+ } else if (name is FastaAccessor) { |
warningNotError( |
"'${beginToken.lexeme}' isn't a type.", beginToken.charOffset); |
- push(const DynamicType()); |
- } else if (name is TypeVariableBuilder && !member.isConstructor) { |
- if (constantExpressionRequired) { |
- addCompileTimeError( |
- beginToken.charOffset, "Not a constant expression."); |
- } |
- push(name.buildTypesWithBuiltArguments(library, arguments)); |
- } else if (name is TypeDeclarationBuilder) { |
- push(name.buildTypesWithBuiltArguments(library, arguments)); |
+ push(const InvalidType()); |
} else if (name is TypeBuilder) { |
push(name.build(library)); |
} else if (name is Builder) { |
@@ -1510,15 +1486,6 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper { |
} else { |
internalError("Unhandled: '${name.runtimeType}'."); |
} |
- if (peek() is TypeParameterType) { |
- TypeParameterType type = peek(); |
- if (!isInstanceContext && type.parameter.parent is Class) { |
- pop(); |
- warning("Type variables can only be used in instance methods.", |
- beginToken.charOffset); |
- push(const DynamicType()); |
- } |
- } |
} |
@override |
@@ -1911,7 +1878,7 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper { |
type = scopeLookup(prefix.exports, identifier.name, start, |
isQualified: true, prefix: prefix); |
identifier = null; |
- } else if (prefix is ClassBuilder) { |
+ } else if (prefix is TypeDeclarationAccessor) { |
type = prefix; |
} else { |
type = new Identifier(start); |
@@ -2031,6 +1998,10 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper { |
String name = pop(); |
List<DartType> typeArguments = pop(); |
var type = pop(); |
+ if (type is TypeDeclarationAccessor) { |
+ TypeDeclarationAccessor accessor = type; |
+ type = accessor.declaration; |
+ } |
bool savedConstantExpressionRequired = pop(); |
() { |
if (arguments == null) { |
@@ -2771,6 +2742,26 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper { |
super.warning(message, charOffset); |
} |
+ @override |
+ DartType validatedTypeVariableUse( |
+ TypeParameterType type, int offset, bool nonInstanceAccessIsError) { |
+ if (!isInstanceContext && type.parameter.parent is Class) { |
+ String message = "Type variables can't be used in static members."; |
+ if (nonInstanceAccessIsError) { |
+ addCompileTimeError(offset, message); |
+ } else { |
+ warning(message, offset); |
+ } |
+ return const InvalidType(); |
+ } else if (constantExpressionRequired) { |
+ addCompileTimeError( |
+ offset, |
+ "Type variable '${type.parameter.name}' can't be used as a constant " |
+ "expression $type."); |
+ } |
+ return type; |
+ } |
+ |
Expression evaluateArgumentsBefore( |
Arguments arguments, Expression expression) { |
if (arguments == null) return expression; |
@@ -3254,10 +3245,8 @@ String debugName(String className, String name, [String prefix]) { |
String getNodeName(Object node) { |
if (node is Identifier) { |
return node.name; |
- } else if (node is TypeDeclarationBuilder) { |
- return node.name; |
- } else if (node is PrefixBuilder) { |
- return node.name; |
+ } else if (node is Builder) { |
+ return node.fullNameForErrors; |
} else if (node is ThisAccessor) { |
return node.isSuper ? "super" : "this"; |
} else if (node is FastaAccessor) { |