001 /* 002 * Copyright 2010-2013 JetBrains s.r.o. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017 package org.jetbrains.jet.codegen.inline; 018 019 import org.jetbrains.annotations.NotNull; 020 import org.jetbrains.annotations.Nullable; 021 import org.jetbrains.org.objectweb.asm.Type; 022 023 import java.util.ArrayList; 024 import java.util.Collections; 025 import java.util.List; 026 027 public class ParametersBuilder { 028 029 private final List<ParameterInfo> params = new ArrayList<ParameterInfo>(); 030 private final List<CapturedParamInfo> capturedParams = new ArrayList<CapturedParamInfo>(); 031 032 private int nextIndex = 0; 033 private int nextCaptured = 0; 034 035 public static ParametersBuilder newBuilder() { 036 return new ParametersBuilder(); 037 } 038 039 public ParameterInfo addThis(Type type, boolean skipped) { 040 ParameterInfo info = new ParameterInfo(type, skipped, nextIndex, -1); 041 addParameter(info); 042 return info; 043 } 044 045 @NotNull 046 public ParameterInfo addNextParameter(@NotNull Type type, boolean skipped, @Nullable ParameterInfo original) { 047 return addParameter(new ParameterInfo(type, skipped, nextIndex, original != null ? original.getIndex() : -1)); 048 } 049 050 @NotNull 051 public CapturedParamInfo addCapturedParam( 052 @NotNull CapturedParamInfo original, 053 @NotNull String newFieldName 054 ) { 055 CapturedParamInfo info = new CapturedParamInfo(original.desc, newFieldName, original.isSkipped, nextCaptured, original.getIndex()); 056 info.setLambda(original.getLambda()); 057 return addCapturedParameter(info); 058 } 059 060 @NotNull 061 public CapturedParamInfo addCapturedParamCopy( 062 @NotNull CapturedParamInfo copyFrom 063 ) { 064 CapturedParamInfo info = copyFrom.newIndex(nextCaptured); 065 return addCapturedParameter(info); 066 } 067 068 @NotNull 069 public CapturedParamInfo addCapturedParam( 070 @NotNull CapturedParamOwner containingLambda, 071 @NotNull String fieldName, 072 @NotNull Type type, 073 boolean skipped, 074 @Nullable ParameterInfo original 075 ) { 076 CapturedParamInfo info = 077 new CapturedParamInfo(CapturedParamDesc.createDesc(containingLambda, fieldName, type), skipped, nextCaptured, 078 original != null ? original.getIndex() : -1); 079 if (original != null) { 080 info.setLambda(original.getLambda()); 081 } 082 return addCapturedParameter(info); 083 } 084 085 private ParameterInfo addParameter(ParameterInfo info) { 086 params.add(info); 087 nextIndex += info.getType().getSize(); 088 return info; 089 } 090 091 private CapturedParamInfo addCapturedParameter(CapturedParamInfo info) { 092 capturedParams.add(info); 093 nextCaptured += info.getType().getSize(); 094 return info; 095 } 096 097 @NotNull 098 public List<ParameterInfo> listNotCaptured() { 099 return Collections.unmodifiableList(params); 100 } 101 102 @NotNull 103 public List<CapturedParamInfo> listCaptured() { 104 return Collections.unmodifiableList(capturedParams); 105 } 106 107 @NotNull 108 private List<ParameterInfo> buildWithStubs() { 109 return Parameters.addStubs(listNotCaptured()); 110 } 111 112 private List<CapturedParamInfo> buildCapturedWithStubs() { 113 return Parameters.shiftAndAddStubs(listCaptured(), nextIndex); 114 } 115 116 public Parameters buildParameters() { 117 return new Parameters(buildWithStubs(), buildCapturedWithStubs()); 118 } 119 120 public int getNextValueParameterIndex() { 121 return nextIndex; 122 } 123 }