[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:
Johnni Winther 2019-09-24 07:55:45 +00:00
parent bf76e4b49c
commit b7ad248209
7 changed files with 140 additions and 0 deletions

View file

@ -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);
}
}

View file

@ -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);
}

View 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() {}

View file

@ -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
;

View file

@ -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}
}

View file

@ -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}
}

View file

@ -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