Skip to content

Nonsensical TASTy for the SELFDEF of non-static object with an explicit self => name. #19019

Closed
@sjrd

Description

@sjrd

Compiler version

3.3.1

Minimized code

package simple_trees

object ObjectWithSelf:
  object StaticObjectNoSelf:
    def foo: Any = this
  end StaticObjectNoSelf

  object StaticObjectWithSelf:
    self =>

    def foo: Any = self
  end StaticObjectWithSelf

  class Container:
    object NonStaticObjectNoSelf:
      def foo: Any = this
    end NonStaticObjectNoSelf

    object NonStaticObjectWithSelf:
      self =>

      def foo: Any = self
    end NonStaticObjectWithSelf
  end Container
end ObjectWithSelf

Output

Tree after typer:

package simple_trees {
  final lazy module val ObjectWithSelf: simple_trees.ObjectWithSelf =
    new simple_trees.ObjectWithSelf()
  final module class ObjectWithSelf() extends Object() {
    this: simple_trees.ObjectWithSelf.type =>
    final lazy module val StaticObjectNoSelf:
      simple_trees.ObjectWithSelf.StaticObjectNoSelf =
      new simple_trees.ObjectWithSelf.StaticObjectNoSelf()
    final module class StaticObjectNoSelf() extends Object() {
      this: simple_trees.ObjectWithSelf.StaticObjectNoSelf.type =>
      def foo: Any = this
    }
    final lazy module val StaticObjectWithSelf:
      simple_trees.ObjectWithSelf.StaticObjectWithSelf =
      new simple_trees.ObjectWithSelf.StaticObjectWithSelf()
    final module class StaticObjectWithSelf() extends Object() {
      self: simple_trees.ObjectWithSelf.StaticObjectWithSelf.type =>
      def foo: Any = self
    }
    class Container() extends Object() {
      final lazy module val NonStaticObjectNoSelf:
        Container.this.NonStaticObjectNoSelf =
        new Container.this.NonStaticObjectNoSelf()
      final module class NonStaticObjectNoSelf() extends Object() {
        this: Container.this.NonStaticObjectNoSelf.type =>
        def foo: Any = this
      }
      final lazy module val NonStaticObjectWithSelf:
        Container.this.NonStaticObjectWithSelf =
        new Container.this.NonStaticObjectWithSelf()
      final module class NonStaticObjectWithSelf() extends Object() {
        self: this.type =>
        def foo: Any = self
      }
    }
  }
}
Full decoded TASTy Tress
Trees:
start = Addr(0), base = 551, current = Addr(0), end = Addr(445)
445 bytes of AST, base = Addr(0)

     0: PACKAGE(442)
     3:   TERMREFpkg 1 [simple_trees]
     5:   VALDEF(18) 2 [ObjectWithSelf]
     8:     IDENTtpt 3 [ObjectWithSelf[ModuleClass]]
    10:       TYPEREFsymbol 25
    12:         TERMREFpkg 1 [simple_trees]
    14:     APPLY(8)
    16:       SELECTin(6) 7 [<init>[Signed Signature(List(),simple_trees.ObjectWithSelf$) @<init>]]
    19:         NEW
    20:           SHAREDterm 8
    22:         SHAREDtype 10
    24:     OBJECT
    25:   TYPEDEF(417) 3 [ObjectWithSelf[ModuleClass]]
    29:     TEMPLATE(392)
    32:       APPLY(10)
    34:         SELECTin(8) 13 [<init>[Signed Signature(List(),java.lang.Object) @<init>]]
    37:           NEW
    38:             TYPEREF 11 [Object]
    40:               TERMREFpkg 10 [java[Qualified . lang]]
    42:           SHAREDtype 38
    44:       SELFDEF 14 [_]
    46:         SINGLETONtpt
    47:           TERMREFsymbol 5
    49:             SHAREDtype 12
    51:       DEFDEF(6) 4 [<init>]
    54:         EMPTYCLAUSE
    55:         TYPEREF 15 [Unit]
    57:           TERMREFpkg 16 [scala]
    59:       DEFDEF(23) 17 [writeReplace]
    62:         EMPTYCLAUSE
    63:         TYPEREF 18 [AnyRef]
    65:           SHAREDtype 57
    67:         APPLY(13)
    69:           SELECTin(8) 25 [<init>[Signed Signature(List(java.lang.Class),scala.runtime.ModuleSerializationProxy) @<init>]]
    72:             NEW
    73:               TYPEREF 21 [ModuleSerializationProxy]
    75:                 TERMREFpkg 20 [scala[Qualified . runtime]]
    77:             SHAREDtype 73
    79:           CLASSconst
    80:             SHAREDtype 47
    82:         PRIVATE
    83:         SYNTHETIC
    84:       VALDEF(19) 26 [StaticObjectNoSelf]
    87:         IDENTtpt 27 [StaticObjectNoSelf[ModuleClass]]
    89:           TYPEREFsymbol 105
    91:             THIS
    92:               SHAREDtype 10
    94:         APPLY(8)
    96:           SELECTin(6) 30 [<init>[Signed Signature(List(),simple_trees.ObjectWithSelf$.StaticObjectNoSelf$) @<init>]]
    99:             NEW
   100:               SHAREDterm 87
   102:             SHAREDtype 89
   104:         OBJECT
   105:       TYPEDEF(61) 27 [StaticObjectNoSelf[ModuleClass]]
   108:         TEMPLATE(57)
   110:           APPLY(8)
   112:             SELECTin(6) 13 [<init>[Signed Signature(List(),java.lang.Object) @<init>]]
   115:               NEW
   116:                 SHAREDtype 38
   118:               SHAREDtype 38
   120:           SELFDEF 14 [_]
   122:             SINGLETONtpt
   123:               TERMREFsymbol 84
   125:                 SHAREDtype 91
   127:           DEFDEF(5) 4 [<init>]
   130:             EMPTYCLAUSE
   131:             SHAREDtype 55
   133:             STABLE
   134:           DEFDEF(19) 17 [writeReplace]
   137:             EMPTYCLAUSE
   138:             SHAREDtype 63
   140:             APPLY(11)
   142:               SELECTin(6) 25 [<init>[Signed Signature(List(java.lang.Class),scala.runtime.ModuleSerializationProxy) @<init>]]
   145:                 NEW
   146:                   SHAREDtype 73
   148:                 SHAREDtype 73
   150:               CLASSconst
   151:                 SHAREDtype 123
   153:             PRIVATE
   154:             SYNTHETIC
   155:           DEFDEF(10) 31 [foo]
   158:             IDENTtpt 32 [Any]
   160:               TYPEREF 32 [Any]
   162:                 TERMREFpkg 16 [scala]
   164:             THIS
   165:               SHAREDtype 89
   167:         OBJECT
   168:       VALDEF(21) 33 [StaticObjectWithSelf]
   171:         IDENTtpt 34 [StaticObjectWithSelf[ModuleClass]]
   173:           TYPEREFsymbol 191
   176:             SHAREDtype 91
   178:         APPLY(10)
   180:           SELECTin(8) 37 [<init>[Signed Signature(List(),simple_trees.ObjectWithSelf$.StaticObjectWithSelf$) @<init>]]
   183:             NEW
   184:               SHAREDterm 171
   187:             SHAREDtype 173
   190:         OBJECT
   191:       TYPEDEF(65) 34 [StaticObjectWithSelf[ModuleClass]]
   194:         TEMPLATE(61)
   196:           APPLY(8)
   198:             SELECTin(6) 13 [<init>[Signed Signature(List(),java.lang.Object) @<init>]]
   201:               NEW
   202:                 SHAREDtype 38
   204:               SHAREDtype 38
   206:           SELFDEF 38 [self]
   208:             SINGLETONtpt
   209:               TERMREFsymbol 168
   212:                 SHAREDtype 91
   214:           DEFDEF(5) 4 [<init>]
   217:             EMPTYCLAUSE
   218:             SHAREDtype 55
   220:             STABLE
   221:           DEFDEF(20) 17 [writeReplace]
   224:             EMPTYCLAUSE
   225:             SHAREDtype 63
   227:             APPLY(12)
   229:               SELECTin(6) 25 [<init>[Signed Signature(List(java.lang.Class),scala.runtime.ModuleSerializationProxy) @<init>]]
   232:                 NEW
   233:                   SHAREDtype 73
   235:                 SHAREDtype 73
   237:               CLASSconst
   238:                 SHAREDtype 209
   241:             PRIVATE
   242:             SYNTHETIC
   243:           DEFDEF(12) 31 [foo]
   246:             IDENTtpt 32 [Any]
   248:               SHAREDtype 160
   251:             QUALTHIS
   252:               IDENTtpt 34 [StaticObjectWithSelf[ModuleClass]]
   254:                 SHAREDtype 173
   257:         OBJECT
   258:       TYPEDEF(163) 39 [Container]
   262:         TEMPLATE(159)
   265:           APPLY(8)
   267:             SELECTin(6) 13 [<init>[Signed Signature(List(),java.lang.Object) @<init>]]
   270:               NEW
   271:                 SHAREDtype 38
   273:               SHAREDtype 38
   275:           DEFDEF(4) 4 [<init>]
   278:             EMPTYCLAUSE
   279:             SHAREDtype 55
   281:           VALDEF(25) 40 [NonStaticObjectNoSelf]
   284:             IDENTtpt 41 [NonStaticObjectNoSelf[ModuleClass]]
   286:               TYPEREFsymbol 308
   289:                 THIS
   290:                   TYPEREFsymbol 258
   293:                     SHAREDtype 91
   295:             APPLY(10)
   297:               SELECTin(8) 45 [<init>[Signed Signature(List(),simple_trees.ObjectWithSelf$.Container.NonStaticObjectNoSelf$) @<init>]]
   300:                 NEW
   301:                   SHAREDterm 284
   304:                 SHAREDtype 286
   307:             OBJECT
   308:           TYPEDEF(44) 41 [NonStaticObjectNoSelf[ModuleClass]]
   311:             TEMPLATE(40)
   313:               APPLY(8)
   315:                 SELECTin(6) 13 [<init>[Signed Signature(List(),java.lang.Object) @<init>]]
   318:                   NEW
   319:                     SHAREDtype 38
   321:                   SHAREDtype 38
   323:               SELFDEF 14 [_]
   325:                 SINGLETONtpt
   326:                   SELECT 40 [NonStaticObjectNoSelf]
   328:                     QUALTHIS
   329:                       IDENTtpt 39 [Container]
   331:                         SHAREDtype 290
   334:               DEFDEF(5) 4 [<init>]
   337:                 EMPTYCLAUSE
   338:                 SHAREDtype 55
   340:                 STABLE
   341:               DEFDEF(10) 31 [foo]
   344:                 IDENTtpt 32 [Any]
   346:                   SHAREDtype 160
   349:                 THIS
   350:                   SHAREDtype 286
   353:             OBJECT
   354:           VALDEF(22) 46 [NonStaticObjectWithSelf]
   357:             IDENTtpt 47 [NonStaticObjectWithSelf[ModuleClass]]
   359:               TYPEREFsymbol 378
   362:                 SHAREDtype 289
   365:             APPLY(10)
   367:               SELECTin(8) 50 [<init>[Signed Signature(List(),simple_trees.ObjectWithSelf$.Container.NonStaticObjectWithSelf$) @<init>]]
   370:                 NEW
   371:                   SHAREDterm 357
   374:                 SHAREDtype 359
   377:             OBJECT
   378:           TYPEDEF(44) 47 [NonStaticObjectWithSelf[ModuleClass]]
   381:             TEMPLATE(40)
   383:               APPLY(8)
   385:                 SELECTin(6) 13 [<init>[Signed Signature(List(),java.lang.Object) @<init>]]
   388:                   NEW
   389:                     SHAREDtype 38
   391:                   SHAREDtype 38
   393:               SELFDEF 38 [self]
   395:                 SINGLETONtpt
   396:                   QUALTHIS
   397:                     IDENTtpt 47 [NonStaticObjectWithSelf[ModuleClass]]
   399:                       SHAREDtype 359
   402:               DEFDEF(5) 4 [<init>]
   405:                 EMPTYCLAUSE
   406:                 SHAREDtype 55
   408:                 STABLE
   409:               DEFDEF(12) 31 [foo]
   412:                 IDENTtpt 32 [Any]
   414:                   SHAREDtype 160
   417:                 QUALTHIS
   418:                   IDENTtpt 47 [NonStaticObjectWithSelf[ModuleClass]]
   420:                     SHAREDtype 359
   423:             OBJECT
   424:     OBJECT
   425:     ANNOTATION(18)
   427:       TYPEREF 51 [SourceFile]
   429:         TERMREFpkg 55 [scala[Qualified . annotation][Qualified . internal]]
   431:       APPLY(12)
   433:         SELECTin(8) 59 [<init>[Signed Signature(List(java.lang.String),scala.annotation.internal.SourceFile) @<init>]]
   436:           NEW
   437:             SHAREDtype 427
   440:           SHAREDtype 427
   443:         STRINGconst 60 [test-sources/src/main/scala/simple_trees/ObjectWithSelf.scala]
   445:

Chosen excerpts:

// StaticObjectNoSelf

    84:       VALDEF(19) 26 [StaticObjectNoSelf]
    87:         IDENTtpt 27 [StaticObjectNoSelf[ModuleClass]]
    89:           TYPEREFsymbol 105
    91:             THIS
    92:               SHAREDtype 10
    94:         APPLY(8)
...
   105:       TYPEDEF(61) 27 [StaticObjectNoSelf[ModuleClass]]
   108:         TEMPLATE(57)
...
   120:           SELFDEF 14 [_]
   122:             SINGLETONtpt
   123:               TERMREFsymbol 84
   125:                 SHAREDtype 91
...

// StaticObjectWithSelf

   168:       VALDEF(21) 33 [StaticObjectWithSelf]
   171:         IDENTtpt 34 [StaticObjectWithSelf[ModuleClass]]
   173:           TYPEREFsymbol 191
   176:             SHAREDtype 91
...
   191:       TYPEDEF(65) 34 [StaticObjectWithSelf[ModuleClass]]
   194:         TEMPLATE(61)
...
   206:           SELFDEF 38 [self]
   208:             SINGLETONtpt
   209:               TERMREFsymbol 168
   212:                 SHAREDtype 91
...

// Container.NonStaticObjectNoSelf

   281:           VALDEF(25) 40 [NonStaticObjectNoSelf]
   284:             IDENTtpt 41 [NonStaticObjectNoSelf[ModuleClass]]
   286:               TYPEREFsymbol 308
   289:                 THIS
   290:                   TYPEREFsymbol 258
   293:                     SHAREDtype 91
...
   308:           TYPEDEF(44) 41 [NonStaticObjectNoSelf[ModuleClass]]
   311:             TEMPLATE(40)
...
   323:               SELFDEF 14 [_]
   325:                 SINGLETONtpt
   326:                   SELECT 40 [NonStaticObjectNoSelf]
   328:                     QUALTHIS
   329:                       IDENTtpt 39 [Container]
   331:                         SHAREDtype 290
...

// NonStaticObjectWithSelf

   354:           VALDEF(22) 46 [NonStaticObjectWithSelf]
   357:             IDENTtpt 47 [NonStaticObjectWithSelf[ModuleClass]]
   359:               TYPEREFsymbol 378
   362:                 SHAREDtype 289
...
   378:           TYPEDEF(44) 47 [NonStaticObjectWithSelf[ModuleClass]]
   381:             TEMPLATE(40)
...
   393:               SELFDEF 38 [self]
   395:                 SINGLETONtpt
   396:                   QUALTHIS
   397:                     IDENTtpt 47 [NonStaticObjectWithSelf[ModuleClass]]
   399:                       SHAREDtype 359
...

Remarks:

OK: The declared type of every module VALDEF is a TypeRef of the module class, for example Container.this.NonStaticObjectNoSelf[ModuleClass].

OK: The type of the SELFDEF for the 3 first cases (both static objects, and the non-static object without self =>), is a SINGLETONtpt of a term ref to the VALDEF, for example Container.this.NonStaticObjectNoSelf.type.

NOT OK: The type of the SELFDEF for the last case--the non-static object with a self =>-- is the this-type of its own module class, namely NonStaticObjectWithSelf[ModuleClass].this.type.

Why is not OK? Because it creates a loop in the superType chain (or underlying) of that this type. The underlying of the this-type is the self type; but the underlying of the self is the this-type!

Expectation

I expect the type of the last SELFDEF to be consistent with the other three, and point to the singleton type of the accompanying VALDEF.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions