mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 16:13:19 +00:00
[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:
parent
53564db036
commit
6ff8d2199d
|
@ -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");
|
||||
|
|
|
@ -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() {}
|
|
@ -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
|
||||
;
|
|
@ -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 {}
|
|
@ -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 {}
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue