示例#1
0
 public function testFullyQualifiedClassConstantName()
 {
     $this->assertFQSENEqual(FullyQualifiedClassConstantName::make(FullyQualifiedClassName::make('\\Name\\Space', 'a'), 'c'), '\\Name\\Space\\a::c');
     $this->assertFQSENEqual(FullyQualifiedClassConstantName::fromFullyQualifiedString('\\Name\\a::c'), '\\Name\\a::c');
     $this->assertFQSENEqual(FullyQualifiedClassConstantName::fromFullyQualifiedString('Name\\a::c'), '\\Name\\a::c');
     $this->assertFQSENEqual(FullyQualifiedClassConstantName::fromFullyQualifiedString('\\Name\\Space\\a::c,2'), '\\Name\\Space\\a::c,2');
     $this->assertFQSENEqual(FullyQualifiedClassConstantName::fromFullyQualifiedString('\\Name\\Space\\a,1::c,2'), '\\Name\\Space\\a,1::c,2');
     $this->assertFQSENEqual(FullyQualifiedClassConstantName::fromStringInContext('a::methodName', $this->context), '\\a::methodName');
 }
示例#2
0
 /**
  * @return FullyQualifiedConstantName
  * A fully-qualified constant name
  */
 public function withConstantName(string $constant_name) : FullyQualifiedClassConstantName
 {
     return FullyQualifiedClassConstantName::make($this, $constant_name);
 }
示例#3
0
文件: Clazz.php 项目: etsy/phan
 /**
  * This method must be called before analysis
  * begins.
  *
  * @return void
  */
 protected function hydrateOnce(CodeBase $code_base)
 {
     foreach ($this->getAncestorFQSENList($code_base) as $fqsen) {
         if ($code_base->hasClassWithFQSEN($fqsen)) {
             $code_base->getClassByFQSEN($fqsen)->hydrate($code_base);
         }
     }
     // Create the 'class' constant
     $this->addConstant($code_base, new ClassConstant($this->getContext(), 'class', StringType::instance()->asUnionType(), 0, FullyQualifiedClassConstantName::make($this->getFQSEN(), 'class')));
     // Add variable '$this' to the scope
     $this->getInternalScope()->addVariable(new Variable($this->getContext(), 'this', $this->getUnionType(), 0));
     // Load parent methods, properties, constants
     $this->importAncestorClasses($code_base);
 }
示例#4
0
 /**
  * @param CodeBase $code_base
  * A reference to the entire code base in which this
  * context exists
  *
  * @param ReflectionClass $class
  * A reflection class representing a builtin class.
  *
  * @return Clazz
  * A Class structural element representing the given named
  * builtin.
  */
 public static function fromReflectionClass(CodeBase $code_base, \ReflectionClass $class) : Clazz
 {
     // Build a set of flags based on the constitution
     // of the built-in class
     $flags = 0;
     if ($class->isFinal()) {
         $flags = \ast\flags\CLASS_FINAL;
     } elseif ($class->isInterface()) {
         $flags = \ast\flags\CLASS_INTERFACE;
     } elseif ($class->isTrait()) {
         $flags = \ast\flags\CLASS_TRAIT;
     }
     if ($class->isAbstract()) {
         $flags |= \ast\flags\CLASS_ABSTRACT;
     }
     $context = new Context();
     // Build a base class element
     $clazz = new Clazz($context, $class->getName(), UnionType::fromStringInContext($class->getName(), $context), $flags);
     $clazz->setFQSEN(FullyQualifiedClassName::fromStringInContext($class->getName(), $context));
     // If this class has a parent class, add it to the
     // class info
     if ($parent_class = $class->getParentClass()) {
         $parent_class_fqsen = FullyQualifiedClassName::fromFullyQualifiedString('\\' . $parent_class->getName());
         $clazz->setParentClassFQSEN($parent_class_fqsen);
     }
     foreach ($class->getDefaultProperties() as $name => $value) {
         // TODO: whats going on here?
         $reflection_property = new \ReflectionProperty($class->getName(), $name);
         $property_context = $context->withClassFQSEN($clazz->getFQSEN());
         $property = new Property($property_context, $name, Type::fromObject($value)->asUnionType(), 0);
         $property->setFQSEN(FullyQualifiedPropertyName::make($clazz->getFQSEN(), $name));
         $clazz->addProperty($code_base, $property);
     }
     foreach ($class->getInterfaceNames() as $name) {
         $clazz->addInterfaceClassFQSEN(FullyQualifiedClassName::fromFullyQualifiedString('\\' . $name));
     }
     foreach ($class->getTraitNames() as $name) {
         $clazz->addTraitFQSEN(FullyQualifiedClassName::fromFullyQualifiedString('\\' . $name));
     }
     foreach ($class->getConstants() as $name => $value) {
         $constant = new ClassConstant($context, $name, Type::fromObject($value)->asUnionType(), 0);
         $constant->setFQSEN(FullyQualifiedClassConstantName::make($clazz->getFQSEN(), $name));
         $clazz->addConstant($code_base, $constant);
     }
     foreach ($class->getMethods() as $reflection_method) {
         $method_list = FunctionFactory::methodListFromReflectionClassAndMethod($context->withClassFQSEN($clazz->getFQSEN()), $code_base, $class, $reflection_method);
         foreach ($method_list as $method) {
             $clazz->addMethod($code_base, $method);
         }
     }
     return $clazz;
 }
示例#5
0
文件: Clazz.php 项目: ablyler/phan
 /**
  * @return ClassConstant
  * The class constant with the given name.
  */
 public function getConstantWithName(CodeBase $code_base, string $name) : ClassConstant
 {
     return $code_base->getClassConstantByFQSEN(FullyQualifiedClassConstantName::make($this->getFQSEN(), $name));
 }
示例#6
0
文件: Clazz.php 项目: tpunt/phan
 /**
  * This method must be called before analysis
  * begins.
  *
  * @return void
  */
 protected function hydrateOnce(CodeBase $code_base)
 {
     $constant_fqsen = FullyQualifiedClassConstantName::make($this->getFQSEN(), 'class');
     // Create the 'class' constant
     $constant = new ClassConstant($this->getContext(), 'class', StringType::instance()->asUnionType(), 0, $constant_fqsen);
     $this->addConstant($code_base, $constant);
     // Add variable '$this' to the scope
     $this->getInternalScope()->addVariable(new Variable($this->getContext(), 'this', $this->getUnionType(), 0));
     // Load parent methods, properties, constants
     $this->importAncestorClasses($code_base);
 }