Skip to content

Commit

Permalink
Version 3.5.0-107.0.dev
Browse files Browse the repository at this point in the history
Merge 6357371 into dev
  • Loading branch information
Dart CI committed Apr 27, 2024
2 parents 7173b4d + 6357371 commit f5a0dc3
Show file tree
Hide file tree
Showing 53 changed files with 1,798 additions and 168 deletions.
2 changes: 1 addition & 1 deletion DEPS
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ vars = {
"boringssl_rev": "d24a38200fef19150eef00cad35b138936c08767",
"browser-compat-data_tag": "ac8cae697014da1ff7124fba33b0b4245cc6cd1b", # v1.0.22
"cpu_features_rev": "936b9ab5515dead115606559502e3864958f7f6e",
"devtools_rev": "36e2f3edc13b9f582e04cf22e4bd00b6007b4f8c",
"devtools_rev": "ac9f4acbbe3ccc7cfd5e0278b628505f65de4428",
"icu_rev": "81d656878ec611cb0b42d52c82e9dae93920d9ba",
"jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
"libcxx_rev": "44079a4cc04cdeffb9cfe8067bfb3c276fb2bab0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1008,6 +1008,8 @@ class InScopeCompletionPass extends SimpleAstVisitor<void> {
mustBeStatic: node.inStaticContext,
).addLexicalDeclarations(node);
}
} else if (expression is IndexExpression) {
expression.accept(this);
} else if (expression is InstanceCreationExpression) {
if (offset <= expression.beginToken.end) {
_forStatement(node);
Expand Down Expand Up @@ -1585,7 +1587,7 @@ class InScopeCompletionPass extends SimpleAstVisitor<void> {
@override
void visitIndexExpression(IndexExpression node) {
collector.completionLocation = 'IndexExpression_index';
_forExpression(node);
_forExpression(node, mustBeNonVoid: true);
}

@override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
// Copyright (c) 2024, 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.

import 'package:test_reflective_loader/test_reflective_loader.dart';

import '../../../../client/completion_driver_test.dart';

void main() {
defineReflectiveSuite(() {
defineReflectiveTests(IndexExpressionTest);
});
}

@reflectiveTest
class IndexExpressionTest extends AbstractCompletionDriverTest {
Future<void> test_index() async {
await computeSuggestions('''
void f(List<int> v, int a01) {
v[a0^];
}
''');
assertResponse(r'''
replacement
left: 2
suggestions
a01
kind: parameter
''');
}

Future<void> test_target() async {
await computeSuggestions('''
void f(List<int> a01) {
a0^[0];
}
''');
assertResponse(r'''
replacement
left: 2
suggestions
a01
kind: parameter
''');
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import 'if_element_test.dart' as if_element;
import 'if_statement_test.dart' as if_statement;
import 'implements_clause_test.dart' as implements_clause;
import 'import_directive_test.dart' as import_directive;
import 'index_expression_test.dart' as index_expression;
import 'instance_creation_expression_test.dart' as instance_creation_expression;
import 'is_expression_test.dart' as is_expression;
import 'library_directive_test.dart' as library_directive;
Expand Down Expand Up @@ -114,6 +115,7 @@ void main() {
if_statement.main();
implements_clause.main();
import_directive.main();
index_expression.main();
instance_creation_expression.main();
is_expression.main();
library_directive.main();
Expand Down
2 changes: 1 addition & 1 deletion pkg/analyzer/lib/src/dart/analysis/driver.dart
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ import 'package:meta/meta.dart';
// TODO(scheglov): Clean up the list of implicitly analyzed files.
class AnalysisDriver {
/// The version of data format, should be incremented on every format change.
static const int DATA_VERSION = 359;
static const int DATA_VERSION = 360;

/// The number of exception contexts allowed to write. Once this field is
/// zero, we stop writing any new exception contexts in this process.
Expand Down
23 changes: 19 additions & 4 deletions pkg/analyzer/lib/src/dart/element/element.dart
Original file line number Diff line number Diff line change
Expand Up @@ -56,14 +56,15 @@ import 'package:analyzer/src/summary2/reference.dart';
import 'package:analyzer/src/task/inference_error.dart';
import 'package:analyzer/src/util/file_paths.dart' as file_paths;
import 'package:analyzer/src/utilities/extensions/collection.dart';
import 'package:analyzer/src/utilities/extensions/object.dart';
import 'package:analyzer/src/utilities/extensions/string.dart';
import 'package:collection/collection.dart';
import 'package:pub_semver/pub_semver.dart';

/// Shared implementation of `augmentation` and `augmentationTarget`.
mixin AugmentableElement<T extends ElementImpl> on ElementImpl {
T? _augmentation;
T? _augmentationTarget;
ElementImpl? _augmentationTargetAny;

T? get augmentation {
linkedData?.read(this);
Expand All @@ -75,12 +76,16 @@ mixin AugmentableElement<T extends ElementImpl> on ElementImpl {
}

T? get augmentationTarget {
return augmentationTargetAny.ifTypeOrNull();
}

ElementImpl? get augmentationTargetAny {
linkedData?.read(this);
return _augmentationTarget;
return _augmentationTargetAny;
}

set augmentationTarget(T? value) {
_augmentationTarget = value;
set augmentationTargetAny(ElementImpl? value) {
_augmentationTargetAny = value;
}

bool get isAugmentation {
Expand Down Expand Up @@ -6332,6 +6337,16 @@ class PropertyAccessorElementImpl extends ExecutableElementImpl
isSynthetic = true;
}

@override
PropertyAccessorElementImpl? get augmentationTarget {
if (super.augmentationTarget case var target?) {
if (target.kind == kind) {
return target;
}
}
return null;
}

@override
PropertyAccessorElement? get correspondingGetter {
if (isGetter) {
Expand Down
88 changes: 68 additions & 20 deletions pkg/analyzer/lib/src/summary2/augmentation.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/dart/element/member.dart';
import 'package:analyzer/src/dart/element/type_algebra.dart';
import 'package:analyzer/src/utilities/extensions/element.dart';
import 'package:analyzer/src/utilities/extensions/string.dart';

class AugmentedClassDeclarationBuilder
extends AugmentedInstanceDeclarationBuilder {
Expand Down Expand Up @@ -97,21 +98,38 @@ class AugmentedExtensionTypeDeclarationBuilder
abstract class AugmentedInstanceDeclarationBuilder {
final Map<String, FieldElementImpl> fields = {};
final Map<String, ConstructorElementImpl> constructors = {};
final Map<String, PropertyAccessorElementImpl> accessors = {};
final Map<String, PropertyAccessorElementImpl> getters = {};
final Map<String, PropertyAccessorElementImpl> setters = {};
final Map<String, MethodElementImpl> methods = {};

void addAccessors(List<PropertyAccessorElementImpl> elements) {
for (var element in elements) {
var name = element.name;
if (element.isAugmentation) {
var existing = accessors[name];
if (existing != null) {
existing.augmentation = element;
element.augmentationTarget = existing;
element.variable2 = existing.variable2;
if (element.isGetter) {
if (element.isAugmentation) {
if (getters[name] case var target?) {
target.augmentation = element;
element.augmentationTargetAny = target;
element.variable2 = target.variable2;
} else {
var target = _recoveryAugmentationTarget(name);
element.augmentationTargetAny = target;
}
}
getters[name] = element;
} else {
if (element.isAugmentation) {
if (setters[name] case var target?) {
target.augmentation = element;
element.augmentationTargetAny = target;
element.variable2 = target.variable2;
} else {
var target = _recoveryAugmentationTarget(name);
element.augmentationTargetAny = target;
}
}
setters[name] = element;
}
accessors[name] = element;
}
}

Expand All @@ -122,7 +140,7 @@ abstract class AugmentedInstanceDeclarationBuilder {
var existing = constructors[name];
if (existing != null) {
existing.augmentation = element;
element.augmentationTarget = existing;
element.augmentationTargetAny = existing;
}
}
constructors[name] = element;
Expand All @@ -136,7 +154,7 @@ abstract class AugmentedInstanceDeclarationBuilder {
var existing = fields[name];
if (existing != null) {
existing.augmentation = element;
element.augmentationTarget = existing;
element.augmentationTargetAny = existing;
}
}
fields[name] = element;
Expand All @@ -147,10 +165,12 @@ abstract class AugmentedInstanceDeclarationBuilder {
for (var element in elements) {
var name = element.name;
if (element.isAugmentation) {
var existing = methods[name];
if (existing != null) {
existing.augmentation = element;
element.augmentationTarget = existing;
if (methods[name] case var target?) {
target.augmentation = element;
element.augmentationTargetAny = target;
} else {
var target = _recoveryAugmentationTarget(name);
element.augmentationTargetAny = target;
}
}
methods[name] = element;
Expand Down Expand Up @@ -192,6 +212,17 @@ abstract class AugmentedInstanceDeclarationBuilder {
return augmented;
}

ElementImpl? _recoveryAugmentationTarget(String name) {
name = name.removeSuffix('=') ?? name;

ElementImpl? target;
target ??= getters[name];
target ??= setters['$name='];
target ??= constructors[name];
target ??= methods[name];
return target;
}

void _updatedAugmented(InstanceElementImpl augmentation) {
assert(augmentation.augmentationTarget != null);
var augmented = _ensureAugmented(augmentation);
Expand Down Expand Up @@ -284,17 +315,34 @@ class AugmentedMixinDeclarationBuilder
}

class AugmentedTopVariablesBuilder {
final Map<String, ElementImpl> augmentationTargets;
final Map<String, TopLevelVariableElementImpl> variables = {};
final Map<String, PropertyAccessorElementImpl> accessors = {};

AugmentedTopVariablesBuilder(this.augmentationTargets);

void addAccessor(PropertyAccessorElementImpl element) {
var name = element.name;
if (element.isAugmentation) {
var existing = accessors[name];
if (existing != null) {
existing.augmentation = element;
element.augmentationTarget = existing;
element.variable2 = existing.variable2;
ElementImpl? target = accessors[name];
// Recovery.
if (target == null) {
if (name.removeSuffix('=') case var getterName?) {
target ??= accessors[getterName];
target ??= augmentationTargets[getterName];
} else {
target ??= accessors['$name='];
target ??= augmentationTargets[name];
}
}

if (target is PropertyAccessorElementImpl &&
target.isGetter == element.isGetter) {
target.augmentation = element;
element.augmentationTargetAny = target;
element.variable2 = target.variable2;
} else {
element.augmentationTargetAny = target;
}
}
accessors[name] = element;
Expand All @@ -306,7 +354,7 @@ class AugmentedTopVariablesBuilder {
var existing = variables[name];
if (existing != null) {
existing.augmentation = element;
element.augmentationTarget = existing;
element.augmentationTargetAny = existing;
}
}
variables[name] = element;
Expand Down

0 comments on commit f5a0dc3

Please sign in to comment.