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