[groovy] extract conditional type calculator

This commit is contained in:
Daniil Ovchinnikov
2018-05-28 18:30:30 +03:00
parent e89edae299
commit cb892dc50d
3 changed files with 18 additions and 42 deletions
@@ -1,53 +1,17 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions;
import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiType;
import com.intellij.util.Function;
import com.intellij.util.NullableFunction;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes;
import org.jetbrains.plugins.groovy.lang.psi.GroovyElementVisitor;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrConditionalExpression;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression;
import org.jetbrains.plugins.groovy.lang.psi.dataFlow.types.TypeInferenceHelper;
/**
* @author ilyas
*/
public class GrConditionalExprImpl extends GrExpressionImpl implements GrConditionalExpression {
private static final Function<GrConditionalExpression, PsiType> TYPE_CALCULATOR =
(NullableFunction<GrConditionalExpression, PsiType>)conditional -> {
GrExpression thenBranch = conditional.getThenBranch();
GrExpression elseBranch = conditional.getElseBranch();
if (thenBranch == null) {
if (elseBranch != null) return elseBranch.getType();
}
else {
if (elseBranch == null) return thenBranch.getType();
PsiType thenType = thenBranch.getType();
PsiType elseType = elseBranch.getType();
return TypesUtil.getLeastUpperBoundNullable(thenType, elseType, conditional.getManager());
}
return null;
};
public GrConditionalExprImpl(@NotNull ASTNode node) {
super(node);
@@ -87,11 +51,6 @@ public class GrConditionalExprImpl extends GrExpressionImpl implements GrConditi
return null;
}
@Override
public PsiType getType() {
return TypeInferenceHelper.getCurrentContext().getExpressionType(this, TYPE_CALCULATOR);
}
@Override
public void accept(GroovyElementVisitor visitor) {
visitor.visitConditionalExpression(this);
@@ -0,0 +1,15 @@
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.plugins.groovy.lang.typing
import com.intellij.psi.PsiType
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrConditionalExpression
import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil.getLeastUpperBoundNullable
class DefaultConditionalTypeCalculator : GrTypeCalculator<GrConditionalExpression> {
override fun getType(expression: GrConditionalExpression): PsiType? {
val thenType = expression.thenBranch?.type
val elseType = expression.elseBranch?.type
return getLeastUpperBoundNullable(thenType, elseType, expression.manager)
}
}
+2
View File
@@ -189,6 +189,8 @@
implementationClass="org.jetbrains.plugins.groovy.lang.typing.DefaultBuiltinTypeClassTypeCalculator"/>
<typeCalculator forClass="org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrSafeCastExpression" order="last"
implementationClass="org.jetbrains.plugins.groovy.lang.typing.DefaultSafeCaseTypeCalculator"/>
<typeCalculator forClass="org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrConditionalExpression" order="last"
implementationClass="org.jetbrains.plugins.groovy.lang.typing.DefaultConditionalTypeCalculator"/>
<scriptTypeDetector implementation="org.jetbrains.plugins.groovy.gant.GantScriptTypeDetector"/>