| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 part of resolution; | 5 part of resolution; |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * [SignatureResolver] resolves function signatures. | 8 * [SignatureResolver] resolves function signatures. |
| 9 */ | 9 */ |
| 10 class SignatureResolver extends MappingVisitor<ParameterElementX> { | 10 class SignatureResolver extends MappingVisitor<ParameterElementX> { |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 50 return null; | 50 return null; |
| 51 } | 51 } |
| 52 if (!definitions.tail.isEmpty) { | 52 if (!definitions.tail.isEmpty) { |
| 53 internalError(definitions.tail.head, 'extra definition'); | 53 internalError(definitions.tail.head, 'extra definition'); |
| 54 return null; | 54 return null; |
| 55 } | 55 } |
| 56 Node definition = definitions.head; | 56 Node definition = definitions.head; |
| 57 if (definition is NodeList) { | 57 if (definition is NodeList) { |
| 58 internalError(node, 'optional parameters are not implemented'); | 58 internalError(node, 'optional parameters are not implemented'); |
| 59 } | 59 } |
| 60 if (node.modifiers.isConst()) { | 60 if (node.modifiers.isConst) { |
| 61 compiler.reportError(node, MessageKind.FORMAL_DECLARED_CONST); | 61 compiler.reportError(node, MessageKind.FORMAL_DECLARED_CONST); |
| 62 } | 62 } |
| 63 if (node.modifiers.isStatic()) { | 63 if (node.modifiers.isStatic) { |
| 64 compiler.reportError(node, MessageKind.FORMAL_DECLARED_STATIC); | 64 compiler.reportError(node, MessageKind.FORMAL_DECLARED_STATIC); |
| 65 } | 65 } |
| 66 | 66 |
| 67 if (currentDefinitions != null) { | 67 if (currentDefinitions != null) { |
| 68 internalError(node, 'function type parameters not supported'); | 68 internalError(node, 'function type parameters not supported'); |
| 69 } | 69 } |
| 70 currentDefinitions = node; | 70 currentDefinitions = node; |
| 71 ParameterElementX element = definition.accept(this); | 71 ParameterElementX element = definition.accept(this); |
| 72 if (currentDefinitions.metadata != null) { | 72 if (currentDefinitions.metadata != null) { |
| 73 element.metadata = compiler.resolver.resolveMetadata(element, node); | 73 element.metadata = compiler.resolver.resolveMetadata(element, node); |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 if (node.receiver.asIdentifier() == null || | 168 if (node.receiver.asIdentifier() == null || |
| 169 !node.receiver.asIdentifier().isThis()) { | 169 !node.receiver.asIdentifier().isThis()) { |
| 170 error(node, MessageKind.INVALID_PARAMETER); | 170 error(node, MessageKind.INVALID_PARAMETER); |
| 171 } else if (!identical(enclosingElement.kind, | 171 } else if (!identical(enclosingElement.kind, |
| 172 ElementKind.GENERATIVE_CONSTRUCTOR)) { | 172 ElementKind.GENERATIVE_CONSTRUCTOR)) { |
| 173 error(node, MessageKind.INITIALIZING_FORMAL_NOT_ALLOWED); | 173 error(node, MessageKind.INITIALIZING_FORMAL_NOT_ALLOWED); |
| 174 } else { | 174 } else { |
| 175 Identifier name = getParameterName(node); | 175 Identifier name = getParameterName(node); |
| 176 validateName(name); | 176 validateName(name); |
| 177 Element fieldElement = | 177 Element fieldElement = |
| 178 enclosingElement.getEnclosingClass().lookupLocalMember(name.source); | 178 enclosingElement.enclosingClass.lookupLocalMember(name.source); |
| 179 if (fieldElement == null || | 179 if (fieldElement == null || |
| 180 !identical(fieldElement.kind, ElementKind.FIELD)) { | 180 !identical(fieldElement.kind, ElementKind.FIELD)) { |
| 181 error(node, MessageKind.NOT_A_FIELD, {'fieldName': name}); | 181 error(node, MessageKind.NOT_A_FIELD, {'fieldName': name}); |
| 182 } else if (!fieldElement.isInstanceMember()) { | 182 } else if (!fieldElement.isInstanceMember) { |
| 183 error(node, MessageKind.NOT_INSTANCE_FIELD, {'fieldName': name}); | 183 error(node, MessageKind.NOT_INSTANCE_FIELD, {'fieldName': name}); |
| 184 } | 184 } |
| 185 element = new FieldParameterElementX(enclosingElement, | 185 element = new FieldParameterElementX(enclosingElement, |
| 186 currentDefinitions, name, initializer, fieldElement); | 186 currentDefinitions, name, initializer, fieldElement); |
| 187 computeParameterType(element, fieldElement); | 187 computeParameterType(element, fieldElement); |
| 188 } | 188 } |
| 189 return element; | 189 return element; |
| 190 } | 190 } |
| 191 | 191 |
| 192 /// A [SendSet] node is an optional parameter with a default value. | 192 /// A [SendSet] node is an optional parameter with a default value. |
| 193 Element visitSendSet(SendSet node) { | 193 Element visitSendSet(SendSet node) { |
| 194 ParameterElementX element; | 194 ParameterElementX element; |
| 195 if (node.receiver != null) { | 195 if (node.receiver != null) { |
| 196 element = createFieldParameter(node, node.arguments.first); | 196 element = createFieldParameter(node, node.arguments.first); |
| 197 } else if (node.selector.asIdentifier() != null || | 197 } else if (node.selector.asIdentifier() != null || |
| 198 node.selector.asFunctionExpression() != null) { | 198 node.selector.asFunctionExpression() != null) { |
| 199 element = createParameter(getParameterName(node), node.arguments.first); | 199 element = createParameter(getParameterName(node), node.arguments.first); |
| 200 } | 200 } |
| 201 Node defaultValue = node.arguments.head; | 201 Node defaultValue = node.arguments.head; |
| 202 if (!defaultValuesAllowed) { | 202 if (!defaultValuesAllowed) { |
| 203 compiler.reportError(defaultValue, defaultValuesError); | 203 compiler.reportError(defaultValue, defaultValuesError); |
| 204 } | 204 } |
| 205 return element; | 205 return element; |
| 206 } | 206 } |
| 207 | 207 |
| 208 Element visitFunctionExpression(FunctionExpression node) { | 208 Element visitFunctionExpression(FunctionExpression node) { |
| 209 // This is a function typed parameter. | 209 // This is a function typed parameter. |
| 210 Modifiers modifiers = currentDefinitions.modifiers; | 210 Modifiers modifiers = currentDefinitions.modifiers; |
| 211 if (modifiers.isFinal()) { | 211 if (modifiers.isFinal) { |
| 212 compiler.reportError(modifiers, | 212 compiler.reportError(modifiers, |
| 213 MessageKind.FINAL_FUNCTION_TYPE_PARAMETER); | 213 MessageKind.FINAL_FUNCTION_TYPE_PARAMETER); |
| 214 } | 214 } |
| 215 if (modifiers.isVar()) { | 215 if (modifiers.isVar) { |
| 216 compiler.reportError(modifiers, MessageKind.VAR_FUNCTION_TYPE_PARAMETER); | 216 compiler.reportError(modifiers, MessageKind.VAR_FUNCTION_TYPE_PARAMETER); |
| 217 } | 217 } |
| 218 | 218 |
| 219 return createParameter(node.name, null); | 219 return createParameter(node.name, null); |
| 220 } | 220 } |
| 221 | 221 |
| 222 LinkBuilder<Element> analyzeNodes(Link<Node> link) { | 222 LinkBuilder<Element> analyzeNodes(Link<Node> link) { |
| 223 LinkBuilder<Element> elements = new LinkBuilder<Element>(); | 223 LinkBuilder<Element> elements = new LinkBuilder<Element>(); |
| 224 for (; !link.isEmpty; link = link.tail) { | 224 for (; !link.isEmpty; link = link.tail) { |
| 225 Element element = link.head.accept(this); | 225 Element element = link.head.accept(this); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 244 NodeList formalParameters, | 244 NodeList formalParameters, |
| 245 Node returnNode, | 245 Node returnNode, |
| 246 Element element, | 246 Element element, |
| 247 TreeElementMapping mapping, | 247 TreeElementMapping mapping, |
| 248 {MessageKind defaultValuesError}) { | 248 {MessageKind defaultValuesError}) { |
| 249 SignatureResolver visitor = new SignatureResolver(compiler, element, | 249 SignatureResolver visitor = new SignatureResolver(compiler, element, |
| 250 mapping, defaultValuesError: defaultValuesError); | 250 mapping, defaultValuesError: defaultValuesError); |
| 251 Link<Element> parameters = const Link<Element>(); | 251 Link<Element> parameters = const Link<Element>(); |
| 252 int requiredParameterCount = 0; | 252 int requiredParameterCount = 0; |
| 253 if (formalParameters == null) { | 253 if (formalParameters == null) { |
| 254 if (!element.isGetter()) { | 254 if (!element.isGetter) { |
| 255 compiler.reportError(element, MessageKind.MISSING_FORMALS); | 255 compiler.reportError(element, MessageKind.MISSING_FORMALS); |
| 256 } | 256 } |
| 257 } else { | 257 } else { |
| 258 if (element.isGetter()) { | 258 if (element.isGetter) { |
| 259 if (!identical(formalParameters.getEndToken().next.stringValue, | 259 if (!identical(formalParameters.endToken.next.stringValue, |
| 260 // TODO(ahe): Remove the check for native keyword. | 260 // TODO(ahe): Remove the check for native keyword. |
| 261 'native')) { | 261 'native')) { |
| 262 compiler.reportError(formalParameters, | 262 compiler.reportError(formalParameters, |
| 263 MessageKind.EXTRA_FORMALS); | 263 MessageKind.EXTRA_FORMALS); |
| 264 } | 264 } |
| 265 } | 265 } |
| 266 LinkBuilder<Element> parametersBuilder = | 266 LinkBuilder<Element> parametersBuilder = |
| 267 visitor.analyzeNodes(formalParameters.nodes); | 267 visitor.analyzeNodes(formalParameters.nodes); |
| 268 requiredParameterCount = parametersBuilder.length; | 268 requiredParameterCount = parametersBuilder.length; |
| 269 parameters = parametersBuilder.toLink(); | 269 parameters = parametersBuilder.toLink(); |
| 270 } | 270 } |
| 271 DartType returnType; | 271 DartType returnType; |
| 272 if (element.isFactoryConstructor()) { | 272 if (element.isFactoryConstructor) { |
| 273 returnType = element.getEnclosingClass().thisType; | 273 returnType = element.enclosingClass.thisType; |
| 274 // Because there is no type annotation for the return type of | 274 // Because there is no type annotation for the return type of |
| 275 // this element, we explicitly add one. | 275 // this element, we explicitly add one. |
| 276 if (compiler.enableTypeAssertions) { | 276 if (compiler.enableTypeAssertions) { |
| 277 compiler.enqueuer.resolution.registerIsCheck(returnType, mapping); | 277 compiler.enqueuer.resolution.registerIsCheck(returnType, mapping); |
| 278 } | 278 } |
| 279 } else { | 279 } else { |
| 280 returnType = visitor.resolveReturnType(returnNode); | 280 returnType = visitor.resolveReturnType(returnNode); |
| 281 } | 281 } |
| 282 | 282 |
| 283 if (element.isSetter() && (requiredParameterCount != 1 || | 283 if (element.isSetter && (requiredParameterCount != 1 || |
| 284 visitor.optionalParameterCount != 0)) { | 284 visitor.optionalParameterCount != 0)) { |
| 285 // If there are no formal parameters, we already reported an error above. | 285 // If there are no formal parameters, we already reported an error above. |
| 286 if (formalParameters != null) { | 286 if (formalParameters != null) { |
| 287 compiler.reportError(formalParameters, | 287 compiler.reportError(formalParameters, |
| 288 MessageKind.ILLEGAL_SETTER_FORMALS); | 288 MessageKind.ILLEGAL_SETTER_FORMALS); |
| 289 } | 289 } |
| 290 } | 290 } |
| 291 LinkBuilder<DartType> parameterTypes = new LinkBuilder<DartType>(); | 291 LinkBuilder<DartType> parameterTypes = new LinkBuilder<DartType>(); |
| 292 for (ParameterElement parameter in parameters) { | 292 for (ParameterElement parameter in parameters) { |
| 293 parameterTypes.addLast(parameter.type); | 293 parameterTypes.addLast(parameter.type); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 344 | 344 |
| 345 DartType resolveReturnType(TypeAnnotation annotation) { | 345 DartType resolveReturnType(TypeAnnotation annotation) { |
| 346 if (annotation == null) return compiler.types.dynamicType; | 346 if (annotation == null) return compiler.types.dynamicType; |
| 347 DartType result = resolver.resolveTypeAnnotation(annotation); | 347 DartType result = resolver.resolveTypeAnnotation(annotation); |
| 348 if (result == null) { | 348 if (result == null) { |
| 349 return compiler.types.dynamicType; | 349 return compiler.types.dynamicType; |
| 350 } | 350 } |
| 351 return result; | 351 return result; |
| 352 } | 352 } |
| 353 } | 353 } |
| OLD | NEW |