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