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

Side by Side Diff: dart/frog/leg/scanner/class_element_parser.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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « dart/frog/leg/resolver.dart ('k') | dart/frog/leg/warnings.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 class ClassElementParser extends PartialParser { 5 class ClassElementParser extends PartialParser {
6 ClassElementParser(Listener listener) : super(listener); 6 ClassElementParser(Listener listener) : super(listener);
7 7
8 Token parseClassBody(Token token) => fullParseClassBody(token); 8 Token parseClassBody(Token token) => fullParseClassBody(token);
9 } 9 }
10 10
(...skipping 13 matching lines...) Expand all
24 MemberListener listener = new MemberListener(diagnosticListener, this); 24 MemberListener listener = new MemberListener(diagnosticListener, this);
25 Parser parser = new ClassElementParser(listener); 25 Parser parser = new ClassElementParser(listener);
26 Token token = parser.parseTopLevelDeclaration(beginToken); 26 Token token = parser.parseTopLevelDeclaration(beginToken);
27 assert(token === endToken.next); 27 assert(token === endToken.next);
28 cachedNode = listener.popNode(); 28 cachedNode = listener.popNode();
29 assert(listener.nodes.isEmpty()); 29 assert(listener.nodes.isEmpty());
30 return cachedNode; 30 return cachedNode;
31 } 31 }
32 32
33 Token position() => beginToken; 33 Token position() => beginToken;
34
35 bool isInterface() => beginToken.stringValue === "interface";
34 } 36 }
35 37
36 class MemberListener extends NodeListener { 38 class MemberListener extends NodeListener {
37 final ClassElement enclosingElement; 39 final ClassElement enclosingElement;
38 40
39 MemberListener(DiagnosticListener listener, 41 MemberListener(DiagnosticListener listener,
40 [Element this.enclosingElement = null]) 42 [Element this.enclosingElement = null])
41 : super(listener); 43 : super(listener);
42 44
43 bool isConstructorName(Node nameNode) { 45 bool isConstructorName(Node nameNode) {
44 if (enclosingElement === null || 46 if (enclosingElement === null ||
45 enclosingElement.kind != ElementKind.CLASS) { 47 enclosingElement.kind != ElementKind.CLASS) {
46 return false; 48 return false;
47 } 49 }
48 SourceString name; 50 SourceString name;
49 if (nameNode.asIdentifier() !== null) { 51 if (nameNode.asIdentifier() !== null) {
50 name = nameNode.asIdentifier().source; 52 name = nameNode.asIdentifier().source;
51 } else { 53 } else {
52 Send send = nameNode.asSend(); 54 Send send = nameNode.asSend();
53 name = send.receiver.asIdentifier().source; 55 name = send.receiver.asIdentifier().source;
54 } 56 }
55 return enclosingElement.name == name; 57 return enclosingElement.name == name;
56 } 58 }
57 59
60 SourceString getMethodNameHack(Node methodName) {
61 Send send = methodName.asSend();
62 if (send === null) return methodName.asIdentifier().source;
63 Identifier receiver = send.receiver.asIdentifier();
64 Identifier selector = send.selector.asIdentifier();
65 if (selector.asOperator() !== null) {
66 return Elements.constructOperatorName(receiver.source, selector.source);
67 } else {
68 return Elements.constructConstructorName(receiver.source,
69 selector.source);
70 }
71 }
72
58 void endMethod(Token getOrSet, Token beginToken, Token endToken) { 73 void endMethod(Token getOrSet, Token beginToken, Token endToken) {
59 super.endMethod(getOrSet, beginToken, endToken); 74 super.endMethod(getOrSet, beginToken, endToken);
60 FunctionExpression method = popNode(); 75 FunctionExpression method = popNode();
61 pushNode(null); 76 pushNode(null);
62 bool isConstructor = isConstructorName(method.name); 77 bool isConstructor = isConstructorName(method.name);
63 SourceString name; 78 SourceString name = getMethodNameHack(method.name);
64 Node methodName = method.name;
65 if (methodName.asSend() !== null) {
66 Send send = methodName.asSend();
67 Identifier receiver = send.receiver.asIdentifier();
68 Identifier selector = send.selector.asIdentifier();
69 if (selector.asOperator() !== null) {
70 name = Elements.constructOperatorName(
71 receiver.source, selector.source);
72 } else {
73 name = Elements.constructConstructorName(
74 receiver.source, selector.source);
75 }
76 } else {
77 name = methodName.asIdentifier().source;
78 }
79 ElementKind kind = ElementKind.FUNCTION; 79 ElementKind kind = ElementKind.FUNCTION;
80 if (isConstructor) { 80 if (isConstructor) {
81 if (getOrSet !== null) { 81 if (getOrSet !== null) {
82 recoverableError('illegal modifier', token: getOrSet); 82 recoverableError('illegal modifier', token: getOrSet);
83 } 83 }
84 kind = ElementKind.GENERATIVE_CONSTRUCTOR; 84 kind = ElementKind.GENERATIVE_CONSTRUCTOR;
85 } else if (getOrSet !== null) { 85 } else if (getOrSet !== null) {
86 kind = (getOrSet.stringValue === 'get') 86 kind = (getOrSet.stringValue === 'get')
87 ? ElementKind.GETTER : ElementKind.SETTER; 87 ? ElementKind.GETTER : ElementKind.SETTER;
88 } 88 }
89 Element memberElement = 89 Element memberElement =
90 new PartialFunctionElement(name, beginToken, getOrSet, endToken, 90 new PartialFunctionElement(name, beginToken, getOrSet, endToken,
91 kind, method.modifiers, enclosingElement); 91 kind, method.modifiers, enclosingElement);
92 enclosingElement.addMember(memberElement, listener); 92 enclosingElement.addMember(memberElement, listener);
93 } 93 }
94 94
95 void endFactoryMethod(Token factoryKeyword, Token periodBeforeName, 95 void endFactoryMethod(Token factoryKeyword, Token periodBeforeName,
96 Token endToken) { 96 Token endToken) {
97 super.endFactoryMethod(factoryKeyword, periodBeforeName, endToken); 97 super.endFactoryMethod(factoryKeyword, periodBeforeName, endToken);
98 FunctionExpression method = popNode(); 98 FunctionExpression method = popNode();
99 pushNode(null); 99 pushNode(null);
100 // TODO(ahe): Named constructors. 100 SourceString name = getMethodNameHack(method.name);
101 if (method.name.asIdentifier() == null) {
102 listener.cancel('Qualified factory names not implemented', node: method);
103 }
104 Identifier name = method.name;
105 ElementKind kind = ElementKind.FUNCTION; 101 ElementKind kind = ElementKind.FUNCTION;
106 Element memberElement = 102 Element memberElement =
107 new PartialFunctionElement(name.source, factoryKeyword, null, endToken, 103 new PartialFunctionElement(name, factoryKeyword, null, endToken,
108 kind, method.modifiers, enclosingElement); 104 kind, method.modifiers, enclosingElement);
109 enclosingElement.addMember(memberElement, listener); 105 enclosingElement.addMember(memberElement, listener);
110 } 106 }
111 107
112 void endFields(int count, Token beginToken, Token endToken) { 108 void endFields(int count, Token beginToken, Token endToken) {
113 super.endFields(count, beginToken, endToken); 109 super.endFields(count, beginToken, endToken);
114 VariableDefinitions variableDefinitions = popNode(); 110 VariableDefinitions variableDefinitions = popNode();
115 Modifiers modifiers = variableDefinitions.modifiers; 111 Modifiers modifiers = variableDefinitions.modifiers;
116 pushNode(null); 112 pushNode(null);
117 void buildFieldElement(SourceString name, Element fields) { 113 void buildFieldElement(SourceString name, Element fields) {
118 Element element = new VariableElement( 114 Element element = new VariableElement(
119 name, fields, ElementKind.FIELD, enclosingElement); 115 name, fields, ElementKind.FIELD, enclosingElement);
120 enclosingElement.addMember(element, listener); 116 enclosingElement.addMember(element, listener);
121 } 117 }
122 buildFieldElements(modifiers, variableDefinitions.definitions, 118 buildFieldElements(modifiers, variableDefinitions.definitions,
123 enclosingElement, 119 enclosingElement,
124 buildFieldElement, beginToken, endToken); 120 buildFieldElement, beginToken, endToken);
125 } 121 }
126 122
127 void endInitializer(Token assignmentOperator) { 123 void endInitializer(Token assignmentOperator) {
128 pushNode(null); // Super expects an expression, but 124 pushNode(null); // Super expects an expression, but
129 // ClassElementParser just skips expressions. 125 // ClassElementParser just skips expressions.
130 super.endInitializer(assignmentOperator); 126 super.endInitializer(assignmentOperator);
131 } 127 }
132 128
133 void endInitializers(int count, Token beginToken, Token endToken) { 129 void endInitializers(int count, Token beginToken, Token endToken) {
134 pushNode(null); 130 pushNode(null);
135 } 131 }
136 } 132 }
OLDNEW
« no previous file with comments | « dart/frog/leg/resolver.dart ('k') | dart/frog/leg/warnings.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698