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 }