1418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
2418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager// for details. All rights reserved. Use of this source code is governed by a
3418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager// BSD-style license that can be found in the LICENSE file.
4418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager
5418d1ca139ea11316113beafbb3b3dd3fd5587aMads Agerpackage com.android.tools.r8.ir.desugar;
6418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager
7418d1ca139ea11316113beafbb3b3dd3fd5587aMads Agerimport com.android.tools.r8.graph.DexItemFactory;
8418d1ca139ea11316113beafbb3b3dd3fd5587aMads Agerimport com.android.tools.r8.graph.DexMethod;
9418d1ca139ea11316113beafbb3b3dd3fd5587aMads Agerimport com.android.tools.r8.graph.DexType;
10418d1ca139ea11316113beafbb3b3dd3fd5587aMads Agerimport com.android.tools.r8.graph.DexTypeList;
112da874a28e1a98dc5d2500a554f9143d6309a132Stephan Herhutimport com.android.tools.r8.ir.synthetic.SingleBlockSourceCode;
12418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager
13418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager// Represents source code of synthesized lambda class methods.
14418d1ca139ea11316113beafbb3b3dd3fd5587aMads Agerabstract class SynthesizedLambdaSourceCode extends SingleBlockSourceCode {
152da874a28e1a98dc5d2500a554f9143d6309a132Stephan Herhut
16418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager  final DexMethod currentMethod;
17418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager  final LambdaClass lambda;
18418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager
19418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager  SynthesizedLambdaSourceCode(DexType receiver, LambdaClass lambda, DexMethod currentMethod) {
20418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager    super(receiver, currentMethod.proto);
21418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager    this.lambda = lambda;
22418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager    this.currentMethod = currentMethod;
23418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager  }
24418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager
25418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager  SynthesizedLambdaSourceCode(LambdaClass lambda, DexMethod currentMethod) {
26418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager    this(lambda.type, lambda, currentMethod);
27418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager  }
28418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager
29418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager  final LambdaDescriptor descriptor() {
30418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager    return lambda.descriptor;
31418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager  }
32418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager
33418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager  final DexType[] captures() {
34418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager    DexTypeList captures = descriptor().captures;
35418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager    assert captures != null;
36418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager    return captures.values;
37418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager  }
38418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager
39418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager  final DexItemFactory factory() {
40418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager    return lambda.rewriter.factory;
41418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager  }
42418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager
43418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager  final int enforceParameterType(int register, DexType paramType, DexType enforcedType) {
44418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager    // `paramType` must be either same as `enforcedType` or both must be class
45418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager    // types and `enforcedType` must be a subclass of `paramType` in which case
46418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager    // a cast need to be inserted.
47418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager    if (paramType != enforcedType) {
48418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager      assert LambdaDescriptor.isSameOrDerived(factory(), enforcedType, paramType);
49418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager      add(builder -> builder.addCheckCast(register, enforcedType));
50418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager    }
51418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager    return register;
52418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager  }
53418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager
54418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager  @Override
55418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager  public String toString() {
56418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager    return currentMethod.toSourceString();
57418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager  }
58418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager}
59418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager
60