mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 02:27:39 +00:00
[cfe] Handle annotations on extension members
Closes #38439 Change-Id: I3c995ba5ca3058530318b14e46d275ce6ccc8778 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118381 Reviewed-by: Jens Johansen <jensj@google.com>
This commit is contained in:
parent
bf76e4b49c
commit
b7ad248209
|
@ -93,4 +93,17 @@ abstract class ExtensionBuilder extends DeclarationBuilder {
|
|||
|
||||
@override
|
||||
String get debugName => "ExtensionBuilder";
|
||||
|
||||
void buildOutlineExpressions(LibraryBuilder library) {
|
||||
void build(String ignore, Builder declaration) {
|
||||
MemberBuilder member = declaration;
|
||||
member.buildOutlineExpressions(library);
|
||||
}
|
||||
|
||||
// TODO(johnniwinther): Handle annotations on the extension declaration.
|
||||
//MetadataBuilder.buildAnnotations(
|
||||
// isPatch ? origin.extension : extension,
|
||||
// metadata, library, this, null);
|
||||
scope.forEach(build);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,6 +37,8 @@ import '../../base/instrumentation.dart' show Instrumentation;
|
|||
|
||||
import '../blacklisted_classes.dart' show blacklistedCoreClasses;
|
||||
|
||||
import '../builder/extension_builder.dart';
|
||||
|
||||
import '../export.dart' show Export;
|
||||
|
||||
import '../import.dart' show Import;
|
||||
|
@ -968,6 +970,8 @@ class SourceLoader extends Loader {
|
|||
Builder declaration = iterator.current;
|
||||
if (declaration is ClassBuilder) {
|
||||
declaration.buildOutlineExpressions(library);
|
||||
} else if (declaration is ExtensionBuilder) {
|
||||
declaration.buildOutlineExpressions(library);
|
||||
} else if (declaration is MemberBuilder) {
|
||||
declaration.buildOutlineExpressions(library);
|
||||
}
|
||||
|
|
24
pkg/front_end/testcases/extensions/annotations.dart
Normal file
24
pkg/front_end/testcases/extensions/annotations.dart
Normal file
|
@ -0,0 +1,24 @@
|
|||
// 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 {
|
||||
@pragma('dart2js:noInline')
|
||||
instanceMethod() {}
|
||||
|
||||
@pragma('dart2js:noInline')
|
||||
static staticMethod() {}
|
||||
}
|
||||
|
||||
extension Extension on Class {
|
||||
@pragma('dart2js:noInline')
|
||||
extensionInstanceMethod() {}
|
||||
|
||||
@pragma('dart2js:noInline')
|
||||
static extensionStaticMethod() {}
|
||||
}
|
||||
|
||||
@pragma('dart2js:noInline')
|
||||
topLevelMethod() {}
|
||||
|
||||
main() {}
|
|
@ -0,0 +1,32 @@
|
|||
library;
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
class Class extends core::Object {
|
||||
synthetic constructor •() → self::Class*
|
||||
;
|
||||
@core::pragma::_("dart2js:noInline")
|
||||
method instanceMethod() → dynamic
|
||||
;
|
||||
@core::pragma::_("dart2js:noInline")
|
||||
static method staticMethod() → dynamic
|
||||
;
|
||||
}
|
||||
extension Extension on self::Class* {
|
||||
method extensionInstanceMethod = self::Extension|extensionInstanceMethod;
|
||||
tearoff extensionInstanceMethod = self::Extension|get#extensionInstanceMethod;
|
||||
static method extensionStaticMethod = self::Extension|extensionStaticMethod;
|
||||
}
|
||||
@core::pragma::_("dart2js:noInline")
|
||||
static method Extension|extensionInstanceMethod(final self::Class* #this) → dynamic
|
||||
;
|
||||
static method Extension|get#extensionInstanceMethod(final self::Class* #this) → () →* dynamic
|
||||
return () → dynamic => self::Extension|extensionInstanceMethod(#this);
|
||||
@core::pragma::_("dart2js:noInline")
|
||||
static method Extension|extensionStaticMethod() → dynamic
|
||||
;
|
||||
@core::pragma::_("dart2js:noInline")
|
||||
static method topLevelMethod() → dynamic
|
||||
;
|
||||
static method main() → dynamic
|
||||
;
|
|
@ -0,0 +1,33 @@
|
|||
library;
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
class Class extends core::Object {
|
||||
synthetic constructor •() → self::Class*
|
||||
: super core::Object::•()
|
||||
;
|
||||
@#C3
|
||||
method instanceMethod() → dynamic {}
|
||||
@#C3
|
||||
static method staticMethod() → dynamic {}
|
||||
}
|
||||
extension Extension on self::Class* {
|
||||
method extensionInstanceMethod = self::Extension|extensionInstanceMethod;
|
||||
tearoff extensionInstanceMethod = self::Extension|get#extensionInstanceMethod;
|
||||
static method extensionStaticMethod = self::Extension|extensionStaticMethod;
|
||||
}
|
||||
@#C3
|
||||
static method Extension|extensionInstanceMethod(final self::Class* #this) → dynamic {}
|
||||
static method Extension|get#extensionInstanceMethod(final self::Class* #this) → () →* dynamic
|
||||
return () → dynamic => self::Extension|extensionInstanceMethod(#this);
|
||||
@#C3
|
||||
static method Extension|extensionStaticMethod() → dynamic {}
|
||||
@#C3
|
||||
static method topLevelMethod() → dynamic {}
|
||||
static method main() → dynamic {}
|
||||
|
||||
constants {
|
||||
#C1 = "dart2js:noInline"
|
||||
#C2 = null
|
||||
#C3 = core::pragma {name:#C1, options:#C2}
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
library;
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
class Class extends core::Object {
|
||||
synthetic constructor •() → self::Class*
|
||||
: super core::Object::•()
|
||||
;
|
||||
@#C3
|
||||
method instanceMethod() → dynamic {}
|
||||
@#C3
|
||||
static method staticMethod() → dynamic {}
|
||||
}
|
||||
extension Extension on self::Class* {
|
||||
method extensionInstanceMethod = self::Extension|extensionInstanceMethod;
|
||||
tearoff extensionInstanceMethod = self::Extension|get#extensionInstanceMethod;
|
||||
static method extensionStaticMethod = self::Extension|extensionStaticMethod;
|
||||
}
|
||||
@#C3
|
||||
static method Extension|extensionInstanceMethod(final self::Class* #this) → dynamic {}
|
||||
static method Extension|get#extensionInstanceMethod(final self::Class* #this) → () →* dynamic
|
||||
return () → dynamic => self::Extension|extensionInstanceMethod(#this);
|
||||
@#C3
|
||||
static method Extension|extensionStaticMethod() → dynamic {}
|
||||
@#C3
|
||||
static method topLevelMethod() → dynamic {}
|
||||
static method main() → dynamic {}
|
||||
|
||||
constants {
|
||||
#C1 = "dart2js:noInline"
|
||||
#C2 = null
|
||||
#C3 = core::pragma {name:#C1, options:#C2}
|
||||
}
|
|
@ -9,6 +9,7 @@
|
|||
all_variances: TextSerializationFailure
|
||||
expression/eval: TextSerializationFailure # Was: Pass
|
||||
expression/main: TextSerializationFailure # Was: Pass
|
||||
extensions/annotations: TextSerializationFailure
|
||||
extensions/compounds: TextSerializationFailure
|
||||
extensions/conflicts: TextSerializationFailure
|
||||
extensions/direct_instance_access: TextSerializationFailure
|
||||
|
|
Loading…
Reference in a new issue