src/vs/platform/extensionManagement/node/extensionsScanner.ts/ExtensionsScanner/scanExtension
class ExtensionsScanner:	private async scanExtension(extensionLocation: URI, type: ExtensionType): Promise<ILocalExtension | null> {
		try {
			const stat = await this.fileService.resolve(extensionLocation);
			if (stat.children) {
				const { manifest, metadata } = await this.readManifest(extensionLocation.fsPath);
				const readmeUrl = stat.children.find(({ name }) => /^readme(\.txt|\.md|)$/i.test(name))?.resource;
				const changelogUrl = stat.children.find(({ name }) => /^changelog(\.txt|\.md|)$/i.test(name))?.resource;
				const identifier = { id: getGalleryExtensionId(manifest.publisher, manifest.name) };
				const local = <ILocalExtension>{ type, identifier, manifest, location: extensionLocation, readmeUrl, changelogUrl, publisherDisplayName: null, publisherId: null, isMachineScoped: false, isBuiltin: type === ExtensionType.System };
				if (metadata) {
					this.setMetadata(local, metadata);
					local.installedTimestamp = metadata.installedTimestamp;
				}
				return local;
			}
		} catch (e) {
			if (type !== ExtensionType.System) {
				this.logService.trace(e);
			}
		}
		return null;
	}