From 7374ec71bd52a23a6dbe074f208c0a1a7a3bdd79 Mon Sep 17 00:00:00 2001 From: Florian Loitsch Date: Tue, 13 Dec 2016 14:04:06 +0100 Subject: [PATCH] Remove support for mixin typedefs in dart2js. Fixes #14410. BUG= http://dartbug.com/14410 R=johnniwinther@google.com, sigmund@google.com Review-Url: https://codereview.chromium.org/2567943003 . --- CHANGELOG.md | 5 +++ .../lib/src/diagnostics/messages.dart | 16 +------- .../lib/src/parser/element_listener.dart | 2 +- .../lib/src/parser/node_listener.dart | 2 +- pkg/compiler/lib/src/parser/parser.dart | 40 +++++-------------- .../lib/src/resolution/class_hierarchy.dart | 7 ---- tests/language/language_dart2js.status | 1 - 7 files changed, 17 insertions(+), 56 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index df7ef8a4f69..25948cc69f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,11 @@ pubspec can't be parsed will now be ignored by `pub get --offline` and deleted by `pub cache repair`. +* Dart2Js + + * Remove support for (long-time deprecated) mixin typedefs. + + ## 1.21.0 - 2016-12-07 ### Language diff --git a/pkg/compiler/lib/src/diagnostics/messages.dart b/pkg/compiler/lib/src/diagnostics/messages.dart index 4b6e33adca3..a9df3ee6562 100644 --- a/pkg/compiler/lib/src/diagnostics/messages.dart +++ b/pkg/compiler/lib/src/diagnostics/messages.dart @@ -162,7 +162,6 @@ enum MessageKind { DEFERRED_LIBRARY_WITHOUT_PREFIX, DEFERRED_OLD_SYNTAX, DEFERRED_TYPE_ANNOTATION, - DEPRECATED_TYPEDEF_MIXIN_SYNTAX, DIRECTLY_THROWING_NSM, DISALLOWED_LIBRARY_IMPORT, DUPLICATE_DEFINITION, @@ -1633,7 +1632,7 @@ class C extends Object with String {} main() => new C(); """, """ -typedef C = Object with String; +class C = Object with String; main() => new C(); """ @@ -2481,19 +2480,6 @@ main() => A.A = 1; "main() => +2; // No longer a valid way to write '2'" ]), - MessageKind.DEPRECATED_TYPEDEF_MIXIN_SYNTAX: const MessageTemplate( - MessageKind.DEPRECATED_TYPEDEF_MIXIN_SYNTAX, - "'typedef' not allowed here. ", - howToFix: "Try replacing 'typedef' with 'class'.", - examples: const [ - """ -class B { } -class M1 { } -typedef C = B with M1; // Need to replace 'typedef' with 'class'. -main() { new C(); } -""" - ]), - MessageKind.MIRRORS_EXPECTED_STRING: const MessageTemplate( MessageKind.MIRRORS_EXPECTED_STRING, "Can't use '#{name}' here because it's an instance of '#{type}' " diff --git a/pkg/compiler/lib/src/parser/element_listener.dart b/pkg/compiler/lib/src/parser/element_listener.dart index 75cd0e9bb0a..5c058ee7331 100644 --- a/pkg/compiler/lib/src/parser/element_listener.dart +++ b/pkg/compiler/lib/src/parser/element_listener.dart @@ -273,9 +273,9 @@ class ElementListener extends Listener { Token classKeyword, Token implementsKeyword, Token endToken) { NodeList interfaces = (implementsKeyword != null) ? popNode() : null; MixinApplication mixinApplication = popNode(); - Modifiers modifiers = popNode(); NodeList typeParameters = popNode(); Identifier name = popNode(); + Modifiers modifiers = popNode(); NamedMixinApplication namedMixinApplication = new NamedMixinApplication( name, typeParameters, diff --git a/pkg/compiler/lib/src/parser/node_listener.dart b/pkg/compiler/lib/src/parser/node_listener.dart index 26cbab3bc39..4dc325cef5b 100644 --- a/pkg/compiler/lib/src/parser/node_listener.dart +++ b/pkg/compiler/lib/src/parser/node_listener.dart @@ -128,9 +128,9 @@ class NodeListener extends ElementListener { Token classKeyword, Token implementsKeyword, Token endToken) { NodeList interfaces = (implementsKeyword != null) ? popNode() : null; Node mixinApplication = popNode(); - Modifiers modifiers = popNode(); NodeList typeParameters = popNode(); Identifier name = popNode(); + Modifiers modifiers = popNode(); pushNode(new NamedMixinApplication(name, typeParameters, modifiers, mixinApplication, interfaces, classKeyword, endToken)); } diff --git a/pkg/compiler/lib/src/parser/parser.dart b/pkg/compiler/lib/src/parser/parser.dart index 7ed43279cbd..988cbf32c63 100644 --- a/pkg/compiler/lib/src/parser/parser.dart +++ b/pkg/compiler/lib/src/parser/parser.dart @@ -362,30 +362,12 @@ class Parser { Token parseTypedef(Token token) { Token typedefKeyword = token; - if (optional('=', peekAfterType(token.next))) { - // TODO(aprelev@gmail.com): Remove deprecated 'typedef' mixin application, - // remove corresponding diagnostic from members.dart. - listener.beginNamedMixinApplication(token); - token = parseIdentifier(token.next); - token = parseTypeVariablesOpt(token); - token = expect('=', token); - token = parseModifiers(token); - token = parseMixinApplication(token); - Token implementsKeyword = null; - if (optional('implements', token)) { - implementsKeyword = token; - token = parseTypeList(token.next); - } - listener.endNamedMixinApplication( - typedefKeyword, implementsKeyword, token); - } else { - listener.beginFunctionTypeAlias(token); - token = parseReturnTypeOpt(token.next); - token = parseIdentifier(token); - token = parseTypeVariablesOpt(token); - token = parseFormalParameters(token); - listener.endFunctionTypeAlias(typedefKeyword, token); - } + listener.beginFunctionTypeAlias(token); + token = parseReturnTypeOpt(token.next); + token = parseIdentifier(token); + token = parseTypeVariablesOpt(token); + token = parseFormalParameters(token); + listener.endFunctionTypeAlias(typedefKeyword, token); return expect(';', token); } @@ -682,17 +664,10 @@ class Parser { var isMixinApplication = optional('=', peekAfterType(token.next)); if (isMixinApplication) { listener.beginNamedMixinApplication(begin); - token = parseIdentifier(token.next); - token = parseTypeVariablesOpt(token); - token = expect('=', token); } else { listener.beginClassDeclaration(begin); } - // TODO(aprelev@gmail.com): Once 'typedef' named mixin application is - // removed, move modifiers for named mixin application to the bottom of - // listener stack. This is so stacks for class declaration and named - // mixin application look similar. int modifierCount = 0; if (abstractKeyword != null) { parseModifier(abstractKeyword); @@ -701,6 +676,9 @@ class Parser { listener.handleModifiers(modifierCount); if (isMixinApplication) { + token = parseIdentifier(token.next); + token = parseTypeVariablesOpt(token); + token = expect('=', token); return parseNamedMixinApplication(token, classKeyword); } else { return parseClass(begin, classKeyword); diff --git a/pkg/compiler/lib/src/resolution/class_hierarchy.dart b/pkg/compiler/lib/src/resolution/class_hierarchy.dart index 551a47e7332..b9fae9797b3 100644 --- a/pkg/compiler/lib/src/resolution/class_hierarchy.dart +++ b/pkg/compiler/lib/src/resolution/class_hierarchy.dart @@ -276,13 +276,6 @@ class ClassResolverVisitor extends TypeDefinitionVisitor { element, 'cyclic resolution of class $element'); } - if (identical(node.classKeyword.stringValue, 'typedef')) { - // TODO(aprelev@gmail.com): Remove this deprecation diagnostic - // together with corresponding TODO in parser.dart. - reporter.reportWarningMessage( - node.classKeyword, MessageKind.DEPRECATED_TYPEDEF_MIXIN_SYNTAX); - } - element.computeType(resolution); scope = new TypeDeclarationScope(scope, element); resolveTypeVariableBounds(node.typeParameters); diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status index 30e33b68b48..0b2e449369e 100644 --- a/tests/language/language_dart2js.status +++ b/tests/language/language_dart2js.status @@ -24,7 +24,6 @@ mixin_supertype_subclass2_test: CompileTimeError # Issue 23773 mixin_supertype_subclass3_test: CompileTimeError # Issue 23773 mixin_supertype_subclass4_test: CompileTimeError # Issue 23773 mixin_of_mixin_test: CompileTimeError # Issue 23773 -mixin_illegal_syntax_test/00: MissingCompileTimeError # Issue 14410 # The following tests are supposed to fail. # In testing-mode, dart2js supports all dart:X libraries (because it