001    /*
002     * Copyright 2010-2014 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;
018    
019    import org.jetbrains.annotations.NotNull;
020    import org.jetbrains.jet.lang.resolve.calls.model.DefaultValueArgument;
021    import org.jetbrains.jet.lang.resolve.calls.model.ExpressionValueArgument;
022    import org.jetbrains.jet.lang.resolve.calls.model.ResolvedValueArgument;
023    import org.jetbrains.jet.lang.resolve.calls.model.VarargValueArgument;
024    
025    import java.util.List;
026    
027    public abstract class ArgumentGenerator {
028        /**
029         * @return a bit mask of default arguments which should be passed as the last argument to $default method, if there were any default
030         * arguments, or 0 if there were none
031         */
032        public int generate(@NotNull List<ResolvedValueArgument> valueArguments) {
033            int mask = 0;
034            int n = valueArguments.size();
035            for (int i = 0; i < n; i++) {
036                ResolvedValueArgument argument = valueArguments.get(i);
037                if (argument instanceof ExpressionValueArgument) {
038                    generateExpression(i, (ExpressionValueArgument) argument);
039                }
040                else if (argument instanceof DefaultValueArgument) {
041                    mask |= 1 << i;
042                    generateDefault(i, (DefaultValueArgument) argument);
043                }
044                else if (argument instanceof VarargValueArgument) {
045                    generateVararg(i, (VarargValueArgument) argument);
046                }
047                else {
048                    generateOther(i, argument);
049                }
050            }
051    
052            return mask;
053        }
054    
055        protected void generateExpression(int i, @NotNull ExpressionValueArgument argument) {
056            throw new UnsupportedOperationException("Unsupported expression value argument #" + i + ": " + argument);
057        }
058    
059        protected void generateDefault(int i, @NotNull DefaultValueArgument argument) {
060            throw new UnsupportedOperationException("Unsupported default value argument #" + i + ": " + argument);
061        }
062    
063        protected void generateVararg(int i, @NotNull VarargValueArgument argument) {
064            throw new UnsupportedOperationException("Unsupported vararg value argument #" + i + ": " + argument);
065        }
066    
067        @SuppressWarnings("MethodMayBeStatic") // is supposed to be overridden
068        protected void generateOther(int i, @NotNull ResolvedValueArgument argument) {
069            throw new UnsupportedOperationException("Unsupported value argument #" + i + ": " + argument);
070        }
071    }