diff --git a/compiler/src/dotty/tools/dotc/semanticdb/ExtractSemanticDB.scala b/compiler/src/dotty/tools/dotc/semanticdb/ExtractSemanticDB.scala index 140d2fe5b766..5234a119d245 100644 --- a/compiler/src/dotty/tools/dotc/semanticdb/ExtractSemanticDB.scala +++ b/compiler/src/dotty/tools/dotc/semanticdb/ExtractSemanticDB.scala @@ -232,7 +232,12 @@ class ExtractSemanticDB extends Phase: val sym = tree.symbol.adjustIfCtorTyparam if qualSpan.exists && qualSpan.hasLength then traverse(qual) - registerUseGuarded(qual.symbol.ifExists, sym, selectSpan(tree), tree.source) + if (sym != NoSymbol) + registerUseGuarded(qual.symbol.ifExists, sym, selectSpan(tree), tree.source) + else + qual.symbol.info.lookupSym(tree.name).foreach(sym => + registerUseGuarded(qual.symbol.ifExists, sym, selectSpan(tree), tree.source) + ) case tree: Import => if tree.span.exists && tree.span.hasLength then traverseChildren(tree) @@ -420,19 +425,22 @@ class ExtractSemanticDB extends Phase: else val symkinds = mutable.HashSet.empty[SymbolKind] tree match - case tree: ValDef => - if !tree.symbol.is(Param) then - symkinds += (if tree.mods is Mutable then SymbolKind.Var else SymbolKind.Val) - if tree.rhs.isEmpty && !tree.symbol.isOneOf(TermParam | CaseAccessor | ParamAccessor) then - symkinds += SymbolKind.Abstract - case tree: DefDef => - if tree.isSetterDef then - symkinds += SymbolKind.Setter - else if tree.rhs.isEmpty then - symkinds += SymbolKind.Abstract - case tree: Bind => - symkinds += SymbolKind.Val - case _ => + case tree: ValDef => + if !tree.symbol.is(Param) then + symkinds += (if tree.mods is Mutable then SymbolKind.Var else SymbolKind.Val) + if tree.rhs.isEmpty && !tree.symbol.isOneOf(TermParam | CaseAccessor | ParamAccessor) then + symkinds += SymbolKind.Abstract + case tree: DefDef => + if tree.isSetterDef then + symkinds += SymbolKind.Setter + else if tree.rhs.isEmpty then + symkinds += SymbolKind.Abstract + // if symbol isType, it's type variable + case tree: Bind if (!tree.symbol.isType) => + symkinds += SymbolKind.Val + case tree: Bind if (tree.symbol.isType) => + symkinds += SymbolKind.TypeVal + case _ => symkinds.toSet private def ctorParams( diff --git a/compiler/src/dotty/tools/dotc/semanticdb/PPrint.scala b/compiler/src/dotty/tools/dotc/semanticdb/PPrint.scala index 17c66ebcc49c..6814d923a062 100644 --- a/compiler/src/dotty/tools/dotc/semanticdb/PPrint.scala +++ b/compiler/src/dotty/tools/dotc/semanticdb/PPrint.scala @@ -191,7 +191,12 @@ class SymbolInformationPrinter (symtab: PrinterSymtab): s"=> ${normal(utpe)}" case RepeatedType(utpe) => s"${normal(utpe)}*" - case _ => + case MatchType(scrutinee, cases) => + val casesStr = cases.map { caseType => + s"${pprint(caseType.key)} => ${pprint(caseType.body)}" + }.mkString(", ") + s"${pprint(scrutinee)} match { ${casesStr} }" + case x => "" def normal(tpe: Type): String = tpe match diff --git a/compiler/src/dotty/tools/dotc/semanticdb/Scala3.scala b/compiler/src/dotty/tools/dotc/semanticdb/Scala3.scala index 45af208b3e36..4985c025cb8c 100644 --- a/compiler/src/dotty/tools/dotc/semanticdb/Scala3.scala +++ b/compiler/src/dotty/tools/dotc/semanticdb/Scala3.scala @@ -12,6 +12,7 @@ import core.StdNames.nme import SymbolInformation.{Kind => k} import dotty.tools.dotc.util.SourceFile import dotty.tools.dotc.util.Spans.Span +import dotty.tools.dotc.core.Names.Designator import java.lang.Character.{isJavaIdentifierPart, isJavaIdentifierStart} @@ -34,7 +35,7 @@ object Scala3: val (endLine, endCol) = lineCol(span.end) Some(Range(startLine, startCol, endLine, endCol)) - def namePresentInSource(sym: Symbol, span: Span, source:SourceFile)(using Context): Boolean = + def namePresentInSource(desig: Designator, span: Span, source:SourceFile)(using Context): Boolean = if !span.exists then false else val content = source.content() @@ -42,15 +43,22 @@ object Scala3: if content.lift(span.end - 1).exists(_ == '`') then (span.start + 1, span.end - 1) else (span.start, span.end) + // println(s"${start}, $end") val nameInSource = content.slice(start, end).mkString // for secondary constructors `this` - if sym.isConstructor && nameInSource == nme.THISkw.toString then - true - else - val target = - if sym.isPackageObject then sym.owner - else sym - nameInSource == target.name.stripModuleClassSuffix.lastPart.toString + desig match + case sym: Symbol => + if sym.isConstructor && nameInSource == nme.THISkw.toString then + true + else + val target = + if sym.isPackageObject then sym.owner + else sym + nameInSource == target.name.stripModuleClassSuffix.lastPart.toString + case name: Name => + // println(nameInSource) + // println(name.mangledString) + nameInSource == name.mangledString sealed trait FakeSymbol { private[Scala3] var sname: Option[String] = None @@ -153,12 +161,13 @@ object Scala3: enum SymbolKind derives CanEqual: kind => - case Val, Var, Setter, Abstract + case Val, Var, Setter, Abstract, TypeVal def isVar: Boolean = kind match case Var | Setter => true case _ => false def isVal: Boolean = kind == Val + def isTypeVal: Boolean = kind == TypeVal def isVarOrVal: Boolean = kind.isVar || kind.isVal end SymbolKind @@ -309,7 +318,9 @@ object Scala3: props |= SymbolInformation.Property.IMPLICIT.value if sym.is(Lazy, butNot=Module) then props |= SymbolInformation.Property.LAZY.value - if sym.isAllOf(Case | Module) || sym.is(CaseClass) || sym.isAllOf(EnumCase) then + if sym.isAllOf(Case | Module) || + (sym.is(CaseClass) && !symkinds.exists(_.isTypeVal)) || // `t` of `case List[t] =>` (which has `CaseClass` flag) shouldn't be `CASE` + sym.isAllOf(EnumCase) then props |= SymbolInformation.Property.CASE.value if sym.is(Covariant) then props |= SymbolInformation.Property.COVARIANT.value diff --git a/compiler/src/dotty/tools/dotc/semanticdb/TypeOps.scala b/compiler/src/dotty/tools/dotc/semanticdb/TypeOps.scala index 8983a3c61634..0ccaab48889a 100644 --- a/compiler/src/dotty/tools/dotc/semanticdb/TypeOps.scala +++ b/compiler/src/dotty/tools/dotc/semanticdb/TypeOps.scala @@ -15,6 +15,7 @@ import collection.mutable import dotty.tools.dotc.{semanticdb => s} import Scala3.{FakeSymbol, SemanticSymbol, WildcardTypeSymbol, TypeParamRefSymbol, TermParamRefSymbol, RefinementSymbol} +import dotty.tools.dotc.core.Names.Designator class TypeOps: import SymbolScopeOps._ @@ -33,7 +34,7 @@ class TypeOps: )(using Context): Option[Symbol] = symtab.get((binder, name)) - extension [T <: LambdaType](symtab: mutable.Map[(T, Name), Symbol]) + extension [T <: LambdaType | RefinedType](symtab: mutable.Map[(T, Name), Symbol]) private def lookupOrErr( binder: T, name: Name, @@ -53,6 +54,8 @@ class TypeOps: private def symbolNotFound(binder: Type, name: Name, parent: Symbol)(using ctx: Context): Unit = warn(s"Ignoring ${name} of symbol ${parent}, type ${binder}") + private def symbolNotFound(name: Name, parent: Symbol)(using ctx: Context): Unit = + warn(s"Ignoring ${name} of symbol ${parent}") private def warn(msg: String)(using ctx: Context): Unit = report.warning( @@ -63,6 +66,23 @@ class TypeOps: fakeSymbols.add(sym) extension (tpe: Type) + def lookupSym(name: Name)(using Context): Option[Symbol] = { + def loop(ty: Type): Option[Symbol] = ty match + case rt: RefinedType => + refinementSymtab.lookup(rt, name).orElse( + loop(rt.parent) + ) + case rec: RecType => + loop(rec.parent) + case AndType(tp1, tp2) => + loop(tp1).orElse(loop(tp2)) + case OrType(tp1, tp2) => + loop(tp1).orElse(loop(tp2)) + case _ => + None + loop(tpe.dealias) + } + def toSemanticSig(using LinkMode, Context, SemanticSymbolBuilder)(sym: Symbol): s.Signature = def enterParamRef(tpe: Type): Unit = tpe match { @@ -81,6 +101,10 @@ class TypeOps: else enterParamRef(lam.resType) + // for CaseType `case Array[t] => t` which is represented as [t] =>> MatchCase[Array[t], t] + case m: MatchType => + m.cases.foreach(enterParamRef) + // for class constructor // class C[T] { ... } case cls: ClassInfo if sym.info.isInstanceOf[LambdaType] => @@ -137,6 +161,12 @@ class TypeOps: enterRefined(expr.resType) case m: LambdaType => enterRefined(m.resType) + case AndType(t1, t2) => + enterRefined(t1) + enterRefined(t2) + case OrType(t1, t2) => + enterRefined(t1) + enterRefined(t2) case _ => () } if sym.exists && sym.owner.exists then @@ -223,16 +253,42 @@ class TypeOps: val stpe = loop(tpe) s.ByNameType(stpe) - case TypeRef(pre, sym: Symbol) => + // sym of `TypeRef(_, sym)` may not be a Symbol but Name in some cases + // e.g. in MatchType, + // case x *: xs => x *: Concat[xs, Ys] + // x and xs should have a typebounds <: Any, >: Nothing + // but Any (and Nothing) are represented as TypeRef(, "Any" <- Name) + case tr @ TypeRef(pre, _) if tr.symbol != NoSymbol => val spre = if tpe.hasTrivialPrefix then s.Type.Empty else loop(pre) - val ssym = sym.symbolName + val ssym = tr.symbol.symbolName s.TypeRef(spre, ssym, Seq.empty) - case TermRef(pre, sym: Symbol) => + // when TypeRef refers the refinement of RefinedType e.g. + // TypeRef for `foo.B` in `trait T[A] { val foo: { type B = A } = ???; def bar(b: foo.B) = () }` has NoSymbol + case TypeRef(pre, name: Name) => + val spre = if tpe.hasTrivialPrefix then s.Type.Empty else loop(pre) + val maybeSym = pre.widen.dealias.lookupSym(name) + maybeSym match + case Some(sym) => + s.TypeRef(spre, sym.symbolName, Seq.empty) + case None => s.Type.Empty + + case tr @ TermRef(pre, _) if tr.symbol != NoSymbol => val spre = if(tpe.hasTrivialPrefix) s.Type.Empty else loop(pre) - val ssym = sym.symbolName + val ssym = tr.symbol.symbolName s.SingleType(spre, ssym) + case TermRef(pre, name: Name) => + val spre = if tpe.hasTrivialPrefix then s.Type.Empty else loop(pre) + val maybeSym = pre.widen.dealias match + case rt: RefinedType => + refinementSymtab.lookupOrErr(rt, name, rt.typeSymbol) + case _ => None + maybeSym match + case Some(sym) => + s.SingleType(spre, sym.symbolName) + case None => s.Type.Empty + case ThisType(TypeRef(_, sym: Symbol)) => s.ThisType(sym.symbolName) @@ -276,6 +332,31 @@ class TypeOps: case ConstantType(const) => s.ConstantType(const.toSemanticConst) + case matchType: MatchType => + val scases = matchType.cases.map { caseType => caseType match { + case lam: HKTypeLambda => // case Array[t] => t + val paramSyms = lam.paramNames.flatMap { paramName => + val key = (lam, paramName) + paramRefSymtab.get(key) + }.sscope + lam.resType match { + case defn.MatchCase(key, body) => + s.MatchType.CaseType( + loop(key), + loop(body) + ) + case _ => s.MatchType.CaseType() // shouldn't happen + } + case defn.MatchCase(key, body) => + val skey = loop(key) + val sbody = loop(body) + s.MatchType.CaseType(skey, sbody) + case _ => s.MatchType.CaseType() // shouldn't happen + }} + val sscrutinee = loop(matchType.scrutinee) + val sbound = loop(matchType.bound) + s.MatchType(sscrutinee, scases) + case rt @ RefinedType(parent, name, info) => // `X { def x: Int; def y: Int }` // RefinedType( @@ -405,8 +486,6 @@ class TypeOps: // Not yet supported case _: HKTypeLambda => s.Type.Empty - case _: MatchType => - s.Type.Empty case tvar: TypeVar => loop(tvar.stripped) @@ -423,8 +502,12 @@ class TypeOps: tpe match { case TypeRef(pre, sym: Symbol) => checkTrivialPrefix(pre, sym) + case tr @ TypeRef(pre, _) if tr.symbol != NoSymbol => + checkTrivialPrefix(pre, tr.symbol) case TermRef(pre, sym: Symbol) => checkTrivialPrefix(pre, sym) + case tr @ TermRef(pre, _) if tr.symbol != NoSymbol => + checkTrivialPrefix(pre, tr.symbol) case _ => false } diff --git a/compiler/src/dotty/tools/dotc/semanticdb/generated/Type.scala b/compiler/src/dotty/tools/dotc/semanticdb/generated/Type.scala index 6e4be1d68b6d..da24b4847e19 100644 --- a/compiler/src/dotty/tools/dotc/semanticdb/generated/Type.scala +++ b/compiler/src/dotty/tools/dotc/semanticdb/generated/Type.scala @@ -38,6 +38,7 @@ object Type { case __v: dotty.tools.dotc.semanticdb.TypeMessage.SealedValue.UniversalType => __v.value case __v: dotty.tools.dotc.semanticdb.TypeMessage.SealedValue.ByNameType => __v.value case __v: dotty.tools.dotc.semanticdb.TypeMessage.SealedValue.RepeatedType => __v.value + case __v: dotty.tools.dotc.semanticdb.TypeMessage.SealedValue.MatchType => __v.value case dotty.tools.dotc.semanticdb.TypeMessage.SealedValue.Empty => Empty } override def toBase(__custom: dotty.tools.dotc.semanticdb.Type): dotty.tools.dotc.semanticdb.TypeMessage = dotty.tools.dotc.semanticdb.TypeMessage(__custom match { @@ -55,6 +56,7 @@ object Type { case __v: dotty.tools.dotc.semanticdb.UniversalType => dotty.tools.dotc.semanticdb.TypeMessage.SealedValue.UniversalType(__v) case __v: dotty.tools.dotc.semanticdb.ByNameType => dotty.tools.dotc.semanticdb.TypeMessage.SealedValue.ByNameType(__v) case __v: dotty.tools.dotc.semanticdb.RepeatedType => dotty.tools.dotc.semanticdb.TypeMessage.SealedValue.RepeatedType(__v) + case __v: dotty.tools.dotc.semanticdb.MatchType => dotty.tools.dotc.semanticdb.TypeMessage.SealedValue.MatchType(__v) case Empty => dotty.tools.dotc.semanticdb.TypeMessage.SealedValue.Empty }) } @@ -123,6 +125,10 @@ final case class TypeMessage( val __value = sealedValue.repeatedType.get __size += 1 + SemanticdbOutputStream.computeUInt32SizeNoTag(__value.serializedSize) + __value.serializedSize }; + if (sealedValue.matchType.isDefined) { + val __value = sealedValue.matchType.get + __size += 2 + SemanticdbOutputStream.computeUInt32SizeNoTag(__value.serializedSize) + __value.serializedSize + }; __size } override def serializedSize: _root_.scala.Int = { @@ -219,6 +225,12 @@ final case class TypeMessage( _output__.writeUInt32NoTag(__m.serializedSize) __m.writeTo(_output__) }; + sealedValue.matchType.foreach { __v => + val __m = __v + _output__.writeTag(25, 2) + _output__.writeUInt32NoTag(__m.serializedSize) + __m.writeTo(_output__) + }; } def getTypeRef: dotty.tools.dotc.semanticdb.TypeRef = sealedValue.typeRef.getOrElse(dotty.tools.dotc.semanticdb.TypeRef.defaultInstance) def withTypeRef(__v: dotty.tools.dotc.semanticdb.TypeRef): TypeMessage = copy(sealedValue = dotty.tools.dotc.semanticdb.TypeMessage.SealedValue.TypeRef(__v)) @@ -248,6 +260,8 @@ final case class TypeMessage( def withByNameType(__v: dotty.tools.dotc.semanticdb.ByNameType): TypeMessage = copy(sealedValue = dotty.tools.dotc.semanticdb.TypeMessage.SealedValue.ByNameType(__v)) def getRepeatedType: dotty.tools.dotc.semanticdb.RepeatedType = sealedValue.repeatedType.getOrElse(dotty.tools.dotc.semanticdb.RepeatedType.defaultInstance) def withRepeatedType(__v: dotty.tools.dotc.semanticdb.RepeatedType): TypeMessage = copy(sealedValue = dotty.tools.dotc.semanticdb.TypeMessage.SealedValue.RepeatedType(__v)) + def getMatchType: dotty.tools.dotc.semanticdb.MatchType = sealedValue.matchType.getOrElse(dotty.tools.dotc.semanticdb.MatchType.defaultInstance) + def withMatchType(__v: dotty.tools.dotc.semanticdb.MatchType): TypeMessage = copy(sealedValue = dotty.tools.dotc.semanticdb.TypeMessage.SealedValue.MatchType(__v)) def clearSealedValue: TypeMessage = copy(sealedValue = dotty.tools.dotc.semanticdb.TypeMessage.SealedValue.Empty) def withSealedValue(__v: dotty.tools.dotc.semanticdb.TypeMessage.SealedValue): TypeMessage = copy(sealedValue = __v) @@ -295,6 +309,8 @@ object TypeMessage extends SemanticdbGeneratedMessageCompanion[dotty.tools.dotc __sealedValue = dotty.tools.dotc.semanticdb.TypeMessage.SealedValue.ByNameType(__sealedValue.byNameType.fold(LiteParser.readMessage[dotty.tools.dotc.semanticdb.ByNameType](_input__))(LiteParser.readMessage(_input__, _))) case 114 => __sealedValue = dotty.tools.dotc.semanticdb.TypeMessage.SealedValue.RepeatedType(__sealedValue.repeatedType.fold(LiteParser.readMessage[dotty.tools.dotc.semanticdb.RepeatedType](_input__))(LiteParser.readMessage(_input__, _))) + case 202 => + __sealedValue = dotty.tools.dotc.semanticdb.TypeMessage.SealedValue.MatchType(__sealedValue.matchType.fold(LiteParser.readMessage[dotty.tools.dotc.semanticdb.MatchType](_input__))(LiteParser.readMessage(_input__, _))) case tag => _input__.skipField(tag) } } @@ -328,6 +344,7 @@ object TypeMessage extends SemanticdbGeneratedMessageCompanion[dotty.tools.dotc def isUniversalType: _root_.scala.Boolean = false def isByNameType: _root_.scala.Boolean = false def isRepeatedType: _root_.scala.Boolean = false + def isMatchType: _root_.scala.Boolean = false def typeRef: _root_.scala.Option[dotty.tools.dotc.semanticdb.TypeRef] = _root_.scala.None def singleType: _root_.scala.Option[dotty.tools.dotc.semanticdb.SingleType] = _root_.scala.None def thisType: _root_.scala.Option[dotty.tools.dotc.semanticdb.ThisType] = _root_.scala.None @@ -342,6 +359,7 @@ object TypeMessage extends SemanticdbGeneratedMessageCompanion[dotty.tools.dotc def universalType: _root_.scala.Option[dotty.tools.dotc.semanticdb.UniversalType] = _root_.scala.None def byNameType: _root_.scala.Option[dotty.tools.dotc.semanticdb.ByNameType] = _root_.scala.None def repeatedType: _root_.scala.Option[dotty.tools.dotc.semanticdb.RepeatedType] = _root_.scala.None + def matchType: _root_.scala.Option[dotty.tools.dotc.semanticdb.MatchType] = _root_.scala.None } object SealedValue { @SerialVersionUID(0L) @@ -451,6 +469,13 @@ object TypeMessage extends SemanticdbGeneratedMessageCompanion[dotty.tools.dotc override def repeatedType: _root_.scala.Option[dotty.tools.dotc.semanticdb.RepeatedType] = Some(value) override def number: _root_.scala.Int = 14 } + @SerialVersionUID(0L) + final case class MatchType(value: dotty.tools.dotc.semanticdb.MatchType) extends dotty.tools.dotc.semanticdb.TypeMessage.SealedValue derives CanEqual { + type ValueType = dotty.tools.dotc.semanticdb.MatchType + override def isMatchType: _root_.scala.Boolean = true + override def matchType: _root_.scala.Option[dotty.tools.dotc.semanticdb.MatchType] = Some(value) + override def number: _root_.scala.Int = 25 + } } final val TYPE_REF_FIELD_NUMBER = 2 final val SINGLE_TYPE_FIELD_NUMBER = 20 @@ -466,6 +491,7 @@ object TypeMessage extends SemanticdbGeneratedMessageCompanion[dotty.tools.dotc final val UNIVERSAL_TYPE_FIELD_NUMBER = 10 final val BY_NAME_TYPE_FIELD_NUMBER = 13 final val REPEATED_TYPE_FIELD_NUMBER = 14 + final val MATCH_TYPE_FIELD_NUMBER = 25 def of( sealedValue: dotty.tools.dotc.semanticdb.TypeMessage.SealedValue ): _root_.dotty.tools.dotc.semanticdb.TypeMessage = _root_.dotty.tools.dotc.semanticdb.TypeMessage( @@ -1794,3 +1820,217 @@ object RepeatedType extends SemanticdbGeneratedMessageCompanion[dotty.tools.dot ) // @@protoc_insertion_point(GeneratedMessageCompanion[dotty.tools.dotc.semanticdb.RepeatedType]) } + +@SerialVersionUID(0L) +final case class MatchType( + scrutinee: dotty.tools.dotc.semanticdb.Type = dotty.tools.dotc.semanticdb.MatchType._typemapper_scrutinee.toCustom(dotty.tools.dotc.semanticdb.TypeMessage.defaultInstance), + cases: _root_.scala.Seq[dotty.tools.dotc.semanticdb.MatchType.CaseType] = _root_.scala.Seq.empty + ) extends dotty.tools.dotc.semanticdb.Type.NonEmpty with SemanticdbGeneratedMessage derives CanEqual { + @transient @sharable + private[this] var __serializedSizeMemoized: _root_.scala.Int = 0 + private[this] def __computeSerializedSize(): _root_.scala.Int = { + var __size = 0 + + { + val __value = dotty.tools.dotc.semanticdb.MatchType._typemapper_scrutinee.toBase(scrutinee) + if (__value.serializedSize != 0) { + __size += 1 + SemanticdbOutputStream.computeUInt32SizeNoTag(__value.serializedSize) + __value.serializedSize + } + }; + cases.foreach { __item => + val __value = __item + __size += 1 + SemanticdbOutputStream.computeUInt32SizeNoTag(__value.serializedSize) + __value.serializedSize + } + __size + } + override def serializedSize: _root_.scala.Int = { + var __size = __serializedSizeMemoized + if (__size == 0) { + __size = __computeSerializedSize() + 1 + __serializedSizeMemoized = __size + } + __size - 1 + + } + def writeTo(`_output__`: SemanticdbOutputStream): _root_.scala.Unit = { + { + val __v = dotty.tools.dotc.semanticdb.MatchType._typemapper_scrutinee.toBase(scrutinee) + if (__v.serializedSize != 0) { + _output__.writeTag(1, 2) + _output__.writeUInt32NoTag(__v.serializedSize) + __v.writeTo(_output__) + } + }; + cases.foreach { __v => + val __m = __v + _output__.writeTag(2, 2) + _output__.writeUInt32NoTag(__m.serializedSize) + __m.writeTo(_output__) + }; + } + def withScrutinee(__v: dotty.tools.dotc.semanticdb.Type): MatchType = copy(scrutinee = __v) + def clearCases = copy(cases = _root_.scala.Seq.empty) + def addCases(__vs: dotty.tools.dotc.semanticdb.MatchType.CaseType *): MatchType = addAllCases(__vs) + def addAllCases(__vs: Iterable[dotty.tools.dotc.semanticdb.MatchType.CaseType]): MatchType = copy(cases = cases ++ __vs) + def withCases(__v: _root_.scala.Seq[dotty.tools.dotc.semanticdb.MatchType.CaseType]): MatchType = copy(cases = __v) + + + + + // @@protoc_insertion_point(GeneratedMessage[dotty.tools.dotc.semanticdb.MatchType]) +} + +object MatchType extends SemanticdbGeneratedMessageCompanion[dotty.tools.dotc.semanticdb.MatchType] { + implicit def messageCompanion: SemanticdbGeneratedMessageCompanion[dotty.tools.dotc.semanticdb.MatchType] = this + def parseFrom(`_input__`: SemanticdbInputStream): dotty.tools.dotc.semanticdb.MatchType = { + var __scrutinee: _root_.scala.Option[dotty.tools.dotc.semanticdb.TypeMessage] = _root_.scala.None + val __cases: _root_.scala.collection.immutable.VectorBuilder[dotty.tools.dotc.semanticdb.MatchType.CaseType] = new _root_.scala.collection.immutable.VectorBuilder[dotty.tools.dotc.semanticdb.MatchType.CaseType] + var _done__ = false + while (!_done__) { + val _tag__ = _input__.readTag() + _tag__ match { + case 0 => _done__ = true + case 10 => + __scrutinee = _root_.scala.Some(__scrutinee.fold(LiteParser.readMessage[dotty.tools.dotc.semanticdb.TypeMessage](_input__))(LiteParser.readMessage(_input__, _))) + case 18 => + __cases += LiteParser.readMessage[dotty.tools.dotc.semanticdb.MatchType.CaseType](_input__) + case tag => _input__.skipField(tag) + } + } + dotty.tools.dotc.semanticdb.MatchType( + scrutinee = dotty.tools.dotc.semanticdb.MatchType._typemapper_scrutinee.toCustom(__scrutinee.getOrElse(dotty.tools.dotc.semanticdb.TypeMessage.defaultInstance)), + cases = __cases.result() + ) + } + + + + + + + lazy val defaultInstance = dotty.tools.dotc.semanticdb.MatchType( + scrutinee = dotty.tools.dotc.semanticdb.MatchType._typemapper_scrutinee.toCustom(dotty.tools.dotc.semanticdb.TypeMessage.defaultInstance), + cases = _root_.scala.Seq.empty + ) + @SerialVersionUID(0L) + final case class CaseType( + key: dotty.tools.dotc.semanticdb.Type = dotty.tools.dotc.semanticdb.MatchType.CaseType._typemapper_key.toCustom(dotty.tools.dotc.semanticdb.TypeMessage.defaultInstance), + body: dotty.tools.dotc.semanticdb.Type = dotty.tools.dotc.semanticdb.MatchType.CaseType._typemapper_body.toCustom(dotty.tools.dotc.semanticdb.TypeMessage.defaultInstance) + ) extends SemanticdbGeneratedMessage derives CanEqual { + @transient @sharable + private[this] var __serializedSizeMemoized: _root_.scala.Int = 0 + private[this] def __computeSerializedSize(): _root_.scala.Int = { + var __size = 0 + + { + val __value = dotty.tools.dotc.semanticdb.MatchType.CaseType._typemapper_key.toBase(key) + if (__value.serializedSize != 0) { + __size += 1 + SemanticdbOutputStream.computeUInt32SizeNoTag(__value.serializedSize) + __value.serializedSize + } + }; + + { + val __value = dotty.tools.dotc.semanticdb.MatchType.CaseType._typemapper_body.toBase(body) + if (__value.serializedSize != 0) { + __size += 1 + SemanticdbOutputStream.computeUInt32SizeNoTag(__value.serializedSize) + __value.serializedSize + } + }; + __size + } + override def serializedSize: _root_.scala.Int = { + var __size = __serializedSizeMemoized + if (__size == 0) { + __size = __computeSerializedSize() + 1 + __serializedSizeMemoized = __size + } + __size - 1 + + } + def writeTo(`_output__`: SemanticdbOutputStream): _root_.scala.Unit = { + { + val __v = dotty.tools.dotc.semanticdb.MatchType.CaseType._typemapper_key.toBase(key) + if (__v.serializedSize != 0) { + _output__.writeTag(1, 2) + _output__.writeUInt32NoTag(__v.serializedSize) + __v.writeTo(_output__) + } + }; + { + val __v = dotty.tools.dotc.semanticdb.MatchType.CaseType._typemapper_body.toBase(body) + if (__v.serializedSize != 0) { + _output__.writeTag(2, 2) + _output__.writeUInt32NoTag(__v.serializedSize) + __v.writeTo(_output__) + } + }; + } + def withKey(__v: dotty.tools.dotc.semanticdb.Type): CaseType = copy(key = __v) + def withBody(__v: dotty.tools.dotc.semanticdb.Type): CaseType = copy(body = __v) + + + + + // @@protoc_insertion_point(GeneratedMessage[dotty.tools.dotc.semanticdb.MatchType.CaseType]) + } + + object CaseType extends SemanticdbGeneratedMessageCompanion[dotty.tools.dotc.semanticdb.MatchType.CaseType] { + implicit def messageCompanion: SemanticdbGeneratedMessageCompanion[dotty.tools.dotc.semanticdb.MatchType.CaseType] = this + def parseFrom(`_input__`: SemanticdbInputStream): dotty.tools.dotc.semanticdb.MatchType.CaseType = { + var __key: _root_.scala.Option[dotty.tools.dotc.semanticdb.TypeMessage] = _root_.scala.None + var __body: _root_.scala.Option[dotty.tools.dotc.semanticdb.TypeMessage] = _root_.scala.None + var _done__ = false + while (!_done__) { + val _tag__ = _input__.readTag() + _tag__ match { + case 0 => _done__ = true + case 10 => + __key = _root_.scala.Some(__key.fold(LiteParser.readMessage[dotty.tools.dotc.semanticdb.TypeMessage](_input__))(LiteParser.readMessage(_input__, _))) + case 18 => + __body = _root_.scala.Some(__body.fold(LiteParser.readMessage[dotty.tools.dotc.semanticdb.TypeMessage](_input__))(LiteParser.readMessage(_input__, _))) + case tag => _input__.skipField(tag) + } + } + dotty.tools.dotc.semanticdb.MatchType.CaseType( + key = dotty.tools.dotc.semanticdb.MatchType.CaseType._typemapper_key.toCustom(__key.getOrElse(dotty.tools.dotc.semanticdb.TypeMessage.defaultInstance)), + body = dotty.tools.dotc.semanticdb.MatchType.CaseType._typemapper_body.toCustom(__body.getOrElse(dotty.tools.dotc.semanticdb.TypeMessage.defaultInstance)) + ) + } + + + + + + + lazy val defaultInstance = dotty.tools.dotc.semanticdb.MatchType.CaseType( + key = dotty.tools.dotc.semanticdb.MatchType.CaseType._typemapper_key.toCustom(dotty.tools.dotc.semanticdb.TypeMessage.defaultInstance), + body = dotty.tools.dotc.semanticdb.MatchType.CaseType._typemapper_body.toCustom(dotty.tools.dotc.semanticdb.TypeMessage.defaultInstance) + ) + final val KEY_FIELD_NUMBER = 1 + final val BODY_FIELD_NUMBER = 2 + @transient @sharable + private[semanticdb] val _typemapper_key: SemanticdbTypeMapper[dotty.tools.dotc.semanticdb.TypeMessage, dotty.tools.dotc.semanticdb.Type] = implicitly[SemanticdbTypeMapper[dotty.tools.dotc.semanticdb.TypeMessage, dotty.tools.dotc.semanticdb.Type]] + @transient @sharable + private[semanticdb] val _typemapper_body: SemanticdbTypeMapper[dotty.tools.dotc.semanticdb.TypeMessage, dotty.tools.dotc.semanticdb.Type] = implicitly[SemanticdbTypeMapper[dotty.tools.dotc.semanticdb.TypeMessage, dotty.tools.dotc.semanticdb.Type]] + def of( + key: dotty.tools.dotc.semanticdb.Type, + body: dotty.tools.dotc.semanticdb.Type + ): _root_.dotty.tools.dotc.semanticdb.MatchType.CaseType = _root_.dotty.tools.dotc.semanticdb.MatchType.CaseType( + key, + body + ) + // @@protoc_insertion_point(GeneratedMessageCompanion[dotty.tools.dotc.semanticdb.MatchType.CaseType]) + } + + final val SCRUTINEE_FIELD_NUMBER = 1 + final val CASES_FIELD_NUMBER = 2 + @transient @sharable + private[semanticdb] val _typemapper_scrutinee: SemanticdbTypeMapper[dotty.tools.dotc.semanticdb.TypeMessage, dotty.tools.dotc.semanticdb.Type] = implicitly[SemanticdbTypeMapper[dotty.tools.dotc.semanticdb.TypeMessage, dotty.tools.dotc.semanticdb.Type]] + def of( + scrutinee: dotty.tools.dotc.semanticdb.Type, + cases: _root_.scala.Seq[dotty.tools.dotc.semanticdb.MatchType.CaseType] + ): _root_.dotty.tools.dotc.semanticdb.MatchType = _root_.dotty.tools.dotc.semanticdb.MatchType( + scrutinee, + cases + ) + // @@protoc_insertion_point(GeneratedMessageCompanion[dotty.tools.dotc.semanticdb.MatchType]) +} diff --git a/tests/semanticdb/expect/Advanced.expect.scala b/tests/semanticdb/expect/Advanced.expect.scala index 0764c11c4dd2..6c05ec96c599 100644 --- a/tests/semanticdb/expect/Advanced.expect.scala +++ b/tests/semanticdb/expect/Advanced.expect.scala @@ -14,6 +14,7 @@ class Structural/*<-advanced::Structural#*/ { def s2/*<-advanced::Structural#s2().*/: { val x/*<-local1*/: Int/*->scala::Int#*/ } = new { val x/*<-local2*/: Int/*->scala::Int#*/ = ???/*->scala::Predef.`???`().*/ } def s3/*<-advanced::Structural#s3().*/: { def m/*<-local6*/(x/*<-local5*/: Int/*->scala::Int#*/): Int/*->scala::Int#*/ } = new { def m/*<-local8*/(x/*<-local7*/: Int/*->scala::Int#*/): Int/*->scala::Int#*/ = ???/*->scala::Predef.`???`().*/ } def s4/*<-advanced::Structural#s4().*/(a/*<-advanced::Structural#s4().(a)*/: Int/*->scala::Int#*/): { val x/*<-local11*/: Int/*->scala::Int#*/ } = ???/*->scala::Predef.`???`().*/ + trait T/*<-advanced::Structural#T#*/[A/*<-advanced::Structural#T#[A]*/] { val foo/*<-advanced::Structural#T#foo.*/: { type B/*<-local12*/ = A/*->advanced::Structural#T#[A]*/ } = ???/*->scala::Predef.`???`().*/; def bar/*<-advanced::Structural#T#bar().*/(b/*<-advanced::Structural#T#bar().(b)*/: foo/*->advanced::Structural#T#foo.*/.B/*->local12*/) = () } // from tests/pos/t8177e.scala } class Wildcards/*<-advanced::Wildcards#*/ { @@ -36,11 +37,15 @@ object Test/*<-advanced::Test.*/ { { (???/*->scala::Predef.`???`().*/ : Any/*->scala::Any#*/) match { - case e3/*<-local12*/: List/*->scala::package.List#*/[_] => - val e3x/*<-local14*/ = e3/*->local12*/.head/*->scala::collection::IterableOps#head().*/ + case e3/*<-local13*/: List/*->scala::package.List#*/[_] => + val e3x/*<-local15*/ = e3/*->local13*/.head/*->scala::collection::IterableOps#head().*/ () } } + + // see: https://github.com/lampepfl/dotty/pull/14608#discussion_r835642563 + lazy val foo/*<-advanced::Test.foo.*/: (reflect.Selectable/*->scala::reflect::Selectable#*/ { type A/*<-local16*/ = Int/*->scala::Int#*/ }) &/*->scala::`&`#*/ (reflect.Selectable/*->scala::reflect::Selectable#*/ { type A/*<-local17*/ = Int/*->scala::Int#*/; val a/*<-local18*/: A/*->local17*/ }) = ???/*->scala::Predef.`???`().*/ + def bar/*<-advanced::Test.bar().*/: foo/*->advanced::Test.foo.*/.A/*->local17*/ = foo/*->advanced::Test.foo.*/.a } diff --git a/tests/semanticdb/expect/Advanced.scala b/tests/semanticdb/expect/Advanced.scala index e0439d911c36..8e0d2f3a1692 100644 --- a/tests/semanticdb/expect/Advanced.scala +++ b/tests/semanticdb/expect/Advanced.scala @@ -14,6 +14,7 @@ class Structural { def s2: { val x: Int } = new { val x: Int = ??? } def s3: { def m(x: Int): Int } = new { def m(x: Int): Int = ??? } def s4(a: Int): { val x: Int } = ??? + trait T[A] { val foo: { type B = A } = ???; def bar(b: foo.B) = () } // from tests/pos/t8177e.scala } class Wildcards { @@ -41,6 +42,10 @@ object Test { () } } + + // see: https://github.com/lampepfl/dotty/pull/14608#discussion_r835642563 + lazy val foo: (reflect.Selectable { type A = Int }) & (reflect.Selectable { type A = Int; val a: A }) = ??? + def bar: foo.A = foo.a } diff --git a/tests/semanticdb/expect/MatchType.expect.scala b/tests/semanticdb/expect/MatchType.expect.scala new file mode 100644 index 000000000000..7cc432a6b10f --- /dev/null +++ b/tests/semanticdb/expect/MatchType.expect.scala @@ -0,0 +1,10 @@ +package example + +type Elem/*<-example::MatchType$package.Elem#*/[X/*<-example::MatchType$package.Elem#[X]*/] = X/*->example::MatchType$package.Elem#[X]*/ match + case String/*->scala::Predef.String#*/ => Char/*->scala::Char#*/ + case Array/*->scala::Array#*/[t/*<-local0*/] => t/*->local0*/ + case Iterable/*->scala::package.Iterable#*/[t/*<-local1*/] => t/*->local1*/ + +type Concat/*<-example::MatchType$package.Concat#*/[Xs/*<-example::MatchType$package.Concat#[Xs]*/ <: Tuple/*->scala::Tuple#*/, +Ys/*<-example::MatchType$package.Concat#[Ys]*/ <: Tuple/*->scala::Tuple#*/] <: Tuple/*->scala::Tuple#*/ = Xs/*->example::MatchType$package.Concat#[Xs]*/ match + case EmptyTuple/*->scala::Tuple$package.EmptyTuple#*/ => Ys/*->example::MatchType$package.Concat#[Ys]*/ + case x/*<-local2*/ *:/*->scala::`*:`#*/ xs/*<-local3*/ => x/*->local2*/ *:/*->scala::`*:`#*/ Concat/*->example::MatchType$package.Concat#*/[xs/*->local3*/, Ys/*->example::MatchType$package.Concat#[Ys]*/] diff --git a/tests/semanticdb/expect/MatchType.scala b/tests/semanticdb/expect/MatchType.scala new file mode 100644 index 000000000000..6384b1bc68f8 --- /dev/null +++ b/tests/semanticdb/expect/MatchType.scala @@ -0,0 +1,10 @@ +package example + +type Elem[X] = X match + case String => Char + case Array[t] => t + case Iterable[t] => t + +type Concat[Xs <: Tuple, +Ys <: Tuple] <: Tuple = Xs match + case EmptyTuple => Ys + case x *: xs => x *: Concat[xs, Ys] diff --git a/tests/semanticdb/expect/dep-match.expect.scala b/tests/semanticdb/expect/dep-match.expect.scala new file mode 100644 index 000000000000..4a4a953ee04d --- /dev/null +++ b/tests/semanticdb/expect/dep-match.expect.scala @@ -0,0 +1,9 @@ +object Test_depmatch/*<-_empty_::Test_depmatch.*/ { + type Foo/*<-_empty_::Test_depmatch.Foo#*/ = Int/*->scala::Int#*/ { type U/*<-local0*/ } + type Bar/*<-_empty_::Test_depmatch.Bar#*/[T/*<-_empty_::Test_depmatch.Bar#[T]*/] = T/*->_empty_::Test_depmatch.Bar#[T]*/ match { + case Unit/*->scala::Unit#*/ => Unit/*->scala::Unit#*/ + } + inline def baz/*<-_empty_::Test_depmatch.baz().*/(foo/*<-_empty_::Test_depmatch.baz().(foo)*/: Foo/*->_empty_::Test_depmatch.Foo#*/): Unit/*->scala::Unit#*/ = { + val v/*<-local1*/: Bar/*->_empty_::Test_depmatch.Bar#*/[foo/*->_empty_::Test_depmatch.baz().(foo)*/.U/*->local0*/] = ???/*->scala::Predef.`???`().*/ + } +} diff --git a/tests/semanticdb/expect/dep-match.scala b/tests/semanticdb/expect/dep-match.scala new file mode 100644 index 000000000000..d548310b11af --- /dev/null +++ b/tests/semanticdb/expect/dep-match.scala @@ -0,0 +1,9 @@ +object Test_depmatch { + type Foo = Int { type U } + type Bar[T] = T match { + case Unit => Unit + } + inline def baz(foo: Foo): Unit = { + val v: Bar[foo.U] = ??? + } +} diff --git a/tests/semanticdb/expect/i5854.expect.scala b/tests/semanticdb/expect/i5854.expect.scala new file mode 100644 index 000000000000..c1878c26706b --- /dev/null +++ b/tests/semanticdb/expect/i5854.expect.scala @@ -0,0 +1,11 @@ +package i5854 + +class B/*<-i5854::B#*/ { + // Known issue: Can't lookup the symbol of `b.A` + // we have to register the symbol of `b { type A }` to the refinementSymtab first + // then resolve, or assign same semanticdb symbol for both + // fake symbol for b.A, and real symbol of A in b + val a/*<-i5854::B#a.*/: String/*->scala::Predef.String#*/ = (((1: Any/*->scala::Any#*/): b/*->i5854::B#b.*/.A): Nothing/*->scala::Nothing#*/): String/*->scala::Predef.String#*/ + val b/*<-i5854::B#b.*/: { type A/*<-local0*/ >: Any/*->scala::Any#*/ <: Nothing/*->scala::Nothing#*/ } = loop/*->i5854::B#loop().*/() // error + def loop/*<-i5854::B#loop().*/(): Nothing/*->scala::Nothing#*/ = loop/*->i5854::B#loop().*/() +} diff --git a/tests/semanticdb/expect/i5854.scala b/tests/semanticdb/expect/i5854.scala new file mode 100644 index 000000000000..1a9fdf6c39d0 --- /dev/null +++ b/tests/semanticdb/expect/i5854.scala @@ -0,0 +1,11 @@ +package i5854 + +class B { + // Known issue: Can't lookup the symbol of `b.A` + // we have to register the symbol of `b { type A }` to the refinementSymtab first + // then resolve, or assign same semanticdb symbol for both + // fake symbol for b.A, and real symbol of A in b + val a: String = (((1: Any): b.A): Nothing): String + val b: { type A >: Any <: Nothing } = loop() // error + def loop(): Nothing = loop() +} diff --git a/tests/semanticdb/metac.expect b/tests/semanticdb/metac.expect index 732e9b07aa85..12c6f72bdb87 100644 --- a/tests/semanticdb/metac.expect +++ b/tests/semanticdb/metac.expect @@ -48,9 +48,9 @@ Schema => SemanticDB v4 Uri => Advanced.scala Text => empty Language => Scala -Symbols => 48 entries -Occurrences => 105 entries -Synthetics => 3 entries +Symbols => 60 entries +Occurrences => 132 entries +Synthetics => 4 entries Symbols: advanced/C# => class C [typeparam T ] extends Object { self: C[T] => +3 decls } @@ -67,17 +67,25 @@ advanced/HKClass#foo(). => method foo [typeparam T , typeparam U ](param x: F[T, advanced/HKClass#foo().(x) => param x: F[T, U] advanced/HKClass#foo().[T] => typeparam T advanced/HKClass#foo().[U] => typeparam U -advanced/Structural# => class Structural extends Object { self: Structural => +5 decls } +advanced/Structural# => class Structural extends Object { self: Structural => +6 decls } +advanced/Structural#T# => trait T [typeparam A ] extends Object { self: T[A] => +4 decls } +advanced/Structural#T#[A] => typeparam A +advanced/Structural#T#``(). => primary ctor [typeparam A ](): T[A] +advanced/Structural#T#bar(). => method bar (param b: foo.B): Unit +advanced/Structural#T#bar().(b) => param b: foo.B +advanced/Structural#T#foo. => val method foo Object { type B = A } advanced/Structural#``(). => primary ctor (): Structural advanced/Structural#s1(). => method s1 => Object { abstract val method x Int } advanced/Structural#s2(). => method s2 => Object { abstract val method x Int } advanced/Structural#s3(). => method s3 => Object { abstract method m (param x: Int): Int } advanced/Structural#s4(). => method s4 (param a: Int): Object { abstract val method x Int } advanced/Structural#s4().(a) => param a: Int -advanced/Test. => final object Test extends Object { self: Test.type => +11 decls } +advanced/Test. => final object Test extends Object { self: Test.type => +13 decls } +advanced/Test.bar(). => method bar => foo.A advanced/Test.e. => val method e Wildcards advanced/Test.e1. => val method e1 List[_] forSome { type _ } advanced/Test.e1x. => val method e1x Any +advanced/Test.foo. => lazy val method foo Selectable { type A = Int } & Selectable { abstract val method a A; type A = Int } advanced/Test.s. => val method s Structural advanced/Test.s1. => val method s1 Object { abstract val method x Int } advanced/Test.s1x. => val method s1x Int @@ -99,8 +107,12 @@ local7 => param x: Int local8 => method m (param x: Int): Int local9 => final class $anon extends Object { self: $anon => +2 decls } local11 => abstract val method x Int -local12 => val local e3: List[local13] -local14 => val local e3x: local13 +local12 => type B = A +local13 => val local e3: List[local14] +local15 => val local e3x: local14 +local16 => type A = Int +local17 => type A = Int +local18 => abstract val method a A Occurrences: [0:8..0:16): advanced <- advanced/ @@ -146,73 +158,101 @@ Occurrences: [15:24..15:25): x <- local11 [15:27..15:30): Int -> scala/Int# [15:35..15:38): ??? -> scala/Predef.`???`(). -[18:6..18:15): Wildcards <- advanced/Wildcards# -[19:6..19:8): e1 <- advanced/Wildcards#e1(). -[19:10..19:14): List -> scala/package.List# -[19:20..19:23): ??? -> scala/Predef.`???`(). -[20:6..20:8): e2 <- advanced/Wildcards#e2(). +[16:8..16:9): T <- advanced/Structural#T# +[16:10..16:11): A <- advanced/Structural#T#[A] +[16:19..16:22): foo <- advanced/Structural#T#foo. +[16:31..16:32): B <- local12 +[16:35..16:36): A -> advanced/Structural#T#[A] +[16:41..16:44): ??? -> scala/Predef.`???`(). +[16:50..16:53): bar <- advanced/Structural#T#bar(). +[16:54..16:55): b <- advanced/Structural#T#bar().(b) +[16:57..16:60): foo -> advanced/Structural#T#foo. +[16:61..16:62): B -> local12 +[19:6..19:15): Wildcards <- advanced/Wildcards# +[20:6..20:8): e1 <- advanced/Wildcards#e1(). [20:10..20:14): List -> scala/package.List# -[20:20..20:23): Int -> scala/Int# -[20:27..20:30): ??? -> scala/Predef.`???`(). -[23:7..23:11): Test <- advanced/Test. -[24:6..24:7): s <- advanced/Test.s. -[24:14..24:24): Structural -> advanced/Structural# -[25:6..25:8): s1 <- advanced/Test.s1. -[25:11..25:12): s -> advanced/Test.s. -[25:13..25:15): s1 -> advanced/Structural#s1(). -[26:6..26:9): s1x <- advanced/Test.s1x. -[26:12..26:13): s -> advanced/Test.s. -[26:14..26:16): s1 -> advanced/Structural#s1(). -[27:6..27:8): s2 <- advanced/Test.s2. -[27:11..27:12): s -> advanced/Test.s. -[27:13..27:15): s2 -> advanced/Structural#s2(). -[28:6..28:9): s2x <- advanced/Test.s2x. -[28:12..28:13): s -> advanced/Test.s. -[28:14..28:16): s2 -> advanced/Structural#s2(). -[29:6..29:8): s3 <- advanced/Test.s3. -[29:11..29:12): s -> advanced/Test.s. -[29:13..29:15): s3 -> advanced/Structural#s3(). -[30:6..30:9): s3x <- advanced/Test.s3x. -[30:12..30:13): s -> advanced/Test.s. -[30:14..30:16): s3 -> advanced/Structural#s3(). -[30:19..30:22): ??? -> scala/Predef.`???`(). -[32:6..32:7): e <- advanced/Test.e. -[32:14..32:23): Wildcards -> advanced/Wildcards# -[33:6..33:8): e1 <- advanced/Test.e1. -[33:11..33:12): e -> advanced/Test.e. -[33:13..33:15): e1 -> advanced/Wildcards#e1(). -[34:6..34:9): e1x <- advanced/Test.e1x. -[34:12..34:13): e -> advanced/Test.e. -[34:14..34:16): e1 -> advanced/Wildcards#e1(). -[34:17..34:21): head -> scala/collection/IterableOps#head(). -[37:5..37:8): ??? -> scala/Predef.`???`(). -[37:11..37:14): Any -> scala/Any# -[38:11..38:13): e3 <- local12 -[38:15..38:19): List -> scala/package.List# -[39:12..39:15): e3x <- local14 -[39:18..39:20): e3 -> local12 -[39:21..39:25): head -> scala/collection/IterableOps#head(). -[47:6..47:13): HKClass <- advanced/HKClass# -[47:14..47:15): F <- advanced/HKClass#[F] -[47:20..47:21): T <- advanced/HKClass#``().[F][T] -[47:28..47:29): U <- advanced/HKClass#``().[F][U] -[47:36..47:37): U -> advanced/HKClass#``().[F][U] -[47:39..47:40): T -> advanced/HKClass#``().[F][T] -[48:6..48:9): foo <- advanced/HKClass#foo(). -[48:10..48:11): T <- advanced/HKClass#foo().[T] -[48:12..48:13): U <- advanced/HKClass#foo().[U] -[48:15..48:16): x <- advanced/HKClass#foo().(x) -[48:18..48:19): F -> advanced/HKClass#[F] -[48:20..48:21): T -> advanced/HKClass#foo().[T] -[48:23..48:24): U -> advanced/HKClass#foo().[U] -[48:28..48:34): String -> scala/Predef.String# -[48:37..48:38): x -> advanced/HKClass#foo().(x) -[48:39..48:47): toString -> scala/Tuple2#toString(). +[20:20..20:23): ??? -> scala/Predef.`???`(). +[21:6..21:8): e2 <- advanced/Wildcards#e2(). +[21:10..21:14): List -> scala/package.List# +[21:20..21:23): Int -> scala/Int# +[21:27..21:30): ??? -> scala/Predef.`???`(). +[24:7..24:11): Test <- advanced/Test. +[25:6..25:7): s <- advanced/Test.s. +[25:14..25:24): Structural -> advanced/Structural# +[26:6..26:8): s1 <- advanced/Test.s1. +[26:11..26:12): s -> advanced/Test.s. +[26:13..26:15): s1 -> advanced/Structural#s1(). +[27:6..27:9): s1x <- advanced/Test.s1x. +[27:12..27:13): s -> advanced/Test.s. +[27:14..27:16): s1 -> advanced/Structural#s1(). +[28:6..28:8): s2 <- advanced/Test.s2. +[28:11..28:12): s -> advanced/Test.s. +[28:13..28:15): s2 -> advanced/Structural#s2(). +[29:6..29:9): s2x <- advanced/Test.s2x. +[29:12..29:13): s -> advanced/Test.s. +[29:14..29:16): s2 -> advanced/Structural#s2(). +[30:6..30:8): s3 <- advanced/Test.s3. +[30:11..30:12): s -> advanced/Test.s. +[30:13..30:15): s3 -> advanced/Structural#s3(). +[31:6..31:9): s3x <- advanced/Test.s3x. +[31:12..31:13): s -> advanced/Test.s. +[31:14..31:16): s3 -> advanced/Structural#s3(). +[31:19..31:22): ??? -> scala/Predef.`???`(). +[33:6..33:7): e <- advanced/Test.e. +[33:14..33:23): Wildcards -> advanced/Wildcards# +[34:6..34:8): e1 <- advanced/Test.e1. +[34:11..34:12): e -> advanced/Test.e. +[34:13..34:15): e1 -> advanced/Wildcards#e1(). +[35:6..35:9): e1x <- advanced/Test.e1x. +[35:12..35:13): e -> advanced/Test.e. +[35:14..35:16): e1 -> advanced/Wildcards#e1(). +[35:17..35:21): head -> scala/collection/IterableOps#head(). +[38:5..38:8): ??? -> scala/Predef.`???`(). +[38:11..38:14): Any -> scala/Any# +[39:11..39:13): e3 <- local13 +[39:15..39:19): List -> scala/package.List# +[40:12..40:15): e3x <- local15 +[40:18..40:20): e3 -> local13 +[40:21..40:25): head -> scala/collection/IterableOps#head(). +[46:11..46:14): foo <- advanced/Test.foo. +[46:17..46:24): reflect -> scala/reflect/ +[46:25..46:35): Selectable -> scala/reflect/Selectable# +[46:43..46:44): A <- local16 +[46:47..46:50): Int -> scala/Int# +[46:54..46:55): & -> scala/`&`# +[46:57..46:64): reflect -> scala/reflect/ +[46:65..46:75): Selectable -> scala/reflect/Selectable# +[46:83..46:84): A <- local17 +[46:87..46:90): Int -> scala/Int# +[46:96..46:97): a <- local18 +[46:99..46:100): A -> local17 +[46:106..46:109): ??? -> scala/Predef.`???`(). +[47:6..47:9): bar <- advanced/Test.bar(). +[47:11..47:14): foo -> advanced/Test.foo. +[47:15..47:16): A -> local17 +[47:19..47:22): foo -> advanced/Test.foo. +[52:6..52:13): HKClass <- advanced/HKClass# +[52:14..52:15): F <- advanced/HKClass#[F] +[52:20..52:21): T <- advanced/HKClass#``().[F][T] +[52:28..52:29): U <- advanced/HKClass#``().[F][U] +[52:36..52:37): U -> advanced/HKClass#``().[F][U] +[52:39..52:40): T -> advanced/HKClass#``().[F][T] +[53:6..53:9): foo <- advanced/HKClass#foo(). +[53:10..53:11): T <- advanced/HKClass#foo().[T] +[53:12..53:13): U <- advanced/HKClass#foo().[U] +[53:15..53:16): x <- advanced/HKClass#foo().(x) +[53:18..53:19): F -> advanced/HKClass#[F] +[53:20..53:21): T -> advanced/HKClass#foo().[T] +[53:23..53:24): U -> advanced/HKClass#foo().[U] +[53:28..53:34): String -> scala/Predef.String# +[53:37..53:38): x -> advanced/HKClass#foo().(x) +[53:39..53:47): toString -> scala/Tuple2#toString(). Synthetics: -[26:12..26:16):s.s1 => reflectiveSelectable(*) -[28:12..28:16):s.s2 => reflectiveSelectable(*) -[30:12..30:16):s.s3 => reflectiveSelectable(*) +[27:12..27:16):s.s1 => reflectiveSelectable(*) +[29:12..29:16):s.s2 => reflectiveSelectable(*) +[31:12..31:16):s.s3 => reflectiveSelectable(*) +[47:19..47:24):foo.a => *[foo.A] expect/Annotations.scala ------------------------ @@ -2016,6 +2056,60 @@ Occurrences: Synthetics: [5:4..5:8):List => *.apply[Int] +expect/MatchType.scala +---------------------- + +Summary: +Schema => SemanticDB v4 +Uri => MatchType.scala +Text => empty +Language => Scala +Symbols => 10 entries +Occurrences => 29 entries + +Symbols: +example/MatchType$package. => final package object example extends Object { self: example.type => +3 decls } +example/MatchType$package.Concat# => type Concat [typeparam Xs <: Tuple, covariant typeparam Ys <: Tuple] = Xs match { EmptyTuple => Ys, *:[x, xs] => *:[x, Concat[xs, Ys]] } +example/MatchType$package.Concat#[Xs] => typeparam Xs <: Tuple +example/MatchType$package.Concat#[Ys] => covariant typeparam Ys <: Tuple +example/MatchType$package.Elem# => type Elem [typeparam X ] = X match { String => Char, Array[t] => t, Iterable[t] => t } +example/MatchType$package.Elem#[X] => typeparam X +local0 => type t +local1 => type t +local2 => type x +local3 => type xs <: Tuple + +Occurrences: +[0:8..0:15): example <- example/ +[2:5..2:9): Elem <- example/MatchType$package.Elem# +[2:10..2:11): X <- example/MatchType$package.Elem#[X] +[2:15..2:16): X -> example/MatchType$package.Elem#[X] +[3:7..3:13): String -> scala/Predef.String# +[3:17..3:21): Char -> scala/Char# +[4:7..4:12): Array -> scala/Array# +[4:13..4:14): t <- local0 +[4:19..4:20): t -> local0 +[5:7..5:15): Iterable -> scala/package.Iterable# +[5:16..5:17): t <- local1 +[5:22..5:23): t -> local1 +[7:5..7:11): Concat <- example/MatchType$package.Concat# +[7:12..7:14): Xs <- example/MatchType$package.Concat#[Xs] +[7:18..7:23): Tuple -> scala/Tuple# +[7:26..7:28): Ys <- example/MatchType$package.Concat#[Ys] +[7:32..7:37): Tuple -> scala/Tuple# +[7:42..7:47): Tuple -> scala/Tuple# +[7:50..7:52): Xs -> example/MatchType$package.Concat#[Xs] +[8:7..8:17): EmptyTuple -> scala/Tuple$package.EmptyTuple# +[8:21..8:23): Ys -> example/MatchType$package.Concat#[Ys] +[9:7..9:8): x <- local2 +[9:9..9:11): *: -> scala/`*:`# +[9:12..9:14): xs <- local3 +[9:18..9:19): x -> local2 +[9:20..9:22): *: -> scala/`*:`# +[9:23..9:29): Concat -> example/MatchType$package.Concat# +[9:30..9:32): xs -> local3 +[9:34..9:36): Ys -> example/MatchType$package.Concat#[Ys] + expect/MetacJava.scala ---------------------- @@ -3633,6 +3727,47 @@ Occurrences: [4:18..4:21): Int -> scala/Int# [4:26..4:30): Unit -> scala/Unit# +expect/dep-match.scala +---------------------- + +Summary: +Schema => SemanticDB v4 +Uri => dep-match.scala +Text => empty +Language => Scala +Symbols => 8 entries +Occurrences => 18 entries + +Symbols: +_empty_/Test_depmatch. => final object Test_depmatch extends Object { self: Test_depmatch.type => +4 decls } +_empty_/Test_depmatch.Bar# => type Bar [typeparam T ] = T match { Unit => Unit } +_empty_/Test_depmatch.Bar#[T] => typeparam T +_empty_/Test_depmatch.Foo# => type Foo = Int { type U } +_empty_/Test_depmatch.baz(). => inline macro baz (param foo: Foo): Unit +_empty_/Test_depmatch.baz().(foo) => param foo: Foo +local0 => type U +local1 => val local v: Bar[foo.U] + +Occurrences: +[0:7..0:20): Test_depmatch <- _empty_/Test_depmatch. +[1:7..1:10): Foo <- _empty_/Test_depmatch.Foo# +[1:13..1:16): Int -> scala/Int# +[1:24..1:25): U <- local0 +[2:7..2:10): Bar <- _empty_/Test_depmatch.Bar# +[2:11..2:12): T <- _empty_/Test_depmatch.Bar#[T] +[2:16..2:17): T -> _empty_/Test_depmatch.Bar#[T] +[3:9..3:13): Unit -> scala/Unit# +[3:17..3:21): Unit -> scala/Unit# +[5:13..5:16): baz <- _empty_/Test_depmatch.baz(). +[5:17..5:20): foo <- _empty_/Test_depmatch.baz().(foo) +[5:22..5:25): Foo -> _empty_/Test_depmatch.Foo# +[5:28..5:32): Unit -> scala/Unit# +[6:8..6:9): v <- local1 +[6:11..6:14): Bar -> _empty_/Test_depmatch.Bar# +[6:15..6:18): foo -> _empty_/Test_depmatch.baz().(foo) +[6:19..6:20): U -> local0 +[6:24..6:27): ??? -> scala/Predef.`???`(). + expect/exports-example-Codec.scala ---------------------------------- @@ -3745,6 +3880,43 @@ Occurrences: [0:8..0:15): example <- example/ [2:6..2:24): FilenameWithSpaces <- example/FilenameWithSpaces# +expect/i5854.scala +------------------ + +Summary: +Schema => SemanticDB v4 +Uri => i5854.scala +Text => empty +Language => Scala +Symbols => 6 entries +Occurrences => 16 entries + +Symbols: +i5854/B# => class B extends Object { self: B => +4 decls } +i5854/B#``(). => primary ctor (): B +i5854/B#a. => val method a String +i5854/B#b. => val method b Object { type A >: Any <: Nothing } +i5854/B#loop(). => method loop (): Nothing +local0 => type A >: Any <: Nothing + +Occurrences: +[0:8..0:13): i5854 <- i5854/ +[2:6..2:7): B <- i5854/B# +[7:6..7:7): a <- i5854/B#a. +[7:9..7:15): String -> scala/Predef.String# +[7:24..7:27): Any -> scala/Any# +[7:30..7:31): b -> i5854/B#b. +[7:36..7:43): Nothing -> scala/Nothing# +[7:46..7:52): String -> scala/Predef.String# +[8:6..8:7): b <- i5854/B#b. +[8:16..8:17): A <- local0 +[8:21..8:24): Any -> scala/Any# +[8:28..8:35): Nothing -> scala/Nothing# +[8:40..8:44): loop -> i5854/B#loop(). +[9:6..9:10): loop <- i5854/B#loop(). +[9:14..9:21): Nothing -> scala/Nothing# +[9:24..9:28): loop -> i5854/B#loop(). + expect/i9727.scala ------------------ @@ -4033,9 +4205,9 @@ Occurrences => 46 entries Synthetics => 3 entries Symbols: -local0 => case val method N$1 <: Nat +local0 => type N$1 <: Nat local1 => val local p: N$1 -local2 => case val method N$2 <: Nat +local2 => type N$2 <: Nat local3 => val local p: N$2 local4 => val local Nat_this: Zero.type local5 => val local Nat_this: Succ[Zero.type] @@ -4217,7 +4389,7 @@ flags/p/package.y(). => protected implicit var method y Int flags/p/package.z(). => method z (param pp: Int): Int flags/p/package.z().(pp) => param pp: Int local0 => val local xs2: Nothing -local1 => case val method t +local1 => type t Occurrences: [0:8..0:13): flags <- flags/