All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.wavesplatform.lang.v1.compiler.CompilerContext.scala Maven / Gradle / Ivy

package com.wavesplatform.lang.v1.compiler

import cats.Semigroup
import com.wavesplatform.lang.v1.FunctionHeader
import com.wavesplatform.lang.v1.compiler.CompilerContext.*
import com.wavesplatform.lang.v1.compiler.Types.*
import com.wavesplatform.lang.v1.evaluator.ctx.FunctionTypeSignature
import com.wavesplatform.lang.v1.parser.Expressions.Pos
import com.wavesplatform.lang.v1.parser.Expressions.Pos.AnyPos
import shapeless.*

case class CompilerContext(
    predefTypes: Map[String, FINAL],
    varDefs: VariableTypes,
    functionDefs: FunctionTypes,
    provideRuntimeTypeOnCastError: Boolean,
    arbitraryDeclarations: Boolean = false,
    tmpArgsIdx: Int = 0,
    foldIdx: Int = 0
) {
  private lazy val allFuncDefs: FunctionTypes =
    predefTypes
      .collect { case (_, CASETYPEREF(typeName, fields, false)) =>
        typeName ->
          FunctionInfo(AnyPos, List(FunctionTypeSignature(CASETYPEREF(typeName, fields), fields, FunctionHeader.User(typeName))))
      } ++ functionDefs

  private def resolveFunction(name: String, args: Int): FunctionInfo =
    if (arbitraryDeclarations) {
      val signature = FunctionTypeSignature(ANY, Seq.fill(args)(("arg", ANY)), FunctionHeader.User(name))
      allFuncDefs.withDefaultValue(FunctionInfo(AnyPos, List(signature))).apply(name)
    } else {
      allFuncDefs.getOrElse(name, FunctionInfo(AnyPos, List.empty))
    }

  def functionTypeSignaturesByName(name: String, args: Int): List[FunctionTypeSignature] =
    resolveFunction(name, args).fSigList

  def resolveVar(name: String): Option[VariableInfo] =
    if (arbitraryDeclarations) {
      Some(varDefs.getOrElse(name, VariableInfo(AnyPos, NOTHING)))
    } else {
      varDefs.get(name)
    }
}

object CompilerContext {
  sealed trait PositionedInfo { val pos: Pos }
  case class VariableInfo(pos: Pos, vType: FINAL)                          extends PositionedInfo
  case class FunctionInfo(pos: Pos, fSigList: List[FunctionTypeSignature]) extends PositionedInfo

  type VariableTypes = Map[String, VariableInfo]
  type FunctionTypes = Map[String, FunctionInfo]

  implicit val semigroup: Semigroup[CompilerContext] = (x: CompilerContext, y: CompilerContext) =>
    CompilerContext(
      predefTypes = x.predefTypes ++ y.predefTypes,
      varDefs = x.varDefs ++ y.varDefs,
      functionDefs = x.functionDefs ++ y.functionDefs,
      y.provideRuntimeTypeOnCastError
    )

  val types: Lens[CompilerContext, Map[String, FINAL]] = lens[CompilerContext] >> Symbol("predefTypes")
  val vars: Lens[CompilerContext, VariableTypes]       = lens[CompilerContext] >> Symbol("varDefs")
  val functions: Lens[CompilerContext, FunctionTypes]  = lens[CompilerContext] >> Symbol("functionDefs")

  val empty = CompilerContext(Map(), Map(), Map(), true)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy