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.asm4.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 ParametersBuilder addNextParameter(@NotNull Type type, boolean skipped, @Nullable ParameterInfo original) { 047 addParameter(new ParameterInfo(type, skipped, nextIndex, original != null ? original.getIndex() : -1)); 048 return this; 049 } 050 051 @NotNull 052 public CapturedParamInfo addCapturedParam( 053 @NotNull CapturedParamInfo original, 054 @NotNull String newFieldName 055 ) { 056 CapturedParamInfo info = new CapturedParamInfo(original.desc, newFieldName, original.isSkipped, nextCaptured, original.getIndex()); 057 info.setLambda(original.getLambda()); 058 return addCapturedParameter(info); 059 } 060 061 @NotNull 062 public CapturedParamInfo addCapturedParam( 063 @NotNull String fieldName, 064 @NotNull Type type, 065 boolean skipped, 066 @Nullable ParameterInfo original, 067 @NotNull CapturedParamOwner containingLambda 068 ) { 069 CapturedParamInfo info = 070 new CapturedParamInfo(CapturedParamDesc.createDesc(containingLambda, fieldName, type), skipped, nextCaptured, 071 original != null ? original.getIndex() : -1); 072 if (original != null) { 073 info.setLambda(original.getLambda()); 074 } 075 return addCapturedParameter(info); 076 } 077 078 private void addParameter(ParameterInfo info) { 079 params.add(info); 080 nextIndex += info.getType().getSize(); 081 } 082 083 private CapturedParamInfo addCapturedParameter(CapturedParamInfo info) { 084 capturedParams.add(info); 085 nextCaptured += info.getType().getSize(); 086 return info; 087 } 088 089 public List<ParameterInfo> build() { 090 return Collections.unmodifiableList(params); 091 } 092 093 public List<CapturedParamInfo> buildCaptured() { 094 return Collections.unmodifiableList(capturedParams); 095 } 096 097 public List<ParameterInfo> buildWithStubs() { 098 return Parameters.addStubs(build()); 099 } 100 101 public List<CapturedParamInfo> buildCapturedWithStubs() { 102 return Parameters.shiftAndAddStubs(buildCaptured(), nextIndex); 103 } 104 105 public Parameters buildParameters() { 106 return new Parameters(buildWithStubs(), buildCapturedWithStubs()); 107 } 108 }