@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); }
@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()); }
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; }
@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; }
@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; }
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; }