Skip to content

Commit 48b0149

Browse files
authored
Extract deprecated usages of analyzer (#2561)
* initial implementation * getting somewhere. mostly works now and no regressions. * refactor to extract function typedefs * cleanup and tests pass * more tweaks * merge leftover * add markdown and more test cases * dartfmt * deprecations extracted but messy * dartfmt * clean up loops
1 parent f04164b commit 48b0149

File tree

9 files changed

+93
-100
lines changed

9 files changed

+93
-100
lines changed

lib/dartdoc.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class DartdocFileWriter implements FileWriter {
7373

7474
var file = resourceProvider
7575
.getFile(resourceProvider.pathContext.join(outputDir, outFile));
76-
var parent = file.parent;
76+
var parent = file.parent2;
7777
if (!parent.exists) {
7878
parent.create();
7979
}

lib/src/dartdoc_options.dart

Lines changed: 24 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1094,26 +1094,23 @@ abstract class _DartdocFileOption<T> implements DartdocOption<T> {
10941094

10951095
/// Searches all dartdoc_options files through parent directories, starting at
10961096
/// [dir], for the option and returns one once found.
1097-
_OptionValueWithContext<Object> _valueAtFromFilesFirstFound(Folder dir) {
1097+
_OptionValueWithContext<Object> _valueAtFromFilesFirstFound(Folder folder) {
10981098
_OptionValueWithContext<Object> value;
1099-
while (true) {
1099+
for (var dir in folder.withAncestors) {
11001100
value = _valueAtFromFile(dir);
1101-
if (value != null || dir.parent == null) break;
1102-
dir = dir.parent;
1101+
if (value != null) break;
11031102
}
11041103
return value;
11051104
}
11061105

11071106
/// Searches all dartdoc_options files for the option, and returns the value
11081107
/// in the top-most parent directory `dartdoc_options.yaml` file it is
11091108
/// mentioned in.
1110-
_OptionValueWithContext<Object> _valueAtFromFilesLastFound(Folder dir) {
1109+
_OptionValueWithContext<Object> _valueAtFromFilesLastFound(Folder folder) {
11111110
_OptionValueWithContext<Object> value;
1112-
while (true) {
1111+
for (var dir in folder.withAncestors) {
11131112
var tmpValue = _valueAtFromFile(dir);
11141113
if (tmpValue != null) value = tmpValue;
1115-
dir = dir.parent;
1116-
if (dir == null) break;
11171114
}
11181115
return value;
11191116
}
@@ -1179,35 +1176,32 @@ abstract class _DartdocFileOption<T> implements DartdocOption<T> {
11791176
definingFile: 'dartdoc_options.yaml');
11801177
}
11811178

1182-
_YamlFileData _yamlAtDirectory(Folder dir) {
1183-
var canonicalPaths = <String>[
1184-
resourceProvider.pathContext.canonicalize(dir.path)
1185-
];
1186-
if (!_yamlAtCanonicalPathCache.containsKey(canonicalPaths.first)) {
1187-
var yamlData = _YamlFileData({}, _directoryCurrentPath);
1179+
_YamlFileData _yamlAtDirectory(Folder folder) {
1180+
var canonicalPaths = <String>[];
1181+
var yamlData = _YamlFileData({}, _directoryCurrentPath);
1182+
1183+
for (var dir in folder.withAncestors) {
1184+
var canonicalPath =
1185+
resourceProvider.pathContext.canonicalize(folder.path);
1186+
if (_yamlAtCanonicalPathCache.containsKey(canonicalPath)) {
1187+
yamlData = _yamlAtCanonicalPathCache[canonicalPath];
1188+
break;
1189+
}
1190+
canonicalPaths.add(canonicalPath);
11881191
if (dir.exists) {
1189-
File dartdocOptionsFile;
1190-
1191-
while (true) {
1192-
dartdocOptionsFile = resourceProvider.getFile(resourceProvider
1193-
.pathContext
1194-
.join(dir.path, 'dartdoc_options.yaml'));
1195-
if (dartdocOptionsFile.exists || dir.parent == null) {
1196-
break;
1197-
}
1198-
dir = dir.parent;
1199-
canonicalPaths
1200-
.add(resourceProvider.pathContext.canonicalize(dir.path));
1201-
}
1192+
var dartdocOptionsFile = resourceProvider.getFile(resourceProvider
1193+
.pathContext
1194+
.join(dir.path, 'dartdoc_options.yaml'));
12021195
if (dartdocOptionsFile.exists) {
12031196
yamlData = _YamlFileData(
12041197
loadYaml(dartdocOptionsFile.readAsStringSync()),
12051198
resourceProvider.pathContext.canonicalize(dir.path));
1199+
break;
12061200
}
12071201
}
1208-
canonicalPaths.forEach((p) => _yamlAtCanonicalPathCache[p] = yamlData);
12091202
}
1210-
return _yamlAtCanonicalPathCache[canonicalPaths.first];
1203+
canonicalPaths.forEach((p) => _yamlAtCanonicalPathCache[p] = yamlData);
1204+
return yamlData;
12111205
}
12121206
}
12131207

@@ -1402,7 +1396,7 @@ class DartdocOptionContext extends DartdocOptionContextBase
14021396
} else {
14031397
context = resourceProvider.getFolder(resourceProvider.pathContext
14041398
.canonicalize(
1405-
resource is File ? resource.parent.path : resource.path));
1399+
resource is File ? resource.parent2.path : resource.path));
14061400
}
14071401
}
14081402

lib/src/element_type.dart

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,7 @@ abstract class ElementType extends Privacy {
3434
} else {
3535
var element = ModelElement.fromElement(f.element, packageGraph);
3636
assert(f is ParameterizedType || f is TypeParameterType);
37-
// TODO(jcollins-g): Remove reference to f.element.enclosingElement after
38-
// analyzer 0.41.
39-
var isGenericTypeAlias =
40-
f.element.enclosingElement is FunctionTypeAliasElement ||
41-
f.element is FunctionTypeAliasElement;
37+
var isGenericTypeAlias = f.aliasElement != null;
4238
if (f is FunctionType) {
4339
assert(f is ParameterizedType);
4440
if (isGenericTypeAlias) {
@@ -366,13 +362,13 @@ abstract class CallableElementTypeMixin implements ParameterizedElementType {
366362
Iterable<DartType> dartTypeArguments;
367363
if (returnedFrom is FunctionTypeElementType) {
368364
if (type.typeFormals.isEmpty) {
369-
dartTypeArguments = type.typeArguments;
365+
dartTypeArguments = type.aliasArguments;
370366
} else {
371367
dartTypeArguments = type.typeFormals.map(_legacyTypeParameterType);
372368
}
373369
} else {
374370
if (type.typeFormals.isEmpty) {
375-
dartTypeArguments = type.typeArguments;
371+
dartTypeArguments = type.aliasArguments;
376372
} else if (returnedFrom != null &&
377373
returnedFrom.type.element is GenericFunctionTypeElement) {
378374
_typeArguments = (returnedFrom as DefinedElementType).typeArguments;
@@ -447,8 +443,8 @@ class CallableGenericTypeAliasElementType extends ParameterizedElementType
447443
ModelElement _returnElement;
448444
@override
449445
ModelElement get returnElement {
450-
_returnElement ??=
451-
ModelElement.fromElement(type.element.enclosingElement, packageGraph);
446+
_returnElement ??= ModelElement.fromElement(
447+
type.aliasElement.enclosingElement, packageGraph);
452448
return _returnElement;
453449
}
454450

lib/src/model/model_element.dart

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ abstract class ModelElement extends Canonicalization
330330
if (e is FunctionElement) {
331331
return ModelFunction(e, library, packageGraph);
332332
} else if (e is GenericFunctionTypeElement) {
333-
assert(e.enclosingElement is FunctionTypeAliasElement);
333+
assert(e.enclosingElement is TypeAliasElement);
334334
assert(e.enclosingElement.name != '');
335335
return ModelFunctionTypedef(e, library, packageGraph);
336336
}
@@ -547,8 +547,11 @@ abstract class ModelElement extends Canonicalization
547547
return allFeatures.join(', ');
548548
}
549549

550+
// True if this is a function, or if it is an type alias to a function.
550551
bool get isCallable =>
551-
element is FunctionTypedElement || element is FunctionTypeAliasElement;
552+
element is FunctionTypedElement ||
553+
(element is TypeAliasElement &&
554+
(element as TypeAliasElement).aliasedElement is FunctionTypedElement);
552555

553556
ModelElement buildCanonicalModelElement() {
554557
Container preferredClass;
@@ -1079,28 +1082,31 @@ abstract class ModelElement extends Canonicalization
10791082
if (_parameters == null) {
10801083
List<ParameterElement> params;
10811084

1082-
if (element is ExecutableElement) {
1083-
if (_originalMember != null) {
1084-
assert(_originalMember is ExecutableMember);
1085-
params = (_originalMember as ExecutableMember).parameters;
1086-
} else {
1087-
params = (element as ExecutableElement).parameters;
1085+
if (element is TypeAliasElement) {
1086+
_parameters = ModelElement.fromElement(
1087+
(element as TypeAliasElement).aliasedElement, packageGraph)
1088+
.parameters;
1089+
} else {
1090+
if (element is ExecutableElement) {
1091+
if (_originalMember != null) {
1092+
assert(_originalMember is ExecutableMember);
1093+
params = (_originalMember as ExecutableMember).parameters;
1094+
} else {
1095+
params = (element as ExecutableElement).parameters;
1096+
}
10881097
}
1089-
}
1090-
if (params == null && element is FunctionTypedElement) {
1091-
if (_originalMember != null) {
1092-
params = (_originalMember as dynamic).parameters;
1093-
} else {
1094-
params = (element as FunctionTypedElement).parameters;
1098+
if (params == null && element is FunctionTypedElement) {
1099+
if (_originalMember != null) {
1100+
params = (_originalMember as dynamic).parameters;
1101+
} else {
1102+
params = (element as FunctionTypedElement).parameters;
1103+
}
10951104
}
1105+
_parameters = UnmodifiableListView(params
1106+
.map(
1107+
(p) => ModelElement.from(p, library, packageGraph) as Parameter)
1108+
.toList(growable: false));
10961109
}
1097-
if (params == null && element is FunctionTypeAliasElement) {
1098-
params = (element as FunctionTypeAliasElement).function.parameters;
1099-
}
1100-
1101-
_parameters = UnmodifiableListView(params
1102-
.map((p) => ModelElement.from(p, library, packageGraph) as Parameter)
1103-
.toList(growable: false));
11041110
}
11051111
return _parameters;
11061112
}

lib/src/model/package_graph.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -972,7 +972,7 @@ class PackageGraph {
972972
// might not be where the element was defined, which is what's important
973973
// for nodoc's semantics. Looking up the defining element just to pull
974974
// a context is again, slow.
975-
List<String> globs = config.optionSet['nodoc'].valueAt(file.parent);
975+
List<String> globs = config.optionSet['nodoc'].valueAt(file.parent2);
976976
_configSetsNodocFor[fullName] = matchGlobs(globs, fullName);
977977
}
978978
return _configSetsNodocFor[fullName];

lib/src/model/typedef.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ class FunctionTypedef extends Typedef {
7070

7171
@override
7272
List<TypeParameterElement> get genericTypeParameters {
73-
var aliasedTypeElement = aliasedType.element;
73+
var aliasedTypeElement = aliasedType.aliasElement;
7474
if (aliasedTypeElement is FunctionTypedElement) {
7575
return aliasedTypeElement.typeParameters;
7676
}

lib/src/mustachio/renderer_base.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ class Template {
7474
partialResolver = (String path) async {
7575
var partialPath = pathContext.isAbsolute(path)
7676
? path
77-
: pathContext.join(file.parent.path, path);
77+
: pathContext.join(file.parent2.path, path);
7878
var partialFile =
7979
file.provider.getFile(pathContext.normalize(partialPath));
8080
return partialFile;

lib/src/package_meta.dart

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ final PackageMetaProvider pubPackageMetaProvider = PackageMetaProvider(
4242
PhysicalResourceProvider.INSTANCE
4343
.getFile(PhysicalResourceProvider.INSTANCE.pathContext
4444
.absolute(Platform.resolvedExecutable))
45-
.parent
46-
.parent);
45+
.parent2
46+
.parent2);
4747

4848
/// Sets the supported way of constructing [PackageMeta] objects.
4949
///
@@ -177,23 +177,21 @@ abstract class PubPackageMeta extends PackageMeta {
177177

178178
static final _sdkDirParent = <String, Folder>{};
179179

180-
/// If [dir] is inside a Dart SDK, returns the directory of the SDK, and `null`
180+
/// If [folder] is inside a Dart SDK, returns the directory of the SDK, and `null`
181181
/// otherwise.
182-
static Folder sdkDirParent(Folder dir, ResourceProvider resourceProvider) {
182+
static Folder sdkDirParent(Folder folder, ResourceProvider resourceProvider) {
183183
var pathContext = resourceProvider.pathContext;
184-
var dirPathCanonical = pathContext.canonicalize(dir.path);
184+
var dirPathCanonical = pathContext.canonicalize(folder.path);
185185
if (!_sdkDirParent.containsKey(dirPathCanonical)) {
186186
_sdkDirParent[dirPathCanonical] = null;
187-
while (dir.exists) {
187+
for (var dir in folder.withAncestors) {
188188
if (_sdkDirFilePaths.every((List<String> l) {
189189
return l.any((f) =>
190190
resourceProvider.getFile(pathContext.join(dir.path, f)).exists);
191191
})) {
192192
_sdkDirParent[dirPathCanonical] = dir;
193193
break;
194194
}
195-
dir = dir.parent;
196-
if (dir == null) break;
197195
}
198196
}
199197
return _sdkDirParent[dirPathCanonical];
@@ -210,54 +208,50 @@ abstract class PubPackageMeta extends PackageMeta {
210208
resourceProvider
211209
.getFile(resourceProvider.pathContext
212210
.canonicalize(libraryElement.source.fullName))
213-
.parent,
211+
.parent2,
214212
resourceProvider);
215213
}
216214

217215
static PubPackageMeta fromFilename(
218216
String filename, ResourceProvider resourceProvider) {
219217
return PubPackageMeta.fromDir(
220-
resourceProvider.getFile(filename).parent, resourceProvider);
218+
resourceProvider.getFile(filename).parent2, resourceProvider);
221219
}
222220

223221
/// This factory is guaranteed to return the same object for any given
224222
/// [dir.absolute.path]. Multiple [dir.absolute.path]s will resolve to the
225223
/// same object if they are part of the same package. Returns null
226224
/// if the directory is not part of a known package.
227-
static PubPackageMeta fromDir(Folder dir, ResourceProvider resourceProvider) {
225+
static PubPackageMeta fromDir(
226+
Folder folder, ResourceProvider resourceProvider) {
228227
var pathContext = resourceProvider.pathContext;
229-
var original = resourceProvider.getFolder(pathContext.absolute(dir.path));
230-
dir = original;
228+
var original =
229+
resourceProvider.getFolder(pathContext.absolute(folder.path));
230+
folder = original;
231231
if (!original.exists) {
232232
throw PackageMetaFailure(
233233
'fatal error: unable to locate the input directory at ${original.path}.');
234234
}
235235

236-
if (!_packageMetaCache.containsKey(dir.path)) {
236+
if (!_packageMetaCache.containsKey(folder.path)) {
237237
PackageMeta packageMeta;
238238
// There are pubspec.yaml files inside the SDK. Ignore them.
239-
var parentSdkDir = sdkDirParent(dir, resourceProvider);
239+
var parentSdkDir = sdkDirParent(folder, resourceProvider);
240240
if (parentSdkDir != null) {
241241
packageMeta = _SdkMeta(parentSdkDir, resourceProvider);
242242
} else {
243-
while (dir.exists) {
243+
for (var dir in folder.withAncestors) {
244244
var pubspec = resourceProvider
245245
.getFile(pathContext.join(dir.path, 'pubspec.yaml'));
246246
if (pubspec.exists) {
247247
packageMeta = _FilePackageMeta(dir, resourceProvider);
248248
break;
249249
}
250-
// Allow a package to be at root (possible in a Windows setting with
251-
// drive letter mappings).
252-
if (dir.parent == null) break;
253-
// TODO(srawlins): or just... `.parent`?
254-
dir =
255-
resourceProvider.getFolder(pathContext.absolute(dir.parent.path));
256250
}
257251
}
258-
_packageMetaCache[pathContext.absolute(dir.path)] = packageMeta;
252+
_packageMetaCache[pathContext.absolute(folder.path)] = packageMeta;
259253
}
260-
return _packageMetaCache[pathContext.absolute(dir.path)];
254+
return _packageMetaCache[pathContext.absolute(folder.path)];
261255
}
262256

263257
@override
@@ -317,10 +311,11 @@ class _FilePackageMeta extends PubPackageMeta {
317311
// a pub library to do this.
318312
// People could have a pub cache at root with Windows drive mappings.
319313
if (pathContext.split(pathContext.canonicalize(dir.path)).length >= 3) {
320-
var pubCacheRoot = dir.parent.parent.parent?.path;
321-
if (pubCacheRoot != null) {
322-
var hosted = pathContext.canonicalize(dir.parent.parent.path);
323-
var hostname = pathContext.canonicalize(dir.parent.path);
314+
var pubCacheRoot = dir.parent2.parent2.parent2.path;
315+
// Check for directory structure too close to root.
316+
if (pubCacheRoot != dir.parent2.parent2.path) {
317+
var hosted = pathContext.canonicalize(dir.parent2.parent2.path);
318+
var hostname = pathContext.canonicalize(dir.parent2.path);
324319
if (pathContext.basename(hosted) == 'hosted' &&
325320
resourceProvider
326321
.getFolder(pathContext.join(pubCacheRoot, '_temp'))

0 commit comments

Comments
 (0)