Skip to content

Commit 676df8b

Browse files
scheglovCommit Queue
authored andcommitted
Elements. Remove PrefixElementImpl.
For now, we have a not nice looking way to write / read Element(s). Most of the elements are stored as their first fragment, and then asked for elements. I start with PrefixElementImpl2 to stop doing this, and switch to writing actual element reference. When we are done with all elements, it will become nice again. Change-Id: Ia18c2ab516ae06dc0da0b1ab022f217bf9a7400d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/431702 Reviewed-by: Paul Berry <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent eba91c5 commit 676df8b

File tree

5 files changed

+47
-84
lines changed

5 files changed

+47
-84
lines changed

pkg/analyzer/lib/src/dart/analysis/driver.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ testFineAfterLibraryAnalyzerHook;
110110
// TODO(scheglov): Clean up the list of implicitly analyzed files.
111111
class AnalysisDriver {
112112
/// The version of data format, should be incremented on every format change.
113-
static const int DATA_VERSION = 460;
113+
static const int DATA_VERSION = 461;
114114

115115
/// The number of exception contexts allowed to write. Once this field is
116116
/// zero, we stop writing any new exception contexts in this process.

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

Lines changed: 0 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -8471,55 +8471,6 @@ class PatternVariableFragmentImpl extends LocalVariableFragmentImpl
84718471
}
84728472
}
84738473

8474-
/// Currently we write [Element] using the first fragment.
8475-
/// Usually this works (as good as a hack can), but [PrefixElementImpl2]
8476-
/// does not have [FragmentImpl] fragments. So, we use this fake element.
8477-
// TODO(scheglov): reconsider how we write Element2.
8478-
// TODO(scheglov): remove this class
8479-
class PrefixElementImpl extends FragmentImpl {
8480-
final PrefixElementImpl2 element2;
8481-
8482-
PrefixElementImpl(this.element2)
8483-
: super(
8484-
name: element2.name3 ?? '',
8485-
nameOffset: -1,
8486-
reference: element2.reference,
8487-
);
8488-
8489-
@override
8490-
List<Fragment> get children3 => throw UnimplementedError();
8491-
8492-
@override
8493-
Element get element => throw UnimplementedError();
8494-
8495-
@override
8496-
Fragment? get enclosingFragment => throw UnimplementedError();
8497-
8498-
@override
8499-
ElementKind get kind => ElementKind.PREFIX;
8500-
8501-
@override
8502-
Null get library => null;
8503-
8504-
@override
8505-
LibraryFragment? get libraryFragment => throw UnimplementedError();
8506-
8507-
@override
8508-
String? get name2 => throw UnimplementedError();
8509-
8510-
@override
8511-
int? get nameOffset2 => throw UnimplementedError();
8512-
8513-
@override
8514-
Fragment? get nextFragment => throw UnimplementedError();
8515-
8516-
@override
8517-
int get offset => throw UnimplementedError();
8518-
8519-
@override
8520-
Fragment? get previousFragment => throw UnimplementedError();
8521-
}
8522-
85238474
class PrefixElementImpl2 extends ElementImpl2 implements PrefixElement {
85248475
@override
85258476
final Reference reference;
@@ -8535,12 +8486,6 @@ class PrefixElementImpl2 extends ElementImpl2 implements PrefixElement {
85358486
PrefixElementImpl2({required this.reference, required this.firstFragment})
85368487
: lastFragment = firstFragment {
85378488
reference.element2 = this;
8538-
asElement;
8539-
}
8540-
8541-
PrefixElementImpl get asElement {
8542-
return PrefixElementImpl(this);
8543-
// return imports.first.prefix!.element;
85448489
}
85458490

85468491
@override

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ enum DirectiveUriKind {
1616
withNothing,
1717
}
1818

19+
// TODO(scheglov): remove once we untangle Element2 from Fragment in storage.
20+
enum ElementKind2 { importPrefix, other }
21+
1922
enum ImportElementPrefixKind { isDeferred, isNotDeferred, isNull }
2023

2124
class Tag {

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

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1962,18 +1962,25 @@ class ResolutionReader {
19621962
}
19631963

19641964
Element? readElement() {
1965-
var fragment = readFragmentOrMember();
1966-
switch (fragment) {
1967-
case null:
1968-
return null;
1969-
case PrefixElementImpl():
1970-
return fragment.element2;
1971-
case FragmentImpl():
1972-
return fragment.asElement2;
1973-
case ExecutableMember():
1974-
return fragment;
1975-
default:
1976-
throw UnimplementedError('${fragment.runtimeType}');
1965+
var kind = readEnum(ElementKind2.values);
1966+
switch (kind) {
1967+
case ElementKind2.importPrefix:
1968+
var referenceIndex = _reader.readUInt30();
1969+
var reference = _referenceReader.referenceOfIndex(referenceIndex);
1970+
return reference.element2 as PrefixElementImpl2;
1971+
case ElementKind2.other:
1972+
// TODO(scheglov): eventually stop using fragments here.
1973+
var fragment = readFragmentOrMember();
1974+
switch (fragment) {
1975+
case null:
1976+
return null;
1977+
case FragmentImpl():
1978+
return fragment.asElement2;
1979+
case ExecutableMember():
1980+
return fragment;
1981+
default:
1982+
throw UnimplementedError('${fragment.runtimeType}');
1983+
}
19771984
}
19781985
}
19791986

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

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -701,20 +701,30 @@ class ResolutionSink extends _SummaryDataWriter {
701701
// TODO(scheglov): Triage places where we write elements.
702702
// Some of then cannot be members, e.g. type names.
703703
void writeElement(Element? element) {
704-
if (element case Member element) {
705-
var baseElement = element.baseElement;
706-
707-
var typeArguments = _enclosingClassTypeArguments(
708-
baseElement,
709-
element.substitution.map,
710-
);
711-
712-
writeByte(Tag.MemberWithTypeArguments);
713-
_writeElement(baseElement);
714-
_writeTypeList(typeArguments);
715-
} else {
716-
writeByte(Tag.RawElement);
717-
_writeElement(element);
704+
switch (element) {
705+
case PrefixElementImpl2():
706+
writeEnum(ElementKind2.importPrefix);
707+
var reference = element.reference;
708+
var referenceIndex = _references._indexOfReference(reference);
709+
writeUInt30(referenceIndex);
710+
default:
711+
// TODO(scheglov): eventually stop using fragments here.
712+
writeEnum(ElementKind2.other);
713+
if (element case Member element) {
714+
var baseElement = element.baseElement;
715+
716+
var typeArguments = _enclosingClassTypeArguments(
717+
baseElement,
718+
element.substitution.map,
719+
);
720+
721+
writeByte(Tag.MemberWithTypeArguments);
722+
_writeElement(baseElement);
723+
_writeTypeList(typeArguments);
724+
} else {
725+
writeByte(Tag.RawElement);
726+
_writeElement(element);
727+
}
718728
}
719729
}
720730

@@ -864,8 +874,6 @@ class ResolutionSink extends _SummaryDataWriter {
864874
_writeFragmentImpl(element.asElement);
865875
case NeverElementImpl2():
866876
_writeFragmentImpl(NeverFragmentImpl.instance);
867-
case PrefixElementImpl2 element:
868-
_writeFragmentImpl(element.asElement);
869877
case TopLevelVariableElementImpl2 element:
870878
_writeFragmentImpl(element.asElement);
871879
case TypeAliasElementImpl2 element:

0 commit comments

Comments
 (0)