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

Unified Diff: frog/leg/universe.dart

Issue 9301038: Support named arguments for statically resolved calls. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: '' Created 8 years, 11 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 | « frog/leg/ssa/codegen.dart ('k') | frog/tests/leg_only/src/NamedParameterForStaticTest.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: frog/leg/universe.dart
===================================================================
--- frog/leg/universe.dart (revision 3723)
+++ frog/leg/universe.dart (working copy)
@@ -64,6 +64,8 @@
int hashCode() => argumentCount + 1000 * namedArguments.length;
List<SourceString> get namedArguments() => const <SourceString>[];
+ int get namedArgumentCount() => 0;
+ int get positionalArgumentCount() => argumentCount;
static final Selector GETTER = const Selector(SelectorKind.GETTER, 0);
static final Selector SETTER = const Selector(SelectorKind.SETTER, 1);
@@ -81,22 +83,36 @@
bool applies(Compiler compiler, FunctionElement element) {
FunctionParameters parameters = element.computeParameters(compiler);
- int parameterCount = parameters.parameterCount;
- if (argumentCount > parameterCount) return false;
+ if (argumentCount > parameters.parameterCount) return false;
+ int requiredParameterCount = parameters.requiredParameterCount;
+ int optionalParameterCount = parameters.optionalParameterCount;
bool hasOptionalParameters = !parameters.optionalParameters.isEmpty();
if (namedArguments.isEmpty()) {
if (!hasOptionalParameters) {
- return parameterCount == argumentCount;
+ return requiredParameterCount == argumentCount;
} else {
- int optionalParameterCount = parameters.optionalParameterCount;
- return argumentCount >= parameterCount &&
- argumentCount <= parameterCount + optionalParameterCount;
+ return argumentCount >= requiredParameterCount &&
+ argumentCount <= requiredParameterCount + optionalParameterCount;
}
} else {
if (!hasOptionalParameters) return false;
+ Link<Element> remainingNamedParameters = parameters.optionalParameters;
+ for (int i = requiredParameterCount; i < positionalArgumentCount; i++) {
+ remainingNamedParameters = remainingNamedParameters.tail;
+ }
+ Set<SourceString> nameSet = new Set<SourceString>();
+ for (;
+ !remainingNamedParameters.isEmpty();
+ remainingNamedParameters = remainingNamedParameters.tail) {
+ nameSet.add(remainingNamedParameters.head.name);
+ }
+
for (SourceString name in namedArguments) {
- compiler.cancel('unimplemented named constructors');
+ if (!nameSet.contains(name)) {
+ return false;
+ }
+ nameSet.remove(name);
}
return true;
}
@@ -120,6 +136,8 @@
class Invocation extends Selector {
final List<SourceString> namedArguments;
+ int get namedArgumentCount() => namedArguments.length;
+ int get positionalArgumentCount() => argumentCount - namedArgumentCount;
const Invocation(
int argumentCount,
« no previous file with comments | « frog/leg/ssa/codegen.dart ('k') | frog/tests/leg_only/src/NamedParameterForStaticTest.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698