Esempio n. 1
0
  @NotNull
  public static Pair<FunctionDescriptor, PsiElement> getContainingFunctionSkipFunctionLiterals(
      @Nullable DeclarationDescriptor startDescriptor, boolean strict) {
    FunctionDescriptor containingFunctionDescriptor =
        DescriptorUtils.getParentOfType(startDescriptor, FunctionDescriptor.class, strict);
    PsiElement containingFunction =
        containingFunctionDescriptor != null
            ? DescriptorToSourceUtils.getSourceFromDescriptor(containingFunctionDescriptor)
            : null;
    while (containingFunction instanceof JetFunctionLiteral) {
      containingFunctionDescriptor =
          DescriptorUtils.getParentOfType(containingFunctionDescriptor, FunctionDescriptor.class);
      containingFunction =
          containingFunctionDescriptor != null
              ? DescriptorToSourceUtils.getSourceFromDescriptor(containingFunctionDescriptor)
              : null;
    }

    return new Pair<FunctionDescriptor, PsiElement>(
        containingFunctionDescriptor, containingFunction);
  }
Esempio n. 2
0
        @Override
        public boolean isVisible(
            @NotNull ReceiverValue receiver,
            @NotNull DeclarationDescriptorWithVisibility what,
            @NotNull DeclarationDescriptor from) {
          ClassDescriptor classDescriptor =
              DescriptorUtils.getParentOfType(what, ClassDescriptor.class);
          if (DescriptorUtils.isCompanionObject(classDescriptor)) {
            classDescriptor =
                DescriptorUtils.getParentOfType(classDescriptor, ClassDescriptor.class);
          }
          if (classDescriptor == null) return false;

          ClassDescriptor fromClass =
              DescriptorUtils.getParentOfType(from, ClassDescriptor.class, false);
          if (fromClass == null) return false;
          if (DescriptorUtils.isSubclass(fromClass, classDescriptor)) {
            return true;
          }
          return isVisible(receiver, what, fromClass.getContainingDeclaration());
        }
Esempio n. 3
0
  private boolean isDefinedInInlineFunction(
      @NotNull DeclarationDescriptorWithVisibility startDescriptor) {
    DeclarationDescriptorWithVisibility parent = startDescriptor;

    while (parent != null) {
      if (parent.getContainingDeclaration() == descriptor) return true;

      parent = DescriptorUtils.getParentOfType(parent, DeclarationDescriptorWithVisibility.class);
    }

    return false;
  }
Esempio n. 4
0
 @Nullable
 public static DeclarationDescriptorWithVisibility findInvisibleMember(
     @NotNull ReceiverValue receiver,
     @NotNull DeclarationDescriptorWithVisibility what,
     @NotNull DeclarationDescriptor from) {
   DeclarationDescriptorWithVisibility parent = what;
   while (parent != null && parent.getVisibility() != LOCAL) {
     if (!parent.getVisibility().isVisible(receiver, parent, from)) {
       return parent;
     }
     parent = DescriptorUtils.getParentOfType(parent, DeclarationDescriptorWithVisibility.class);
   }
   return null;
 }
Esempio n. 5
0
        @Override
        public boolean isVisible(
            @NotNull ReceiverValue thisObject,
            @NotNull DeclarationDescriptorWithVisibility what,
            @NotNull DeclarationDescriptor from) {
          if (PRIVATE.isVisible(thisObject, what, from)) {
            DeclarationDescriptor classDescriptor =
                DescriptorUtils.getParentOfType(what, ClassDescriptor.class);

            if (classDescriptor != null && thisObject instanceof ClassReceiver) {
              return ((ClassReceiver) thisObject).getDeclarationDescriptor().getOriginal()
                  == classDescriptor.getOriginal();
            }
          }
          return false;
        }
Esempio n. 6
0
  private void generateBridge(@NotNull Method bridge, @NotNull Method delegate) {
    if (bridge.equals(delegate)) return;

    MethodVisitor mv =
        v.newMethod(
            OtherOrigin(element, funDescriptor),
            ACC_PUBLIC | ACC_BRIDGE,
            bridge.getName(),
            bridge.getDescriptor(),
            null,
            ArrayUtil.EMPTY_STRING_ARRAY);

    if (state.getClassBuilderMode() != ClassBuilderMode.FULL) return;

    mv.visitCode();

    InstructionAdapter iv = new InstructionAdapter(mv);
    ImplementationBodyCodegen.markLineNumberForSyntheticFunction(
        DescriptorUtils.getParentOfType(funDescriptor, ClassDescriptor.class), iv);

    iv.load(0, asmType);

    ReceiverParameterDescriptor receiver = funDescriptor.getExtensionReceiverParameter();
    int count = 1;
    if (receiver != null) {
      StackValue.local(count, bridge.getArgumentTypes()[count - 1])
          .put(typeMapper.mapType(receiver.getType()), iv);
      count++;
    }

    List<ValueParameterDescriptor> params = funDescriptor.getValueParameters();
    for (ValueParameterDescriptor param : params) {
      StackValue.local(count, bridge.getArgumentTypes()[count - 1])
          .put(typeMapper.mapType(param.getType()), iv);
      count++;
    }

    iv.invokevirtual(
        asmType.getInternalName(), delegate.getName(), delegate.getDescriptor(), false);
    StackValue.onStack(delegate.getReturnType()).put(bridge.getReturnType(), iv);

    iv.areturn(bridge.getReturnType());

    FunctionCodegen.endVisit(mv, "bridge", element);
  }
 // TODO: navigate to inner classes
 @Nullable
 private static ClassId getContainerClassId(@NotNull DeclarationDescriptor referencedDescriptor) {
   ClassOrPackageFragmentDescriptor containerDescriptor =
       DescriptorUtils.getParentOfType(
           referencedDescriptor, ClassOrPackageFragmentDescriptor.class, false);
   if (containerDescriptor instanceof PackageFragmentDescriptor) {
     return getPackageClassId(((PackageFragmentDescriptor) containerDescriptor).getFqName());
   }
   if (containerDescriptor instanceof ClassDescriptor) {
     if (containerDescriptor.getContainingDeclaration() instanceof ClassDescriptor
         || ExpressionTypingUtils.isLocal(
             containerDescriptor.getContainingDeclaration(), containerDescriptor)) {
       return getContainerClassId(containerDescriptor.getContainingDeclaration());
     }
     return getClassId((ClassDescriptor) containerDescriptor);
   }
   return null;
 }
 // TODO: navigate to inner classes
 @Nullable
 public static ClassId getContainerClassId(@NotNull DeclarationDescriptor referencedDescriptor) {
   ClassOrPackageFragmentDescriptor containerDescriptor =
       DescriptorUtils.getParentOfType(
           referencedDescriptor, ClassOrPackageFragmentDescriptor.class, false);
   if (containerDescriptor instanceof PackageFragmentDescriptor) {
     return PackageClassUtils.getPackageClassId(getFqName(containerDescriptor).toSafe());
   }
   if (containerDescriptor instanceof ClassDescriptor) {
     ClassId classId = DescriptorUtilPackage.getClassId((ClassDescriptor) containerDescriptor);
     if (isInterface(containerDescriptor)) {
       FqName relativeClassName = classId.getRelativeClassName();
       // TODO test nested trait fun inlining
       classId =
           new ClassId(
               classId.getPackageFqName(),
               Name.identifier(
                   relativeClassName.shortName().asString() + JvmAbi.DEFAULT_IMPLS_SUFFIX));
     }
     return classId;
   }
   return null;
 }