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

Unified Diff: frog/leg/scanner/class_element_parser.dart

Issue 9243011: Implement named constructors and resolving of redirecting constructors and super-initializers. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Address comments. 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
Index: frog/leg/scanner/class_element_parser.dart
diff --git a/frog/leg/scanner/class_element_parser.dart b/frog/leg/scanner/class_element_parser.dart
index 256a48e48f03b9d3acab05153177a4c701e6842c..ce300fa0de423d95712ee06f55f6aec93883d1b0 100644
--- a/frog/leg/scanner/class_element_parser.dart
+++ b/frog/leg/scanner/class_element_parser.dart
@@ -39,26 +39,41 @@ class MemberListener extends NodeListener {
[Element this.enclosingElement = null])
: super(canceler, logger);
- bool isConstructor(Identifier name) {
- return enclosingElement !== null &&
- enclosingElement.kind == ElementKind.CLASS &&
- enclosingElement.name == name.source;
+ bool isConstructorName(Node nameNode) {
ngeoffray 2012/01/19 08:56:12 Why renaming it to isConstructorName? isConstructo
karlklose 2012/01/19 13:51:24 Because it operates on a 'name'-node, not the cons
ngeoffray 2012/01/19 14:36:33 OK.
+ if (enclosingElement === null ||
+ enclosingElement.kind != ElementKind.CLASS) {
+ return false;
+ }
+ SourceString name;
+ if (nameNode.asIdentifier() != null) {
+ name = nameNode.asIdentifier().source;
+ } else {
+ Send send = nameNode.asSend();
+ name = send.receiver.asIdentifier().source;
+ }
+ return enclosingElement.name == name;
}
void endMethod(Token beginToken, Token endToken) {
super.endMethod(beginToken, endToken);
FunctionExpression method = popNode();
pushNode(null);
- Expression qualified = method.name;
- Identifier name = qualified.asIdentifier();
- if (name === null) {
- canceler.cancel('qualified names are not implemented', node: qualified);
+ bool isConstructor = isConstructorName(method.name);
+ SourceString name;
+ if (method.name.asSend() != null) {
+ Identifier receiver = method.name.asSend().receiver.asIdentifier();
+ Identifier selector = method.name.asSend().selector.asIdentifier();
+ SourceString className = receiver.source;
+ SourceString constructorName = selector.source;
+ name = new SourceString('$className.$constructorName');
ngeoffray 2012/01/19 08:56:12 Since you are putting constructors in a different
karlklose 2012/01/19 13:51:24 The map contains factories, too.
ngeoffray 2012/01/19 14:36:33 The 'constructor' map right? That's no problem, ge
+ } else {
+ name = method.name.asIdentifier().source;
}
- ElementKind kind = isConstructor(name) ?
+ ElementKind kind = isConstructor ?
ElementKind.GENERATIVE_CONSTRUCTOR :
ElementKind.FUNCTION;
Element memberElement =
- new PartialFunctionElement(name.source, beginToken, endToken,
+ new PartialFunctionElement(name, beginToken, endToken,
kind, method.modifiers, enclosingElement);
enclosingElement.addMember(memberElement);
}

Powered by Google App Engine
This is Rietveld 408576698