Record TopLevelInferenceErrorKind.dependencyCycle in summary2.

R=brianwilkerson@google.com

Change-Id: I1869f31dd6163827026e8e9d54e8682cb9ab2405
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/99820
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
This commit is contained in:
Konstantin Shcheglov 2019-04-19 15:45:34 +00:00 committed by commit-bot@chromium.org
parent 3ae2ef7763
commit 9e87c16677
9 changed files with 103 additions and 12 deletions

View file

@ -7935,6 +7935,10 @@ abstract class NonParameterVariableElementImpl extends VariableElementImpl {
@override
TopLevelInferenceError get typeInferenceError {
if (linkedNode != null) {
return linkedContext.getTypeInferenceError(linkedNode);
}
if (_unlinkedVariable != null) {
return enclosingUnit.resynthesizerContext
.getTypeInferenceError(_unlinkedVariable.inferredTypeSlot);

View file

@ -4754,6 +4754,7 @@ class LinkedNodeBuilder extends Object
idl.LinkedNodeKind _kind;
String _variantField_20;
bool _variantField_31;
TopLevelInferenceErrorBuilder _variantField_35;
String _variantField_22;
LinkedNodeVariablesDeclarationBuilder _variantField_32;
@ -10008,6 +10009,17 @@ class LinkedNodeBuilder extends Object
_variantField_31 = value;
}
@override
TopLevelInferenceErrorBuilder get topLevelTypeInferenceError {
assert(kind == idl.LinkedNodeKind.variableDeclaration);
return _variantField_35;
}
set topLevelTypeInferenceError(TopLevelInferenceErrorBuilder value) {
assert(kind == idl.LinkedNodeKind.variableDeclaration);
_variantField_35 = value;
}
@override
String get uriBasedDirective_uriContent {
assert(kind == idl.LinkedNodeKind.exportDirective ||
@ -10240,6 +10252,7 @@ class LinkedNodeBuilder extends Object
LinkedNodeBuilder variableDeclaration_name,
int codeLength,
int codeOffset,
TopLevelInferenceErrorBuilder topLevelTypeInferenceError,
LinkedNodeVariablesDeclarationBuilder variableDeclaration_declaration,
}) : _kind = idl.LinkedNodeKind.variableDeclaration,
_variantField_24 = actualType,
@ -10250,6 +10263,7 @@ class LinkedNodeBuilder extends Object
_variantField_7 = variableDeclaration_name,
_variantField_34 = codeLength,
_variantField_33 = codeOffset,
_variantField_35 = topLevelTypeInferenceError,
_variantField_32 = variableDeclaration_declaration;
LinkedNodeBuilder.binaryExpression({
@ -11621,6 +11635,7 @@ class LinkedNodeBuilder extends Object
_variantField_10?.flushInformative();
_variantField_25?.flushInformative();
_variantField_14?.flushInformative();
_variantField_35?.flushInformative();
_variantField_32?.flushInformative();
}
@ -11711,6 +11726,8 @@ class LinkedNodeBuilder extends Object
this._variantField_32?.collectApiSignature(signature);
signature.addInt(this._variantField_33 ?? 0);
signature.addInt(this._variantField_34 ?? 0);
signature.addBool(this._variantField_35 != null);
this._variantField_35?.collectApiSignature(signature);
}
fb.Offset finish(fb.Builder fbBuilder) {
@ -11733,6 +11750,7 @@ class LinkedNodeBuilder extends Object
fb.Offset offset_variantField_30;
fb.Offset offset_variantField_14;
fb.Offset offset_variantField_20;
fb.Offset offset_variantField_35;
fb.Offset offset_variantField_22;
fb.Offset offset_variantField_32;
if (_variantField_24 != null) {
@ -11796,6 +11814,9 @@ class LinkedNodeBuilder extends Object
if (_variantField_20 != null) {
offset_variantField_20 = fbBuilder.writeString(_variantField_20);
}
if (_variantField_35 != null) {
offset_variantField_35 = _variantField_35.finish(fbBuilder);
}
if (_variantField_22 != null) {
offset_variantField_22 = fbBuilder.writeString(_variantField_22);
}
@ -11904,6 +11925,9 @@ class LinkedNodeBuilder extends Object
if (_variantField_31 == true) {
fbBuilder.addBool(31, true);
}
if (offset_variantField_35 != null) {
fbBuilder.addOffset(35, offset_variantField_35);
}
if (offset_variantField_22 != null) {
fbBuilder.addOffset(22, offset_variantField_22);
}
@ -11963,6 +11987,7 @@ class _LinkedNodeImpl extends Object
idl.LinkedNodeKind _kind;
String _variantField_20;
bool _variantField_31;
idl.TopLevelInferenceError _variantField_35;
String _variantField_22;
idl.LinkedNodeVariablesDeclaration _variantField_32;
@ -15590,6 +15615,14 @@ class _LinkedNodeImpl extends Object
return _variantField_31;
}
@override
idl.TopLevelInferenceError get topLevelTypeInferenceError {
assert(kind == idl.LinkedNodeKind.variableDeclaration);
_variantField_35 ??= const _TopLevelInferenceErrorReader()
.vTableGet(_bc, _bcOffset, 35, null);
return _variantField_35;
}
@override
String get uriBasedDirective_uriContent {
assert(kind == idl.LinkedNodeKind.exportDirective ||
@ -15865,6 +15898,9 @@ abstract class _LinkedNodeMixin implements idl.LinkedNode {
_result["variableDeclaration_name"] = variableDeclaration_name.toJson();
if (codeLength != 0) _result["codeLength"] = codeLength;
if (codeOffset != 0) _result["codeOffset"] = codeOffset;
if (topLevelTypeInferenceError != null)
_result["topLevelTypeInferenceError"] =
topLevelTypeInferenceError.toJson();
if (variableDeclaration_declaration != null)
_result["variableDeclaration_declaration"] =
variableDeclaration_declaration.toJson();
@ -17518,6 +17554,7 @@ abstract class _LinkedNodeMixin implements idl.LinkedNode {
"codeOffset": codeOffset,
"isSynthetic": isSynthetic,
"kind": kind,
"topLevelTypeInferenceError": topLevelTypeInferenceError,
"variableDeclaration_declaration": variableDeclaration_declaration,
};
}

View file

@ -1935,6 +1935,8 @@ table LinkedNode {
variantField_31:bool (id: 31);
variantField_35:TopLevelInferenceError (id: 35);
variantField_22:string (id: 22);
variantField_32:LinkedNodeVariablesDeclaration (id: 32);

View file

@ -2211,6 +2211,11 @@ abstract class LinkedNode extends base.SummaryClass {
@VariantId(15, variant: LinkedNodeKind.throwExpression)
int get throwExpression_throwKeyword;
@VariantId(35, variantList: [
LinkedNodeKind.variableDeclaration,
])
TopLevelInferenceError get topLevelTypeInferenceError;
@VariantId(15, variant: LinkedNodeKind.topLevelVariableDeclaration)
int get topLevelVariableDeclaration_semicolon;

View file

@ -1267,6 +1267,7 @@ class AstBinaryWriter extends ThrowingAstVisitor<LinkedNodeBuilder> {
variableDeclaration_name: node.name.accept(this),
variableDeclaration_declaration: _variablesDeclaration,
);
builder.topLevelTypeInferenceError = LazyAst.getTypeInferenceError(node);
_writeActualType(builder, node);
return builder;
}

View file

@ -14,6 +14,7 @@ class LazyAst {
static const _hasOverrideInferenceKey = 'lazyAst_hasOverrideInference';
static const _isSimplyBoundedKey = 'lazyAst_simplyBounded';
static const _returnTypeKey = 'lazyAst_returnType';
static const _typeInferenceErrorKey = 'lazyAst_typeInferenceError';
static const _typeKey = 'lazyAst_type';
final LinkedNode data;
@ -28,6 +29,10 @@ class LazyAst {
return node.getProperty(_typeKey);
}
static TopLevelInferenceError getTypeInferenceError(AstNode node) {
return node.getProperty(_typeInferenceErrorKey);
}
static bool hasOverrideInferenceDone(AstNode node) {
return node.getProperty(_hasOverrideInferenceKey) ?? false;
}
@ -51,6 +56,11 @@ class LazyAst {
static void setType(AstNode node, DartType type) {
node.setProperty(_typeKey, type);
}
static void setTypeInferenceError(
AstNode node, TopLevelInferenceError error) {
node.setProperty(_typeInferenceErrorKey, error);
}
}
class LazyClassDeclaration {
@ -1241,6 +1251,7 @@ class LazyVariableDeclaration {
bool _hasInitializer = false;
bool _hasType = false;
bool _hasTypeInferenceError = false;
LazyVariableDeclaration(this.data);
@ -1263,6 +1274,17 @@ class LazyVariableDeclaration {
return LazyAst.getType(node);
}
static TopLevelInferenceError getTypeInferenceError(
VariableDeclaration node) {
var lazy = get(node);
if (!lazy._hasTypeInferenceError) {
var error = lazy.data.topLevelTypeInferenceError;
LazyAst.setTypeInferenceError(node, error);
lazy._hasTypeInferenceError = true;
}
return LazyAst.getTypeInferenceError(node);
}
static void readInitializer(
AstBinaryReader reader,
VariableDeclaration node,

View file

@ -531,6 +531,14 @@ class LinkedUnitContext {
}
}
TopLevelInferenceError getTypeInferenceError(AstNode node) {
if (node is VariableDeclaration) {
return LazyVariableDeclaration.getTypeInferenceError(node);
} else {
return null;
}
}
TypeAnnotation getTypeParameterBound(TypeParameter node) {
LazyTypeParameter.readBound(_astReader, node);
return node.bound;

View file

@ -11,6 +11,8 @@ import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/dart/element/type.dart';
import 'package:analyzer/src/dart/resolver/scope.dart';
import 'package:analyzer/src/generated/resolver.dart';
import 'package:analyzer/src/summary/format.dart';
import 'package:analyzer/src/summary/idl.dart';
import 'package:analyzer/src/summary/link.dart' as graph
show DependencyWalker, Node;
import 'package:analyzer/src/summary2/ast_resolver.dart';
@ -150,8 +152,27 @@ class _InferenceNode extends graph.Node<_InferenceNode> {
isEvaluated = true;
}
void markCircular() {
void markCircular(List<_InferenceNode> cycle) {
LazyAst.setType(_node, DynamicTypeImpl.instance);
var cycleNames = Set<String>();
for (var inferenceNode in cycle) {
var node = inferenceNode._node;
if (node is VariableDeclaration) {
cycleNames.add(node.name.name);
} else {
cycleNames.add('<unknown>');
}
}
LazyAst.setTypeInferenceError(
_node,
TopLevelInferenceErrorBuilder(
kind: TopLevelInferenceErrorKind.dependencyCycle,
arguments: cycleNames.toList(),
),
);
isEvaluated = true;
}
@ -180,7 +201,7 @@ class _InferenceWalker extends graph.DependencyWalker<_InferenceNode> {
@override
void evaluateScc(List<_InferenceNode> scc) {
for (var node in scc) {
node.markCircular();
node.markCircular(scc);
}
}

View file

@ -6535,21 +6535,12 @@ var b = c + 2;
var c = a + 3;
var d = 4;
''');
if (isAstBasedSummary) {
checkElementText(library, r'''
dynamic a;
dynamic b;
dynamic c;
int d;
''');
} else {
checkElementText(library, r'''
checkElementText(library, r'''
dynamic a/*error: dependencyCycle*/;
dynamic b/*error: dependencyCycle*/;
dynamic c/*error: dependencyCycle*/;
int d;
''');
}
}
test_inferred_type_is_typedef() async {