[cfe] Don't crash on constructors in extensions

Change-Id: I11cdb9699101f384c2734c3551b4eefdfda6eccb
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118980
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Jens Johansen <jensj@google.com>
This commit is contained in:
Johnni Winther 2019-09-26 12:32:25 +00:00 committed by commit-bot@chromium.org
parent 53564db036
commit 6ff8d2199d
6 changed files with 202 additions and 0 deletions

View file

@ -585,6 +585,28 @@ class DietListener extends StackListener {
}
}
@override
void endExtensionFactoryMethod(
Token beginToken, Token factoryKeyword, Token endToken) {
debugEvent("ExtensionFactoryMethod");
pop(); // bodyToken
pop(); // name
pop(); // metadata
checkEmpty(beginToken.charOffset);
// Skip the declaration. An error as already been produced by the parser.
}
@override
void endExtensionConstructor(Token getOrSet, Token beginToken,
Token beginParam, Token beginInitializers, Token endToken) {
debugEvent("ExtensionConstructor");
pop(); // bodyToken
pop(); // name
pop(); // metadata
checkEmpty(beginToken.charOffset);
// Skip the declaration. An error as already been produced by the parser.
}
@override
void endRedirectingFactoryBody(Token beginToken, Token endToken) {
debugEvent("RedirectingFactoryBody");

View file

@ -0,0 +1,16 @@
// Copyright (c) 2019, 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.
class Class {}
extension Extension on Class {
Extension() {}
Extension.named() {}
factory Extension.fact() => null;
factory Extension.redirect() = Extension;
method() {}
}
main() {}

View file

@ -0,0 +1,55 @@
library;
//
// Problems in library:
//
// pkg/front_end/testcases/extensions/extension_constructor.dart:8:3: Error: Extensions can't declare constructors.
// Try removing the constructor declaration.
// Extension() {}
// ^^^^^^^^^
//
// pkg/front_end/testcases/extensions/extension_constructor.dart:9:3: Error: Extensions can't declare constructors.
// Try removing the constructor declaration.
// Extension.named() {}
// ^^^^^^^^^
//
// pkg/front_end/testcases/extensions/extension_constructor.dart:10:3: Error: Extensions can't declare constructors.
// Try removing the constructor declaration.
// factory Extension.fact() => null;
// ^^^^^^^
//
// pkg/front_end/testcases/extensions/extension_constructor.dart:11:3: Error: Extensions can't declare constructors.
// Try removing the constructor declaration.
// factory Extension.redirect() = Extension;
// ^^^^^^^
//
// pkg/front_end/testcases/extensions/extension_constructor.dart:10:11: Error: 'Extension' isn't a type.
// factory Extension.fact() => null;
// ^^^^^^^^^
// pkg/front_end/testcases/extensions/extension_constructor.dart:7:11: Context: This isn't a type.
// extension Extension on Class {
// ^^^^^^^^^
//
// pkg/front_end/testcases/extensions/extension_constructor.dart:11:11: Error: 'Extension' isn't a type.
// factory Extension.redirect() = Extension;
// ^^^^^^^^^
// pkg/front_end/testcases/extensions/extension_constructor.dart:7:11: Context: This isn't a type.
// extension Extension on Class {
// ^^^^^^^^^
//
import self as self;
import "dart:core" as core;
class Class extends core::Object {
synthetic constructor •() → self::Class*
;
}
extension Extension on self::Class* {
method method = self::Extension|method;
tearoff method = self::Extension|get#method;
}
static method Extension|method(final self::Class* #this) → dynamic
;
static method Extension|get#method(final self::Class* #this) → () →* dynamic
return () → dynamic => self::Extension|method(#this);
static method main() → dynamic
;

View file

@ -0,0 +1,54 @@
library;
//
// Problems in library:
//
// pkg/front_end/testcases/extensions/extension_constructor.dart:8:3: Error: Extensions can't declare constructors.
// Try removing the constructor declaration.
// Extension() {}
// ^^^^^^^^^
//
// pkg/front_end/testcases/extensions/extension_constructor.dart:9:3: Error: Extensions can't declare constructors.
// Try removing the constructor declaration.
// Extension.named() {}
// ^^^^^^^^^
//
// pkg/front_end/testcases/extensions/extension_constructor.dart:10:3: Error: Extensions can't declare constructors.
// Try removing the constructor declaration.
// factory Extension.fact() => null;
// ^^^^^^^
//
// pkg/front_end/testcases/extensions/extension_constructor.dart:11:3: Error: Extensions can't declare constructors.
// Try removing the constructor declaration.
// factory Extension.redirect() = Extension;
// ^^^^^^^
//
// pkg/front_end/testcases/extensions/extension_constructor.dart:10:11: Error: 'Extension' isn't a type.
// factory Extension.fact() => null;
// ^^^^^^^^^
// pkg/front_end/testcases/extensions/extension_constructor.dart:7:11: Context: This isn't a type.
// extension Extension on Class {
// ^^^^^^^^^
//
// pkg/front_end/testcases/extensions/extension_constructor.dart:11:11: Error: 'Extension' isn't a type.
// factory Extension.redirect() = Extension;
// ^^^^^^^^^
// pkg/front_end/testcases/extensions/extension_constructor.dart:7:11: Context: This isn't a type.
// extension Extension on Class {
// ^^^^^^^^^
//
import self as self;
import "dart:core" as core;
class Class extends core::Object {
synthetic constructor •() → self::Class*
: super core::Object::•()
;
}
extension Extension on self::Class* {
method method = self::Extension|method;
tearoff method = self::Extension|get#method;
}
static method Extension|method(final self::Class* #this) → dynamic {}
static method Extension|get#method(final self::Class* #this) → () →* dynamic
return () → dynamic => self::Extension|method(#this);
static method main() → dynamic {}

View file

@ -0,0 +1,54 @@
library;
//
// Problems in library:
//
// pkg/front_end/testcases/extensions/extension_constructor.dart:8:3: Error: Extensions can't declare constructors.
// Try removing the constructor declaration.
// Extension() {}
// ^^^^^^^^^
//
// pkg/front_end/testcases/extensions/extension_constructor.dart:9:3: Error: Extensions can't declare constructors.
// Try removing the constructor declaration.
// Extension.named() {}
// ^^^^^^^^^
//
// pkg/front_end/testcases/extensions/extension_constructor.dart:10:3: Error: Extensions can't declare constructors.
// Try removing the constructor declaration.
// factory Extension.fact() => null;
// ^^^^^^^
//
// pkg/front_end/testcases/extensions/extension_constructor.dart:11:3: Error: Extensions can't declare constructors.
// Try removing the constructor declaration.
// factory Extension.redirect() = Extension;
// ^^^^^^^
//
// pkg/front_end/testcases/extensions/extension_constructor.dart:10:11: Error: 'Extension' isn't a type.
// factory Extension.fact() => null;
// ^^^^^^^^^
// pkg/front_end/testcases/extensions/extension_constructor.dart:7:11: Context: This isn't a type.
// extension Extension on Class {
// ^^^^^^^^^
//
// pkg/front_end/testcases/extensions/extension_constructor.dart:11:11: Error: 'Extension' isn't a type.
// factory Extension.redirect() = Extension;
// ^^^^^^^^^
// pkg/front_end/testcases/extensions/extension_constructor.dart:7:11: Context: This isn't a type.
// extension Extension on Class {
// ^^^^^^^^^
//
import self as self;
import "dart:core" as core;
class Class extends core::Object {
synthetic constructor •() → self::Class*
: super core::Object::•()
;
}
extension Extension on self::Class* {
method method = self::Extension|method;
tearoff method = self::Extension|get#method;
}
static method Extension|method(final self::Class* #this) → dynamic {}
static method Extension|get#method(final self::Class* #this) → () →* dynamic
return () → dynamic => self::Extension|method(#this);
static method main() → dynamic {}

View file

@ -23,6 +23,7 @@ extensions/explicit_generic_extension_access: TextSerializationFailure
extensions/explicit_invalid_access: TextSerializationFailure
extensions/explicit_this: TextSerializationFailure
extensions/extension_call: TextSerializationFailure
extensions/extension_constructor: TextSerializationFailure
extensions/extension_methods: TextSerializationFailure
extensions/extension_setter: TextSerializationFailure
extensions/extension_setter_error: TypeCheckError