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.k2js.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.jet.lang.psi.*;
023    import org.jetbrains.jet.lexer.JetToken;
024    import org.jetbrains.jet.lexer.JetTokens;
025    
026    import java.util.Collections;
027    import java.util.List;
028    
029    public final class PsiUtils {
030    
031        private PsiUtils() {
032        }
033    
034        @Nullable
035        public static JetSimpleNameExpression getSelectorAsSimpleName(@NotNull JetQualifiedExpression expression) {
036            JetExpression selectorExpression = getSelector(expression);
037            if (!(selectorExpression instanceof JetSimpleNameExpression)) {
038                return null;
039            }
040            return (JetSimpleNameExpression) selectorExpression;
041        }
042    
043        @NotNull
044        public static JetExpression getSelector(@NotNull JetQualifiedExpression expression) {
045            JetExpression selectorExpression = expression.getSelectorExpression();
046            assert selectorExpression != null : "Selector should not be null.";
047            return selectorExpression;
048        }
049    
050        @NotNull
051        public static JetSimpleNameExpression getNotNullSimpleNameSelector(@NotNull JetQualifiedExpression expression) {
052            JetSimpleNameExpression selectorAsSimpleName = getSelectorAsSimpleName(expression);
053            assert selectorAsSimpleName != null;
054            return selectorAsSimpleName;
055        }
056    
057        @NotNull
058        public static JetToken getOperationToken(@NotNull JetOperationExpression expression) {
059            JetSimpleNameExpression operationExpression = expression.getOperationReference();
060            IElementType elementType = operationExpression.getReferencedNameElementType();
061            assert elementType instanceof JetToken : "Unary expression should have operation token of type JetToken";
062            return (JetToken) elementType;
063        }
064    
065        @NotNull
066        public static JetExpression getBaseExpression(@NotNull JetUnaryExpression expression) {
067            JetExpression baseExpression = expression.getBaseExpression();
068            assert baseExpression != null;
069            return baseExpression;
070        }
071    
072        public static boolean isPrefix(@NotNull JetUnaryExpression expression) {
073            return (expression instanceof JetPrefixExpression);
074        }
075    
076        public static boolean isAssignment(JetToken token) {
077            return (token == JetTokens.EQ);
078        }
079    
080        public static boolean isInOrNotInOperation(@NotNull JetBinaryExpression binaryExpression) {
081            return isInOperation(binaryExpression) || isNotInOperation(binaryExpression);
082        }
083    
084        public static boolean isNotInOperation(@NotNull JetBinaryExpression binaryExpression) {
085            return (binaryExpression.getOperationToken() == JetTokens.NOT_IN);
086        }
087    
088        public static boolean isNegatedOperation(@NotNull JetBinaryExpression binaryExpression) {
089            return (binaryExpression.getOperationToken() == JetTokens.EXCLEQ) || isNotInOperation(binaryExpression);
090        }
091    
092        private static boolean isInOperation(@NotNull JetBinaryExpression binaryExpression) {
093            return (binaryExpression.getOperationToken() == JetTokens.IN_KEYWORD);
094        }
095    
096        @NotNull
097        public static JetExpression getCallee(@NotNull JetCallExpression expression) {
098            JetExpression calleeExpression = expression.getCalleeExpression();
099            assert calleeExpression != null;
100            return calleeExpression;
101        }
102    
103        @NotNull
104        public static JetExpression getLoopBody(@NotNull JetLoopExpression expression) {
105            JetExpression body = expression.getBody();
106            assert body != null : "Loops cannot have null bodies.";
107            return body;
108        }
109    
110        @Nullable
111        public static JetParameter getLoopParameter(@NotNull JetForExpression expression) {
112            return expression.getLoopParameter();
113        }
114    
115        @NotNull
116        public static List<JetParameter> getPrimaryConstructorParameters(@NotNull JetClassOrObject classDeclaration) {
117            if (classDeclaration instanceof JetClass) {
118                return ((JetClass) classDeclaration).getPrimaryConstructorParameters();
119            }
120            return Collections.emptyList();
121        }
122    
123        @NotNull
124        public static JetExpression getLoopRange(@NotNull JetForExpression expression) {
125            JetExpression rangeExpression = expression.getLoopRange();
126            assert rangeExpression != null;
127            return rangeExpression;
128        }
129    }