Skip to content

Commit

Permalink
Compute constant dependencies for constructor elements in canBeConst().
Browse files Browse the repository at this point in the history
R=brianwilkerson@google.com, pquitslund@google.com

Change-Id: I92871e880e669aca5447f6fe7d7a8249421e7c44
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/115613
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
  • Loading branch information
scheglov authored and commit-bot@chromium.org committed Sep 6, 2019
1 parent 981be87 commit 2246f0a
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 0 deletions.
10 changes: 10 additions & 0 deletions pkg/analyzer/lib/src/dart/element/element.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2786,6 +2786,16 @@ class ConstructorElementImpl extends ExecutableElementImpl
appendToWithName(buffer, name);
}

/// Ensures that dependencies of this constructor, such as default values
/// of formal parameters, are evaluated.
void computeConstantDependencies() {
if (!isConstantEvaluated) {
AnalysisOptionsImpl analysisOptions = context.analysisOptions;
computeConstants(context.typeProvider, context.typeSystem,
context.declaredVariables, [this], analysisOptions.experimentStatus);
}
}

@deprecated
@override
ConstructorDeclaration computeNode() =>
Expand Down
10 changes: 10 additions & 0 deletions pkg/analyzer/lib/src/lint/linter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ import 'package:analyzer/file_system/file_system.dart' as file_system;
import 'package:analyzer/src/dart/ast/ast.dart';
import 'package:analyzer/src/dart/ast/token.dart';
import 'package:analyzer/src/dart/constant/potentially_constant.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
import 'package:analyzer/src/dart/element/member.dart';
import 'package:analyzer/src/dart/error/lint_codes.dart';
import 'package:analyzer/src/generated/engine.dart'
show AnalysisErrorInfo, AnalysisErrorInfoImpl, AnalysisOptions, Logger;
Expand Down Expand Up @@ -280,6 +282,14 @@ class LinterContextImpl implements LinterContext {
if (element == null || !element.isConst) {
return false;
}

// Ensure that dependencies (e.g. default parameter values) are computed.
var implElement = element;
if (element is ConstructorMember) {
implElement = element.baseElement;
}
(implElement as ConstructorElementImpl).computeConstantDependencies();

//
// Verify that the evaluation of the constructor would not produce an
// exception.
Expand Down
16 changes: 16 additions & 0 deletions pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -206,4 +206,20 @@ A f() => A([1, 2, 3]);
''');
assertCanBeConst("A([", true);
}

void test_true_importedClass_defaultValue() async {
var aPath = convertPath('/test/lib/a.dart');
newFile(aPath, content: r'''
class A {
final int a;
const A({int b = 1}) : a = b * 2;
}
''');
await resolve('''
import 'a.dart';
A f() => A();
''');
assertCanBeConst("A();", true);
}
}

0 comments on commit 2246f0a

Please sign in to comment.