| // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| // Test that deprecated language features are diagnosed correctly. |
| |
| import "package:expect/expect.dart"; |
| import 'dart:async'; |
| import 'dart:uri'; |
| |
| import '../../../sdk/lib/_internal/compiler/compiler.dart'; |
| import '../../utils/dummy_compiler_test.dart' as dummy; |
| |
| main() { |
| StringBuffer messages = new StringBuffer(); |
| void handler(Uri uri, int begin, int end, String message, Diagnostic kind) { |
| if (kind == Diagnostic.VERBOSE_INFO) return; |
| if (identical(kind.name, 'source map')) return; |
| if (uri == null) { |
| messages.write('$kind: $message\n'); |
| } else { |
| Expect.equals('main:${uri.path}', '$uri'); |
| String source = TEST_SOURCE[uri.path]; |
| Expect.isNotNull(source); |
| messages.write('$begin<${source.substring(begin, end)}>:${uri.path}:' |
| '$kind: $message\n'); |
| } |
| } |
| |
| Future<String> provider(Uri uri) { |
| if (uri.scheme != "main") return dummy.provider(uri); |
| String source = TEST_SOURCE[uri.path]; |
| Expect.isNotNull(source); |
| return (new Completer<String>()..complete(source)).future; |
| } |
| |
| String code = deprecatedFutureValue( |
| compile(new Uri.fromComponents(scheme: 'main'), |
| new Uri.fromComponents(scheme: 'lib', path: '/'), |
| new Uri.fromComponents(scheme: 'package', path: '/'), |
| provider, handler)); |
| if (code == null) { |
| throw 'Compilation failed: ${messages}'; |
| } |
| Expect.stringEquals( |
| // This string is comprised of lines of the following format: |
| // |
| // offset<source>:path:kind: message |
| // |
| // "offset" is the character offset from the beginning of TEST_SOURCE. |
| // "source" is the substring of TEST_SOURCE that the compiler is |
| // indicating as erroneous. |
| // "path" is the URI path. |
| // "kind" is the result of calling toString on a [Diagnostic] object. |
| // "message" is the expected message as a [String]. This is a |
| // short-term solution and should eventually changed to include |
| // a symbolic reference to a MessageKind. |
| "0<#library('test');>::${deprecatedMessage('# tags')}\n" |
| "38<interface>::${deprecatedMessage('interface declarations')}\n" |
| "19<part 'part.dart';>::${deprecatedMessage('missing part-of tag')}\n" |
| "0<>:/part.dart:info: Note: This file has no part-of tag, but it is being" |
| " used as a part.\n" |
| "163<Fisk>::${deprecatedMessage('interface factories')}\n" |
| |
| // TODO(ahe): Should be <Fisk.hest>. |
| "183<Fisk>::${deprecatedMessage('interface factories')}\n" |
| |
| // TODO(ahe): Should be <bar>. |
| "109<Foo>::${deprecatedMessage('conflicting constructor')}\n" |
| |
| "129<bar>::info: This member conflicts with a constructor.\n" |
| "205<()>::${deprecatedMessage('getter parameters')}\n", |
| messages.toString()); |
| } |
| |
| deprecatedMessage(feature) { |
| return |
| "warning: Warning: deprecated language feature, $feature" |
| ", will be removed in a future Dart milestone."; |
| } |
| |
| const Map<String, String> TEST_SOURCE = |
| const <String, String>{ '': """ |
| #library('test'); |
| |
| part 'part.dart'; |
| |
| interface Fisk default Foo { |
| Fisk(); |
| Fisk.hest(); |
| } |
| |
| class Foo { |
| Foo.bar(); |
| static bar() => new Foo.bar(); |
| factory Fisk() {} |
| factory Fisk.hest() {} |
| get x() => null; |
| } |
| |
| main() { |
| var a = Foo.bar(); |
| var b = new Foo.bar(); |
| new Fisk(); |
| new Fisk.hest(); |
| } |
| """, |
| // TODO(ahe): Why isn't this 'part.dart'? Why the leading slash? |
| '/part.dart': '', |
| }; |