From cb892dc50d54f8bba179111ae7428e92925bb596 Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Mon, 28 May 2018 18:30:30 +0300 Subject: [PATCH] [groovy] extract conditional type calculator --- .../expressions/GrConditionalExprImpl.java | 43 +------------------ .../DefaultConditionalTypeCalculator.kt | 15 +++++++ plugins/groovy/src/META-INF/plugin.xml | 2 + 3 files changed, 18 insertions(+), 42 deletions(-) create mode 100644 plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/typing/DefaultConditionalTypeCalculator.kt diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrConditionalExprImpl.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrConditionalExprImpl.java index 4e015f0bd4cb..f19d0717473e 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrConditionalExprImpl.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrConditionalExprImpl.java @@ -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 TYPE_CALCULATOR = - (NullableFunction)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); diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/typing/DefaultConditionalTypeCalculator.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/typing/DefaultConditionalTypeCalculator.kt new file mode 100644 index 000000000000..626c9470b7a5 --- /dev/null +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/typing/DefaultConditionalTypeCalculator.kt @@ -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 { + + override fun getType(expression: GrConditionalExpression): PsiType? { + val thenType = expression.thenBranch?.type + val elseType = expression.elseBranch?.type + return getLeastUpperBoundNullable(thenType, elseType, expression.manager) + } +} diff --git a/plugins/groovy/src/META-INF/plugin.xml b/plugins/groovy/src/META-INF/plugin.xml index e72679c809a2..cbff94e57adb 100644 --- a/plugins/groovy/src/META-INF/plugin.xml +++ b/plugins/groovy/src/META-INF/plugin.xml @@ -189,6 +189,8 @@ implementationClass="org.jetbrains.plugins.groovy.lang.typing.DefaultBuiltinTypeClassTypeCalculator"/> +