mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[groovy] extract conditional type calculator
This commit is contained in:
+1
-42
@@ -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);
|
||||
|
||||
+15
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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"/>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user