public function testCreatingContextWithSelf()
 {
     $reflector = new ClassReflector(new StringSourceLocator('<?php class Foo {}'));
     $self = $reflector->reflect('Foo');
     $context = new CompilerContext($reflector, $self);
     $this->assertTrue($context->hasSelf());
     $this->assertSame($reflector, $context->getReflector());
     $this->assertSame($self, $context->getSelf());
 }
 /**
  * Compile class constants
  *
  * @param Node\Expr\ClassConstFetch $node
  * @param CompilerContext $context
  * @return string
  */
 private function compileClassConstFetch(Node\Expr\ClassConstFetch $node, CompilerContext $context)
 {
     $className = implode('\\', $node->class->parts);
     if ($node->name === 'class') {
         return substr((string) (new ResolveTypes())->__invoke([$className], (new ContextFactory())->createForNamespace($context->getSelf()->getNamespaceName(), $context->getSelf()->getLocatedSource()->getSource()))[0]->getFqsen(), 1);
     }
     $classInfo = null;
     if ('self' === $className || 'static' === $className) {
         $classInfo = $context->getSelf();
     }
     if (null === $classInfo) {
         $classInfo = $context->getReflector()->reflect($className);
     }
     /* @var ReflectionClass $classInfo */
     $constName = $node->name;
     return $classInfo->getConstant($constName);
 }
 /**
  * Compile class constants
  *
  * @param Node\Expr\ClassConstFetch $node
  * @param CompilerContext $context
  * @return string
  */
 private function compileClassConstFetch(Node\Expr\ClassConstFetch $node, CompilerContext $context)
 {
     $className = implode('\\', $node->class->parts);
     $classInfo = null;
     if ('self' === $className || 'static' === $className) {
         $classInfo = $context->getSelf();
     }
     if (null === $classInfo) {
         $classInfo = $context->getReflector()->reflect($className);
     }
     /* @var ReflectionClass $classInfo */
     $constName = $node->name;
     return $classInfo->getConstant($constName);
 }