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
017package org.jetbrains.jet.lang.psi;
018
019import com.google.common.collect.Lists;
020import com.intellij.lang.ASTNode;
021import org.jetbrains.annotations.NotNull;
022import org.jetbrains.annotations.Nullable;
023import org.jetbrains.jet.JetNodeTypes;
024import org.jetbrains.jet.lexer.JetToken;
025import org.jetbrains.jet.lexer.JetTokens;
026
027import java.util.ArrayList;
028import java.util.Collections;
029import java.util.List;
030
031public class JetFunctionType extends JetTypeElement {
032
033    public static final JetToken RETURN_TYPE_SEPARATOR = JetTokens.ARROW;
034
035    public JetFunctionType(@NotNull ASTNode node) {
036        super(node);
037    }
038
039    @NotNull
040    @Override
041    public List<JetTypeReference> getTypeArgumentsAsTypes() {
042        ArrayList<JetTypeReference> result = Lists.newArrayList();
043        JetTypeReference receiverTypeRef = getReceiverTypeRef();
044        if (receiverTypeRef != null) {
045            result.add(receiverTypeRef);
046        }
047        for (JetParameter jetParameter : getParameters()) {
048            result.add(jetParameter.getTypeReference());
049        }
050        JetTypeReference returnTypeRef = getReturnTypeRef();
051        if (returnTypeRef != null) {
052            result.add(returnTypeRef);
053        }
054        return result;
055    }
056
057    @Override
058    public void accept(@NotNull JetVisitorVoid visitor) {
059        visitor.visitFunctionType(this);
060    }
061
062    @Override
063    public <R, D> R accept(@NotNull JetVisitor<R, D> visitor, D data) {
064        return visitor.visitFunctionType(this, data);
065    }
066
067    @Nullable
068    public JetParameterList getParameterList() {
069        return (JetParameterList) findChildByType(JetNodeTypes.VALUE_PARAMETER_LIST);
070    }
071
072    @NotNull
073    public List<JetParameter> getParameters() {
074        JetParameterList list = getParameterList();
075        return list != null ? list.getParameters() : Collections.<JetParameter>emptyList();
076    }
077
078    @Nullable
079    public JetTypeReference getReceiverTypeRef() {
080        JetFunctionTypeReceiver receiverDeclaration = (JetFunctionTypeReceiver) findChildByType(JetNodeTypes.FUNCTION_TYPE_RECEIVER);
081        if (receiverDeclaration == null) {
082            return null;
083        }
084        return receiverDeclaration.getTypeReference();
085    }
086
087    @Nullable
088    public JetTypeReference getReturnTypeRef() {
089        return (JetTypeReference) findChildByType(JetNodeTypes.TYPE_REFERENCE);
090    }
091}