public function getThisType(PhpType $objType) { switch (true) { case $objType instanceof ProxyObjectType: $className = $objType->getReferenceName(); break; case $objType instanceof MethodContainer: $className = $objType->getName(); break; default: throw new \LogicException(sprintf('The previous CASES were exhaustive. Unknown type "%s".', get_class($objType))); } $loweredClassName = strtolower($className); if (!isset($this->thisTypes[$loweredClassName])) { $this->thisTypes[$loweredClassName] = new ThisType($this, $this->getClassOrCreate($className)); } return $this->thisTypes[$loweredClassName]; }
private function getClassName(PhpType $type) { if ($type instanceof NamedType) { return $type->getReferenceName(); } $methodContainer = $type->toMaybeObjectType(); if ($methodContainer instanceof Clazz) { return $methodContainer->getName(); } return null; }
public function equals(PhpType $type) { if ($type->isInterface() && strtolower($type->toMaybeObjectType()->getName()) === strtolower($this->getName())) { return true; } if ($type instanceof ProxyObjectType && strtolower($type->getReferenceName()) === strtolower($this->getName())) { return true; } return false; }
private function getStringRepr(PhpType $type) { switch (true) { case $type instanceof AllType: return TypeRegistry::NATIVE_ALL; // This handles the generic array type specially. // This handles the generic array type specially. case $type === self::$typeRegistry->getNativeType('array'): return 'array'; case $type instanceof ArrayType: $itemTypes = $type->getItemTypes(); if (empty($itemTypes)) { return TypeRegistry::NATIVE_ARRAY . '<' . $this->getStringRepr($type->getKeyType()) . ',' . $this->getStringRepr($type->getElementType()) . '>'; } return sprintf('array<%s,%s,%s>', $this->getStringRepr($type->getKeyType()), $this->getStringRepr($type->getElementType()), $this->dumpJsonLike($itemTypes, true)); case $type instanceof FalseType: return TypeRegistry::NATIVE_BOOLEAN_FALSE; case $type instanceof BooleanType: return TypeRegistry::NATIVE_BOOLEAN; case $type instanceof CallableType: return TypeRegistry::NATIVE_CALLABLE; case $type instanceof ResourceType: return TypeRegistry::NATIVE_RESOURCE; case $type instanceof DoubleType: return TypeRegistry::NATIVE_DOUBLE; case $type instanceof IntegerType: return TypeRegistry::NATIVE_INTEGER; case $type instanceof ThisType: return 'this<' . $type->getReferenceName() . '>'; case $type instanceof NamedType: // If this type has been resolved, we can get the representation // of the resolved type instead of using the reference name. if (!$type->isNoResolvedType()) { return $this->getStringRepr($type->getReferencedType()); } return 'object<' . $type->getReferenceName() . '>'; case $type instanceof NoObjectType: return TypeRegistry::NATIVE_OBJECT; case $type instanceof NoType: return TypeRegistry::NATIVE_NONE; case $type instanceof NullType: return TypeRegistry::NATIVE_NULL; case $type instanceof ObjectType: return 'object<' . $type->getName() . '>'; case $type instanceof StringType: return TypeRegistry::NATIVE_STRING; case $type instanceof UnionType: $alt = array(); foreach ($type->getAlternates() as $t) { $alt[] = $this->getStringRepr($t); } return implode('|', $alt); case $type instanceof UnknownType: return $type->isChecked() ? TypeRegistry::NATIVE_UNKNOWN_CHECKED : TypeRegistry::NATIVE_UNKNOWN; } throw new \InvalidArgumentException(sprintf('The SWITCH statement is exhaustive, but got "%s".', get_class($type))); }