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

Unified Diff: dart/frog/leg/resolver.dart

Issue 9347045: Start supporting default classes. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years, 10 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
« no previous file with comments | « dart/frog/leg/elements/elements.dart ('k') | dart/frog/leg/scanner/class_element_parser.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: dart/frog/leg/resolver.dart
diff --git a/dart/frog/leg/resolver.dart b/dart/frog/leg/resolver.dart
index 0734e996a671538df2c831d14764fd88fb3f52fe..479295fe9f928dc389a56f901e146f5731bc1c53 100644
--- a/dart/frog/leg/resolver.dart
+++ b/dart/frog/leg/resolver.dart
@@ -800,13 +800,14 @@ class ResolverVisitor extends CommonResolverVisitor<Element> {
visitNewExpression(NewExpression node) {
if (node.isConst()) cancel(node, 'const expressions are not implemented');
- if (node.send.selector.asTypeAnnotation() === null) {
+ Node selector = node.send.selector;
+ if (selector.asTypeAnnotation() === null) {
cancel(
node, 'named constructors with type arguments are not implemented');
}
SourceString constructorName;
- Node typeName = node.send.selector.asTypeAnnotation().typeName;
+ Node typeName = selector.asTypeAnnotation().typeName;
if (typeName.asSend() !== null) {
Identifier receiver = typeName.asSend().receiver.asIdentifier();
Identifier selector = typeName.asSend().selector.asIdentifier();
@@ -816,10 +817,14 @@ class ResolverVisitor extends CommonResolverVisitor<Element> {
} else {
constructorName = typeName.asIdentifier().source;
}
- ClassElement cls = resolveTypeRequired(node.send.selector);
+ ClassElement cls = resolveTypeRequired(selector);
Element constructor = null;
if (cls !== null) {
- constructor = cls.resolve(compiler).lookupConstructor(constructorName);
+ cls.resolve(compiler);
+ if (cls.isInterface() && (cls.defaultClass === null)) {
+ error(selector, MessageKind.CANNOT_INSTANTIATE_INTERFACE, [cls.name]);
+ }
+ constructor = cls.lookupConstructor(constructorName);
if (constructorName == cls.name
&& constructor === null
&& node.send.argumentsNode.isEmpty()) {
@@ -837,7 +842,6 @@ class ResolverVisitor extends CommonResolverVisitor<Element> {
}
}
} else {
- Node selector = node.send.selector;
error(selector, MessageKind.CANNOT_RESOLVE_TYPE, [selector]);
}
handleArguments(node.send);
@@ -1024,6 +1028,9 @@ class ClassResolverVisitor extends CommonResolverVisitor<Type> {
element.supertype = new SimpleType(Types.OBJECT,
objectElement);
}
+ if (node.defaultClause !== null) {
+ element.defaultClass = visit(node.defaultClause.nodes.head);
+ }
for (Link<Node> link = node.interfaces.nodes;
!link.isEmpty();
link = link.tail) {
@@ -1037,11 +1044,15 @@ class ClassResolverVisitor extends CommonResolverVisitor<Type> {
if (name === null) {
unimplemented(node.typeName, "prefixes");
}
- Element element = context.lookup(name.source);
+ return visit(name);
+ }
+
+ Type visitIdentifier(Identifier node) {
+ Element element = context.lookup(node.source);
if (element === null) {
- error(node, MessageKind.CANNOT_RESOLVE_TYPE, [name]);
+ error(node, MessageKind.CANNOT_RESOLVE_TYPE, [node]);
} else if (element.kind !== ElementKind.CLASS) {
- error(node, MessageKind.NOT_A_TYPE, [name]);
+ error(node, MessageKind.NOT_A_TYPE, [node]);
} else {
compiler.resolver.toResolve.add(element);
// TODO(ngeoffray): Use type variables.
« no previous file with comments | « dart/frog/leg/elements/elements.dart ('k') | dart/frog/leg/scanner/class_element_parser.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698