OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 library fasta.body_builder; | 5 library fasta.body_builder; |
6 | 6 |
7 import '../parser/parser.dart' show FormalParameterType, optional; | 7 import '../parser/parser.dart' show FormalParameterType, optional; |
8 | 8 |
9 import '../parser/error_kind.dart' show ErrorKind; | 9 import '../parser/error_kind.dart' show ErrorKind; |
10 | 10 |
(...skipping 1681 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1692 push(type); | 1692 push(type); |
1693 push(typeArguments ?? NullValue.TypeArguments); | 1693 push(typeArguments ?? NullValue.TypeArguments); |
1694 push(name); | 1694 push(name); |
1695 } | 1695 } |
1696 | 1696 |
1697 @override | 1697 @override |
1698 Expression buildStaticInvocation(Member target, Arguments arguments, | 1698 Expression buildStaticInvocation(Member target, Arguments arguments, |
1699 {bool isConst: false, int charOffset: -1}) { | 1699 {bool isConst: false, int charOffset: -1}) { |
1700 List<TypeParameter> typeParameters = target.function.typeParameters; | 1700 List<TypeParameter> typeParameters = target.function.typeParameters; |
1701 if (target is Constructor) { | 1701 if (target is Constructor) { |
| 1702 assert(!target.enclosingClass.isAbstract); |
1702 typeParameters = target.enclosingClass.typeParameters; | 1703 typeParameters = target.enclosingClass.typeParameters; |
1703 } | 1704 } |
1704 if (!checkArguments(target.function, arguments, typeParameters)) { | 1705 if (!checkArguments(target.function, arguments, typeParameters)) { |
1705 return throwNoSuchMethodError(target.name.name, arguments, charOffset); | 1706 return throwNoSuchMethodError(target.name.name, arguments, charOffset); |
1706 } | 1707 } |
1707 if (target is Constructor) { | 1708 if (target is Constructor) { |
1708 return new ConstructorInvocation(target, arguments) | 1709 return new ConstructorInvocation(target, arguments) |
1709 ..isConst = isConst | 1710 ..isConst = isConst |
1710 ..fileOffset = charOffset; | 1711 ..fileOffset = charOffset; |
1711 } else { | 1712 } else { |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1785 } | 1786 } |
1786 | 1787 |
1787 String errorName; | 1788 String errorName; |
1788 if (type is ClassBuilder) { | 1789 if (type is ClassBuilder) { |
1789 Builder b = type.findConstructorOrFactory(name); | 1790 Builder b = type.findConstructorOrFactory(name); |
1790 Member target; | 1791 Member target; |
1791 if (b == null) { | 1792 if (b == null) { |
1792 // Not found. Reported below. | 1793 // Not found. Reported below. |
1793 } else if (b.isConstructor) { | 1794 } else if (b.isConstructor) { |
1794 if (type.isAbstract) { | 1795 if (type.isAbstract) { |
1795 // TODO(ahe): Generate abstract instantiation error. | 1796 push(evaluateArgumentsBefore( |
| 1797 arguments, |
| 1798 buildAbstractClassInstantiationError( |
| 1799 type.name, nameToken.charOffset))); |
| 1800 return; |
1796 } else { | 1801 } else { |
1797 target = b.target; | 1802 target = b.target; |
1798 } | 1803 } |
1799 } else if (b.isFactory) { | 1804 } else if (b.isFactory) { |
1800 target = getRedirectionTarget(b.target); | 1805 target = getRedirectionTarget(b.target); |
1801 if (target == null) { | 1806 if (target == null) { |
1802 push(buildCompileTimeError( | 1807 push(buildCompileTimeError( |
1803 "Cyclic definition of factory '${name}'.", | 1808 "Cyclic definition of factory '${name}'.", |
1804 nameToken.charOffset)); | 1809 nameToken.charOffset)); |
1805 return; | 1810 return; |
(...skipping 556 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2362 } | 2367 } |
2363 return super.handleUnrecoverableError(token, kind, arguments); | 2368 return super.handleUnrecoverableError(token, kind, arguments); |
2364 } | 2369 } |
2365 | 2370 |
2366 @override | 2371 @override |
2367 Expression buildCompileTimeError(error, [int charOffset = -1]) { | 2372 Expression buildCompileTimeError(error, [int charOffset = -1]) { |
2368 addCompileTimeError(charOffset, error); | 2373 addCompileTimeError(charOffset, error); |
2369 String message = formatUnexpected(uri, charOffset, error); | 2374 String message = formatUnexpected(uri, charOffset, error); |
2370 Builder constructor = library.loader.getCompileTimeError(); | 2375 Builder constructor = library.loader.getCompileTimeError(); |
2371 return new Throw(buildStaticInvocation(constructor.target, | 2376 return new Throw(buildStaticInvocation(constructor.target, |
2372 new Arguments(<Expression>[new StringLiteral(message)]), | 2377 new Arguments(<Expression>[new StringLiteral(message)]))); |
2373 isConst: false)); // TODO(ahe): Make this const. | 2378 } |
| 2379 |
| 2380 Expression buildAbstractClassInstantiationError(String className, |
| 2381 [int charOffset = -1]) { |
| 2382 warning("The class '$className' is abstract and can't be instantiated.", |
| 2383 charOffset); |
| 2384 Builder constructor = library.loader.getAbstractClassInstantiationError(); |
| 2385 return new Throw(buildStaticInvocation(constructor.target, |
| 2386 new Arguments(<Expression>[new StringLiteral(className)]))); |
2374 } | 2387 } |
2375 | 2388 |
2376 Statement buildCompileTimeErrorStatement(error, [int charOffset = -1]) { | 2389 Statement buildCompileTimeErrorStatement(error, [int charOffset = -1]) { |
2377 return new ExpressionStatement(buildCompileTimeError(error, charOffset)); | 2390 return new ExpressionStatement(buildCompileTimeError(error, charOffset)); |
2378 } | 2391 } |
2379 | 2392 |
2380 @override | 2393 @override |
2381 Initializer buildCompileTimeErrorIntializer(error, [int charOffset = -1]) { | 2394 Initializer buildCompileTimeErrorIntializer(error, [int charOffset = -1]) { |
2382 return new LocalInitializer(new VariableDeclaration.forValue( | 2395 return new LocalInitializer(new VariableDeclaration.forValue( |
2383 buildCompileTimeError(error, charOffset))); | 2396 buildCompileTimeError(error, charOffset))); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2417 | 2430 |
2418 @override | 2431 @override |
2419 void warning(String message, [int charOffset = -1]) { | 2432 void warning(String message, [int charOffset = -1]) { |
2420 if (constantExpressionRequired) { | 2433 if (constantExpressionRequired) { |
2421 addCompileTimeError(charOffset, message); | 2434 addCompileTimeError(charOffset, message); |
2422 } else { | 2435 } else { |
2423 super.warning(message, charOffset); | 2436 super.warning(message, charOffset); |
2424 } | 2437 } |
2425 } | 2438 } |
2426 | 2439 |
| 2440 Expression evaluateArgumentsBefore( |
| 2441 Arguments arguments, Expression expression) { |
| 2442 if (arguments == null) return expression; |
| 2443 List<Expression> expressions = |
| 2444 new List<Expression>.from(arguments.positional); |
| 2445 for (NamedExpression named in arguments.named) { |
| 2446 expressions.add(named.value); |
| 2447 } |
| 2448 for (Expression argument in expressions.reversed) { |
| 2449 expression = new Let( |
| 2450 new VariableDeclaration.forValue(argument, isFinal: true), |
| 2451 expression); |
| 2452 } |
| 2453 return expression; |
| 2454 } |
| 2455 |
2427 @override | 2456 @override |
2428 void debugEvent(String name) { | 2457 void debugEvent(String name) { |
2429 // printEvent(name); | 2458 // printEvent(name); |
2430 } | 2459 } |
2431 } | 2460 } |
2432 | 2461 |
2433 // TODO(ahe): Shouldn't need to be an expression. | 2462 // TODO(ahe): Shouldn't need to be an expression. |
2434 class UnresolvedIdentifier extends InvalidExpression { | 2463 class UnresolvedIdentifier extends InvalidExpression { |
2435 final Name name; | 2464 final Name name; |
2436 | 2465 |
(...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2897 } else if (node is PrefixBuilder) { | 2926 } else if (node is PrefixBuilder) { |
2898 return node.name; | 2927 return node.name; |
2899 } else if (node is ThisAccessor) { | 2928 } else if (node is ThisAccessor) { |
2900 return node.isSuper ? "super" : "this"; | 2929 return node.isSuper ? "super" : "this"; |
2901 } else if (node is FastaAccessor) { | 2930 } else if (node is FastaAccessor) { |
2902 return node.plainNameForRead; | 2931 return node.plainNameForRead; |
2903 } else { | 2932 } else { |
2904 return internalError("Unhandled: ${node.runtimeType}"); | 2933 return internalError("Unhandled: ${node.runtimeType}"); |
2905 } | 2934 } |
2906 } | 2935 } |
OLD | NEW |