Skip to content

Commit 00d61ac

Browse files
scheglovCommit Queue
authored andcommitted
Elements. Store LocalVariableElementImpl.type, don't get from the fragment.
Eventually VariableFragmentImpl.type will become nullable, with the meaning that if it is specified, it has value, otherwise it is `null`. And `VariableElementImpl.type` will be non-nullable, inferred if necessary. Change-Id: If20c037f46ffb6861a11b945089dcf1d5b77dc40 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/438487 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Paul Berry <[email protected]>
1 parent e6ecb6c commit 00d61ac

File tree

4 files changed

+56
-34
lines changed

4 files changed

+56
-34
lines changed

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

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6803,6 +6803,9 @@ class LocalVariableElementImpl extends PromotableElementImpl
68036803
@override
68046804
final LocalVariableFragmentImpl _wrappedElement;
68056805

6806+
@override
6807+
TypeImpl type = InvalidTypeImpl.instance;
6808+
68066809
LocalVariableElementImpl(this._wrappedElement);
68076810

68086811
@override
@@ -6854,11 +6857,6 @@ class LocalVariableElementImpl extends PromotableElementImpl
68546857
@override
68556858
MetadataImpl get metadata2 => metadata;
68566859

6857-
@override
6858-
TypeImpl get type => _wrappedElement.type;
6859-
6860-
set type(TypeImpl type) => _wrappedElement.type = type;
6861-
68626860
LocalVariableFragmentImpl get wrappedElement {
68636861
return _wrappedElement;
68646862
}
@@ -6874,6 +6872,19 @@ class LocalVariableElementImpl extends PromotableElementImpl
68746872
@Deprecated('Use accept instead')
68756873
@override
68766874
T? accept2<T>(ElementVisitor2<T> visitor) => accept(visitor);
6875+
6876+
@override
6877+
String displayString2({
6878+
bool multiline = false,
6879+
bool preferTypeAlias = false,
6880+
}) {
6881+
var builder = ElementDisplayStringBuilder(
6882+
multiline: multiline,
6883+
preferTypeAlias: preferTypeAlias,
6884+
);
6885+
builder.writeVariableElement2(this);
6886+
return builder.toString();
6887+
}
68776888
}
68786889

68796890
class LocalVariableFragmentImpl extends NonParameterVariableFragmentImpl
@@ -10126,6 +10137,10 @@ abstract class VariableFragmentImpl extends FragmentImpl
1012610137
_type = type;
1012710138
}
1012810139

10140+
/// The declared type of this variable.
10141+
// TODO(scheglov): turn into field
10142+
TypeImpl? get type2 => _type;
10143+
1012910144
@override
1013010145
void appendTo(ElementDisplayStringBuilder builder) {
1013110146
builder.writeVariableElement(this);

pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -244,9 +244,10 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
244244
fragment.isFinal = true;
245245
if (exceptionTypeNode == null) {
246246
fragment.hasImplicitType = true;
247-
fragment.type = _typeProvider.objectType;
247+
fragment.element.type = _typeProvider.objectType;
248248
} else {
249249
fragment.type = exceptionTypeNode.typeOrThrow;
250+
fragment.element.type = exceptionTypeNode.typeOrThrow;
250251
}
251252

252253
fragment.setCodeRange(
@@ -267,7 +268,8 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
267268
stackTraceNode.declaredFragment = fragment;
268269

269270
fragment.isFinal = true;
270-
fragment.type = _typeProvider.stackTraceType;
271+
fragment.hasImplicitType = true;
272+
fragment.element.type = _typeProvider.stackTraceType;
271273

272274
fragment.setCodeRange(
273275
stackTraceNode.name.offset,
@@ -391,12 +393,13 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
391393
fragment.isConst = node.isConst;
392394
fragment.isFinal = node.isFinal;
393395

394-
if (node.type == null) {
395-
fragment.hasImplicitType = true;
396-
fragment.type = _dynamicType;
396+
if (node.type case var typeNode?) {
397+
typeNode.accept(this);
398+
fragment.type = typeNode.typeOrThrow;
399+
fragment.element.type = typeNode.typeOrThrow;
397400
} else {
398-
node.type!.accept(this);
399-
fragment.type = node.type!.typeOrThrow;
401+
fragment.hasImplicitType = true;
402+
fragment.element.type = _dynamicType;
400403
}
401404

402405
_setCodeRange(fragment, node);
@@ -418,7 +421,10 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
418421
_elementHolder.enclose(fragment);
419422
_define(fragment.element);
420423
fragment.hasImplicitType = node.type == null;
421-
fragment.type = node.type?.type ?? InvalidTypeImpl.instance;
424+
if (node.type case var typeNode?) {
425+
fragment.type = typeNode.typeOrThrow;
426+
fragment.element.type = typeNode.typeOrThrow;
427+
}
422428
node.declaredFragment = fragment;
423429

424430
var patternContext = node.patternContext;
@@ -1419,13 +1425,19 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
14191425
fragment = _elementWalker!.getVariable();
14201426
node.declaredFragment = fragment;
14211427
} else {
1422-
var localElement = node.declaredFragment as LocalVariableFragmentImpl;
1423-
fragment = localElement;
1428+
var localFragment = node.declaredFragment as LocalVariableFragmentImpl;
1429+
fragment = localFragment;
14241430

14251431
var varList = node.parent as VariableDeclarationListImpl;
1426-
localElement.hasImplicitType = varList.type == null;
1427-
localElement.hasInitializer = initializerNode != null;
1428-
localElement.type = varList.type?.type ?? _dynamicType;
1432+
localFragment.hasInitializer = initializerNode != null;
1433+
if (varList.type case var typeNode?) {
1434+
var type = typeNode.typeOrThrow;
1435+
localFragment.type = type;
1436+
localFragment.element.type = type;
1437+
} else {
1438+
localFragment.hasImplicitType = true;
1439+
localFragment.element.type = _dynamicType;
1440+
}
14291441
}
14301442

14311443
if (initializerNode != null) {

pkg/analyzer/test/src/dart/resolution/try_statement_test.dart

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,8 @@ TryStatement
8484
stackTraceParameter: CatchClauseParameter
8585
name: y
8686
declaredFragment: isFinal isPublic y@30
87-
type: StackTrace
88-
element: isFinal isPublic
87+
type: null
88+
element: hasImplicitType isFinal isPublic
8989
type: StackTrace
9090
rightParenthesis: )
9191
body: Block
@@ -128,8 +128,8 @@ TryStatement
128128
stackTraceParameter: CatchClauseParameter
129129
name: st
130130
declaredFragment: isFinal isPublic st@31
131-
type: StackTrace
132-
element: isFinal isPublic
131+
type: null
132+
element: hasImplicitType isFinal isPublic
133133
type: StackTrace
134134
rightParenthesis: )
135135
body: Block
@@ -172,8 +172,8 @@ TryStatement
172172
stackTraceParameter: CatchClauseParameter
173173
name: st
174174
declaredFragment: isFinal isPublic st@31
175-
type: StackTrace
176-
element: isFinal isPublic
175+
type: null
176+
element: hasImplicitType isFinal isPublic
177177
type: StackTrace
178178
rightParenthesis: )
179179
body: Block
@@ -213,8 +213,8 @@ TryStatement
213213
stackTraceParameter: CatchClauseParameter
214214
name: st
215215
declaredFragment: isFinal isPublic st@30
216-
type: StackTrace
217-
element: isFinal isPublic
216+
type: null
217+
element: hasImplicitType isFinal isPublic
218218
type: StackTrace
219219
rightParenthesis: )
220220
body: Block
@@ -259,8 +259,8 @@ TryStatement
259259
stackTraceParameter: CatchClauseParameter
260260
name: st
261261
declaredFragment: isFinal isPublic st@37
262-
type: StackTrace
263-
element: isFinal isPublic
262+
type: null
263+
element: hasImplicitType isFinal isPublic
264264
type: StackTrace
265265
rightParenthesis: )
266266
body: Block

pkg/analyzer/test/src/summary/resolved_ast_printer.dart

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1786,12 +1786,7 @@ Expected parent: (${parent.runtimeType}) $parent
17861786
});
17871787

17881788
_sink.withIndent(() {
1789-
if (fragment.hasImplicitType) {
1790-
// TODO(scheglov): eventually we can just write type a below.
1791-
_sink.writelnWithIndent('type: null');
1792-
} else {
1793-
_writeType('type', fragment.type);
1794-
}
1789+
_writeType('type', fragment.type2);
17951790

17961791
var element = fragment.element;
17971792
_sink.writeIndentedLine(() {

0 commit comments

Comments
 (0)