Skip to content

Commit e4689c9

Browse files
johnniwinthercommit-bot@chromium.org
authored andcommitted
[dart2js] Use new pragma directive syntax.
+ add annotation test. Change-Id: Ic87e6b5f3f45a7e65de53fb6afacb04fd469e951 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/108726 Reviewed-by: Stephen Adams <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent 07a53a3 commit e4689c9

File tree

4 files changed

+227
-59
lines changed

4 files changed

+227
-59
lines changed

pkg/compiler/lib/src/js_backend/annotations.dart

Lines changed: 45 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -74,36 +74,34 @@ class PragmaAnnotation {
7474
6, 'assumeDynamic',
7575
forFunctionsOnly: true, internalOnly: true);
7676

77-
static const PragmaAnnotation omitAsCasts = const PragmaAnnotation(
78-
7, 'omitAsCasts',
77+
static const PragmaAnnotation asTrust = const PragmaAnnotation(7, 'as:trust',
7978
forFunctionsOnly: false, internalOnly: false);
8079

81-
static const PragmaAnnotation emitAsCasts = const PragmaAnnotation(
82-
8, 'emitAsCasts',
80+
static const PragmaAnnotation asCheck = const PragmaAnnotation(8, 'as:check',
8381
forFunctionsOnly: false, internalOnly: false);
8482

85-
static const PragmaAnnotation omitImplicitChecks = const PragmaAnnotation(
86-
9, 'omitImplicitChecks',
83+
static const PragmaAnnotation typesTrust = const PragmaAnnotation(
84+
9, 'types:trust',
8785
forFunctionsOnly: false, internalOnly: false);
8886

89-
static const PragmaAnnotation emitImplicitChecks = const PragmaAnnotation(
90-
10, 'emitImplicitChecks',
87+
static const PragmaAnnotation typesCheck = const PragmaAnnotation(
88+
10, 'types:check',
9189
forFunctionsOnly: false, internalOnly: false);
9290

93-
static const PragmaAnnotation omitParameterChecks = const PragmaAnnotation(
94-
11, 'omitParameterChecks',
91+
static const PragmaAnnotation parameterTrust = const PragmaAnnotation(
92+
11, 'parameter:trust',
9593
forFunctionsOnly: false, internalOnly: false);
9694

97-
static const PragmaAnnotation emitParameterChecks = const PragmaAnnotation(
98-
12, 'emitParameterChecks',
95+
static const PragmaAnnotation parameterCheck = const PragmaAnnotation(
96+
12, 'parameter:check',
9997
forFunctionsOnly: false, internalOnly: false);
10098

101-
static const PragmaAnnotation omitImplicitDowncasts = const PragmaAnnotation(
102-
13, 'omitImplicitDowncasts',
99+
static const PragmaAnnotation downcastTrust = const PragmaAnnotation(
100+
13, 'downcast:trust',
103101
forFunctionsOnly: false, internalOnly: false);
104102

105-
static const PragmaAnnotation emitImplicitDowncasts = const PragmaAnnotation(
106-
14, 'emitImplicitDowncasts',
103+
static const PragmaAnnotation downcastCheck = const PragmaAnnotation(
104+
14, 'downcast:check',
107105
forFunctionsOnly: false, internalOnly: false);
108106

109107
static const List<PragmaAnnotation> values = [
@@ -114,37 +112,29 @@ class PragmaAnnotation {
114112
noThrows,
115113
noSideEffects,
116114
assumeDynamic,
117-
omitAsCasts,
118-
emitAsCasts,
119-
omitImplicitChecks,
120-
emitImplicitChecks,
121-
omitParameterChecks,
122-
emitParameterChecks,
123-
omitImplicitDowncasts,
124-
emitImplicitDowncasts,
115+
asTrust,
116+
asCheck,
117+
typesTrust,
118+
typesCheck,
119+
parameterTrust,
120+
parameterCheck,
121+
downcastTrust,
122+
downcastCheck,
125123
];
126124

127125
static const Map<PragmaAnnotation, Set<PragmaAnnotation>> implies = {
128-
omitImplicitChecks: {omitParameterChecks, omitImplicitDowncasts},
129-
emitImplicitChecks: {emitParameterChecks, emitImplicitDowncasts},
126+
typesTrust: {parameterTrust, downcastTrust},
127+
typesCheck: {parameterCheck, downcastCheck},
130128
};
131129
static const Map<PragmaAnnotation, Set<PragmaAnnotation>> excludes = {
132130
noInline: {tryInline},
133131
tryInline: {noInline},
134-
omitImplicitChecks: {
135-
emitImplicitChecks,
136-
emitParameterChecks,
137-
emitImplicitDowncasts
138-
},
139-
emitImplicitChecks: {
140-
omitImplicitChecks,
141-
omitParameterChecks,
142-
omitImplicitDowncasts
143-
},
144-
omitParameterChecks: {emitParameterChecks},
145-
emitParameterChecks: {omitParameterChecks},
146-
omitImplicitDowncasts: {emitImplicitDowncasts},
147-
emitImplicitDowncasts: {omitImplicitDowncasts},
132+
typesTrust: {typesCheck, parameterCheck, downcastCheck},
133+
typesCheck: {typesTrust, parameterTrust, downcastTrust},
134+
parameterTrust: {parameterCheck},
135+
parameterCheck: {parameterTrust},
136+
downcastTrust: {downcastCheck},
137+
downcastCheck: {downcastTrust},
148138
};
149139
static const Map<PragmaAnnotation, Set<PragmaAnnotation>> requires = {
150140
noThrows: {noInline},
@@ -279,7 +269,7 @@ EnumSet<PragmaAnnotation> processMemberAnnotations(
279269
reporter.reportErrorMessage(
280270
computeSourceSpanFromTreeNode(member), MessageKind.GENERIC, {
281271
'text': "@pragma('dart2js:${annotation.name}') should always be "
282-
"combined with @pragma('dart2js:${annotation.name}')."
272+
"combined with @pragma('dart2js:${other.name}')."
283273
});
284274
}
285275
}
@@ -477,13 +467,13 @@ class AnnotationsDataImpl implements AnnotationsData {
477467
if (member != null) {
478468
EnumSet<PragmaAnnotation> annotations = pragmaAnnotations[member];
479469
if (annotations != null) {
480-
if (annotations.contains(PragmaAnnotation.omitImplicitChecks)) {
470+
if (annotations.contains(PragmaAnnotation.typesTrust)) {
481471
return CheckPolicy.trusted;
482-
} else if (annotations.contains(PragmaAnnotation.emitImplicitChecks)) {
472+
} else if (annotations.contains(PragmaAnnotation.typesCheck)) {
483473
return CheckPolicy.checked;
484-
} else if (annotations.contains(PragmaAnnotation.omitParameterChecks)) {
474+
} else if (annotations.contains(PragmaAnnotation.parameterTrust)) {
485475
return CheckPolicy.trusted;
486-
} else if (annotations.contains(PragmaAnnotation.emitParameterChecks)) {
476+
} else if (annotations.contains(PragmaAnnotation.parameterCheck)) {
487477
return CheckPolicy.checked;
488478
}
489479
}
@@ -496,15 +486,13 @@ class AnnotationsDataImpl implements AnnotationsData {
496486
if (member != null) {
497487
EnumSet<PragmaAnnotation> annotations = pragmaAnnotations[member];
498488
if (annotations != null) {
499-
if (annotations.contains(PragmaAnnotation.omitImplicitChecks)) {
489+
if (annotations.contains(PragmaAnnotation.typesTrust)) {
500490
return CheckPolicy.trusted;
501-
} else if (annotations.contains(PragmaAnnotation.emitImplicitChecks)) {
491+
} else if (annotations.contains(PragmaAnnotation.typesCheck)) {
502492
return CheckPolicy.checked;
503-
} else if (annotations
504-
.contains(PragmaAnnotation.omitImplicitDowncasts)) {
493+
} else if (annotations.contains(PragmaAnnotation.downcastTrust)) {
505494
return CheckPolicy.trusted;
506-
} else if (annotations
507-
.contains(PragmaAnnotation.emitImplicitDowncasts)) {
495+
} else if (annotations.contains(PragmaAnnotation.downcastCheck)) {
508496
return CheckPolicy.checked;
509497
}
510498
}
@@ -517,15 +505,13 @@ class AnnotationsDataImpl implements AnnotationsData {
517505
if (member != null) {
518506
EnumSet<PragmaAnnotation> annotations = pragmaAnnotations[member];
519507
if (annotations != null) {
520-
if (annotations.contains(PragmaAnnotation.omitImplicitChecks)) {
508+
if (annotations.contains(PragmaAnnotation.typesTrust)) {
521509
return CheckPolicy.trusted;
522-
} else if (annotations.contains(PragmaAnnotation.emitImplicitChecks)) {
510+
} else if (annotations.contains(PragmaAnnotation.typesCheck)) {
523511
return CheckPolicy.checked;
524-
} else if (annotations
525-
.contains(PragmaAnnotation.omitImplicitDowncasts)) {
512+
} else if (annotations.contains(PragmaAnnotation.downcastTrust)) {
526513
return CheckPolicy.trusted;
527-
} else if (annotations
528-
.contains(PragmaAnnotation.emitImplicitDowncasts)) {
514+
} else if (annotations.contains(PragmaAnnotation.downcastCheck)) {
529515
return CheckPolicy.checked;
530516
}
531517
}
@@ -538,9 +524,9 @@ class AnnotationsDataImpl implements AnnotationsData {
538524
if (member != null) {
539525
EnumSet<PragmaAnnotation> annotations = pragmaAnnotations[member];
540526
if (annotations != null) {
541-
if (annotations.contains(PragmaAnnotation.omitAsCasts)) {
527+
if (annotations.contains(PragmaAnnotation.asTrust)) {
542528
return true;
543-
} else if (annotations.contains(PragmaAnnotation.emitAsCasts)) {
529+
} else if (annotations.contains(PragmaAnnotation.asCheck)) {
544530
return false;
545531
}
546532
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'dart:io';
6+
import 'package:async_helper/async_helper.dart';
7+
import 'package:compiler/src/closure.dart';
8+
import 'package:compiler/src/common.dart';
9+
import 'package:compiler/src/compiler.dart';
10+
import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
11+
import 'package:compiler/src/elements/entities.dart';
12+
import 'package:compiler/src/js_backend/annotations.dart';
13+
import 'package:compiler/src/js_model/element_map.dart';
14+
import 'package:compiler/src/js_model/js_world.dart';
15+
import 'package:compiler/src/util/enumset.dart';
16+
import 'package:compiler/src/util/features.dart';
17+
import 'package:kernel/ast.dart' as ir;
18+
import '../equivalence/id_equivalence.dart';
19+
import '../equivalence/id_equivalence_helper.dart';
20+
21+
main(List<String> args) {
22+
asyncTest(() async {
23+
Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
24+
await checkTests(dataDir, const AnnotationDataComputer(),
25+
args: args, testedConfigs: allStrongConfigs);
26+
});
27+
}
28+
29+
class AnnotationDataComputer extends DataComputer<String> {
30+
const AnnotationDataComputer();
31+
32+
/// Compute type inference data for [member] from kernel based inference.
33+
///
34+
/// Fills [actualMap] with the data.
35+
@override
36+
void computeMemberData(Compiler compiler, MemberEntity member,
37+
Map<Id, ActualData<String>> actualMap,
38+
{bool verbose: false}) {
39+
JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
40+
JsToElementMap elementMap = closedWorld.elementMap;
41+
MemberDefinition definition = elementMap.getMemberDefinition(member);
42+
new AnnotationIrComputer(compiler.reporter, actualMap, elementMap, member,
43+
closedWorld.closureDataLookup, closedWorld.annotationsData)
44+
.run(definition.node);
45+
}
46+
47+
@override
48+
DataInterpreter<String> get dataValidator => const StringDataInterpreter();
49+
}
50+
51+
/// AST visitor for computing inference data for a member.
52+
class AnnotationIrComputer extends IrDataExtractor<String> {
53+
final JsToElementMap _elementMap;
54+
final ClosureData _closureDataLookup;
55+
final AnnotationsDataImpl _annotationData;
56+
57+
AnnotationIrComputer(
58+
DiagnosticReporter reporter,
59+
Map<Id, ActualData<String>> actualMap,
60+
this._elementMap,
61+
MemberEntity member,
62+
this._closureDataLookup,
63+
this._annotationData)
64+
: super(reporter, actualMap);
65+
66+
String getMemberValue(MemberEntity member) {
67+
EnumSet<PragmaAnnotation> pragmas =
68+
_annotationData.pragmaAnnotations[member];
69+
if (pragmas != null) {
70+
Features features = new Features();
71+
for (PragmaAnnotation pragma
72+
in pragmas.iterable(PragmaAnnotation.values)) {
73+
features.add(pragma.name);
74+
}
75+
return features.getText();
76+
}
77+
return null;
78+
}
79+
80+
@override
81+
String computeClassValue(Id id, ir.Class cls) {
82+
return null;
83+
}
84+
85+
@override
86+
String computeMemberValue(Id id, ir.Member node) {
87+
return getMemberValue(_elementMap.getMember(node));
88+
}
89+
90+
@override
91+
String computeNodeValue(Id id, ir.TreeNode node) {
92+
if (node is ir.FunctionExpression || node is ir.FunctionDeclaration) {
93+
ClosureRepresentationInfo info = _closureDataLookup.getClosureInfo(node);
94+
return getMemberValue(info.callMethod);
95+
}
96+
return null;
97+
}
98+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
main() {
6+
noInline();
7+
tryInline();
8+
noElision();
9+
noThrows();
10+
noSideEffects();
11+
assumeDynamic();
12+
}
13+
14+
/*member: noInline:noInline*/
15+
@pragma('dart2js:noInline')
16+
noInline() {}
17+
18+
/*member: tryInline:tryInline*/
19+
@pragma('dart2js:tryInline')
20+
tryInline() {}
21+
22+
/*member: noElision:noElision*/
23+
@pragma('dart2js:noElision')
24+
noElision() {}
25+
26+
/*member: noThrows:noInline,noThrows*/
27+
@pragma('dart2js:noThrows')
28+
@pragma('dart2js:noInline')
29+
noThrows() {}
30+
31+
/*member: noSideEffects:noInline,noSideEffects*/
32+
@pragma('dart2js:noSideEffects')
33+
@pragma('dart2js:noInline')
34+
noSideEffects() {}
35+
36+
/*member: assumeDynamic:assumeDynamic*/
37+
@pragma('dart2js:assumeDynamic')
38+
assumeDynamic() {}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
main() {
6+
typesTrust();
7+
typesCheck();
8+
asTrust();
9+
asCheck();
10+
downcastTrust();
11+
downcastCheck();
12+
parameterTrust();
13+
parameterCheck();
14+
}
15+
16+
/*member: typesTrust:types:trust*/
17+
@pragma('dart2js:types:trust')
18+
typesTrust() {}
19+
20+
/*member: typesCheck:types:check*/
21+
@pragma('dart2js:types:check')
22+
typesCheck() {}
23+
24+
/*member: asTrust:as:trust*/
25+
@pragma('dart2js:as:trust')
26+
asTrust() {}
27+
28+
/*member: asCheck:as:check*/
29+
@pragma('dart2js:as:check')
30+
asCheck() {}
31+
32+
/*member: downcastTrust:downcast:trust*/
33+
@pragma('dart2js:downcast:trust')
34+
downcastTrust() {}
35+
36+
/*member: downcastCheck:downcast:check*/
37+
@pragma('dart2js:downcast:check')
38+
downcastCheck() {}
39+
40+
/*member: parameterTrust:parameter:trust*/
41+
@pragma('dart2js:parameter:trust')
42+
parameterTrust() {}
43+
44+
/*member: parameterCheck:parameter:check*/
45+
@pragma('dart2js:parameter:check')
46+
parameterCheck() {}

0 commit comments

Comments
 (0)