| OLD | NEW |
| 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 package com.google.dart.compiler.resolver; | 5 package com.google.dart.compiler.resolver; |
| 6 | 6 |
| 7 import com.google.common.annotations.VisibleForTesting; | 7 import com.google.common.annotations.VisibleForTesting; |
| 8 import com.google.dart.compiler.DartCompilerContext; | 8 import com.google.dart.compiler.DartCompilerContext; |
| 9 import com.google.dart.compiler.ErrorCode; | 9 import com.google.dart.compiler.ErrorCode; |
| 10 import com.google.dart.compiler.ast.ASTVisitor; | 10 import com.google.dart.compiler.ast.ASTVisitor; |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 parameters, returnType)); | 123 parameters, returnType)); |
| 124 currentHolder = libraryElement; | 124 currentHolder = libraryElement; |
| 125 context = topLevelContext; | 125 context = topLevelContext; |
| 126 return null; | 126 return null; |
| 127 } | 127 } |
| 128 | 128 |
| 129 @Override | 129 @Override |
| 130 public Element visitMethodDefinition(final DartMethodDefinition method) { | 130 public Element visitMethodDefinition(final DartMethodDefinition method) { |
| 131 isFactory = method.getModifiers().isFactory(); | 131 isFactory = method.getModifiers().isFactory(); |
| 132 isStatic = method.getModifiers().isStatic() || isFactory; | 132 isStatic = method.getModifiers().isStatic() || isFactory; |
| 133 MethodElement element = method.getElement(); | 133 MethodNodeElement element = method.getElement(); |
| 134 if (element == null) { | 134 if (element == null) { |
| 135 switch (getMethodKind(method)) { | 135 switch (getMethodKind(method)) { |
| 136 case NONE: | 136 case NONE: |
| 137 case CONSTRUCTOR: | 137 case CONSTRUCTOR: |
| 138 element = buildConstructor(method); | 138 element = buildConstructor(method); |
| 139 checkConstructor(element, method); | 139 checkConstructor(element, method); |
| 140 addConstructor((ClassElement) currentHolder, (ConstructorElement) el
ement); | 140 addConstructor((ClassElement) currentHolder, (ConstructorNodeElement
) element); |
| 141 break; | 141 break; |
| 142 | 142 |
| 143 case METHOD: | 143 case METHOD: |
| 144 element = Elements.methodFromMethodNode(method, currentHolder); | 144 element = Elements.methodFromMethodNode(method, currentHolder); |
| 145 addMethod(currentHolder, element); | 145 addMethod(currentHolder, element); |
| 146 break; | 146 break; |
| 147 } | 147 } |
| 148 } else { | 148 } else { |
| 149 // This is a top-level element, and an element was already created in | 149 // This is a top-level element, and an element was already created in |
| 150 // TopLevelElementBuilder. | 150 // TopLevelElementBuilder. |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 225 recordElement(node.getExpression(), element); | 225 recordElement(node.getExpression(), element); |
| 226 } | 226 } |
| 227 return element; | 227 return element; |
| 228 } | 228 } |
| 229 @Override public Element visitNode(DartNode node) { | 229 @Override public Element visitNode(DartNode node) { |
| 230 throw new RuntimeException("Unexpected node " + node); | 230 throw new RuntimeException("Unexpected node " + node); |
| 231 } | 231 } |
| 232 }); | 232 }); |
| 233 } | 233 } |
| 234 | 234 |
| 235 private MethodElement buildConstructor(final DartMethodDefinition method) { | 235 private MethodNodeElement buildConstructor(final DartMethodDefinition method
) { |
| 236 // Resolve the constructor's name and class name. | 236 // Resolve the constructor's name and class name. |
| 237 Element e = resolveConstructorName(method); | 237 Element e = resolveConstructorName(method); |
| 238 | 238 |
| 239 switch (ElementKind.of(e)) { | 239 switch (ElementKind.of(e)) { |
| 240 default: | 240 default: |
| 241 // Report an error and create a fake constructor element below. | 241 // Report an error and create a fake constructor element below. |
| 242 resolutionError(method.getName(), ResolverErrorCode.INVALID_TYPE_NAME_
IN_CONSTRUCTOR); | 242 resolutionError(method.getName(), ResolverErrorCode.INVALID_TYPE_NAME_
IN_CONSTRUCTOR); |
| 243 break; | 243 break; |
| 244 | 244 |
| 245 case DYNAMIC: | 245 case DYNAMIC: |
| 246 case CLASS: | 246 case CLASS: |
| 247 break; | 247 break; |
| 248 | 248 |
| 249 case CONSTRUCTOR: | 249 case CONSTRUCTOR: |
| 250 return (ConstructorElement) e; | 250 return (ConstructorNodeElement) e; |
| 251 } | 251 } |
| 252 // If the constructor name resolves to a class or there was an error, | 252 // If the constructor name resolves to a class or there was an error, |
| 253 // create the unnamed constructor. | 253 // create the unnamed constructor. |
| 254 return Elements.constructorFromMethodNode(method, "", (ClassElement) curre
ntHolder, | 254 return Elements.constructorFromMethodNode(method, "", (ClassElement) curre
ntHolder, |
| 255 (ClassElement) e); | 255 (ClassElement) e); |
| 256 } | 256 } |
| 257 | 257 |
| 258 private FieldElement buildField(DartField fieldNode, Type type) { | 258 private FieldElement buildField(DartField fieldNode, Type type) { |
| 259 assert !fieldNode.getModifiers().isAbstractField(); | 259 assert !fieldNode.getModifiers().isAbstractField(); |
| 260 Modifiers modifiers = fieldNode.getModifiers(); | 260 Modifiers modifiers = fieldNode.getModifiers(); |
| 261 if (modifiers.isFinal() && (modifiers.isStatic() || context == topLevelCon
text)) { | 261 if (modifiers.isFinal() && (modifiers.isStatic() || context == topLevelCon
text)) { |
| 262 // final toplevel fields are implicitly compile-time constants. | 262 // final toplevel fields are implicitly compile-time constants. |
| 263 modifiers = modifiers.makeStatic(); | 263 modifiers = modifiers.makeStatic(); |
| 264 // Set the "const" modifier so that it is easy to compare a constant fie
ld to other | 264 // Set the "const" modifier so that it is easy to compare a constant fie
ld to other |
| 265 // types of constant expressions. | 265 // types of constant expressions. |
| 266 modifiers = modifiers.makeConstant(); | 266 modifiers = modifiers.makeConstant(); |
| 267 } | 267 } |
| 268 FieldElement fieldElement = fieldNode.getElement(); | 268 FieldNodeElement fieldElement = fieldNode.getElement(); |
| 269 if (fieldElement == null) { | 269 if (fieldElement == null) { |
| 270 fieldElement = Elements.fieldFromNode(fieldNode, currentHolder, modifier
s); | 270 fieldElement = Elements.fieldFromNode(fieldNode, currentHolder, modifier
s); |
| 271 addField(currentHolder, fieldElement); | 271 addField(currentHolder, fieldElement); |
| 272 } else { | 272 } else { |
| 273 // This is a top-level element, and an element was already created in | 273 // This is a top-level element, and an element was already created in |
| 274 // TopLevelElementBuilder. | 274 // TopLevelElementBuilder. |
| 275 Elements.addField(currentHolder, fieldElement); | 275 Elements.addField(currentHolder, fieldElement); |
| 276 assertTopLevel(fieldNode); | 276 assertTopLevel(fieldNode); |
| 277 } | 277 } |
| 278 fieldElement.setType(type); | 278 fieldElement.setType(type); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 319 * + setter: | 319 * + setter: |
| 320 * MethodElement | 320 * MethodElement |
| 321 * + name: foo | 321 * + name: foo |
| 322 * + function: set foo(x) { ... } | 322 * + function: set foo(x) { ... } |
| 323 * | 323 * |
| 324 */ | 324 */ |
| 325 private FieldElement buildAbstractField(DartField fieldNode) { | 325 private FieldElement buildAbstractField(DartField fieldNode) { |
| 326 assert fieldNode.getModifiers().isAbstractField(); | 326 assert fieldNode.getModifiers().isAbstractField(); |
| 327 boolean topLevelDefinition = fieldNode.getParent().getParent() instanceof
DartUnit; | 327 boolean topLevelDefinition = fieldNode.getParent().getParent() instanceof
DartUnit; |
| 328 DartMethodDefinition accessorNode = fieldNode.getAccessor(); | 328 DartMethodDefinition accessorNode = fieldNode.getAccessor(); |
| 329 MethodElement accessorElement = Elements.methodFromMethodNode(accessorNode
, currentHolder); | 329 MethodNodeElement accessorElement = Elements.methodFromMethodNode(accessor
Node, currentHolder); |
| 330 EnclosingElement previousEnclosingElement = enclosingElement; | 330 EnclosingElement previousEnclosingElement = enclosingElement; |
| 331 enclosingElement = accessorElement; | 331 enclosingElement = accessorElement; |
| 332 recordElement(accessorNode, accessorElement); | 332 recordElement(accessorNode, accessorElement); |
| 333 resolveFunction(accessorNode.getFunction(), accessorElement); | 333 resolveFunction(accessorNode.getFunction(), accessorElement); |
| 334 enclosingElement = previousEnclosingElement; | 334 enclosingElement = previousEnclosingElement; |
| 335 | 335 |
| 336 String name = fieldNode.getName().getName(); | 336 String name = fieldNode.getName().getName(); |
| 337 Element element = null; | 337 Element element = null; |
| 338 if (currentHolder != null) { | 338 if (currentHolder != null) { |
| 339 element = currentHolder.lookupLocalElement(name); | 339 element = currentHolder.lookupLocalElement(name); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 378 type = getTypeProvider().getDynamicType(); | 378 type = getTypeProvider().getDynamicType(); |
| 379 } else { | 379 } else { |
| 380 type = parameters.get(0).getType(); | 380 type = parameters.get(0).getType(); |
| 381 } | 381 } |
| 382 fieldElement.setType(type); | 382 fieldElement.setType(type); |
| 383 } | 383 } |
| 384 } | 384 } |
| 385 return recordElement(fieldNode, fieldElement); | 385 return recordElement(fieldNode, fieldElement); |
| 386 } | 386 } |
| 387 | 387 |
| 388 private void addField(EnclosingElement holder, FieldElement element) { | 388 private void addField(EnclosingElement holder, FieldNodeElement element) { |
| 389 if (holder != null) { | 389 if (holder != null) { |
| 390 checkUniqueName(holder, element); | 390 checkUniqueName(holder, element); |
| 391 Elements.addField(holder, element); | 391 Elements.addField(holder, element); |
| 392 } | 392 } |
| 393 } | 393 } |
| 394 | 394 |
| 395 private void addMethod(EnclosingElement holder, MethodElement element) { | 395 private void addMethod(EnclosingElement holder, MethodNodeElement element) { |
| 396 checkUniqueName(holder, element); | 396 checkUniqueName(holder, element); |
| 397 Elements.addMethod(holder, element); | 397 Elements.addMethod(holder, element); |
| 398 } | 398 } |
| 399 | 399 |
| 400 private void addConstructor(ClassElement cls, MethodElement element) { | 400 private void addConstructor(ClassElement cls, ConstructorNodeElement element
) { |
| 401 checkUniqueName(cls, element); | 401 checkUniqueName(cls, element); |
| 402 Elements.addConstructor(cls, (ConstructorElement) element); | 402 Elements.addConstructor(cls, element); |
| 403 } | 403 } |
| 404 | 404 |
| 405 private ElementKind getMethodKind(DartMethodDefinition method) { | 405 private ElementKind getMethodKind(DartMethodDefinition method) { |
| 406 if (!ElementKind.of(currentHolder).equals(ElementKind.CLASS)) { | 406 if (!ElementKind.of(currentHolder).equals(ElementKind.CLASS)) { |
| 407 return ElementKind.METHOD; | 407 return ElementKind.METHOD; |
| 408 } | 408 } |
| 409 | 409 |
| 410 if (method.getModifiers().isFactory()) { | 410 if (method.getModifiers().isFactory()) { |
| 411 return ElementKind.CONSTRUCTOR; | 411 return ElementKind.CONSTRUCTOR; |
| 412 } | 412 } |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 560 */ | 560 */ |
| 561 private void reportDuplicateDeclaration(ErrorCode errorCode, Element element
) { | 561 private void reportDuplicateDeclaration(ErrorCode errorCode, Element element
) { |
| 562 String name = | 562 String name = |
| 563 element instanceof MethodElement | 563 element instanceof MethodElement |
| 564 ? Elements.getRawMethodName((MethodElement) element) | 564 ? Elements.getRawMethodName((MethodElement) element) |
| 565 : element.getName(); | 565 : element.getName(); |
| 566 resolutionError(element.getNameLocation(), errorCode, name); | 566 resolutionError(element.getNameLocation(), errorCode, name); |
| 567 } | 567 } |
| 568 } | 568 } |
| 569 } | 569 } |
| OLD | NEW |