Skip to content

Commit 266d076

Browse files
scheglovCommit Queue
authored andcommitted
Fine. Changes to analyzer/ and linter/ to not trigger opaqu API usage.
With these changes I was able to run all linter/ tests without any opaque API usage stack trace. Change-Id: I28a5de8a0fce47efdf16f7dd845cda103fddb92c Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/450422 Reviewed-by: Samuel Rawlins <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 39c1850 commit 266d076

File tree

7 files changed

+147
-23
lines changed

7 files changed

+147
-23
lines changed

pkg/analyzer/lib/src/dart/element/element.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5139,9 +5139,8 @@ abstract class InterfaceElementImpl extends InstanceElementImpl
51395139
}
51405140

51415141
@override
5142-
@trackedDirectlyOpaque
5142+
@trackedIndirectly
51435143
ExecutableElement? getInterfaceMember(Name name) {
5144-
globalResultRequirements?.recordOpaqueApiUse(this, 'getInterfaceMember');
51455144
return inheritanceManager.getMember(this, name);
51465145
}
51475146

pkg/analyzer/lib/src/summary2/extension_type.dart

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,12 @@ class _Node extends graph.Node<_Node> {
6767

6868
var dependencies = <_Node>[];
6969
for (var element in visitor.dependencies) {
70-
var declaration = walker.linker.getLinkingNode2(element.firstFragment);
71-
if (declaration is ExtensionTypeDeclarationImpl) {
72-
var node = walker.getNode(declaration);
73-
dependencies.add(node);
70+
if (walker.linker.isLinkingElement(element)) {
71+
var declaration = walker.linker.getLinkingNode2(element.firstFragment);
72+
if (declaration is ExtensionTypeDeclarationImpl) {
73+
var node = walker.getNode(declaration);
74+
dependencies.add(node);
75+
}
7476
}
7577
}
7678

pkg/analyzer/test/src/dart/analysis/driver_test.dart

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9229,6 +9229,128 @@ class C extends A implements B {}
92299229
);
92309230
}
92319231

9232+
test_dependency_class_instanceMethod_change_getInterfaceMember() async {
9233+
configuration
9234+
..withGetErrorsEvents = false
9235+
..withStreamResolvedUnitResults = false;
9236+
9237+
_ManualRequirements.install((state) {
9238+
var B = state.singleUnit.scopeClassElement('B');
9239+
B.getInterfaceMember(Name(null, 'foo'));
9240+
});
9241+
9242+
await _runChangeScenarioTA(
9243+
initialA: r'''
9244+
abstract class A {
9245+
int foo();
9246+
}
9247+
9248+
abstract class B extends A {}
9249+
''',
9250+
testCode: r'''
9251+
import 'a.dart';
9252+
''',
9253+
operation: _FineOperationTestFileGetErrors(),
9254+
expectedInitialEvents: r'''
9255+
[status] working
9256+
[operation] linkLibraryCycle SDK
9257+
[operation] linkLibraryCycle
9258+
package:test/a.dart
9259+
declaredClasses
9260+
A: #M0
9261+
declaredMethods
9262+
foo: #M1
9263+
interface: #M2
9264+
map
9265+
foo: #M1
9266+
B: #M3
9267+
interface: #M4
9268+
map
9269+
foo: #M1
9270+
inherited
9271+
foo: #M1
9272+
requirements
9273+
[operation] linkLibraryCycle
9274+
package:test/test.dart
9275+
requirements
9276+
[operation] analyzeFile
9277+
file: /home/test/lib/test.dart
9278+
library: /home/test/lib/test.dart
9279+
[operation] analyzedLibrary
9280+
file: /home/test/lib/test.dart
9281+
requirements
9282+
libraries
9283+
package:test/a.dart
9284+
libraryMetadataId: #M5
9285+
exportedTopLevels
9286+
B: #M3
9287+
B=: <null>
9288+
reExportDeprecatedOnly
9289+
B: false
9290+
interfaces
9291+
B
9292+
methods
9293+
foo: #M1
9294+
[status] idle
9295+
''',
9296+
updatedA: r'''
9297+
abstract class A {
9298+
double foo();
9299+
}
9300+
9301+
abstract class B extends A {}
9302+
''',
9303+
expectedUpdatedEvents: r'''
9304+
[status] working
9305+
[operation] linkLibraryCycle
9306+
package:test/a.dart
9307+
declaredClasses
9308+
A: #M0
9309+
declaredMethods
9310+
foo: #M6
9311+
interface: #M7
9312+
map
9313+
foo: #M6
9314+
B: #M3
9315+
interface: #M8
9316+
map
9317+
foo: #M6
9318+
inherited
9319+
foo: #M6
9320+
requirements
9321+
[operation] reuseLinkedBundle
9322+
package:test/test.dart
9323+
[operation] checkLibraryDiagnosticsRequirements
9324+
library: /home/test/lib/test.dart
9325+
instanceMethodIdMismatch
9326+
libraryUri: package:test/a.dart
9327+
interfaceName: B
9328+
methodName: foo
9329+
expectedId: #M1
9330+
actualId: #M6
9331+
[operation] analyzeFile
9332+
file: /home/test/lib/test.dart
9333+
library: /home/test/lib/test.dart
9334+
[operation] analyzedLibrary
9335+
file: /home/test/lib/test.dart
9336+
requirements
9337+
libraries
9338+
package:test/a.dart
9339+
libraryMetadataId: #M5
9340+
exportedTopLevels
9341+
B: #M3
9342+
B=: <null>
9343+
reExportDeprecatedOnly
9344+
B: false
9345+
interfaces
9346+
B
9347+
methods
9348+
foo: #M6
9349+
[status] idle
9350+
''',
9351+
);
9352+
}
9353+
92329354
test_dependency_class_instanceMethod_change_getMethod() async {
92339355
_ManualRequirements.install((state) {
92349356
var A = state.singleUnit.scopeInstanceElement('A');

pkg/linter/lib/src/extensions.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ extension ElementExtension on Element? {
331331
var self = this;
332332
return self is TopLevelFunctionElement &&
333333
self.name == 'print' &&
334-
self.firstFragment.libraryFragment.element.isDartCore;
334+
self.library.isDartCore;
335335
}
336336

337337
/// Returns the class member that is overridden by `this`, if there is one,

pkg/linter/lib/src/rules/deprecated_member_use_from_same_package.dart

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import 'package:analyzer/dart/ast/syntactic_entity.dart';
1313
import 'package:analyzer/dart/ast/visitor.dart';
1414
import 'package:analyzer/dart/element/element.dart';
1515
import 'package:analyzer/error/error.dart';
16+
import 'package:analyzer/src/dart/element/element.dart'; // ignore: implementation_imports
1617
import 'package:analyzer/src/dart/element/extensions.dart'; // ignore: implementation_imports
1718
import 'package:analyzer/src/error/deprecated_member_use_verifier.dart' // ignore: implementation_imports
1819
show BaseDeprecatedMemberUseVerifier;
@@ -62,10 +63,11 @@ class _DeprecatedMemberUseVerifier extends BaseDeprecatedMemberUseVerifier {
6263
String? message,
6364
) {
6465
var library = element is LibraryElement ? element : element.library;
65-
if (library == null ||
66-
!_workspacePackage.contains(library.firstFragment.source)) {
67-
// In this case, `DEPRECATED_MEMBER_USE` is reported by the analyzer.
68-
return;
66+
if (library case LibraryElementImpl library) {
67+
if (!_workspacePackage.contains(library.source)) {
68+
// In this case, `DEPRECATED_MEMBER_USE` is reported by the analyzer.
69+
return;
70+
}
6971
}
7072

7173
var normalizedMessage = message?.trim();

pkg/linter/lib/src/rules/use_build_context_synchronously.dart

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1465,10 +1465,7 @@ extension ElementExtension on Element {
14651465
// The BuildContext object is the field on Flutter's State class.
14661466
// This object can only be guarded by async gaps with a mounted
14671467
// check on the State.
1468-
return enclosingElement.lookUpGetter(
1469-
name: 'mounted',
1470-
library: enclosingElement.library,
1471-
);
1468+
return enclosingElement.mountedGetter;
14721469
}
14731470
}
14741471

@@ -1478,12 +1475,16 @@ extension ElementExtension on Element {
14781475
_ => null,
14791476
}?.element;
14801477
if (buildContextElement is InterfaceElement) {
1481-
return buildContextElement.lookUpGetter(
1482-
name: 'mounted',
1483-
library: buildContextElement.library,
1484-
);
1478+
return buildContextElement.mountedGetter;
14851479
}
14861480

14871481
return null;
14881482
}
14891483
}
1484+
1485+
extension _InterfaceElementExtension on InterfaceElement {
1486+
GetterElement? get mountedGetter {
1487+
var result = getInterfaceMember(Name(null, 'mounted'));
1488+
return result is GetterElement ? result : null;
1489+
}
1490+
}

pkg/linter/lib/src/util/flutter_utils.dart

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ class _Flutter {
116116

117117
/// Whether [element] is exactly the element named [type], from Flutter.
118118
bool isExactly(InterfaceElement element, String type, Uri uri) =>
119-
element.name == type && element.library.firstFragment.source.uri == uri;
119+
element.name == type && element.library.uri == uri;
120120

121121
bool isExactWidget(ClassElement element) =>
122122
isExactly(element, _nameWidget, _uriFramework);
@@ -183,9 +183,7 @@ extension InterfaceElementExtension2 on InterfaceElement? {
183183
/// Whether this is the exact [type] defined in the file with the given [uri].
184184
bool _isExactly(String type, Uri uri) {
185185
var self = this;
186-
return self is ClassElement &&
187-
self.name == type &&
188-
self.firstFragment.libraryFragment.source.uri == uri;
186+
return self is ClassElement && self.name == type && self.library.uri == uri;
189187
}
190188

191189
static bool _hasWidgetAsAscendant(

0 commit comments

Comments
 (0)