Ejemplo n.º 1
0
  public GeneratedAnonymousClassDescriptor generateObjectLiteral(
      JetObjectLiteralExpression literal, ObjectOrClosureCodegen closure) {
    JetObjectDeclaration objectDeclaration = literal.getObjectDeclaration();
    Pair<String, ClassBuilder> nameAndVisitor = forAnonymousSubclass(objectDeclaration);

    closure.cv = nameAndVisitor.getSecond();
    closure.name = nameAndVisitor.getFirst();
    final CodegenContext objectContext =
        closure.context.intoAnonymousClass(
            closure,
            getBindingContext().get(BindingContext.CLASS, objectDeclaration),
            OwnerKind.IMPLEMENTATION,
            typeMapper);

    new ImplementationBodyCodegen(
            objectDeclaration, objectContext, nameAndVisitor.getSecond(), this)
        .generate();

    ConstructorDescriptor constructorDescriptor =
        closure.state.getBindingContext().get(BindingContext.CONSTRUCTOR, objectDeclaration);
    CallableMethod callableMethod =
        closure
            .state
            .getTypeMapper()
            .mapToCallableMethod(
                constructorDescriptor,
                OwnerKind.IMPLEMENTATION,
                typeMapper.hasThis0(constructorDescriptor.getContainingDeclaration()));
    return new GeneratedAnonymousClassDescriptor(
        nameAndVisitor.first,
        callableMethod.getSignature().getAsmMethod(),
        objectContext.outerWasUsed,
        null);
  }
Ejemplo n.º 2
0
 @Override
 public StackValue generate(
     ExpressionCodegen codegen,
     InstructionAdapter v,
     @NotNull Type expectedType,
     PsiElement element,
     List<JetExpression> arguments,
     StackValue receiver,
     @NotNull GenerationState state) {
   final CallableMethod callableMethod =
       state.getTypeMapper().mapToCallableMethod(method, false, OwnerKind.IMPLEMENTATION);
   codegen.invokeMethodWithArguments(callableMethod, (JetCallExpression) element, receiver);
   return StackValue.onStack(callableMethod.getSignature().getAsmMethod().getReturnType());
 }