Skip to content

Commit

Permalink
Merge pull request #551 from alex999990009/alex99999/fixes
Browse files Browse the repository at this point in the history
Fix ArendExpressionTypechecker
  • Loading branch information
sxhya authored Sep 10, 2024
2 parents e7f0232 + 22d012f commit 0eea9bf
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 34 deletions.
1 change: 1 addition & 0 deletions src/main/kotlin/org/arend/refactoring/ArendSubExprUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@ fun rangeOfConcrete(subConcrete: Concrete.Expression): TextRange {
val exprs = everyExprOf(subConcrete)
.filterIsInstance<PsiElement>()
.toList()
if (exprs.isEmpty()) return TextRange(0, 0)
if (exprs.size == 1) return exprs.first().textRange
// exprs is guaranteed to be empty
val leftMost = exprs.minByOrNull { it.textRange.startOffset }!!
Expand Down
Original file line number Diff line number Diff line change
@@ -1,60 +1,39 @@
package org.arend.typechecking

import com.intellij.openapi.util.TextRange
import com.intellij.psi.PsiElement
import org.arend.core.context.binding.Binding
import org.arend.core.expr.Expression
import org.arend.ext.ArendExtension
import org.arend.ext.error.ErrorReporter
import org.arend.naming.reference.Referable
import org.arend.psi.ext.ArendExpr
import org.arend.refactoring.rangeOfConcrete
import org.arend.term.concrete.Concrete
import org.arend.term.prettyprint.LocalExpressionPrettifier
import org.arend.typechecking.result.TypecheckingResult
import org.arend.typechecking.visitor.CheckTypeVisitor

class ArendExpressionTypechecker(private val checkedExprData: ArendExpr, errorReporter: ErrorReporter, extension: ArendExtension?):
class ArendExpressionTypechecker(checkedExprData: ArendExpr, errorReporter: ErrorReporter, extension: ArendExtension?):
CheckTypeVisitor(LinkedHashMap<Referable, Binding>(), LocalExpressionPrettifier(), errorReporter, null, extension, null) {

private val exprRange = checkedExprData.textRange
var checkedExprResult: TypecheckingResult? = null
var checkedExprRange: TextRange? = null
private var diffDepthTop = -1
private var diffDepthDown = -1

override fun checkExpr(expr: Concrete.Expression?, expectedType: Expression?): TypecheckingResult? {
val result = super.checkExpr(expr, expectedType) ?: return null
val data = expr?.data as? PsiElement? ?: return result
check(data, checkedExprData, result, true)
check(checkedExprData, data, result, false)

expr ?: return result
val rangeOfConcrete = rangeOfConcrete(expr)
if (exprRange in rangeOfConcrete) {
if (checkedExprRange == null || checkedExprRange?.contains(rangeOfConcrete) == true) {
setCheckedExprData(result, rangeOfConcrete)
}
}
return result
}

private fun check(data1: PsiElement?, data2: PsiElement, result: TypecheckingResult, isParent: Boolean) {
var diff = 0
var data = data1
while (data != null && data != data2) {
data = data.parent
diff++
}
if (data == data2) {
if (diff == 0) {
checkedExprResult = result
diffDepthTop = 0
checkedExprRange = data.textRange
} else if (isParent) {
if (diffDepthTop == -1 || diff < diffDepthTop) {
checkedExprResult = result
diffDepthTop = diff
checkedExprRange = data.textRange
}
} else if (diffDepthTop == -1) {
if (diffDepthDown == -1 || diff < diffDepthDown) {
checkedExprResult = result
diffDepthDown = diff
checkedExprRange = data.textRange
}
}
}
private fun setCheckedExprData(result: TypecheckingResult, range: TextRange) {
checkedExprResult = result
checkedExprRange = range
}
}

0 comments on commit 0eea9bf

Please sign in to comment.