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 }