001    /*
002     * Copyright 2010-2015 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.kotlin.js.translate.utils;
018    
019    import com.intellij.psi.tree.IElementType;
020    import org.jetbrains.annotations.NotNull;
021    import org.jetbrains.annotations.Nullable;
022    import org.jetbrains.kotlin.descriptors.CallableDescriptor;
023    import org.jetbrains.kotlin.lexer.KtToken;
024    import org.jetbrains.kotlin.lexer.KtTokens;
025    import org.jetbrains.kotlin.psi.*;
026    import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
027    import org.jetbrains.kotlin.resolve.calls.model.VariableAsFunctionResolvedCall;
028    
029    import java.util.Collections;
030    import java.util.List;
031    
032    public final class PsiUtils {
033    
034        private PsiUtils() {
035        }
036    
037        @Nullable
038        public static KtSimpleNameExpression getSimpleName(@NotNull KtExpression expression) {
039            if (expression instanceof KtSimpleNameExpression) {
040                return (KtSimpleNameExpression) expression;
041            }
042    
043            if (expression instanceof KtQualifiedExpression) {
044                return getSelectorAsSimpleName((KtQualifiedExpression) expression);
045            }
046    
047            return null;
048        }
049    
050        @Nullable
051        public static KtSimpleNameExpression getSelectorAsSimpleName(@NotNull KtQualifiedExpression expression) {
052            KtExpression selectorExpression = getSelector(expression);
053            if (!(selectorExpression instanceof KtSimpleNameExpression)) {
054                return null;
055            }
056            return (KtSimpleNameExpression) selectorExpression;
057        }
058    
059        @NotNull
060        public static KtExpression getSelector(@NotNull KtQualifiedExpression expression) {
061            KtExpression selectorExpression = expression.getSelectorExpression();
062            assert selectorExpression != null : "Selector should not be null.";
063            return selectorExpression;
064        }
065    
066        @NotNull
067        public static KtSimpleNameExpression getNotNullSimpleNameSelector(@NotNull KtQualifiedExpression expression) {
068            KtSimpleNameExpression selectorAsSimpleName = getSelectorAsSimpleName(expression);
069            assert selectorAsSimpleName != null;
070            return selectorAsSimpleName;
071        }
072    
073        @NotNull
074        public static KtToken getOperationToken(@NotNull KtOperationExpression expression) {
075            KtSimpleNameExpression operationExpression = expression.getOperationReference();
076            IElementType elementType = operationExpression.getReferencedNameElementType();
077            assert elementType instanceof KtToken : "Expected KtToken type, but " + elementType.getClass() + ", expression: " + expression.getText();
078            return (KtToken) elementType;
079        }
080    
081        @NotNull
082        public static KtExpression getBaseExpression(@NotNull KtUnaryExpression expression) {
083            KtExpression baseExpression = expression.getBaseExpression();
084            assert baseExpression != null;
085            return baseExpression;
086        }
087    
088        public static boolean isPrefix(@NotNull KtUnaryExpression expression) {
089            return (expression instanceof KtPrefixExpression);
090        }
091    
092        public static boolean isAssignment(KtToken token) {
093            return (token == KtTokens.EQ);
094        }
095    
096        public static boolean isInOrNotInOperation(@NotNull KtBinaryExpression binaryExpression) {
097            return isInOperation(binaryExpression) || isNotInOperation(binaryExpression);
098        }
099    
100        private static boolean isNotInOperation(@NotNull KtBinaryExpression binaryExpression) {
101            return (binaryExpression.getOperationToken() == KtTokens.NOT_IN);
102        }
103    
104        public static boolean isNegatedOperation(@NotNull KtBinaryExpression binaryExpression) {
105            return (binaryExpression.getOperationToken() == KtTokens.EXCLEQ) || isNotInOperation(binaryExpression);
106        }
107    
108        private static boolean isInOperation(@NotNull KtBinaryExpression binaryExpression) {
109            return (binaryExpression.getOperationToken() == KtTokens.IN_KEYWORD);
110        }
111    
112        @NotNull
113        public static List<KtParameter> getPrimaryConstructorParameters(@NotNull KtClassOrObject classDeclaration) {
114            if (classDeclaration instanceof KtClass) {
115                return classDeclaration.getPrimaryConstructorParameters();
116            }
117            return Collections.emptyList();
118        }
119    
120        @NotNull
121        public static KtExpression getLoopRange(@NotNull KtForExpression expression) {
122            KtExpression rangeExpression = expression.getLoopRange();
123            assert rangeExpression != null;
124            return rangeExpression;
125        }
126    
127        @NotNull
128        public static CallableDescriptor getFunctionDescriptor(ResolvedCall<?> resolvedCall) {
129            if (resolvedCall instanceof VariableAsFunctionResolvedCall) {
130                return  ((VariableAsFunctionResolvedCall) resolvedCall).getVariableCall().getCandidateDescriptor();
131            }
132    
133            return resolvedCall.getCandidateDescriptor();
134        }
135    }