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

Unified Diff: compiler/java/com/google/dart/compiler/resolver/Resolver.java

Issue 8948001: Updates dartc to recognize 'default' keyword on interface and updated factory method syntax (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Got rid of some problems. Created 9 years 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: compiler/java/com/google/dart/compiler/resolver/Resolver.java
diff --git a/compiler/java/com/google/dart/compiler/resolver/Resolver.java b/compiler/java/com/google/dart/compiler/resolver/Resolver.java
index 0e2c4e1fb36cff978140216b00aff76b6fe09985..2d8bd313567a2b49cf78b31bdd7e8dfbfaf3e6b0 100644
--- a/compiler/java/com/google/dart/compiler/resolver/Resolver.java
+++ b/compiler/java/com/google/dart/compiler/resolver/Resolver.java
@@ -60,11 +60,9 @@ import com.google.dart.compiler.ast.DartVariable;
import com.google.dart.compiler.ast.DartVariableStatement;
import com.google.dart.compiler.ast.DartWhileStatement;
import com.google.dart.compiler.ast.Modifiers;
-import com.google.dart.compiler.type.FunctionType;
import com.google.dart.compiler.type.InterfaceType;
import com.google.dart.compiler.type.InterfaceType.Member;
import com.google.dart.compiler.type.Type;
-import com.google.dart.compiler.type.TypeVariable;
import com.google.dart.compiler.util.StringUtils;
import java.util.ArrayList;
@@ -246,8 +244,34 @@ public class Resolver {
}
// Check that interface constructors have corresponding methods in default class.
- if (cls.getDefaultClass() != null) {
+
+
+ if (classElement.getDefaultClass() != null) {
+ ClassElement defaultClass = classElement.getDefaultClass().getElement();
+ if (defaultClass.isInterface()) {
+ onError(cls.getDefaultClass(), ResolverErrorCode.DEFAULT_MUST_SPECIFY_CLASS);
+ }
checkInteraceConstructors(classElement);
+
+ List<? extends Type> cParams = classElement.getTypeParameters();
+ List<? extends Type> dParams = defaultClass.getTypeParameters();
+ if (cParams.size() != dParams.size()) {
+ onError(cls.getDefaultClass(),
+ ResolverErrorCode.DEFAULT_CLASS_MUST_HAVE_SAME_TYPE_PARAMS);
+ }
+ Iterator<? extends Type> cIter = cParams.iterator();
+ Iterator<? extends Type> dIter = dParams.iterator();
+
+ while (cIter.hasNext() && dIter.hasNext()) {
+ Type classTypeVar = cIter.next();
+ Type defaultTypeVar = dIter.next();
+ String cName = classTypeVar.getElement().getName();
+ String dName = defaultTypeVar.getElement().getName();
+ if (!cName.equals(dName)) {
+ onError(cls.getDefaultClass(), ResolverErrorCode.TYPE_PARAMETER_DOES_NOT_MATCH,
+ cName, dName);
+ }
+ }
}
context = previousContext;
@@ -261,6 +285,7 @@ public class Resolver {
private void checkInteraceConstructors(ClassElement interfaceElement) {
String interfaceClassName = interfaceElement.getName();
String defaultClassName = interfaceElement.getDefaultClass().getElement().getName();
+
for (ConstructorElement interfaceConstructor : interfaceElement.getConstructors()) {
ConstructorElement defaultConstructor =
resolveInterfaceConstructorInDefaultClass(
@@ -276,7 +301,7 @@ public class Resolver {
if (numReqInterface != numReqDefault) {
onError(
interfaceConstructor.getNode(),
- ResolverErrorCode.FACTORY_CONSTRUCTOR_NUMBER_OF_REQUIRED_PARAMETERS,
+ ResolverErrorCode.DEFAULT_CONSTRUCTOR_NUMBER_OF_REQUIRED_PARAMETERS,
Elements.getRawMethodName(interfaceConstructor),
interfaceClassName,
numReqInterface,
@@ -292,7 +317,7 @@ public class Resolver {
if (!interfaceNames.equals(defaultNames)) {
onError(
interfaceConstructor.getNode(),
- ResolverErrorCode.FACTORY_CONSTRUCTOR_NAMED_PARAMETERS,
+ ResolverErrorCode.DEFAULT_CONSTRUCTOR_NAMED_PARAMETERS,
Elements.getRawMethodName(interfaceConstructor),
interfaceClassName,
interfaceNames,
@@ -359,11 +384,6 @@ public class Resolver {
DartFunction functionNode = node.getFunction();
List<DartParameter> parameters = functionNode.getParams();
- FunctionType type = (FunctionType) member.getType();
- for (TypeVariable typeVariable : type.getTypeVariables()) {
- context.declare(typeVariable.getElement());
- }
-
// First declare all normal parameters in the scope, putting them in the
// scope of the default expressions so we can report better errors.
for (DartParameter parameter : parameters) {
@@ -533,6 +553,7 @@ public class Resolver {
resolveType(
node.getTypeNode(),
inStaticContext(currentMethod),
+ inFactoryContext(currentMethod),
TypeErrorCode.NO_SUCH_TYPE);
for (DartVariable variable : node.getVariables()) {
Elements.setType(resolveVariable(variable, node.getModifiers()), type);
@@ -572,7 +593,7 @@ public class Resolver {
MethodElement previousFunction = innermostFunction;
innermostFunction = element;
DartFunction functionNode = x.getFunction();
- resolveFunction(functionNode, element, null);
+ resolveFunction(functionNode, element);
resolve(functionNode.getBody());
innermostFunction = previousFunction;
getContext().popScope();
@@ -819,7 +840,8 @@ public class Resolver {
@Override
public Element visitTypeNode(DartTypeNode x) {
- return resolveType(x, inStaticContext(currentMethod), ResolverErrorCode.NO_SUCH_TYPE).getElement();
+ return resolveType(x, inStaticContext(currentMethod), inFactoryContext(currentMethod),
+ ResolverErrorCode.NO_SUCH_TYPE).getElement();
}
@Override
@@ -992,10 +1014,11 @@ public class Resolver {
Element element = x.getConstructor().accept(getContext().new Selector() {
// Only 'new' expressions can have a type in a property access.
- @Override public Element visitTypeNode(DartTypeNode type) {
- return recordType(
- type,
- resolveType(type, inStaticContext(currentMethod), ResolverErrorCode.NO_SUCH_TYPE));
+ @Override
+ public Element visitTypeNode(DartTypeNode type) {
+ return recordType(type, resolveType(type, inStaticContext(currentMethod),
+ inFactoryContext(currentMethod),
+ ResolverErrorCode.NO_SUCH_TYPE));
}
@Override public Element visitPropertyAccess(DartPropertyAccess node) {
@@ -1117,7 +1140,7 @@ public class Resolver {
}
onError(
errorTargetNode,
- ResolverErrorCode.FACTORY_CONSTRUCTOR_UNRESOLVED,
+ ResolverErrorCode.DEFAULT_CONSTRUCTOR_UNRESOLVED,
expectedFactoryConstructorName,
defaultClassName);
return null;
@@ -1371,6 +1394,7 @@ public class Resolver {
node,
typeArgs,
inStaticContext(currentMethod),
+ inFactoryContext(currentMethod),
ResolverErrorCode.NO_SUCH_TYPE);
// instantiateParametersType() will complain for wrong number of parameters (!=2)
recordType(node, type);
@@ -1387,6 +1411,7 @@ public class Resolver {
node,
typeArgs,
inStaticContext(currentMethod),
+ inFactoryContext(currentMethod),
ResolverErrorCode.NO_SUCH_TYPE);
// instantiateParametersType() will complain for wrong number of parameters (!=1)
recordType(node, type);
@@ -1521,8 +1546,15 @@ public class Resolver {
}
private boolean inStaticContext(Element element) {
- return element == null || Elements.isTopLevel(element)
- || element.getModifiers().isStatic() || element.getModifiers().isFactory();
+ return element == null || Elements.isTopLevel(element)
+ || element.getModifiers().isStatic() || element.getModifiers().isFactory();
+ }
+
+ private boolean inFactoryContext(Element element) {
+ if (element != null) {
+ return element.getModifiers().isFactory();
+ }
+ return false;
}
@Override
@@ -1530,6 +1562,11 @@ public class Resolver {
return inStaticContext(currentMethod);
}
+ @Override
+ boolean isFactoryContext() {
+ return inFactoryContext(currentMethod);
+ }
+
boolean isStaticContextOrInitializer() {
return inStaticContext(currentMethod) || inInitializer;
}

Powered by Google App Engine
This is Rietveld 408576698