protected function getTree(DateTimeParseContext $context)
 {
     if ($this->textStyle == TextStyle::NARROW()) {
         return parent::getTree($context);
     }
     $locale = $context->getLocale();
     $isCaseSensitive = $context->isCaseSensitive();
     $regionIds = ZoneRulesProvider::getAvailableZoneIds();
     $regionIdsSize = $regionIds->size();
     $cached = $isCaseSensitive ? self::$cachedTree : self::$cachedTreeCI;
     $entry = null;
     $tree = null;
     $zoneStrings = null;
     if (($entry = $cached->get($locale)) == null || ($entry->getKey() != $regionIdsSize || ($tree = $entry->getValue()->get()) == null)) {
         $tree = PrefixTree::newTree($context);
         $zoneStrings = TimeZoneNameUtility::getZoneStrings($locale);
         foreach ($zoneStrings as $names) {
             $zid = $names[0];
             if (!$regionIds->contains($zid)) {
                 continue;
             }
             $tree->add($zid, $zid);
             // don't convert zid -> metazone
             $zid = ZoneName::toZid($zid, $locale);
             $i = $this->textStyle == TextStyle::FULL() ? 1 : 2;
             for (; $i < count($names); $i += 2) {
                 $tree->add($names[$i], $zid);
             }
         }
         // if we have a set of preferred zones, need a copy and
         // add the preferred zones again to overwrite
         if (self::$preferredZones != null) {
             foreach ($zoneStrings as $names) {
                 $zid = $names[0];
                 if (!self::$preferredZones->contains($zid) || !$regionIds->contains($zid)) {
                     continue;
                 }
                 $i = $this->textStyle == TextStyle::FULL() ? 1 : 2;
                 for (; $i < count($names); $i += 2) {
                     $tree->add($names[$i], $zid);
                 }
             }
         }
         $cached->put($locale, new SimpleImmutableEntry($regionIdsSize, $tree));
     }
     return $tree;
 }
 private function parse(DateTimeFormatter $fmt, $zid, $expected, $text, Locale $locale, TextStyle $style, $ci)
 {
     if ($ci) {
         $text = $text->toUpperCase();
     }
     /** @var ZoneId $ret */
     $ret = $fmt->parseQuery($text, TemporalQueries::zone())->getId();
     // TBD: need an excluding list
     // assertEquals(...);
     if ($ret->equals($expected) || $ret->equals($zid) || $ret->equals(ZoneName::toZid($zid)) || $ret->equals($expected->replace("UTC", "UCT"))) {
         return;
     }
     echo printf("[%-5s %s %s %16s] %24s -> %s(%s)%n", $locale->__toString(), $ci ? "ci" : "  ", $style == TextStyle::FULL() ? " full" : "short", $zid, $text, $ret, $expected);
 }