public void genDelegate( PropertyDescriptor declaration, PropertyDescriptor overriddenDescriptor, StackValue field) { JvmPropertyAccessorSignature jvmPropertyAccessorSignature = state .getInjector() .getJetTypeMapper() .mapGetterSignature(declaration, OwnerKind.IMPLEMENTATION); functionCodegen.genDelegate( declaration, overriddenDescriptor, field, jvmPropertyAccessorSignature.getJvmMethodSignature()); if (declaration.isVar()) { jvmPropertyAccessorSignature = state .getInjector() .getJetTypeMapper() .mapSetterSignature(declaration, OwnerKind.IMPLEMENTATION); functionCodegen.genDelegate( declaration, overriddenDescriptor, field, jvmPropertyAccessorSignature.getJvmMethodSignature()); } }
public void genFunctionOrProperty( @NotNull JetTypeParameterListOwner functionOrProperty, @NotNull ClassBuilder classBuilder) { FunctionCodegen functionCodegen = new FunctionCodegen(context, classBuilder, state, this); if (functionOrProperty instanceof JetNamedFunction) { try { functionCodegen.gen((JetNamedFunction) functionOrProperty); } catch (ProcessCanceledException e) { throw e; } catch (CompilationException e) { throw e; } catch (Exception e) { throw new CompilationException( "Failed to generate function " + functionOrProperty.getName(), e, functionOrProperty); } } else if (functionOrProperty instanceof JetProperty) { try { new PropertyCodegen(context, classBuilder, functionCodegen, this) .gen((JetProperty) functionOrProperty); } catch (ProcessCanceledException e) { throw e; } catch (CompilationException e) { throw e; } catch (Exception e) { throw new CompilationException( "Failed to generate property " + functionOrProperty.getName(), e, functionOrProperty); } } else { throw new IllegalArgumentException("Unknown parameter: " + functionOrProperty); } }
private void done() { if (clInit != null) { clInit.v.visitInsn(RETURN); FunctionCodegen.endVisit(clInit.v, "static initializer", element); } v.done(); }
private void generateStaticInitializer() { if (staticInitializerChunks.size() > 0) { MethodVisitor mv = v.newMethod(null, ACC_PUBLIC | ACC_STATIC, "<clinit>", "()V", null, null); if (state.getClassBuilderMode() == ClassBuilderMode.FULL) { mv.visitCode(); InstructionAdapter v = new InstructionAdapter(mv); for (CodeChunk chunk : staticInitializerChunks) { chunk.generate(v); } mv.visitInsn(RETURN); FunctionCodegen.endVisit(v, "static initializer", myClass); } } }
private void generateGetter(JetProperty p, PropertyDescriptor propertyDescriptor) { final JetPropertyAccessor getter = p.getGetter(); if (getter != null) { if (getter.getBodyExpression() != null) { JvmPropertyAccessorSignature signature = state.getInjector().getJetTypeMapper().mapGetterSignature(propertyDescriptor, kind); functionCodegen.generateMethod( getter, signature.getJvmMethodSignature(), true, signature.getPropertyTypeKotlinSignature(), propertyDescriptor.getGetter()); } else if (isExternallyAccessible(propertyDescriptor)) { generateDefaultGetter(p); } } else if (isExternallyAccessible(propertyDescriptor)) { generateDefaultGetter(p); } }
private void generateSetter(JetProperty p, PropertyDescriptor propertyDescriptor) { final JetPropertyAccessor setter = p.getSetter(); if (setter != null) { if (setter.getBodyExpression() != null) { final PropertySetterDescriptor setterDescriptor = propertyDescriptor.getSetter(); assert setterDescriptor != null; JvmPropertyAccessorSignature signature = state.getInjector().getJetTypeMapper().mapSetterSignature(propertyDescriptor, kind); functionCodegen.generateMethod( setter, signature.getJvmMethodSignature(), true, signature.getPropertyTypeKotlinSignature(), setterDescriptor); } else if (isExternallyAccessible(propertyDescriptor)) { generateDefaultSetter(p); } } else if (isExternallyAccessible(propertyDescriptor) && propertyDescriptor.isVar()) { generateDefaultSetter(p); } }
public void generateDefaultSetter( PropertyDescriptor propertyDescriptor, int flags, PsiElement origin) { if (propertyDescriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { throw new IllegalStateException("must not generate code for fake overrides"); } if (kind == OwnerKind.TRAIT_IMPL) { return; } if (kind == OwnerKind.NAMESPACE) { flags |= Opcodes.ACC_STATIC; } PsiElement psiElement = state .getBindingContext() .get( BindingContext.DESCRIPTOR_TO_DECLARATION, propertyDescriptor.getContainingDeclaration()); boolean isTrait = psiElement instanceof JetClass && ((JetClass) psiElement).isTrait(); if (isTrait && !(kind instanceof OwnerKind.DelegateKind)) flags |= Opcodes.ACC_ABSTRACT; if (propertyDescriptor.getModality() == Modality.FINAL) { flags |= Opcodes.ACC_FINAL; } JvmPropertyAccessorSignature signature = state.getInjector().getJetTypeMapper().mapSetterSignature(propertyDescriptor, kind); final String descriptor = signature.getJvmMethodSignature().getAsmMethod().getDescriptor(); MethodVisitor mv = v.newMethod( origin, flags, setterName(propertyDescriptor.getName()), descriptor, null, null); generateJetPropertyAnnotation( mv, signature.getPropertyTypeKotlinSignature(), signature.getJvmMethodSignature().getKotlinTypeParameter()); if (propertyDescriptor.getSetter() != null) { assert !propertyDescriptor.getSetter().hasBody(); AnnotationCodegen.forMethod(mv, state.getInjector().getJetTypeMapper()) .genAnnotations(propertyDescriptor.getSetter()); } if (v.generateCode() != ClassBuilder.Mode.SIGNATURES && (!isTrait || kind instanceof OwnerKind.DelegateKind)) { if (propertyDescriptor.getModality() != Modality.ABSTRACT) { mv.visitCode(); if (v.generateCode() == ClassBuilder.Mode.STUBS) { StubCodegen.generateStubThrow(mv); } else { InstructionAdapter iv = new InstructionAdapter(mv); final Type type = state .getInjector() .getJetTypeMapper() .mapType(propertyDescriptor.getType(), MapTypeMode.VALUE); int paramCode = 0; if (kind != OwnerKind.NAMESPACE) { iv.load(0, JetTypeMapper.TYPE_OBJECT); paramCode = 1; } if ((kind instanceof OwnerKind.DelegateKind) != (propertyDescriptor.getKind() == FunctionDescriptor.Kind.DELEGATION)) { throw new IllegalStateException("mismatching kind in " + propertyDescriptor); } if (kind instanceof OwnerKind.DelegateKind) { OwnerKind.DelegateKind dk = (OwnerKind.DelegateKind) kind; iv.load(0, JetTypeMapper.TYPE_OBJECT); dk.getDelegate().put(JetTypeMapper.TYPE_OBJECT, iv); iv.load(paramCode, type); iv.invokeinterface( dk.getOwnerClass(), setterName(propertyDescriptor.getName()), descriptor); } else { iv.load(paramCode, type); iv.visitFieldInsn( kind == OwnerKind.NAMESPACE ? Opcodes.PUTSTATIC : Opcodes.PUTFIELD, state.getInjector().getJetTypeMapper().getOwner(propertyDescriptor, kind), propertyDescriptor.getName(), type.getDescriptor()); } iv.visitInsn(Opcodes.RETURN); } } FunctionCodegen.endVisit(mv, "setter", origin); } }