Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rebased #2696 #2719

Closed
wants to merge 2 commits into from
Closed

Rebased #2696 #2719

wants to merge 2 commits into from

Conversation

adriaanm
Copy link
Contributor

supersedes #2696

Add a file argument to the :paste command which loads the
file's contents as though entered in :paste mode.

The :paste command is replayable.

Samples, including companions defined together:

```
scala> :paste junk.scala
File contains no code: junk.scala

scala> :paste no-file.scala
That file does not exist

scala> :paste obj-repl.scala
Pasting file obj-repl.scala...
<console>:2: error: expected start of definition
         private foo = 7
                 ^

scala> :paste hw-repl.scala
Pasting file hw-repl.scala...
The pasted code is incomplete!

<pastie>:5: error: illegal start of simple expression
}
^

scala> :replay
Replaying: :paste junk.scala
File contains no code: junk.scala

Replaying: :paste obj-repl.scala
Pasting file obj-repl.scala...
defined trait Foo
defined object Foo

Replaying: Foo(new Foo{})
res0: Int = 7
```
By special request, :paste -raw simply compiles the pasted
code to the repl output dir.

The -raw flag means no wrapping; the pasted code must be
ordinary top level Scala code, not script.
@som-snytt
Copy link
Contributor

@adriaanm Thanks, I wouldn't mind doing the rebase, even though I am a mere journeyman rebaser.

@adriaanm
Copy link
Contributor Author

Darn, looks like test/files/run/repl-paste-4 failed.

@adriaanm
Copy link
Contributor Author

I did the rebase because I'm cutting M4 and wanted to get this one in. I guess there's always the next snapshot.

@som-snytt
Copy link
Contributor

But the diff is empty!

Oh, if only we'd used command line diff or git diff, instead of a java library to ensure uniform output!

Just kidding. I'm sure there's a perfectly logical explanation. Like, Jenkins has had it in for me ever since I suggested, half-jokingly, that maybe he shouldn't imbibe such a hearty quantity of gin while he's testing our stuff.

@som-snytt
Copy link
Contributor

I can't even clean build it -- fresh fetch, pulling my branch and fixing the minor collision:

quick.reflect:
    [mkdir] Created dir: /home/apm/projects/scala-pick/build/quick/classes/reflect
[quick.reflect] Compiling 147 files to /home/apm/projects/scala-pick/build/quick/classes/reflect
[quick.reflect] /home/apm/projects/scala-pick/src/reflect/scala/reflect/api/Quasiquotes.scala:12: error: macro implementation has wrong shape:
[quick.reflect]  required: (c: scala.reflect.macros.Context)(args: c.Expr[Any]*): c.Expr[Any]
[quick.reflect]  found   : : Nothing
[quick.reflect] number of parameter sections differ
[quick.reflect]       def apply(args: Any*): Any = macro ???
[quick.reflect]                                          ^
[quick.reflect] /home/apm/projects/scala-pick/src/reflect/scala/reflect/api/Quasiquotes.scala:13: error: macro implementation has wrong shape:
[quick.reflect]  required: (c: scala.reflect.macros.Context)(subpatterns: c.Expr[Any]*): c.Expr[Option[Any]]
[quick.reflect]  found   : : Nothing
[quick.reflect] number of parameter sections differ
[quick.reflect]       def unapply(subpatterns: Any*): Option[Any] = macro ???
[quick.reflect]                                                           ^
[quick.reflect] two errors found

@som-snytt
Copy link
Contributor

Deleting build.properties fixed the build problem. From cygwin days, I had a script to output git.commit properties and also the skip.locker flags.

@som-snytt
Copy link
Contributor

@adriaanm I did a fresh rebase and build and ant test.suite passed on Linux. Ah, but not -optimise! Could that really make a difference here? Between build cycles and reading Travis Brown's Metaplasm, I keep forgetting what the commit was for.

@som-snytt
Copy link
Contributor

I just noticed there are \n in the test code. That must be it.

@som-snytt
Copy link
Contributor

@adriaanm Are the build artifacts archived? ("Archiving artifacts")

I want to see the

/localhome/jenkins/a/workspace/pr-checkin-per-commit/test/files/run/repl-paste-4-run.log

with my own eyes.

I took another look at the "git diff" code in partest. It looks like it should work, but in Runner.diffIsOk, the code is knotty, and I can't tell by looking how bestDiff was generated. If the output of the git Process doesn't give you lines of diff when you expect it to, there should be a red flag.

I changed this test to a SessionTest and rm'd the check file, but I don't see yet what failed.

@adriaanm adriaanm closed this Jul 12, 2013
adriaanm added a commit to adriaanm/scala that referenced this pull request Oct 1, 2015
```
trait T { val a: String ; val b: a.type }
class C extends T {
  // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
}
```

poking around ASF v memberInfo

using lazy type completer to only do ASF when synth symbol should be there

it seems symbols occurring in types of synthesized members
do not get rebound to other synthesized symbols

package <empty>#4 {
  abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
    <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
    <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
    <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
      ()
    };
    <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
    N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
    <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
    N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
  };
  abstract class M#7353 extends scala#22.AnyRef#2378 {
    <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
      M#7353.super.<init>scala#2719();
      ()
    };
    <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
    <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
  };
  class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
    <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
    <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
    <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
    <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
    <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
    <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
    <method> def <init>#14997(): <empty>#3.this.C#7354 = {
      C#7354.super.<init>#13465();
      ()
    }
  }
}

[running phase pickler on dependent_rebind.scala]
[running phase refchecks on dependent_rebind.scala]
test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
 value n #15017 has incompatible type;
 found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
 required: => N#7352.this.self#7442.type
class C extends M with N
      ^
adriaanm added a commit to adriaanm/scala that referenced this pull request Oct 1, 2015
must replace old trait accessor symbols by mixed in symbols
in the infos of the mixed in symbols

```
trait T { val a: String ; val b: a.type }
class C extends T {
  // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
}
```

symbols occurring in types of synthesized members
do not get rebound to other synthesized symbols

package <empty>#4 {
  abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
    <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
    <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
    <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
      ()
    };
    <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
    N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
    <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
    N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
  };
  abstract class M#7353 extends scala#22.AnyRef#2378 {
    <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
      M#7353.super.<init>scala#2719();
      ()
    };
    <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
    <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
  };
  class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
    <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
    <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
    <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
    <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
    <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
    <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
    <method> def <init>#14997(): <empty>#3.this.C#7354 = {
      C#7354.super.<init>#13465();
      ()
    }
  }
}

[running phase pickler on dependent_rebind.scala]
[running phase refchecks on dependent_rebind.scala]
test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
 value n #15017 has incompatible type;
 found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
 required: => N#7352.this.self#7442.type
class C extends M with N
      ^
adriaanm added a commit to adriaanm/scala that referenced this pull request Oct 1, 2015
must replace old trait accessor symbols by mixed in symbols
in the infos of the mixed in symbols

```
trait T { val a: String ; val b: a.type }
class C extends T {
  // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
}
```

symbols occurring in types of synthesized members
do not get rebound to other synthesized symbols

package <empty>#4 {
  abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
    <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
    <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
    <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
      ()
    };
    <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
    N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
    <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
    N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
  };
  abstract class M#7353 extends scala#22.AnyRef#2378 {
    <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
      M#7353.super.<init>scala#2719();
      ()
    };
    <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
    <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
  };
  class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
    <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
    <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
    <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
    <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
    <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
    <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
    <method> def <init>#14997(): <empty>#3.this.C#7354 = {
      C#7354.super.<init>#13465();
      ()
    }
  }
}

[running phase pickler on dependent_rebind.scala]
[running phase refchecks on dependent_rebind.scala]
test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
 value n #15017 has incompatible type;
 found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
 required: => N#7352.this.self#7442.type
class C extends M with N
      ^
adriaanm added a commit to adriaanm/scala that referenced this pull request Oct 1, 2015
must replace old trait accessor symbols by mixed in symbols
in the infos of the mixed in symbols

```
trait T { val a: String ; val b: a.type }
class C extends T {
  // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
}
```

symbols occurring in types of synthesized members
do not get rebound to other synthesized symbols

package <empty>#4 {
  abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
    <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
    <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
    <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
      ()
    };
    <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
    N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
    <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
    N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
  };
  abstract class M#7353 extends scala#22.AnyRef#2378 {
    <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
      M#7353.super.<init>scala#2719();
      ()
    };
    <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
    <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
  };
  class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
    <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
    <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
    <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
    <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
    <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
    <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
    <method> def <init>#14997(): <empty>#3.this.C#7354 = {
      C#7354.super.<init>#13465();
      ()
    }
  }
}

[running phase pickler on dependent_rebind.scala]
[running phase refchecks on dependent_rebind.scala]
test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
 value n #15017 has incompatible type;
 found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
 required: => N#7352.this.self#7442.type
class C extends M with N
      ^
adriaanm added a commit to adriaanm/scala that referenced this pull request Oct 2, 2015
must replace old trait accessor symbols by mixed in symbols
in the infos of the mixed in symbols

```
trait T { val a: String ; val b: a.type }
class C extends T {
  // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
}
```

symbols occurring in types of synthesized members
do not get rebound to other synthesized symbols

package <empty>#4 {
  abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
    <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
    <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
    <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
      ()
    };
    <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
    N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
    <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
    N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
  };
  abstract class M#7353 extends scala#22.AnyRef#2378 {
    <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
      M#7353.super.<init>scala#2719();
      ()
    };
    <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
    <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
  };
  class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
    <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
    <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
    <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
    <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
    <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
    <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
    <method> def <init>#14997(): <empty>#3.this.C#7354 = {
      C#7354.super.<init>#13465();
      ()
    }
  }
}

[running phase pickler on dependent_rebind.scala]
[running phase refchecks on dependent_rebind.scala]
test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
 value n #15017 has incompatible type;
 found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
 required: => N#7352.this.self#7442.type
class C extends M with N
      ^
adriaanm added a commit to adriaanm/scala that referenced this pull request Oct 2, 2015
must replace old trait accessor symbols by mixed in symbols
in the infos of the mixed in symbols

```
trait T { val a: String ; val b: a.type }
class C extends T {
  // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
}
```

symbols occurring in types of synthesized members
do not get rebound to other synthesized symbols

package <empty>#4 {
  abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
    <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
    <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
    <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
      ()
    };
    <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
    N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
    <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
    N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
  };
  abstract class M#7353 extends scala#22.AnyRef#2378 {
    <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
      M#7353.super.<init>scala#2719();
      ()
    };
    <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
    <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
  };
  class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
    <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
    <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
    <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
    <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
    <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
    <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
    <method> def <init>#14997(): <empty>#3.this.C#7354 = {
      C#7354.super.<init>#13465();
      ()
    }
  }
}

[running phase pickler on dependent_rebind.scala]
[running phase refchecks on dependent_rebind.scala]
test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
 value n #15017 has incompatible type;
 found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
 required: => N#7352.this.self#7442.type
class C extends M with N
      ^
adriaanm added a commit to adriaanm/scala that referenced this pull request Oct 11, 2015
must replace old trait accessor symbols by mixed in symbols
in the infos of the mixed in symbols

```
trait T { val a: String ; val b: a.type }
class C extends T {
  // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
}
```

symbols occurring in types of synthesized members
do not get rebound to other synthesized symbols

package <empty>#4 {
  abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
    <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
    <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
    <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
      ()
    };
    <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
    N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
    <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
    N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
  };
  abstract class M#7353 extends scala#22.AnyRef#2378 {
    <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
      M#7353.super.<init>scala#2719();
      ()
    };
    <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
    <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
  };
  class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
    <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
    <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
    <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
    <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
    <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
    <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
    <method> def <init>#14997(): <empty>#3.this.C#7354 = {
      C#7354.super.<init>#13465();
      ()
    }
  }
}

[running phase pickler on dependent_rebind.scala]
[running phase refchecks on dependent_rebind.scala]
test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
 value n #15017 has incompatible type;
 found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
 required: => N#7352.this.self#7442.type
class C extends M with N
      ^
adriaanm added a commit to adriaanm/scala that referenced this pull request Nov 12, 2015
and past commit messages:

commit abae762 (adriaanm/traits-late-fields)
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   2 hours ago

    bootstrapped compiler needs new partest

commit 81d7c25
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   5 hours ago

    update test to reflect useless constant fields are now dropped

commit 5f8fe87
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   16 hours ago

    Reduce flagbit usage, remove some stale comments

commit 9368256
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   16 hours ago

    annotations cleanup/fix for slitting between fields and getter annotation targets

commit 4336eb1
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 days ago

    fix printerstest

commit 4b4932e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 days ago

    do assignment to trait fields in AddInterfaces

    regular class vals get assignments during constructors, as before

commit 822913e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   9 days ago

    refactor accessor/field derivation

    in preparation of moving to compute-method style
    which in turn hopefully will be more manageable for specialization

commit cf845ab
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    don't suppress field for unit-typed vals

    it affects the memory model -- even a write of unit to a field is relevant...

commit 675f937
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    docs

commit baf568d
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    produce identical bytecode for constant trait val getters

    I couldn't bring myself to emit the unused fields that we
    used to emit for constant vals, even though the getters
    immediately return the constant, and thus the field goes unused.

    In the next version, there's no need to synthesize impls
    for these in subclasses -- the getter can be implemented
    in the interface.

commit 874f48b
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    one fewer warning: can't currently distinguish getter and setter in unused defs in traits

commit 7d21968
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    update skolems again...

commit 20165ea
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    test/files/neg/t5455.scala: trait lazy val needs field

commit b9052da
Author: Lukas Rytz <lukas.rytz@gmail.com>
Date:   3 weeks ago

    Fix enclosing method attribute for classes nested in trait fields

    Trait fields are now created as MethodSymbol (no longer TermSymbol).
    This symbol shows up in the `originalOwner` chain of a class declared
    within the field initializer. This promoted the field getter to
    being the enclosing method of the nested class, which it is not
    (the EnclosingMethod attribute is a source-level property).

commit 2b916f4
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    update skolems in check file for neg/t6829.scala

commit 3ac6aad
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    wip: neg/t6276.scala

    vals no longer have rhs after fields,
    so must check the assign node it was lifted out to

commit 892e13c
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    detect trait vals

    see neg/delayed-init-ref.scala and neg/t562.scala

commit 536b978
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    error on concrete val in universal trait

    see neg/anytrait.scala

commit d7c1de8
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    refactor field memoization logic -- wip

commit 337a9dd
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    unit-typed lazy vals should never receive a field

    this need was unmasked by test/files/run/t7843-jsr223-service.scala,
    which no longer printed the output expected from the `0 to 10 foreach`

commit 8405e72
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    benign checkfile updates

commit 3dbcd57
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    Revert "broken tests -- for check file diffing ease"

    This reverts commit 631b636,
    at least the part that masked actual breakage

    Currently failing tests:

     - test/files/pos/t6780.scala
     - test/files/neg/anytrait.scala
     - test/files/neg/delayed-init-ref.scala
     - test/files/neg/t562.scala
     - test/files/neg/t6276.scala
     - test/files/run/delambdafy_uncurry_byname_inline.scala
     - test/files/run/delambdafy_uncurry_byname_method.scala
     - test/files/run/delambdafy_uncurry_inline.scala
     - test/files/run/delambdafy_uncurry_method.scala
     - test/files/run/inner-obj-auto.scala
     - test/files/run/lazy-traits.scala
     - test/files/run/reify_lazyunit.scala
     - test/files/run/showraw_mods.scala
     - test/files/run/t3670.scala
     - test/files/run/t3980.scala
     - test/files/run/t4047.scala
     - test/files/run/t6622.scala
     - test/files/run/t7406.scala
     - test/files/run/t7843-jsr223-service.scala
     - test/files/jvm/innerClassAttribute
     - test/files/specialized/SI-7343.scala
     - test/files/specialized/constant_lambda.scala
     - test/files/specialized/spec-early.scala
     - test/files/specialized/spec-init.scala
     - test/files/specialized/spec-matrix-new.scala
     - test/files/specialized/spec-matrix-old.scala
     - test/files/presentation/scope-completion-3

commit 08cbc35
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    fix nondeterminism in printerstest???

commit b1b4e5c
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    wip: lambdalift fix

    test/files/trait-defaults/lambdalift.scala works,
    but still some related tests failing

    (note that we can't use a bootstrapped compiler yet
    due to binary incompatibility in partest)

    Selected 34 tests drawn from specified tests

    !! 1 - pos/t6780.scala                           [compilation failed]

    ok  1 - neg/anytrait.scala
    ok  2 - neg/t1960.scala
    ok  3 - neg/t562.scala
    ok  4 - neg/t2796.scala
    ok  5 - neg/t5455.scala
    ok  6 - neg/delayed-init-ref.scala
    ok  7 - neg/t6446-show-phases.scala
    ok  8 - neg/t6446-missing
    ok  9 - neg/t6276.scala
    ok 10 - neg/t6829.scala
    ok 11 - neg/t6446-additional
    ok 12 - neg/t7494-no-options

    !!  1 - run/bugs.scala                            [output differs]
    !!  2 - run/inner-obj-auto.scala                  [non-zero exit code]
    ok  3 - run/delambdafy_t6555.scala
    ok  4 - run/delambdafy_t6028.scala
    ok  5 - run/preinits.scala
    ok  6 - run/lazy-locals.scala
    ok  7 - run/analyzerPlugins.scala
    ok  8 - run/t0936.scala
    ok  9 - run/programmatic-main.scala
    !! 10 - run/showraw_mods.scala                    [output differs]
    ok 11 - run/t4426.scala
    ok 12 - run/t5938.scala
    ok 13 - run/t6733.scala
    !! 14 - run/t7406.scala                           [non-zero exit code]
    ok 15 - run/t6555.scala
    ok 16 - run/t6028.scala
    ok 17 - run/t8002.scala
    ok 18 - run/t7533.scala
    ok 19 - run/t7569.scala

    ok 1 - jvm/t7006
    !! 2 - jvm/innerClassAttribute                   [non-zero exit code]

    test/partest --update-check \
      /Users/adriaan/git/scala/test/files/pos/t6780.scala \
      /Users/adriaan/git/scala/test/files/run/bugs.scala \
      /Users/adriaan/git/scala/test/files/run/inner-obj-auto.scala \
      /Users/adriaan/git/scala/test/files/run/showraw_mods.scala \
      /Users/adriaan/git/scala/test/files/run/t7406.scala \
      /Users/adriaan/git/scala/test/files/jvm/innerClassAttribute

commit c4694d9
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    refactor

commit e676a2a
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    cleanups

commit a3bc708
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    centralize fields flag juggling

commit eae7dac
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update check now that trait vals can be concrete, use names not letters

    note the progression in a concrete trait val now being recognized as such
    ```
    -trait T => true
    -method $init$ => false
    -value z1 => true
    -value z2 => true // z2 is actually concrete!
    ```

commit 255cc06
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update check files sensitive to <subsynth> modifier being printed

commit 6555c74
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    bootstraps again by running info transform once per class...

    not sure how this ever worked, as separate compilation would transform a trait's info
    multiple times, resulting in double defs...

commit 33ac5e0
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    flag simplification, but double def errors in in strap.comp

    Compiling 327 files to /Users/adriaan/git/scala/build/strap/classes/compiler
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/transform/Constructors.scala:170: warning: postfix operator toMap should be enabled
    by making the implicit value scala.language.postfixOps visible.
    This can be achieved by adding the import clause 'import scala.language.postfixOps'
    or by setting the compiler option -language:postfixOps.
    See the Scala docs for value scala.language.postfixOps for a discussion
    why the feature should be explicitly enabled.
            lazy val bodyOfOuterAccessor = defs collect { case dd: DefDef if omittableOuterAcc(dd.symbol) => dd.symbol -> dd.rhs } toMap
                                                                                                                                   ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/transform/Fields.scala:193: warning: postfix operator nonEmpty should be enabled
    by making the implicit value scala.language.postfixOps visible.
            if (newSetters nonEmpty) {
                           ^
    /Users/adriaan/git/scala/src/compiler/scala/reflect/macros/contexts/Context.scala:6: error: double definition:
    def scala$reflect$macros$Aliases$_setter_$TypeTag_=(x$1: Context.this.universe.TypeTag.type): Unit at line 6 and
    def scala$reflect$macros$Aliases$_setter_$TypeTag_=(x$1: Context.this.universe.TypeTag.type): Unit at line 6
    have same type
    abstract class Context extends scala.reflect.macros.blackbox.Context
                   ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/Global.scala:1155: error: double definition:
    def scala$reflect$internal$Reporting$RunReporting$_setter_$reporting_=(x$1: Global.this.PerRunReporting): Unit at line 1155 and
    def scala$reflect$internal$Reporting$RunReporting$_setter_$reporting_=(x$1: Global.this.PerRunReporting): Unit at line 1155
    have same type
      class Run extends RunContextApi with RunReporting with RunParsing {
            ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/Properties.scala:10: error: double definition:
    def scala$util$PropertiesTrait$_setter_$copyrightString_=(x$1: String): Unit at line 10 and
    def scala$util$PropertiesTrait$_setter_$copyrightString_=(x$1: String): Unit at line 10
    have same type
    object Properties extends scala.util.PropertiesTrait {
           ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala:224: error: double definition:
    def selfOrSuperCalls_=(x$1: scala.collection.mutable.Stack[ExplicitOuter.this.global.Symbol]): Unit at line 224 and
    def selfOrSuperCalls_=(x$1: scala.collection.mutable.Stack[ExplicitOuter.this.global.Symbol]): Unit at line 224
    have same type
      abstract class OuterPathTransformer(unit: CompilationUnit) extends TypingTransformer(unit) with UnderConstructionTransformer {
                     ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/transform/UnCurry.scala:48: error: double definition:
    def uncurryType_=(x$1: UnCurry.this.global.TypeMap): Unit at line 48 and
    def uncurryType_=(x$1: UnCurry.this.global.TypeMap): Unit at line 48
    have same type
    abstract class UnCurry extends InfoTransform
                   ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/typechecker/TreeCheckers.scala:279: error: double definition:
    def scala$reflect$internal$Trees$TreeStackTraverser$_setter_$path_=(x$1: scala.collection.mutable.Stack[TreeCheckers.this.global.Tree]): Unit at line 279 and
    def scala$reflect$internal$Trees$TreeStackTraverser$_setter_$path_=(x$1: scala.collection.mutable.Stack[TreeCheckers.this.global.Tree]): Unit at line 279
    have same type
        object precheck extends TreeStackTraverser {
               ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/util/ShowPickled.scala:18: error: double definition:
    def scala$reflect$internal$Names$_setter_$TypeNameTag_=(x$1: scala.reflect.ClassTag[scala.tools.nsc.util.ShowPickled.TypeName]): Unit at line 18 and
    def scala$reflect$internal$Names$_setter_$TypeNameTag_=(x$1: scala.reflect.ClassTag[scala.tools.nsc.util.ShowPickled.TypeName]): Unit at line 18
    have same type
    object ShowPickled extends Names {
           ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/reflect/ReflectGlobal.scala:13: error: double definition:
    def scala$reflect$api$JavaUniverse$_setter_$RuntimeClassTag_=(x$1: scala.reflect.ClassTag[ReflectGlobal.this.RuntimeClass]): Unit at line 13 and
    def scala$reflect$api$JavaUniverse$_setter_$RuntimeClassTag_=(x$1: scala.reflect.ClassTag[ReflectGlobal.this.RuntimeClass]): Unit at line 13
    have same type
    class ReflectGlobal(currentSettings: Settings, reporter: Reporter, override val rootClassLoader: ClassLoader)
          ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/reflect/WrappedProperties.scala:42: error: double definition:
    def scala$util$PropertiesTrait$_setter_$copyrightString_=(x$1: String): Unit at line 42 and
    def scala$util$PropertiesTrait$_setter_$copyrightString_=(x$1: String): Unit at line 42
    have same type
      object AccessControl extends WrappedProperties {
             ^
    two warnings found
    9 errors found

commit ae34ac7
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update skolem ids in check file

commit 8672bb1
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    cleanup, no intended functional change

commit 319d3d2
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    clarify: all trait vals receive accessors

    those that wouldn't are synthesized later anyway -- right?

commit ab16f32
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    backwards compat: leave final?

    maybe we can save a few flag bits by using DEFERRED | FINAL
    instead of SYNTHESIZE_IMPL_IN_SUBCLASS, as a deferred final
    member must necessarily receive an implementation automatically
    to meet the constraints implied by this keyword combo

commit ccb8363
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    non-unit-typed lazy vals in traits still get field -- see neg/t5455.scala

commit 273cb20
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    skip presuper vals in new encoding

commit 631b636
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    broken tests -- for check file diffing ease

commit 9ff7869
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    benign, though rough check file updates

commit 90af847
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    unexplained updates to check files in printers test

commit 728e71e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    incoherent cyclic references between synthesized members

    must replace old trait accessor symbols by mixed in symbols
    in the infos of the mixed in symbols

    ```
    trait T { val a: String ; val b: a.type }
    class C extends T {
      // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
    }
    ```

    symbols occurring in types of synthesized members
    do not get rebound to other synthesized symbols

    package <empty>#4 {
      abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
        <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
        N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
        <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
        N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
      };
      abstract class M#7353 extends scala#22.AnyRef#2378 {
        <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
          M#7353.super.<init>scala#2719();
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
        <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
      };
      class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
        <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
        <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
        <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
        <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
        <method> def <init>#14997(): <empty>#3.this.C#7354 = {
          C#7354.super.<init>#13465();
          ()
        }
      }
    }

    [running phase pickler on dependent_rebind.scala]
    [running phase refchecks on dependent_rebind.scala]
    test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
     value n #15017 has incompatible type;
     found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
     required: => N#7352.this.self#7442.type
    class C extends M with N
          ^

commit ec2283e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    pos/t9111-inliner-workaround

commit 115e880
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    mark synthesized protected member as notPROTECTED,

    TODO: this doesn't work because protected[this] is supposed to be a
    variance checking escape hatch, and making these notPROTECTED here will trigger errors in refchecks

    so that it stays in overriding relation with the trait member in later phases

    make notPROTECTED a bit later?

    protected local variance bla

commit b56ca2f
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    static forwarders & private[this] val in trait

    object Properties extends PropertiesTrait

    trait PropertiesTrait {
      // the protected member is not emitted as a static member of  -- it works when dropping the access modifier
      // somehow, the module class member is considered deferred in BForwardersGen
      protected val propFilename: String = /
    }

    // [log jvm] No forwarder for 'getter propFilename' from Properties to 'module class Properties': false || m.isDeferred == true || false || false

    // the following method is missing compared to scalac
    // public final class Properties {
    //     public static String propFilename() {
    //         return Properties$.MODULE$.propFilename();
    //     }

    trait Chars {
      private[this] val char2uescapeArray = Array[Char]('\', 'u', 0, 0, 0, 0)
    }

    object Chars extends Chars

    // +++ w/reflect/scala/reflect/internal/Chars$.class
    // -  private final [C scala83014char2uescapeArray

commit ed7625f
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    finality for trait setters, annotations

    traitsetter annot for all concrete trait-owned setters

    stumble towards juggling annotations correctly

commit 492aa60
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    constant fold in forwarder for backwards compat

commit b8a7aa0
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    constant-typed final val in trait should yield impl method

commit 1655d1b
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    bean{setter,getter} delegates to setter/getter

commit 968fc30
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   2 months ago

    Fields phase

    Constructors: simplify transform loop

    Also encapsulate mixin ctor creation in `newMixinConstructor`

    Constructors: emit mixin-super constructor calls

    This was previously done by AddInterfaces, whose days are numbered.

    wip: trait fields 1

    wip: drop stuff from constructors

    lazyGetterBody

    wippythewipwip

    constructors transforminfo

    wip for unit-typed getters, delay trait setters until constructors, mix in accessors and fields there as well

    bare bones info transform is "working"

    ```
    trait OneConcreteVal[T] {
      val x = 1 // : T = ???
    }

    trait OneOtherConcreteVal[T] {
      var y: T = ???
    }

    class C extends OneConcreteVal[Int] with OneOtherConcreteVal[String]
    ```

    /*
    old decls for trait trait OneOtherConcreteVal: Scope{
      def y(): Object;
      def y_=(x$1: Object): Unit
    }
    new decls for trait trait OneOtherConcreteVal: Scope{
      def y(): Object;
      def y_=(x$1: Object): Unit;
      def $init$(): Unit
    }
    old decls for trait trait OneConcreteVal: Scope{
      val x(): Int
    }
    new decls for trait trait OneConcreteVal: Scope{
      val x(): Int;
      def $init$(): Unit;
      private[this] def x_=(x$1: Int): Unit
    }
    old decls for class C: Scope{
      def <init>(): C
    }
    mixing in List(method y, method y_=, value x, method x_=) from List(trait OneOtherConcreteVal, trait OneConcreteVal)
    new decls for class C: Scope{
      def <init>(): C;
      def y(): Object;
      private[this] var y: Object;
      def y_=(x$1: Object): Unit;
      val x(): Int;
      private[this] val x: Int;
      private[this] def x_=(x$1: Int): Unit
    }
    */

    getting there: need to avoid MIXEDIN/lateDEFERRED so as not to confuse mixins?

    temporarily using ARTIFACT instead of MIXEDIN to not confuse mixin

    kinda working...

    impl classes get accessors until mixin,
    so that constructors acts on them there,
    and produced the init method in the required spot (the impl class)

    the info-transformed of constructors:
      - traits receive trait-setters for vals
      - classes receive fields & accessors for mixed in traits

    Constructors tree transformer
      - makes trees for decls added during above info transform
        (TODO: decide on the right flag to communicate this)
      - adds mixin super calls to the primary constructor

    Later, mixins will drop all accessors in the impl class,
    retaining only the init method.
    Selects of setters/getters (in that init method)
    are rewritten to refer to the getters/setters in the interface (TODO)

    TODO (among many other things)
      - no constructor in trait
      - trait setter for val isn't found when rewriting accessors in impl classes
      - annotations
      - privacy

    ```
    trait OneConcreteVal[T] {
      var x = 1 // : T = ???
      def foo = x
    }

    trait OneOtherConcreteVal[T] {
      var y: T = ???
    }

    class C extends OneConcreteVal[Int] with OneOtherConcreteVal[String]
    ```

    ```
    [[syntax trees at end of              constructors]] // fields.scala
    package <empty> {
      abstract trait OneConcreteVal extends Object {
        <empty>; // <-- TODO
        <accessor> def x(): Int;
        @scala.runtime.TraitSetter <accessor> def x_=(x$1: Int): Unit;
        def foo(): Int
      };
      abstract trait OneOtherConcreteVal extends Object {
        <empty>; // <-- TODO
        <accessor> def y(): Object;
        @scala.runtime.TraitSetter <accessor> def y_=(x$1: Object): Unit
      };
      class C extends Object with OneConcreteVal with OneOtherConcreteVal {
        def <init>(): C = {
          C.super.<init>();
          C.this./*OneConcreteVal$class*/$init$();
          C.this./*OneOtherConcreteVal$class*/$init$();
          ()
        };
        <accessor> <artifact> def y(): Object = C.this.y;
        <artifact> private[this] var y: Object = _;
        @scala.runtime.TraitSetter <accessor> <artifact> def y_=(x$1: Object): Unit = C.this.y = x$1;
        <accessor> <artifact> def x(): Int = C.this.x;
        <artifact> private[this] var x: Int = _;
        @scala.runtime.TraitSetter <accessor> <artifact> def x_=(x$1: Int): Unit = C.this.x = x$1
      };
      abstract trait OneConcreteVal$class extends Object with OneConcreteVal {
        def /*OneConcreteVal$class*/$init$(): Unit = {
          OneConcreteVal$class.this.x_=(1);
          ()
        };
        <accessor> def x(): Int;
        @scala.runtime.TraitSetter <accessor> def x_=(x$1: Int): Unit;
        def foo(): Int = OneConcreteVal$class.this.x()
      };
      abstract trait OneOtherConcreteVal$class extends Object with OneOtherConcreteVal {
        def /*OneOtherConcreteVal$class*/$init$(): Unit = {
          OneOtherConcreteVal$class.this.y_=(scala.this.Predef.???());
          ()
        };
        <accessor> def y(): Object;
        @scala.runtime.TraitSetter <accessor> def y_=(x$1: Object): Unit
      }
    }
    ```

    ```
    [[syntax trees at end of                     mixin]] // fields.scala
    package <empty> {
      abstract trait OneConcreteVal extends Object {
        <accessor> def x(): Int;
        @scala.runtime.TraitSetter <accessor> def x_=(x$1: Int): Unit;
        def foo(): Int
      };
      abstract trait OneOtherConcreteVal extends Object {
        <accessor> def y(): Object;
        @scala.runtime.TraitSetter <accessor> def y_=(x$1: Object): Unit
      };
      class C extends Object with OneConcreteVal with OneOtherConcreteVal {
        def foo(): Int = OneConcreteVal$class.foo(C.this);
        def <init>(): C = {
          C.super.<init>();
          OneConcreteVal$class./*OneConcreteVal$class*/$init$(C.this);
          OneOtherConcreteVal$class./*OneOtherConcreteVal$class*/$init$(C.this);
          ()
        };
        <accessor> <artifact> def y(): Object = C.this.y;
        <artifact> private[this] var y: Object = _;
        @scala.runtime.TraitSetter <accessor> <artifact> def y_=(x$1: Object): Unit = C.this.y = x$1;
        <accessor> <artifact> def x(): Int = C.this.x;
        <artifact> private[this] var x: Int = _;
        @scala.runtime.TraitSetter <accessor> <artifact> def x_=(x$1: Int): Unit = C.this.x = x$1
      };
      abstract trait OneConcreteVal$class extends  {
        def /*OneConcreteVal$class*/$init$($this: OneConcreteVal): Unit = {
          $this.x_=(1);
          ()
        };
        def foo($this: OneConcreteVal): Int = $this.x()
      };
      abstract trait OneOtherConcreteVal$class extends  {
        def /*OneOtherConcreteVal$class*/$init$($this: OneOtherConcreteVal): Unit = {
          $this.y_=(scala.this.Predef.???());
          ()
        }
      }
    }
    ```

    emit trait setters, target interface for setter

    don't emit trait constructors yet, don't mess with mixin class ctors

    hack to explore where to keep annotations on trait fields

    we don't have a field -- only a getter -- so,
    where will we keep non-getter but-field annotations?

    restore mixins

    reduce OOification re: annotation derivation

      - replace virtual dispatch on sealed traits by matches
      - rename `keepClean` to `defaultRetention`
      - allow multiple categories in annotationFilter (for trait fields)

    mixin only deals with lazy accessors/vals

    do not used referenced to correlate getter/setter

    it messes with paramaccessor's usage, and we don't really need it

    annotations

    typo

    poking around overriding and unit-typed vars

    detect unit correctly

    setter should be considered deferred, just like getter and val

    fixup constructor triaging

    introduce constructor's very own flag

    stop using referenced entirely

    refactor

    add Fields phase

    meh

    mehmeh

    meeeeeh

    Fields phase is kind of working. Yay.

    emit synthetic setter for trait val

    make sure to clone info's, so we don't share symbols for method args
    this manifests itself as an exception in lambdalift, finding proxies

    ```
    trait OneAbstractVar[T] {
      val x: Int = 123
    }

    class ConcVar extends OneAbstractVar[Int]
    ```

    compiles to the following (as desired!):

    ```
    ➜  scala git:(traits-late-fields) ✗ cfr /tmp/ConcVar.class
    /*
     * Decompiled with CFR 0_102.
     *
     * Could not load the following classes:
     *  scala.reflect.ScalaSignature
     */
    import OneAbstractVar;
    import OneAbstractVar$class;
    import scala.reflect.ScalaSignature;

    @ScalaSignature(bytes="\u0006\u0001\u00112A!\u0001\u0002\u0001\u000b\t91i\u001c8d-\u0006\u0014(\"A\u0002\u0002\u000fq*W\u000e\u001d;z}\r\u00011c\u0001\u0001\u0007\u0019A\u0011qAC\u0007\u0002\u0011)\t\u0011\"A\u0003tG\u0006d\u0017-\u0003\u0002\f\u0011\t1\u0011I\\=SK\u001a\u00042!\u0004\b\u0011\u001b\u0005\u0011\u0011BA\b\u0003\u00059ye.Z!cgR\u0014\u0018m\u0019;WCJ\u0004\"aB\t\n\u0005IA!aA%oi\")A\u0003\u0001C\u0001+\u00051A(\u001b8jiz\"\u0012A\u0006\t\u0003\u001b\u0001A\u0011\u0002\u0007\u0001A\u0002\u000b\u0007I\u0011A\r\u0002\u0003a,\u0012\u0001\u0005\u0005\n7\u0001\u0001\r\u0011!Q\u0001\nA\t!\u0001\u001f\u0011\t\u0013u\u0001\u0001\u0019aa\u0001J\u0003q\u0012!H(oK\u0006\u00137\u000f\u001e:bGR4\u0016M\u001d\u0013`g\u0016$H/\u001a:`Ia|F%Z9\u0015\u0005}\u0011\u0003CA\u0004!\u0013\t\t\u0003B\u0001\u0003V]&$\bbB\u0012\u001d\u0003\u0003\u0005\r\u0001E\u0001\u0004q\u0012\n\u0004")
    public class ConcVar
    implements OneAbstractVar<Object> {
        private final int x;

        public ConcVar() {
            OneAbstractVar$class.$init$(this);
        }

        @OverRide
        public int x() {
            return this.x;
        }

        @OverRide
        public void OneAbstractVar$_setter_$x_$eq(int x$1) {
            this.x = x$1;
        }
    }
    ➜  scala git:(traits-late-fields) ✗ cfr /tmp/OneAbstractVar\$class.class
    /*
     * Decompiled with CFR 0_102.
     */
    import OneAbstractVar;

    public abstract class OneAbstractVar$class {
        public static void $init$(OneAbstractVar $this) {
            $this.OneAbstractVar$_setter_$x_$eq(123);
        }
    }
    ➜  scala git:(traits-late-fields) ✗ cfr /tmp/OneAbstractVar.class
    /*
     * Decompiled with CFR 0_102.
     *
     * Could not load the following classes:
     *  scala.reflect.ScalaSignature
     */
    import scala.reflect.ScalaSignature;

    @ScalaSignature(bytes="\u0006\u0001\u001d2q!\u0001\u0002\u0011\u0002\u0007\u0005QA\u0001\bP]\u0016\f%m\u001d;sC\u000e$h+\u0019:\u000b\u0003\r\tq\u0001P3naRLhh\u0001\u0001\u0016\u0005\u0019q2C\u0001\u0001\b!\tA1\"D\u0001\n\u0015\u0005Q\u0011!B:dC2\f\u0017B\u0001\u0007\n\u0005\u0019\te.\u001f*fM\")a\u0002\u0001C\u0001\u001f\u00051A%\u001b8ji\u0012\"\u0012\u0001\u0005\t\u0003\u0011EI!AE\u0005\u0003\tUs\u0017\u000e\u001e\u0005\b)\u0001\u0011\rQ\"\u0001\u0016\u0003\u0005AX#\u0001\f\u0011\u0005!9\u0012B\u0001\r\n\u0005\rIe\u000e\u001e\u0005\n5\u0001\u0001\r11A'\u0002m\tQd\u00148f\u0003\n\u001cHO]1diZ\u000b'\u000fJ0tKR$XM]0%q~#S-\u001d\u000b\u0003!qAq!H\r\u0002\u0002\u0003\u0007a#A\u0002yIE\"Qa\b\u0001C\u0002\u0001\u0012\u0011\u0001V\t\u0003C\u0011\u0002\"\u0001\u0003\u0012\n\u0005\rJ!a\u0002(pi\"Lgn\u001a\t\u0003\u0011\u0015J!AJ\u0005\u0003\u0007\u0005s\u0017\u0010")
    public interface OneAbstractVar<T> {
        public void OneAbstractVar$_setter_$x_$eq(int var1);

        public int x();
    }
    ```

    cleanup

    TODO: overriding accessors

    don't mix in accessors if conflicting member exists

    getting closer to bootstrap

    exclude lazy vals, don't makeNotPrivate

    lazy accessors and presupers require old treatment

    constructors should leave strict valdefs alone

    restore constructors to minimal diff compared to scala#4723

    revert more gratuitous stuff

    revert more in mixins

    trying to get to bootstrap.. currently failing in scala.util.Properties

    reduction of bootstrap failures

    on a bed of TODOs, with a hint of minimalism

    use primary constructor as owner for stats in template?

    fix pattern match in infotransform, remove mutation

    deferred setter does need impl in subclass

    remove SYNTHESIZE_IMPL_IN_SUBCLASS

    Use NEEDS_TREES for all comms between InfoTransform and tree transform

    We can now compile the library again, though the bytecode diff
    is not empty yet :-)

    TODO:
      - Weirdly, scala signatures are not emitted?
      - Fields are no longer emitted for constants
        (an improvement, but should not do this until next milestone)
      - the volatile annotation is not preserved
      - App, Enumeration compiled differently
      - Owner chain changes due to lifting of rhs affects:
        --> anonymous function in Iterator, PartialFunction, scala/collection/immutable/HashMap
      - traitsetter name mangling differences
      - abortflag accessors duplicated in scala/collection/generic/VolatileAbort.class
      - ...

    yep, need SYNTHESIZE_IMPL_IN_SUBCLASS

    distinguish accessors that should be mixed into subclass,
    and those that simply need to be implemented in tree transform,
    after info transform added the decl

    emit const vals for now to minimize bytecode diff

    TODO: still some bytecode diffs with constants remain (Enumeration)

    correct owner for stats in template

    closing in on boostrap

    strap.done:
        [mkdir] Created dir: /Users/adriaan/git/scala/build/strap/classes/library
    [strap.library] Compiling 584 files to /Users/adriaan/git/scala/build/strap/classes/library
    [strap.library] /Users/adriaan/git/scala/src/library/scala/collection/convert/WrapAsScala.scala:173: warning: abstract type A in type pattern scala.collection.convert.Wrappers.ConcurrentMapWrapper[A,B] is unchecked since it is eliminated by erasure
    [strap.library]     case cmw: ConcurrentMapWrapper[A, B]  => cmw.underlying
    [strap.library]               ^
    [strap.library] warning: there were 111 deprecation warnings; re-run with -deprecation for details
    [strap.library] two warnings found
        [javac] Compiling 165 source files to /Users/adriaan/git/scala/build/strap/classes/library
        [javac] Note: Some input files use unchecked or unsafe operations.
        [javac] Note: Recompile with -Xlint:unchecked for details.
    [propertyfile] Creating new property file: /Users/adriaan/git/scala/build/strap/classes/library/library.properties
         [copy] Copying 1 file to /Users/adriaan/git/scala/build/strap/classes/library
    [stopwatch] [strap.library.timer: 1:31.668 sec]
        [mkdir] Created dir: /Users/adriaan/git/scala/build/strap/classes/reflect
    [strap.reflect] Compiling 157 files to /Users/adriaan/git/scala/build/strap/classes/reflect
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/JavaUniverse.scala:16: error: overriding variable uniques in class SymbolTable of type scala.reflect.internal.util.WeakHashSet[JavaUniverse.this.Type];
    [strap.reflect]  value uniques needs `override' modifier
    [strap.reflect] class JavaUniverse extends InternalSymbolTable with JavaUniverseForce with ReflectSetup with RuntimeSymbolTable { self =>
    [strap.reflect]       ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedOps.scala:6: error: overriding variable uniques in trait SynchronizedTypes of type scala.collection.mutable.WeakHashMap[SynchronizedOps.this.Type,java.lang.ref.WeakReference[SynchronizedOps.this.Type]];
    [strap.reflect]  variable uniques in class SymbolTable of type scala.reflect.internal.util.WeakHashSet[SynchronizedOps.this.Type] needs to be a stable, immutable value
    [strap.reflect] private[reflect] trait SynchronizedOps extends internal.SymbolTable
    [strap.reflect]                        ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedSymbols.scala:16: error: overriding variable _recursionTable in trait Symbols of type scala.collection.immutable.Map[SynchronizedSymbols.this.Symbol,Int];
    [strap.reflect]  lazy value _recursionTable has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _recursionTable = mkThreadLocalStorage(immutable.Map.empty[Symbol, Int])
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:43: error: overriding variable _skolemizationLevel in trait Types of type Int;
    [strap.reflect]  lazy value _skolemizationLevel has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _skolemizationLevel = mkThreadLocalStorage(0)
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:50: error: overriding variable _intersectionWitness in trait Types of type scala.collection.mutable.WeakHashMap[List[SynchronizedTypes.this.Type],scala.ref.WeakReference[SynchronizedTypes.this.Type]];
    [strap.reflect]  lazy value _intersectionWitness has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _intersectionWitness = mkThreadLocalStorage(perRunCaches.newWeakMap[List[Type], sWeakRef[Type]]())
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:53: error: overriding variable _subsametypeRecursions in trait TypeComparers of type Int;
    [strap.reflect]  lazy value _subsametypeRecursions has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _subsametypeRecursions = mkThreadLocalStorage(0)
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:57: error: overriding variable _pendingSubTypes in trait TypeComparers of type scala.collection.mutable.HashSet[SynchronizedTypes.this.SubTypePair];
    [strap.reflect]  lazy value _pendingSubTypes has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _pendingSubTypes = mkThreadLocalStorage(new mutable.HashSet[SubTypePair])
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:60: error: overriding variable _basetypeRecursions in trait Types of type Int;
    [strap.reflect]  lazy value _basetypeRecursions has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _basetypeRecursions = mkThreadLocalStorage(0)
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:64: error: overriding variable _pendingBaseTypes in trait Types of type scala.collection.mutable.HashSet[SynchronizedTypes.this.Type];
    [strap.reflect]  lazy value _pendingBaseTypes has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _pendingBaseTypes = mkThreadLocalStorage(new mutable.HashSet[Type])
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:67: error: overriding variable _lubResults in trait GlbLubs of type scala.collection.mutable.HashMap[(scala.reflect.internal.Depth, List[SynchronizedTypes.this.Type]),SynchronizedTypes.this.Type];
    [strap.reflect]  lazy value _lubResults has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _lubResults = mkThreadLocalStorage(new mutable.HashMap[(Depth, List[Type]), Type])
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:70: error: overriding variable _glbResults in trait GlbLubs of type scala.collection.mutable.HashMap[(scala.reflect.internal.Depth, List[SynchronizedTypes.this.Type]),SynchronizedTypes.this.Type];
    [strap.reflect]  lazy value _glbResults has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _glbResults = mkThreadLocalStorage(new mutable.HashMap[(Depth, List[Type]), Type])
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:73: error: overriding variable _indent in trait Types of type String;
    [strap.reflect]  lazy value _indent has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _indent = mkThreadLocalStorage("")
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:77: error: overriding variable _toStringRecursions in trait TypeToStrings of type Int;
    [strap.reflect]  lazy value _toStringRecursions has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _toStringRecursions = mkThreadLocalStorage(0)
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:81: error: overriding variable _toStringSubjects in trait TypeToStrings of type scala.collection.mutable.HashSet[SynchronizedTypes.this.Type];
    [strap.reflect]  lazy value _toStringSubjects has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _toStringSubjects = mkThreadLocalStorage(new mutable.HashSet[Type])
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:21: error: overriding variable uniques in trait Types of type scala.reflect.internal.util.WeakHashSet[SynchronizedTypes.this.Type];
    [strap.reflect]  variable uniques has incompatible type
    [strap.reflect]   private val uniques = mutable.WeakHashMap[Type, jWeakRef[Type]]()
    [strap.reflect]               ^
    [strap.reflect] 15 errors found

    make private vals in traits not-private

    TODO: refine

    only look at strict accessors

    don't widen type for getter -- wtf

    current TODO: overriding vals

    mor compact accessor synth

    major cleanup

    compiles library & reflect, but not compiler:

    [strap.compiler] /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/CompileServer.scala:40: error: object creation impossible, since:
    [strap.compiler] it has 151 unimplemented members.

    last error flag pickling issue?

    info mangling, traitsetter

    remove hacks from other files

    trait fields stuff
adriaanm added a commit to adriaanm/scala that referenced this pull request Nov 12, 2015
and past commit messages:

commit abae762 (adriaanm/traits-late-fields)
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   2 hours ago

    bootstrapped compiler needs new partest

commit 81d7c25
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   5 hours ago

    update test to reflect useless constant fields are now dropped

commit 5f8fe87
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   16 hours ago

    Reduce flagbit usage, remove some stale comments

commit 9368256
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   16 hours ago

    annotations cleanup/fix for slitting between fields and getter annotation targets

commit 4336eb1
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 days ago

    fix printerstest

commit 4b4932e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 days ago

    do assignment to trait fields in AddInterfaces

    regular class vals get assignments during constructors, as before

commit 822913e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   9 days ago

    refactor accessor/field derivation

    in preparation of moving to compute-method style
    which in turn hopefully will be more manageable for specialization

commit cf845ab
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    don't suppress field for unit-typed vals

    it affects the memory model -- even a write of unit to a field is relevant...

commit 675f937
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    docs

commit baf568d
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    produce identical bytecode for constant trait val getters

    I couldn't bring myself to emit the unused fields that we
    used to emit for constant vals, even though the getters
    immediately return the constant, and thus the field goes unused.

    In the next version, there's no need to synthesize impls
    for these in subclasses -- the getter can be implemented
    in the interface.

commit 874f48b
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    one fewer warning: can't currently distinguish getter and setter in unused defs in traits

commit 7d21968
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    update skolems again...

commit 20165ea
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    test/files/neg/t5455.scala: trait lazy val needs field

commit b9052da
Author: Lukas Rytz <lukas.rytz@gmail.com>
Date:   3 weeks ago

    Fix enclosing method attribute for classes nested in trait fields

    Trait fields are now created as MethodSymbol (no longer TermSymbol).
    This symbol shows up in the `originalOwner` chain of a class declared
    within the field initializer. This promoted the field getter to
    being the enclosing method of the nested class, which it is not
    (the EnclosingMethod attribute is a source-level property).

commit 2b916f4
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    update skolems in check file for neg/t6829.scala

commit 3ac6aad
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    wip: neg/t6276.scala

    vals no longer have rhs after fields,
    so must check the assign node it was lifted out to

commit 892e13c
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    detect trait vals

    see neg/delayed-init-ref.scala and neg/t562.scala

commit 536b978
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    error on concrete val in universal trait

    see neg/anytrait.scala

commit d7c1de8
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    refactor field memoization logic -- wip

commit 337a9dd
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    unit-typed lazy vals should never receive a field

    this need was unmasked by test/files/run/t7843-jsr223-service.scala,
    which no longer printed the output expected from the `0 to 10 foreach`

commit 8405e72
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    benign checkfile updates

commit 3dbcd57
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    Revert "broken tests -- for check file diffing ease"

    This reverts commit 631b636,
    at least the part that masked actual breakage

    Currently failing tests:

     - test/files/pos/t6780.scala
     - test/files/neg/anytrait.scala
     - test/files/neg/delayed-init-ref.scala
     - test/files/neg/t562.scala
     - test/files/neg/t6276.scala
     - test/files/run/delambdafy_uncurry_byname_inline.scala
     - test/files/run/delambdafy_uncurry_byname_method.scala
     - test/files/run/delambdafy_uncurry_inline.scala
     - test/files/run/delambdafy_uncurry_method.scala
     - test/files/run/inner-obj-auto.scala
     - test/files/run/lazy-traits.scala
     - test/files/run/reify_lazyunit.scala
     - test/files/run/showraw_mods.scala
     - test/files/run/t3670.scala
     - test/files/run/t3980.scala
     - test/files/run/t4047.scala
     - test/files/run/t6622.scala
     - test/files/run/t7406.scala
     - test/files/run/t7843-jsr223-service.scala
     - test/files/jvm/innerClassAttribute
     - test/files/specialized/SI-7343.scala
     - test/files/specialized/constant_lambda.scala
     - test/files/specialized/spec-early.scala
     - test/files/specialized/spec-init.scala
     - test/files/specialized/spec-matrix-new.scala
     - test/files/specialized/spec-matrix-old.scala
     - test/files/presentation/scope-completion-3

commit 08cbc35
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    fix nondeterminism in printerstest???

commit b1b4e5c
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    wip: lambdalift fix

    test/files/trait-defaults/lambdalift.scala works,
    but still some related tests failing

    (note that we can't use a bootstrapped compiler yet
    due to binary incompatibility in partest)

    Selected 34 tests drawn from specified tests

    !! 1 - pos/t6780.scala                           [compilation failed]

    ok  1 - neg/anytrait.scala
    ok  2 - neg/t1960.scala
    ok  3 - neg/t562.scala
    ok  4 - neg/t2796.scala
    ok  5 - neg/t5455.scala
    ok  6 - neg/delayed-init-ref.scala
    ok  7 - neg/t6446-show-phases.scala
    ok  8 - neg/t6446-missing
    ok  9 - neg/t6276.scala
    ok 10 - neg/t6829.scala
    ok 11 - neg/t6446-additional
    ok 12 - neg/t7494-no-options

    !!  1 - run/bugs.scala                            [output differs]
    !!  2 - run/inner-obj-auto.scala                  [non-zero exit code]
    ok  3 - run/delambdafy_t6555.scala
    ok  4 - run/delambdafy_t6028.scala
    ok  5 - run/preinits.scala
    ok  6 - run/lazy-locals.scala
    ok  7 - run/analyzerPlugins.scala
    ok  8 - run/t0936.scala
    ok  9 - run/programmatic-main.scala
    !! 10 - run/showraw_mods.scala                    [output differs]
    ok 11 - run/t4426.scala
    ok 12 - run/t5938.scala
    ok 13 - run/t6733.scala
    !! 14 - run/t7406.scala                           [non-zero exit code]
    ok 15 - run/t6555.scala
    ok 16 - run/t6028.scala
    ok 17 - run/t8002.scala
    ok 18 - run/t7533.scala
    ok 19 - run/t7569.scala

    ok 1 - jvm/t7006
    !! 2 - jvm/innerClassAttribute                   [non-zero exit code]

    test/partest --update-check \
      /Users/adriaan/git/scala/test/files/pos/t6780.scala \
      /Users/adriaan/git/scala/test/files/run/bugs.scala \
      /Users/adriaan/git/scala/test/files/run/inner-obj-auto.scala \
      /Users/adriaan/git/scala/test/files/run/showraw_mods.scala \
      /Users/adriaan/git/scala/test/files/run/t7406.scala \
      /Users/adriaan/git/scala/test/files/jvm/innerClassAttribute

commit c4694d9
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    refactor

commit e676a2a
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    cleanups

commit a3bc708
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    centralize fields flag juggling

commit eae7dac
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update check now that trait vals can be concrete, use names not letters

    note the progression in a concrete trait val now being recognized as such
    ```
    -trait T => true
    -method $init$ => false
    -value z1 => true
    -value z2 => true // z2 is actually concrete!
    ```

commit 255cc06
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update check files sensitive to <subsynth> modifier being printed

commit 6555c74
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    bootstraps again by running info transform once per class...

    not sure how this ever worked, as separate compilation would transform a trait's info
    multiple times, resulting in double defs...

commit 33ac5e0
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    flag simplification, but double def errors in in strap.comp

    Compiling 327 files to /Users/adriaan/git/scala/build/strap/classes/compiler
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/transform/Constructors.scala:170: warning: postfix operator toMap should be enabled
    by making the implicit value scala.language.postfixOps visible.
    This can be achieved by adding the import clause 'import scala.language.postfixOps'
    or by setting the compiler option -language:postfixOps.
    See the Scala docs for value scala.language.postfixOps for a discussion
    why the feature should be explicitly enabled.
            lazy val bodyOfOuterAccessor = defs collect { case dd: DefDef if omittableOuterAcc(dd.symbol) => dd.symbol -> dd.rhs } toMap
                                                                                                                                   ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/transform/Fields.scala:193: warning: postfix operator nonEmpty should be enabled
    by making the implicit value scala.language.postfixOps visible.
            if (newSetters nonEmpty) {
                           ^
    /Users/adriaan/git/scala/src/compiler/scala/reflect/macros/contexts/Context.scala:6: error: double definition:
    def scala$reflect$macros$Aliases$_setter_$TypeTag_=(x$1: Context.this.universe.TypeTag.type): Unit at line 6 and
    def scala$reflect$macros$Aliases$_setter_$TypeTag_=(x$1: Context.this.universe.TypeTag.type): Unit at line 6
    have same type
    abstract class Context extends scala.reflect.macros.blackbox.Context
                   ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/Global.scala:1155: error: double definition:
    def scala$reflect$internal$Reporting$RunReporting$_setter_$reporting_=(x$1: Global.this.PerRunReporting): Unit at line 1155 and
    def scala$reflect$internal$Reporting$RunReporting$_setter_$reporting_=(x$1: Global.this.PerRunReporting): Unit at line 1155
    have same type
      class Run extends RunContextApi with RunReporting with RunParsing {
            ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/Properties.scala:10: error: double definition:
    def scala$util$PropertiesTrait$_setter_$copyrightString_=(x$1: String): Unit at line 10 and
    def scala$util$PropertiesTrait$_setter_$copyrightString_=(x$1: String): Unit at line 10
    have same type
    object Properties extends scala.util.PropertiesTrait {
           ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala:224: error: double definition:
    def selfOrSuperCalls_=(x$1: scala.collection.mutable.Stack[ExplicitOuter.this.global.Symbol]): Unit at line 224 and
    def selfOrSuperCalls_=(x$1: scala.collection.mutable.Stack[ExplicitOuter.this.global.Symbol]): Unit at line 224
    have same type
      abstract class OuterPathTransformer(unit: CompilationUnit) extends TypingTransformer(unit) with UnderConstructionTransformer {
                     ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/transform/UnCurry.scala:48: error: double definition:
    def uncurryType_=(x$1: UnCurry.this.global.TypeMap): Unit at line 48 and
    def uncurryType_=(x$1: UnCurry.this.global.TypeMap): Unit at line 48
    have same type
    abstract class UnCurry extends InfoTransform
                   ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/typechecker/TreeCheckers.scala:279: error: double definition:
    def scala$reflect$internal$Trees$TreeStackTraverser$_setter_$path_=(x$1: scala.collection.mutable.Stack[TreeCheckers.this.global.Tree]): Unit at line 279 and
    def scala$reflect$internal$Trees$TreeStackTraverser$_setter_$path_=(x$1: scala.collection.mutable.Stack[TreeCheckers.this.global.Tree]): Unit at line 279
    have same type
        object precheck extends TreeStackTraverser {
               ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/util/ShowPickled.scala:18: error: double definition:
    def scala$reflect$internal$Names$_setter_$TypeNameTag_=(x$1: scala.reflect.ClassTag[scala.tools.nsc.util.ShowPickled.TypeName]): Unit at line 18 and
    def scala$reflect$internal$Names$_setter_$TypeNameTag_=(x$1: scala.reflect.ClassTag[scala.tools.nsc.util.ShowPickled.TypeName]): Unit at line 18
    have same type
    object ShowPickled extends Names {
           ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/reflect/ReflectGlobal.scala:13: error: double definition:
    def scala$reflect$api$JavaUniverse$_setter_$RuntimeClassTag_=(x$1: scala.reflect.ClassTag[ReflectGlobal.this.RuntimeClass]): Unit at line 13 and
    def scala$reflect$api$JavaUniverse$_setter_$RuntimeClassTag_=(x$1: scala.reflect.ClassTag[ReflectGlobal.this.RuntimeClass]): Unit at line 13
    have same type
    class ReflectGlobal(currentSettings: Settings, reporter: Reporter, override val rootClassLoader: ClassLoader)
          ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/reflect/WrappedProperties.scala:42: error: double definition:
    def scala$util$PropertiesTrait$_setter_$copyrightString_=(x$1: String): Unit at line 42 and
    def scala$util$PropertiesTrait$_setter_$copyrightString_=(x$1: String): Unit at line 42
    have same type
      object AccessControl extends WrappedProperties {
             ^
    two warnings found
    9 errors found

commit ae34ac7
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update skolem ids in check file

commit 8672bb1
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    cleanup, no intended functional change

commit 319d3d2
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    clarify: all trait vals receive accessors

    those that wouldn't are synthesized later anyway -- right?

commit ab16f32
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    backwards compat: leave final?

    maybe we can save a few flag bits by using DEFERRED | FINAL
    instead of SYNTHESIZE_IMPL_IN_SUBCLASS, as a deferred final
    member must necessarily receive an implementation automatically
    to meet the constraints implied by this keyword combo

commit ccb8363
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    non-unit-typed lazy vals in traits still get field -- see neg/t5455.scala

commit 273cb20
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    skip presuper vals in new encoding

commit 631b636
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    broken tests -- for check file diffing ease

commit 9ff7869
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    benign, though rough check file updates

commit 90af847
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    unexplained updates to check files in printers test

commit 728e71e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    incoherent cyclic references between synthesized members

    must replace old trait accessor symbols by mixed in symbols
    in the infos of the mixed in symbols

    ```
    trait T { val a: String ; val b: a.type }
    class C extends T {
      // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
    }
    ```

    symbols occurring in types of synthesized members
    do not get rebound to other synthesized symbols

    package <empty>#4 {
      abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
        <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
        N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
        <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
        N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
      };
      abstract class M#7353 extends scala#22.AnyRef#2378 {
        <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
          M#7353.super.<init>scala#2719();
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
        <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
      };
      class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
        <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
        <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
        <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
        <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
        <method> def <init>#14997(): <empty>#3.this.C#7354 = {
          C#7354.super.<init>#13465();
          ()
        }
      }
    }

    [running phase pickler on dependent_rebind.scala]
    [running phase refchecks on dependent_rebind.scala]
    test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
     value n #15017 has incompatible type;
     found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
     required: => N#7352.this.self#7442.type
    class C extends M with N
          ^

commit ec2283e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    pos/t9111-inliner-workaround

commit 115e880
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    mark synthesized protected member as notPROTECTED,

    TODO: this doesn't work because protected[this] is supposed to be a
    variance checking escape hatch, and making these notPROTECTED here will trigger errors in refchecks

    so that it stays in overriding relation with the trait member in later phases

    make notPROTECTED a bit later?

    protected local variance bla

commit b56ca2f
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    static forwarders & private[this] val in trait

    object Properties extends PropertiesTrait

    trait PropertiesTrait {
      // the protected member is not emitted as a static member of  -- it works when dropping the access modifier
      // somehow, the module class member is considered deferred in BForwardersGen
      protected val propFilename: String = /
    }

    // [log jvm] No forwarder for 'getter propFilename' from Properties to 'module class Properties': false || m.isDeferred == true || false || false

    // the following method is missing compared to scalac
    // public final class Properties {
    //     public static String propFilename() {
    //         return Properties$.MODULE$.propFilename();
    //     }

    trait Chars {
      private[this] val char2uescapeArray = Array[Char]('\', 'u', 0, 0, 0, 0)
    }

    object Chars extends Chars

    // +++ w/reflect/scala/reflect/internal/Chars$.class
    // -  private final [C scala83014char2uescapeArray

commit ed7625f
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    finality for trait setters, annotations

    traitsetter annot for all concrete trait-owned setters

    stumble towards juggling annotations correctly

commit 492aa60
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    constant fold in forwarder for backwards compat

commit b8a7aa0
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    constant-typed final val in trait should yield impl method

commit 1655d1b
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    bean{setter,getter} delegates to setter/getter

commit 968fc30
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   2 months ago

    Fields phase

    Constructors: simplify transform loop

    Also encapsulate mixin ctor creation in `newMixinConstructor`

    Constructors: emit mixin-super constructor calls

    This was previously done by AddInterfaces, whose days are numbered.

    wip: trait fields 1

    wip: drop stuff from constructors

    lazyGetterBody

    wippythewipwip

    constructors transforminfo

    wip for unit-typed getters, delay trait setters until constructors, mix in accessors and fields there as well

    bare bones info transform is "working"

    ```
    trait OneConcreteVal[T] {
      val x = 1 // : T = ???
    }

    trait OneOtherConcreteVal[T] {
      var y: T = ???
    }

    class C extends OneConcreteVal[Int] with OneOtherConcreteVal[String]
    ```

    /*
    old decls for trait trait OneOtherConcreteVal: Scope{
      def y(): Object;
      def y_=(x$1: Object): Unit
    }
    new decls for trait trait OneOtherConcreteVal: Scope{
      def y(): Object;
      def y_=(x$1: Object): Unit;
      def $init$(): Unit
    }
    old decls for trait trait OneConcreteVal: Scope{
      val x(): Int
    }
    new decls for trait trait OneConcreteVal: Scope{
      val x(): Int;
      def $init$(): Unit;
      private[this] def x_=(x$1: Int): Unit
    }
    old decls for class C: Scope{
      def <init>(): C
    }
    mixing in List(method y, method y_=, value x, method x_=) from List(trait OneOtherConcreteVal, trait OneConcreteVal)
    new decls for class C: Scope{
      def <init>(): C;
      def y(): Object;
      private[this] var y: Object;
      def y_=(x$1: Object): Unit;
      val x(): Int;
      private[this] val x: Int;
      private[this] def x_=(x$1: Int): Unit
    }
    */

    getting there: need to avoid MIXEDIN/lateDEFERRED so as not to confuse mixins?

    temporarily using ARTIFACT instead of MIXEDIN to not confuse mixin

    kinda working...

    impl classes get accessors until mixin,
    so that constructors acts on them there,
    and produced the init method in the required spot (the impl class)

    the info-transformed of constructors:
      - traits receive trait-setters for vals
      - classes receive fields & accessors for mixed in traits

    Constructors tree transformer
      - makes trees for decls added during above info transform
        (TODO: decide on the right flag to communicate this)
      - adds mixin super calls to the primary constructor

    Later, mixins will drop all accessors in the impl class,
    retaining only the init method.
    Selects of setters/getters (in that init method)
    are rewritten to refer to the getters/setters in the interface (TODO)

    TODO (among many other things)
      - no constructor in trait
      - trait setter for val isn't found when rewriting accessors in impl classes
      - annotations
      - privacy

    ```
    trait OneConcreteVal[T] {
      var x = 1 // : T = ???
      def foo = x
    }

    trait OneOtherConcreteVal[T] {
      var y: T = ???
    }

    class C extends OneConcreteVal[Int] with OneOtherConcreteVal[String]
    ```

    ```
    [[syntax trees at end of              constructors]] // fields.scala
    package <empty> {
      abstract trait OneConcreteVal extends Object {
        <empty>; // <-- TODO
        <accessor> def x(): Int;
        @scala.runtime.TraitSetter <accessor> def x_=(x$1: Int): Unit;
        def foo(): Int
      };
      abstract trait OneOtherConcreteVal extends Object {
        <empty>; // <-- TODO
        <accessor> def y(): Object;
        @scala.runtime.TraitSetter <accessor> def y_=(x$1: Object): Unit
      };
      class C extends Object with OneConcreteVal with OneOtherConcreteVal {
        def <init>(): C = {
          C.super.<init>();
          C.this./*OneConcreteVal$class*/$init$();
          C.this./*OneOtherConcreteVal$class*/$init$();
          ()
        };
        <accessor> <artifact> def y(): Object = C.this.y;
        <artifact> private[this] var y: Object = _;
        @scala.runtime.TraitSetter <accessor> <artifact> def y_=(x$1: Object): Unit = C.this.y = x$1;
        <accessor> <artifact> def x(): Int = C.this.x;
        <artifact> private[this] var x: Int = _;
        @scala.runtime.TraitSetter <accessor> <artifact> def x_=(x$1: Int): Unit = C.this.x = x$1
      };
      abstract trait OneConcreteVal$class extends Object with OneConcreteVal {
        def /*OneConcreteVal$class*/$init$(): Unit = {
          OneConcreteVal$class.this.x_=(1);
          ()
        };
        <accessor> def x(): Int;
        @scala.runtime.TraitSetter <accessor> def x_=(x$1: Int): Unit;
        def foo(): Int = OneConcreteVal$class.this.x()
      };
      abstract trait OneOtherConcreteVal$class extends Object with OneOtherConcreteVal {
        def /*OneOtherConcreteVal$class*/$init$(): Unit = {
          OneOtherConcreteVal$class.this.y_=(scala.this.Predef.???());
          ()
        };
        <accessor> def y(): Object;
        @scala.runtime.TraitSetter <accessor> def y_=(x$1: Object): Unit
      }
    }
    ```

    ```
    [[syntax trees at end of                     mixin]] // fields.scala
    package <empty> {
      abstract trait OneConcreteVal extends Object {
        <accessor> def x(): Int;
        @scala.runtime.TraitSetter <accessor> def x_=(x$1: Int): Unit;
        def foo(): Int
      };
      abstract trait OneOtherConcreteVal extends Object {
        <accessor> def y(): Object;
        @scala.runtime.TraitSetter <accessor> def y_=(x$1: Object): Unit
      };
      class C extends Object with OneConcreteVal with OneOtherConcreteVal {
        def foo(): Int = OneConcreteVal$class.foo(C.this);
        def <init>(): C = {
          C.super.<init>();
          OneConcreteVal$class./*OneConcreteVal$class*/$init$(C.this);
          OneOtherConcreteVal$class./*OneOtherConcreteVal$class*/$init$(C.this);
          ()
        };
        <accessor> <artifact> def y(): Object = C.this.y;
        <artifact> private[this] var y: Object = _;
        @scala.runtime.TraitSetter <accessor> <artifact> def y_=(x$1: Object): Unit = C.this.y = x$1;
        <accessor> <artifact> def x(): Int = C.this.x;
        <artifact> private[this] var x: Int = _;
        @scala.runtime.TraitSetter <accessor> <artifact> def x_=(x$1: Int): Unit = C.this.x = x$1
      };
      abstract trait OneConcreteVal$class extends  {
        def /*OneConcreteVal$class*/$init$($this: OneConcreteVal): Unit = {
          $this.x_=(1);
          ()
        };
        def foo($this: OneConcreteVal): Int = $this.x()
      };
      abstract trait OneOtherConcreteVal$class extends  {
        def /*OneOtherConcreteVal$class*/$init$($this: OneOtherConcreteVal): Unit = {
          $this.y_=(scala.this.Predef.???());
          ()
        }
      }
    }
    ```

    emit trait setters, target interface for setter

    don't emit trait constructors yet, don't mess with mixin class ctors

    hack to explore where to keep annotations on trait fields

    we don't have a field -- only a getter -- so,
    where will we keep non-getter but-field annotations?

    restore mixins

    reduce OOification re: annotation derivation

      - replace virtual dispatch on sealed traits by matches
      - rename `keepClean` to `defaultRetention`
      - allow multiple categories in annotationFilter (for trait fields)

    mixin only deals with lazy accessors/vals

    do not used referenced to correlate getter/setter

    it messes with paramaccessor's usage, and we don't really need it

    annotations

    typo

    poking around overriding and unit-typed vars

    detect unit correctly

    setter should be considered deferred, just like getter and val

    fixup constructor triaging

    introduce constructor's very own flag

    stop using referenced entirely

    refactor

    add Fields phase

    meh

    mehmeh

    meeeeeh

    Fields phase is kind of working. Yay.

    emit synthetic setter for trait val

    make sure to clone info's, so we don't share symbols for method args
    this manifests itself as an exception in lambdalift, finding proxies

    ```
    trait OneAbstractVar[T] {
      val x: Int = 123
    }

    class ConcVar extends OneAbstractVar[Int]
    ```

    compiles to the following (as desired!):

    ```
    ➜  scala git:(traits-late-fields) ✗ cfr /tmp/ConcVar.class
    /*
     * Decompiled with CFR 0_102.
     *
     * Could not load the following classes:
     *  scala.reflect.ScalaSignature
     */
    import OneAbstractVar;
    import OneAbstractVar$class;
    import scala.reflect.ScalaSignature;

    @ScalaSignature(bytes="\u0006\u0001\u00112A!\u0001\u0002\u0001\u000b\t91i\u001c8d-\u0006\u0014(\"A\u0002\u0002\u000fq*W\u000e\u001d;z}\r\u00011c\u0001\u0001\u0007\u0019A\u0011qAC\u0007\u0002\u0011)\t\u0011\"A\u0003tG\u0006d\u0017-\u0003\u0002\f\u0011\t1\u0011I\\=SK\u001a\u00042!\u0004\b\u0011\u001b\u0005\u0011\u0011BA\b\u0003\u00059ye.Z!cgR\u0014\u0018m\u0019;WCJ\u0004\"aB\t\n\u0005IA!aA%oi\")A\u0003\u0001C\u0001+\u00051A(\u001b8jiz\"\u0012A\u0006\t\u0003\u001b\u0001A\u0011\u0002\u0007\u0001A\u0002\u000b\u0007I\u0011A\r\u0002\u0003a,\u0012\u0001\u0005\u0005\n7\u0001\u0001\r\u0011!Q\u0001\nA\t!\u0001\u001f\u0011\t\u0013u\u0001\u0001\u0019aa\u0001J\u0003q\u0012!H(oK\u0006\u00137\u000f\u001e:bGR4\u0016M\u001d\u0013`g\u0016$H/\u001a:`Ia|F%Z9\u0015\u0005}\u0011\u0003CA\u0004!\u0013\t\t\u0003B\u0001\u0003V]&$\bbB\u0012\u001d\u0003\u0003\u0005\r\u0001E\u0001\u0004q\u0012\n\u0004")
    public class ConcVar
    implements OneAbstractVar<Object> {
        private final int x;

        public ConcVar() {
            OneAbstractVar$class.$init$(this);
        }

        @OverRide
        public int x() {
            return this.x;
        }

        @OverRide
        public void OneAbstractVar$_setter_$x_$eq(int x$1) {
            this.x = x$1;
        }
    }
    ➜  scala git:(traits-late-fields) ✗ cfr /tmp/OneAbstractVar\$class.class
    /*
     * Decompiled with CFR 0_102.
     */
    import OneAbstractVar;

    public abstract class OneAbstractVar$class {
        public static void $init$(OneAbstractVar $this) {
            $this.OneAbstractVar$_setter_$x_$eq(123);
        }
    }
    ➜  scala git:(traits-late-fields) ✗ cfr /tmp/OneAbstractVar.class
    /*
     * Decompiled with CFR 0_102.
     *
     * Could not load the following classes:
     *  scala.reflect.ScalaSignature
     */
    import scala.reflect.ScalaSignature;

    @ScalaSignature(bytes="\u0006\u0001\u001d2q!\u0001\u0002\u0011\u0002\u0007\u0005QA\u0001\bP]\u0016\f%m\u001d;sC\u000e$h+\u0019:\u000b\u0003\r\tq\u0001P3naRLhh\u0001\u0001\u0016\u0005\u0019q2C\u0001\u0001\b!\tA1\"D\u0001\n\u0015\u0005Q\u0011!B:dC2\f\u0017B\u0001\u0007\n\u0005\u0019\te.\u001f*fM\")a\u0002\u0001C\u0001\u001f\u00051A%\u001b8ji\u0012\"\u0012\u0001\u0005\t\u0003\u0011EI!AE\u0005\u0003\tUs\u0017\u000e\u001e\u0005\b)\u0001\u0011\rQ\"\u0001\u0016\u0003\u0005AX#\u0001\f\u0011\u0005!9\u0012B\u0001\r\n\u0005\rIe\u000e\u001e\u0005\n5\u0001\u0001\r11A'\u0002m\tQd\u00148f\u0003\n\u001cHO]1diZ\u000b'\u000fJ0tKR$XM]0%q~#S-\u001d\u000b\u0003!qAq!H\r\u0002\u0002\u0003\u0007a#A\u0002yIE\"Qa\b\u0001C\u0002\u0001\u0012\u0011\u0001V\t\u0003C\u0011\u0002\"\u0001\u0003\u0012\n\u0005\rJ!a\u0002(pi\"Lgn\u001a\t\u0003\u0011\u0015J!AJ\u0005\u0003\u0007\u0005s\u0017\u0010")
    public interface OneAbstractVar<T> {
        public void OneAbstractVar$_setter_$x_$eq(int var1);

        public int x();
    }
    ```

    cleanup

    TODO: overriding accessors

    don't mix in accessors if conflicting member exists

    getting closer to bootstrap

    exclude lazy vals, don't makeNotPrivate

    lazy accessors and presupers require old treatment

    constructors should leave strict valdefs alone

    restore constructors to minimal diff compared to scala#4723

    revert more gratuitous stuff

    revert more in mixins

    trying to get to bootstrap.. currently failing in scala.util.Properties

    reduction of bootstrap failures

    on a bed of TODOs, with a hint of minimalism

    use primary constructor as owner for stats in template?

    fix pattern match in infotransform, remove mutation

    deferred setter does need impl in subclass

    remove SYNTHESIZE_IMPL_IN_SUBCLASS

    Use NEEDS_TREES for all comms between InfoTransform and tree transform

    We can now compile the library again, though the bytecode diff
    is not empty yet :-)

    TODO:
      - Weirdly, scala signatures are not emitted?
      - Fields are no longer emitted for constants
        (an improvement, but should not do this until next milestone)
      - the volatile annotation is not preserved
      - App, Enumeration compiled differently
      - Owner chain changes due to lifting of rhs affects:
        --> anonymous function in Iterator, PartialFunction, scala/collection/immutable/HashMap
      - traitsetter name mangling differences
      - abortflag accessors duplicated in scala/collection/generic/VolatileAbort.class
      - ...

    yep, need SYNTHESIZE_IMPL_IN_SUBCLASS

    distinguish accessors that should be mixed into subclass,
    and those that simply need to be implemented in tree transform,
    after info transform added the decl

    emit const vals for now to minimize bytecode diff

    TODO: still some bytecode diffs with constants remain (Enumeration)

    correct owner for stats in template

    closing in on boostrap

    strap.done:
        [mkdir] Created dir: /Users/adriaan/git/scala/build/strap/classes/library
    [strap.library] Compiling 584 files to /Users/adriaan/git/scala/build/strap/classes/library
    [strap.library] /Users/adriaan/git/scala/src/library/scala/collection/convert/WrapAsScala.scala:173: warning: abstract type A in type pattern scala.collection.convert.Wrappers.ConcurrentMapWrapper[A,B] is unchecked since it is eliminated by erasure
    [strap.library]     case cmw: ConcurrentMapWrapper[A, B]  => cmw.underlying
    [strap.library]               ^
    [strap.library] warning: there were 111 deprecation warnings; re-run with -deprecation for details
    [strap.library] two warnings found
        [javac] Compiling 165 source files to /Users/adriaan/git/scala/build/strap/classes/library
        [javac] Note: Some input files use unchecked or unsafe operations.
        [javac] Note: Recompile with -Xlint:unchecked for details.
    [propertyfile] Creating new property file: /Users/adriaan/git/scala/build/strap/classes/library/library.properties
         [copy] Copying 1 file to /Users/adriaan/git/scala/build/strap/classes/library
    [stopwatch] [strap.library.timer: 1:31.668 sec]
        [mkdir] Created dir: /Users/adriaan/git/scala/build/strap/classes/reflect
    [strap.reflect] Compiling 157 files to /Users/adriaan/git/scala/build/strap/classes/reflect
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/JavaUniverse.scala:16: error: overriding variable uniques in class SymbolTable of type scala.reflect.internal.util.WeakHashSet[JavaUniverse.this.Type];
    [strap.reflect]  value uniques needs `override' modifier
    [strap.reflect] class JavaUniverse extends InternalSymbolTable with JavaUniverseForce with ReflectSetup with RuntimeSymbolTable { self =>
    [strap.reflect]       ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedOps.scala:6: error: overriding variable uniques in trait SynchronizedTypes of type scala.collection.mutable.WeakHashMap[SynchronizedOps.this.Type,java.lang.ref.WeakReference[SynchronizedOps.this.Type]];
    [strap.reflect]  variable uniques in class SymbolTable of type scala.reflect.internal.util.WeakHashSet[SynchronizedOps.this.Type] needs to be a stable, immutable value
    [strap.reflect] private[reflect] trait SynchronizedOps extends internal.SymbolTable
    [strap.reflect]                        ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedSymbols.scala:16: error: overriding variable _recursionTable in trait Symbols of type scala.collection.immutable.Map[SynchronizedSymbols.this.Symbol,Int];
    [strap.reflect]  lazy value _recursionTable has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _recursionTable = mkThreadLocalStorage(immutable.Map.empty[Symbol, Int])
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:43: error: overriding variable _skolemizationLevel in trait Types of type Int;
    [strap.reflect]  lazy value _skolemizationLevel has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _skolemizationLevel = mkThreadLocalStorage(0)
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:50: error: overriding variable _intersectionWitness in trait Types of type scala.collection.mutable.WeakHashMap[List[SynchronizedTypes.this.Type],scala.ref.WeakReference[SynchronizedTypes.this.Type]];
    [strap.reflect]  lazy value _intersectionWitness has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _intersectionWitness = mkThreadLocalStorage(perRunCaches.newWeakMap[List[Type], sWeakRef[Type]]())
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:53: error: overriding variable _subsametypeRecursions in trait TypeComparers of type Int;
    [strap.reflect]  lazy value _subsametypeRecursions has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _subsametypeRecursions = mkThreadLocalStorage(0)
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:57: error: overriding variable _pendingSubTypes in trait TypeComparers of type scala.collection.mutable.HashSet[SynchronizedTypes.this.SubTypePair];
    [strap.reflect]  lazy value _pendingSubTypes has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _pendingSubTypes = mkThreadLocalStorage(new mutable.HashSet[SubTypePair])
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:60: error: overriding variable _basetypeRecursions in trait Types of type Int;
    [strap.reflect]  lazy value _basetypeRecursions has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _basetypeRecursions = mkThreadLocalStorage(0)
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:64: error: overriding variable _pendingBaseTypes in trait Types of type scala.collection.mutable.HashSet[SynchronizedTypes.this.Type];
    [strap.reflect]  lazy value _pendingBaseTypes has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _pendingBaseTypes = mkThreadLocalStorage(new mutable.HashSet[Type])
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:67: error: overriding variable _lubResults in trait GlbLubs of type scala.collection.mutable.HashMap[(scala.reflect.internal.Depth, List[SynchronizedTypes.this.Type]),SynchronizedTypes.this.Type];
    [strap.reflect]  lazy value _lubResults has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _lubResults = mkThreadLocalStorage(new mutable.HashMap[(Depth, List[Type]), Type])
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:70: error: overriding variable _glbResults in trait GlbLubs of type scala.collection.mutable.HashMap[(scala.reflect.internal.Depth, List[SynchronizedTypes.this.Type]),SynchronizedTypes.this.Type];
    [strap.reflect]  lazy value _glbResults has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _glbResults = mkThreadLocalStorage(new mutable.HashMap[(Depth, List[Type]), Type])
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:73: error: overriding variable _indent in trait Types of type String;
    [strap.reflect]  lazy value _indent has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _indent = mkThreadLocalStorage("")
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:77: error: overriding variable _toStringRecursions in trait TypeToStrings of type Int;
    [strap.reflect]  lazy value _toStringRecursions has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _toStringRecursions = mkThreadLocalStorage(0)
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:81: error: overriding variable _toStringSubjects in trait TypeToStrings of type scala.collection.mutable.HashSet[SynchronizedTypes.this.Type];
    [strap.reflect]  lazy value _toStringSubjects has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _toStringSubjects = mkThreadLocalStorage(new mutable.HashSet[Type])
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:21: error: overriding variable uniques in trait Types of type scala.reflect.internal.util.WeakHashSet[SynchronizedTypes.this.Type];
    [strap.reflect]  variable uniques has incompatible type
    [strap.reflect]   private val uniques = mutable.WeakHashMap[Type, jWeakRef[Type]]()
    [strap.reflect]               ^
    [strap.reflect] 15 errors found

    make private vals in traits not-private

    TODO: refine

    only look at strict accessors

    don't widen type for getter -- wtf

    current TODO: overriding vals

    mor compact accessor synth

    major cleanup

    compiles library & reflect, but not compiler:

    [strap.compiler] /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/CompileServer.scala:40: error: object creation impossible, since:
    [strap.compiler] it has 151 unimplemented members.

    last error flag pickling issue?

    info mangling, traitsetter

    remove hacks from other files

    trait fields stuff
adriaanm added a commit to adriaanm/scala that referenced this pull request Nov 12, 2015
and past commit messages:

commit abae762 (adriaanm/traits-late-fields)
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   2 hours ago

    bootstrapped compiler needs new partest

commit 81d7c25
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   5 hours ago

    update test to reflect useless constant fields are now dropped

commit 5f8fe87
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   16 hours ago

    Reduce flagbit usage, remove some stale comments

commit 9368256
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   16 hours ago

    annotations cleanup/fix for slitting between fields and getter annotation targets

commit 4336eb1
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 days ago

    fix printerstest

commit 4b4932e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 days ago

    do assignment to trait fields in AddInterfaces

    regular class vals get assignments during constructors, as before

commit 822913e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   9 days ago

    refactor accessor/field derivation

    in preparation of moving to compute-method style
    which in turn hopefully will be more manageable for specialization

commit cf845ab
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    don't suppress field for unit-typed vals

    it affects the memory model -- even a write of unit to a field is relevant...

commit 675f937
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    docs

commit baf568d
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    produce identical bytecode for constant trait val getters

    I couldn't bring myself to emit the unused fields that we
    used to emit for constant vals, even though the getters
    immediately return the constant, and thus the field goes unused.

    In the next version, there's no need to synthesize impls
    for these in subclasses -- the getter can be implemented
    in the interface.

commit 874f48b
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    one fewer warning: can't currently distinguish getter and setter in unused defs in traits

commit 7d21968
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    update skolems again...

commit 20165ea
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    test/files/neg/t5455.scala: trait lazy val needs field

commit b9052da
Author: Lukas Rytz <lukas.rytz@gmail.com>
Date:   3 weeks ago

    Fix enclosing method attribute for classes nested in trait fields

    Trait fields are now created as MethodSymbol (no longer TermSymbol).
    This symbol shows up in the `originalOwner` chain of a class declared
    within the field initializer. This promoted the field getter to
    being the enclosing method of the nested class, which it is not
    (the EnclosingMethod attribute is a source-level property).

commit 2b916f4
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    update skolems in check file for neg/t6829.scala

commit 3ac6aad
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    wip: neg/t6276.scala

    vals no longer have rhs after fields,
    so must check the assign node it was lifted out to

commit 892e13c
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    detect trait vals

    see neg/delayed-init-ref.scala and neg/t562.scala

commit 536b978
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    error on concrete val in universal trait

    see neg/anytrait.scala

commit d7c1de8
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    refactor field memoization logic -- wip

commit 337a9dd
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    unit-typed lazy vals should never receive a field

    this need was unmasked by test/files/run/t7843-jsr223-service.scala,
    which no longer printed the output expected from the `0 to 10 foreach`

commit 8405e72
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    benign checkfile updates

commit 3dbcd57
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    Revert "broken tests -- for check file diffing ease"

    This reverts commit 631b636,
    at least the part that masked actual breakage

    Currently failing tests:

     - test/files/pos/t6780.scala
     - test/files/neg/anytrait.scala
     - test/files/neg/delayed-init-ref.scala
     - test/files/neg/t562.scala
     - test/files/neg/t6276.scala
     - test/files/run/delambdafy_uncurry_byname_inline.scala
     - test/files/run/delambdafy_uncurry_byname_method.scala
     - test/files/run/delambdafy_uncurry_inline.scala
     - test/files/run/delambdafy_uncurry_method.scala
     - test/files/run/inner-obj-auto.scala
     - test/files/run/lazy-traits.scala
     - test/files/run/reify_lazyunit.scala
     - test/files/run/showraw_mods.scala
     - test/files/run/t3670.scala
     - test/files/run/t3980.scala
     - test/files/run/t4047.scala
     - test/files/run/t6622.scala
     - test/files/run/t7406.scala
     - test/files/run/t7843-jsr223-service.scala
     - test/files/jvm/innerClassAttribute
     - test/files/specialized/SI-7343.scala
     - test/files/specialized/constant_lambda.scala
     - test/files/specialized/spec-early.scala
     - test/files/specialized/spec-init.scala
     - test/files/specialized/spec-matrix-new.scala
     - test/files/specialized/spec-matrix-old.scala
     - test/files/presentation/scope-completion-3

commit 08cbc35
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    fix nondeterminism in printerstest???

commit b1b4e5c
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    wip: lambdalift fix

    test/files/trait-defaults/lambdalift.scala works,
    but still some related tests failing

    (note that we can't use a bootstrapped compiler yet
    due to binary incompatibility in partest)

    Selected 34 tests drawn from specified tests

    !! 1 - pos/t6780.scala                           [compilation failed]

    ok  1 - neg/anytrait.scala
    ok  2 - neg/t1960.scala
    ok  3 - neg/t562.scala
    ok  4 - neg/t2796.scala
    ok  5 - neg/t5455.scala
    ok  6 - neg/delayed-init-ref.scala
    ok  7 - neg/t6446-show-phases.scala
    ok  8 - neg/t6446-missing
    ok  9 - neg/t6276.scala
    ok 10 - neg/t6829.scala
    ok 11 - neg/t6446-additional
    ok 12 - neg/t7494-no-options

    !!  1 - run/bugs.scala                            [output differs]
    !!  2 - run/inner-obj-auto.scala                  [non-zero exit code]
    ok  3 - run/delambdafy_t6555.scala
    ok  4 - run/delambdafy_t6028.scala
    ok  5 - run/preinits.scala
    ok  6 - run/lazy-locals.scala
    ok  7 - run/analyzerPlugins.scala
    ok  8 - run/t0936.scala
    ok  9 - run/programmatic-main.scala
    !! 10 - run/showraw_mods.scala                    [output differs]
    ok 11 - run/t4426.scala
    ok 12 - run/t5938.scala
    ok 13 - run/t6733.scala
    !! 14 - run/t7406.scala                           [non-zero exit code]
    ok 15 - run/t6555.scala
    ok 16 - run/t6028.scala
    ok 17 - run/t8002.scala
    ok 18 - run/t7533.scala
    ok 19 - run/t7569.scala

    ok 1 - jvm/t7006
    !! 2 - jvm/innerClassAttribute                   [non-zero exit code]

    test/partest --update-check \
      /Users/adriaan/git/scala/test/files/pos/t6780.scala \
      /Users/adriaan/git/scala/test/files/run/bugs.scala \
      /Users/adriaan/git/scala/test/files/run/inner-obj-auto.scala \
      /Users/adriaan/git/scala/test/files/run/showraw_mods.scala \
      /Users/adriaan/git/scala/test/files/run/t7406.scala \
      /Users/adriaan/git/scala/test/files/jvm/innerClassAttribute

commit c4694d9
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    refactor

commit e676a2a
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    cleanups

commit a3bc708
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    centralize fields flag juggling

commit eae7dac
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update check now that trait vals can be concrete, use names not letters

    note the progression in a concrete trait val now being recognized as such
    ```
    -trait T => true
    -method $init$ => false
    -value z1 => true
    -value z2 => true // z2 is actually concrete!
    ```

commit 255cc06
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update check files sensitive to <subsynth> modifier being printed

commit 6555c74
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    bootstraps again by running info transform once per class...

    not sure how this ever worked, as separate compilation would transform a trait's info
    multiple times, resulting in double defs...

commit 33ac5e0
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    flag simplification, but double def errors in in strap.comp

    Compiling 327 files to /Users/adriaan/git/scala/build/strap/classes/compiler
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/transform/Constructors.scala:170: warning: postfix operator toMap should be enabled
    by making the implicit value scala.language.postfixOps visible.
    This can be achieved by adding the import clause 'import scala.language.postfixOps'
    or by setting the compiler option -language:postfixOps.
    See the Scala docs for value scala.language.postfixOps for a discussion
    why the feature should be explicitly enabled.
            lazy val bodyOfOuterAccessor = defs collect { case dd: DefDef if omittableOuterAcc(dd.symbol) => dd.symbol -> dd.rhs } toMap
                                                                                                                                   ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/transform/Fields.scala:193: warning: postfix operator nonEmpty should be enabled
    by making the implicit value scala.language.postfixOps visible.
            if (newSetters nonEmpty) {
                           ^
    /Users/adriaan/git/scala/src/compiler/scala/reflect/macros/contexts/Context.scala:6: error: double definition:
    def scala$reflect$macros$Aliases$_setter_$TypeTag_=(x$1: Context.this.universe.TypeTag.type): Unit at line 6 and
    def scala$reflect$macros$Aliases$_setter_$TypeTag_=(x$1: Context.this.universe.TypeTag.type): Unit at line 6
    have same type
    abstract class Context extends scala.reflect.macros.blackbox.Context
                   ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/Global.scala:1155: error: double definition:
    def scala$reflect$internal$Reporting$RunReporting$_setter_$reporting_=(x$1: Global.this.PerRunReporting): Unit at line 1155 and
    def scala$reflect$internal$Reporting$RunReporting$_setter_$reporting_=(x$1: Global.this.PerRunReporting): Unit at line 1155
    have same type
      class Run extends RunContextApi with RunReporting with RunParsing {
            ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/Properties.scala:10: error: double definition:
    def scala$util$PropertiesTrait$_setter_$copyrightString_=(x$1: String): Unit at line 10 and
    def scala$util$PropertiesTrait$_setter_$copyrightString_=(x$1: String): Unit at line 10
    have same type
    object Properties extends scala.util.PropertiesTrait {
           ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala:224: error: double definition:
    def selfOrSuperCalls_=(x$1: scala.collection.mutable.Stack[ExplicitOuter.this.global.Symbol]): Unit at line 224 and
    def selfOrSuperCalls_=(x$1: scala.collection.mutable.Stack[ExplicitOuter.this.global.Symbol]): Unit at line 224
    have same type
      abstract class OuterPathTransformer(unit: CompilationUnit) extends TypingTransformer(unit) with UnderConstructionTransformer {
                     ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/transform/UnCurry.scala:48: error: double definition:
    def uncurryType_=(x$1: UnCurry.this.global.TypeMap): Unit at line 48 and
    def uncurryType_=(x$1: UnCurry.this.global.TypeMap): Unit at line 48
    have same type
    abstract class UnCurry extends InfoTransform
                   ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/typechecker/TreeCheckers.scala:279: error: double definition:
    def scala$reflect$internal$Trees$TreeStackTraverser$_setter_$path_=(x$1: scala.collection.mutable.Stack[TreeCheckers.this.global.Tree]): Unit at line 279 and
    def scala$reflect$internal$Trees$TreeStackTraverser$_setter_$path_=(x$1: scala.collection.mutable.Stack[TreeCheckers.this.global.Tree]): Unit at line 279
    have same type
        object precheck extends TreeStackTraverser {
               ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/util/ShowPickled.scala:18: error: double definition:
    def scala$reflect$internal$Names$_setter_$TypeNameTag_=(x$1: scala.reflect.ClassTag[scala.tools.nsc.util.ShowPickled.TypeName]): Unit at line 18 and
    def scala$reflect$internal$Names$_setter_$TypeNameTag_=(x$1: scala.reflect.ClassTag[scala.tools.nsc.util.ShowPickled.TypeName]): Unit at line 18
    have same type
    object ShowPickled extends Names {
           ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/reflect/ReflectGlobal.scala:13: error: double definition:
    def scala$reflect$api$JavaUniverse$_setter_$RuntimeClassTag_=(x$1: scala.reflect.ClassTag[ReflectGlobal.this.RuntimeClass]): Unit at line 13 and
    def scala$reflect$api$JavaUniverse$_setter_$RuntimeClassTag_=(x$1: scala.reflect.ClassTag[ReflectGlobal.this.RuntimeClass]): Unit at line 13
    have same type
    class ReflectGlobal(currentSettings: Settings, reporter: Reporter, override val rootClassLoader: ClassLoader)
          ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/reflect/WrappedProperties.scala:42: error: double definition:
    def scala$util$PropertiesTrait$_setter_$copyrightString_=(x$1: String): Unit at line 42 and
    def scala$util$PropertiesTrait$_setter_$copyrightString_=(x$1: String): Unit at line 42
    have same type
      object AccessControl extends WrappedProperties {
             ^
    two warnings found
    9 errors found

commit ae34ac7
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update skolem ids in check file

commit 8672bb1
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    cleanup, no intended functional change

commit 319d3d2
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    clarify: all trait vals receive accessors

    those that wouldn't are synthesized later anyway -- right?

commit ab16f32
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    backwards compat: leave final?

    maybe we can save a few flag bits by using DEFERRED | FINAL
    instead of SYNTHESIZE_IMPL_IN_SUBCLASS, as a deferred final
    member must necessarily receive an implementation automatically
    to meet the constraints implied by this keyword combo

commit ccb8363
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    non-unit-typed lazy vals in traits still get field -- see neg/t5455.scala

commit 273cb20
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    skip presuper vals in new encoding

commit 631b636
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    broken tests -- for check file diffing ease

commit 9ff7869
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    benign, though rough check file updates

commit 90af847
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    unexplained updates to check files in printers test

commit 728e71e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    incoherent cyclic references between synthesized members

    must replace old trait accessor symbols by mixed in symbols
    in the infos of the mixed in symbols

    ```
    trait T { val a: String ; val b: a.type }
    class C extends T {
      // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
    }
    ```

    symbols occurring in types of synthesized members
    do not get rebound to other synthesized symbols

    package <empty>#4 {
      abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
        <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
        N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
        <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
        N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
      };
      abstract class M#7353 extends scala#22.AnyRef#2378 {
        <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
          M#7353.super.<init>scala#2719();
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
        <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
      };
      class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
        <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
        <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
        <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
        <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
        <method> def <init>#14997(): <empty>#3.this.C#7354 = {
          C#7354.super.<init>#13465();
          ()
        }
      }
    }

    [running phase pickler on dependent_rebind.scala]
    [running phase refchecks on dependent_rebind.scala]
    test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
     value n #15017 has incompatible type;
     found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
     required: => N#7352.this.self#7442.type
    class C extends M with N
          ^

commit ec2283e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    pos/t9111-inliner-workaround

commit 115e880
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    mark synthesized protected member as notPROTECTED,

    TODO: this doesn't work because protected[this] is supposed to be a
    variance checking escape hatch, and making these notPROTECTED here will trigger errors in refchecks

    so that it stays in overriding relation with the trait member in later phases

    make notPROTECTED a bit later?

    protected local variance bla

commit b56ca2f
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    static forwarders & private[this] val in trait

    object Properties extends PropertiesTrait

    trait PropertiesTrait {
      // the protected member is not emitted as a static member of  -- it works when dropping the access modifier
      // somehow, the module class member is considered deferred in BForwardersGen
      protected val propFilename: String = /
    }

    // [log jvm] No forwarder for 'getter propFilename' from Properties to 'module class Properties': false || m.isDeferred == true || false || false

    // the following method is missing compared to scalac
    // public final class Properties {
    //     public static String propFilename() {
    //         return Properties$.MODULE$.propFilename();
    //     }

    trait Chars {
      private[this] val char2uescapeArray = Array[Char]('\', 'u', 0, 0, 0, 0)
    }

    object Chars extends Chars

    // +++ w/reflect/scala/reflect/internal/Chars$.class
    // -  private final [C scala83014char2uescapeArray

commit ed7625f
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    finality for trait setters, annotations

    traitsetter annot for all concrete trait-owned setters

    stumble towards juggling annotations correctly

commit 492aa60
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    constant fold in forwarder for backwards compat

commit b8a7aa0
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    constant-typed final val in trait should yield impl method

commit 1655d1b
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    bean{setter,getter} delegates to setter/getter

commit 968fc30
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   2 months ago

    Fields phase

    Constructors: simplify transform loop

    Also encapsulate mixin ctor creation in `newMixinConstructor`

    Constructors: emit mixin-super constructor calls

    This was previously done by AddInterfaces, whose days are numbered.

    wip: trait fields 1

    wip: drop stuff from constructors

    lazyGetterBody

    wippythewipwip

    constructors transforminfo

    wip for unit-typed getters, delay trait setters until constructors, mix in accessors and fields there as well

    bare bones info transform is "working"

    ```
    trait OneConcreteVal[T] {
      val x = 1 // : T = ???
    }

    trait OneOtherConcreteVal[T] {
      var y: T = ???
    }

    class C extends OneConcreteVal[Int] with OneOtherConcreteVal[String]
    ```

    /*
    old decls for trait trait OneOtherConcreteVal: Scope{
      def y(): Object;
      def y_=(x$1: Object): Unit
    }
    new decls for trait trait OneOtherConcreteVal: Scope{
      def y(): Object;
      def y_=(x$1: Object): Unit;
      def $init$(): Unit
    }
    old decls for trait trait OneConcreteVal: Scope{
      val x(): Int
    }
    new decls for trait trait OneConcreteVal: Scope{
      val x(): Int;
      def $init$(): Unit;
      private[this] def x_=(x$1: Int): Unit
    }
    old decls for class C: Scope{
      def <init>(): C
    }
    mixing in List(method y, method y_=, value x, method x_=) from List(trait OneOtherConcreteVal, trait OneConcreteVal)
    new decls for class C: Scope{
      def <init>(): C;
      def y(): Object;
      private[this] var y: Object;
      def y_=(x$1: Object): Unit;
      val x(): Int;
      private[this] val x: Int;
      private[this] def x_=(x$1: Int): Unit
    }
    */

    getting there: need to avoid MIXEDIN/lateDEFERRED so as not to confuse mixins?

    temporarily using ARTIFACT instead of MIXEDIN to not confuse mixin

    kinda working...

    impl classes get accessors until mixin,
    so that constructors acts on them there,
    and produced the init method in the required spot (the impl class)

    the info-transformed of constructors:
      - traits receive trait-setters for vals
      - classes receive fields & accessors for mixed in traits

    Constructors tree transformer
      - makes trees for decls added during above info transform
        (TODO: decide on the right flag to communicate this)
      - adds mixin super calls to the primary constructor

    Later, mixins will drop all accessors in the impl class,
    retaining only the init method.
    Selects of setters/getters (in that init method)
    are rewritten to refer to the getters/setters in the interface (TODO)

    TODO (among many other things)
      - no constructor in trait
      - trait setter for val isn't found when rewriting accessors in impl classes
      - annotations
      - privacy

    ```
    trait OneConcreteVal[T] {
      var x = 1 // : T = ???
      def foo = x
    }

    trait OneOtherConcreteVal[T] {
      var y: T = ???
    }

    class C extends OneConcreteVal[Int] with OneOtherConcreteVal[String]
    ```

    ```
    [[syntax trees at end of              constructors]] // fields.scala
    package <empty> {
      abstract trait OneConcreteVal extends Object {
        <empty>; // <-- TODO
        <accessor> def x(): Int;
        @scala.runtime.TraitSetter <accessor> def x_=(x$1: Int): Unit;
        def foo(): Int
      };
      abstract trait OneOtherConcreteVal extends Object {
        <empty>; // <-- TODO
        <accessor> def y(): Object;
        @scala.runtime.TraitSetter <accessor> def y_=(x$1: Object): Unit
      };
      class C extends Object with OneConcreteVal with OneOtherConcreteVal {
        def <init>(): C = {
          C.super.<init>();
          C.this./*OneConcreteVal$class*/$init$();
          C.this./*OneOtherConcreteVal$class*/$init$();
          ()
        };
        <accessor> <artifact> def y(): Object = C.this.y;
        <artifact> private[this] var y: Object = _;
        @scala.runtime.TraitSetter <accessor> <artifact> def y_=(x$1: Object): Unit = C.this.y = x$1;
        <accessor> <artifact> def x(): Int = C.this.x;
        <artifact> private[this] var x: Int = _;
        @scala.runtime.TraitSetter <accessor> <artifact> def x_=(x$1: Int): Unit = C.this.x = x$1
      };
      abstract trait OneConcreteVal$class extends Object with OneConcreteVal {
        def /*OneConcreteVal$class*/$init$(): Unit = {
          OneConcreteVal$class.this.x_=(1);
          ()
        };
        <accessor> def x(): Int;
        @scala.runtime.TraitSetter <accessor> def x_=(x$1: Int): Unit;
        def foo(): Int = OneConcreteVal$class.this.x()
      };
      abstract trait OneOtherConcreteVal$class extends Object with OneOtherConcreteVal {
        def /*OneOtherConcreteVal$class*/$init$(): Unit = {
          OneOtherConcreteVal$class.this.y_=(scala.this.Predef.???());
          ()
        };
        <accessor> def y(): Object;
        @scala.runtime.TraitSetter <accessor> def y_=(x$1: Object): Unit
      }
    }
    ```

    ```
    [[syntax trees at end of                     mixin]] // fields.scala
    package <empty> {
      abstract trait OneConcreteVal extends Object {
        <accessor> def x(): Int;
        @scala.runtime.TraitSetter <accessor> def x_=(x$1: Int): Unit;
        def foo(): Int
      };
      abstract trait OneOtherConcreteVal extends Object {
        <accessor> def y(): Object;
        @scala.runtime.TraitSetter <accessor> def y_=(x$1: Object): Unit
      };
      class C extends Object with OneConcreteVal with OneOtherConcreteVal {
        def foo(): Int = OneConcreteVal$class.foo(C.this);
        def <init>(): C = {
          C.super.<init>();
          OneConcreteVal$class./*OneConcreteVal$class*/$init$(C.this);
          OneOtherConcreteVal$class./*OneOtherConcreteVal$class*/$init$(C.this);
          ()
        };
        <accessor> <artifact> def y(): Object = C.this.y;
        <artifact> private[this] var y: Object = _;
        @scala.runtime.TraitSetter <accessor> <artifact> def y_=(x$1: Object): Unit = C.this.y = x$1;
        <accessor> <artifact> def x(): Int = C.this.x;
        <artifact> private[this] var x: Int = _;
        @scala.runtime.TraitSetter <accessor> <artifact> def x_=(x$1: Int): Unit = C.this.x = x$1
      };
      abstract trait OneConcreteVal$class extends  {
        def /*OneConcreteVal$class*/$init$($this: OneConcreteVal): Unit = {
          $this.x_=(1);
          ()
        };
        def foo($this: OneConcreteVal): Int = $this.x()
      };
      abstract trait OneOtherConcreteVal$class extends  {
        def /*OneOtherConcreteVal$class*/$init$($this: OneOtherConcreteVal): Unit = {
          $this.y_=(scala.this.Predef.???());
          ()
        }
      }
    }
    ```

    emit trait setters, target interface for setter

    don't emit trait constructors yet, don't mess with mixin class ctors

    hack to explore where to keep annotations on trait fields

    we don't have a field -- only a getter -- so,
    where will we keep non-getter but-field annotations?

    restore mixins

    reduce OOification re: annotation derivation

      - replace virtual dispatch on sealed traits by matches
      - rename `keepClean` to `defaultRetention`
      - allow multiple categories in annotationFilter (for trait fields)

    mixin only deals with lazy accessors/vals

    do not used referenced to correlate getter/setter

    it messes with paramaccessor's usage, and we don't really need it

    annotations

    typo

    poking around overriding and unit-typed vars

    detect unit correctly

    setter should be considered deferred, just like getter and val

    fixup constructor triaging

    introduce constructor's very own flag

    stop using referenced entirely

    refactor

    add Fields phase

    meh

    mehmeh

    meeeeeh

    Fields phase is kind of working. Yay.

    emit synthetic setter for trait val

    make sure to clone info's, so we don't share symbols for method args
    this manifests itself as an exception in lambdalift, finding proxies

    ```
    trait OneAbstractVar[T] {
      val x: Int = 123
    }

    class ConcVar extends OneAbstractVar[Int]
    ```

    compiles to the following (as desired!):

    ```
    ➜  scala git:(traits-late-fields) ✗ cfr /tmp/ConcVar.class
    /*
     * Decompiled with CFR 0_102.
     *
     * Could not load the following classes:
     *  scala.reflect.ScalaSignature
     */
    import OneAbstractVar;
    import OneAbstractVar$class;
    import scala.reflect.ScalaSignature;

    @ScalaSignature(bytes="\u0006\u0001\u00112A!\u0001\u0002\u0001\u000b\t91i\u001c8d-\u0006\u0014(\"A\u0002\u0002\u000fq*W\u000e\u001d;z}\r\u00011c\u0001\u0001\u0007\u0019A\u0011qAC\u0007\u0002\u0011)\t\u0011\"A\u0003tG\u0006d\u0017-\u0003\u0002\f\u0011\t1\u0011I\\=SK\u001a\u00042!\u0004\b\u0011\u001b\u0005\u0011\u0011BA\b\u0003\u00059ye.Z!cgR\u0014\u0018m\u0019;WCJ\u0004\"aB\t\n\u0005IA!aA%oi\")A\u0003\u0001C\u0001+\u00051A(\u001b8jiz\"\u0012A\u0006\t\u0003\u001b\u0001A\u0011\u0002\u0007\u0001A\u0002\u000b\u0007I\u0011A\r\u0002\u0003a,\u0012\u0001\u0005\u0005\n7\u0001\u0001\r\u0011!Q\u0001\nA\t!\u0001\u001f\u0011\t\u0013u\u0001\u0001\u0019aa\u0001J\u0003q\u0012!H(oK\u0006\u00137\u000f\u001e:bGR4\u0016M\u001d\u0013`g\u0016$H/\u001a:`Ia|F%Z9\u0015\u0005}\u0011\u0003CA\u0004!\u0013\t\t\u0003B\u0001\u0003V]&$\bbB\u0012\u001d\u0003\u0003\u0005\r\u0001E\u0001\u0004q\u0012\n\u0004")
    public class ConcVar
    implements OneAbstractVar<Object> {
        private final int x;

        public ConcVar() {
            OneAbstractVar$class.$init$(this);
        }

        @OverRide
        public int x() {
            return this.x;
        }

        @OverRide
        public void OneAbstractVar$_setter_$x_$eq(int x$1) {
            this.x = x$1;
        }
    }
    ➜  scala git:(traits-late-fields) ✗ cfr /tmp/OneAbstractVar\$class.class
    /*
     * Decompiled with CFR 0_102.
     */
    import OneAbstractVar;

    public abstract class OneAbstractVar$class {
        public static void $init$(OneAbstractVar $this) {
            $this.OneAbstractVar$_setter_$x_$eq(123);
        }
    }
    ➜  scala git:(traits-late-fields) ✗ cfr /tmp/OneAbstractVar.class
    /*
     * Decompiled with CFR 0_102.
     *
     * Could not load the following classes:
     *  scala.reflect.ScalaSignature
     */
    import scala.reflect.ScalaSignature;

    @ScalaSignature(bytes="\u0006\u0001\u001d2q!\u0001\u0002\u0011\u0002\u0007\u0005QA\u0001\bP]\u0016\f%m\u001d;sC\u000e$h+\u0019:\u000b\u0003\r\tq\u0001P3naRLhh\u0001\u0001\u0016\u0005\u0019q2C\u0001\u0001\b!\tA1\"D\u0001\n\u0015\u0005Q\u0011!B:dC2\f\u0017B\u0001\u0007\n\u0005\u0019\te.\u001f*fM\")a\u0002\u0001C\u0001\u001f\u00051A%\u001b8ji\u0012\"\u0012\u0001\u0005\t\u0003\u0011EI!AE\u0005\u0003\tUs\u0017\u000e\u001e\u0005\b)\u0001\u0011\rQ\"\u0001\u0016\u0003\u0005AX#\u0001\f\u0011\u0005!9\u0012B\u0001\r\n\u0005\rIe\u000e\u001e\u0005\n5\u0001\u0001\r11A'\u0002m\tQd\u00148f\u0003\n\u001cHO]1diZ\u000b'\u000fJ0tKR$XM]0%q~#S-\u001d\u000b\u0003!qAq!H\r\u0002\u0002\u0003\u0007a#A\u0002yIE\"Qa\b\u0001C\u0002\u0001\u0012\u0011\u0001V\t\u0003C\u0011\u0002\"\u0001\u0003\u0012\n\u0005\rJ!a\u0002(pi\"Lgn\u001a\t\u0003\u0011\u0015J!AJ\u0005\u0003\u0007\u0005s\u0017\u0010")
    public interface OneAbstractVar<T> {
        public void OneAbstractVar$_setter_$x_$eq(int var1);

        public int x();
    }
    ```

    cleanup

    TODO: overriding accessors

    don't mix in accessors if conflicting member exists

    getting closer to bootstrap

    exclude lazy vals, don't makeNotPrivate

    lazy accessors and presupers require old treatment

    constructors should leave strict valdefs alone

    restore constructors to minimal diff compared to scala#4723

    revert more gratuitous stuff

    revert more in mixins

    trying to get to bootstrap.. currently failing in scala.util.Properties

    reduction of bootstrap failures

    on a bed of TODOs, with a hint of minimalism

    use primary constructor as owner for stats in template?

    fix pattern match in infotransform, remove mutation

    deferred setter does need impl in subclass

    remove SYNTHESIZE_IMPL_IN_SUBCLASS

    Use NEEDS_TREES for all comms between InfoTransform and tree transform

    We can now compile the library again, though the bytecode diff
    is not empty yet :-)

    TODO:
      - Weirdly, scala signatures are not emitted?
      - Fields are no longer emitted for constants
        (an improvement, but should not do this until next milestone)
      - the volatile annotation is not preserved
      - App, Enumeration compiled differently
      - Owner chain changes due to lifting of rhs affects:
        --> anonymous function in Iterator, PartialFunction, scala/collection/immutable/HashMap
      - traitsetter name mangling differences
      - abortflag accessors duplicated in scala/collection/generic/VolatileAbort.class
      - ...

    yep, need SYNTHESIZE_IMPL_IN_SUBCLASS

    distinguish accessors that should be mixed into subclass,
    and those that simply need to be implemented in tree transform,
    after info transform added the decl

    emit const vals for now to minimize bytecode diff

    TODO: still some bytecode diffs with constants remain (Enumeration)

    correct owner for stats in template

    closing in on boostrap

    strap.done:
        [mkdir] Created dir: /Users/adriaan/git/scala/build/strap/classes/library
    [strap.library] Compiling 584 files to /Users/adriaan/git/scala/build/strap/classes/library
    [strap.library] /Users/adriaan/git/scala/src/library/scala/collection/convert/WrapAsScala.scala:173: warning: abstract type A in type pattern scala.collection.convert.Wrappers.ConcurrentMapWrapper[A,B] is unchecked since it is eliminated by erasure
    [strap.library]     case cmw: ConcurrentMapWrapper[A, B]  => cmw.underlying
    [strap.library]               ^
    [strap.library] warning: there were 111 deprecation warnings; re-run with -deprecation for details
    [strap.library] two warnings found
        [javac] Compiling 165 source files to /Users/adriaan/git/scala/build/strap/classes/library
        [javac] Note: Some input files use unchecked or unsafe operations.
        [javac] Note: Recompile with -Xlint:unchecked for details.
    [propertyfile] Creating new property file: /Users/adriaan/git/scala/build/strap/classes/library/library.properties
         [copy] Copying 1 file to /Users/adriaan/git/scala/build/strap/classes/library
    [stopwatch] [strap.library.timer: 1:31.668 sec]
        [mkdir] Created dir: /Users/adriaan/git/scala/build/strap/classes/reflect
    [strap.reflect] Compiling 157 files to /Users/adriaan/git/scala/build/strap/classes/reflect
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/JavaUniverse.scala:16: error: overriding variable uniques in class SymbolTable of type scala.reflect.internal.util.WeakHashSet[JavaUniverse.this.Type];
    [strap.reflect]  value uniques needs `override' modifier
    [strap.reflect] class JavaUniverse extends InternalSymbolTable with JavaUniverseForce with ReflectSetup with RuntimeSymbolTable { self =>
    [strap.reflect]       ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedOps.scala:6: error: overriding variable uniques in trait SynchronizedTypes of type scala.collection.mutable.WeakHashMap[SynchronizedOps.this.Type,java.lang.ref.WeakReference[SynchronizedOps.this.Type]];
    [strap.reflect]  variable uniques in class SymbolTable of type scala.reflect.internal.util.WeakHashSet[SynchronizedOps.this.Type] needs to be a stable, immutable value
    [strap.reflect] private[reflect] trait SynchronizedOps extends internal.SymbolTable
    [strap.reflect]                        ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedSymbols.scala:16: error: overriding variable _recursionTable in trait Symbols of type scala.collection.immutable.Map[SynchronizedSymbols.this.Symbol,Int];
    [strap.reflect]  lazy value _recursionTable has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _recursionTable = mkThreadLocalStorage(immutable.Map.empty[Symbol, Int])
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:43: error: overriding variable _skolemizationLevel in trait Types of type Int;
    [strap.reflect]  lazy value _skolemizationLevel has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _skolemizationLevel = mkThreadLocalStorage(0)
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:50: error: overriding variable _intersectionWitness in trait Types of type scala.collection.mutable.WeakHashMap[List[SynchronizedTypes.this.Type],scala.ref.WeakReference[SynchronizedTypes.this.Type]];
    [strap.reflect]  lazy value _intersectionWitness has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _intersectionWitness = mkThreadLocalStorage(perRunCaches.newWeakMap[List[Type], sWeakRef[Type]]())
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:53: error: overriding variable _subsametypeRecursions in trait TypeComparers of type Int;
    [strap.reflect]  lazy value _subsametypeRecursions has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _subsametypeRecursions = mkThreadLocalStorage(0)
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:57: error: overriding variable _pendingSubTypes in trait TypeComparers of type scala.collection.mutable.HashSet[SynchronizedTypes.this.SubTypePair];
    [strap.reflect]  lazy value _pendingSubTypes has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _pendingSubTypes = mkThreadLocalStorage(new mutable.HashSet[SubTypePair])
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:60: error: overriding variable _basetypeRecursions in trait Types of type Int;
    [strap.reflect]  lazy value _basetypeRecursions has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _basetypeRecursions = mkThreadLocalStorage(0)
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:64: error: overriding variable _pendingBaseTypes in trait Types of type scala.collection.mutable.HashSet[SynchronizedTypes.this.Type];
    [strap.reflect]  lazy value _pendingBaseTypes has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _pendingBaseTypes = mkThreadLocalStorage(new mutable.HashSet[Type])
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:67: error: overriding variable _lubResults in trait GlbLubs of type scala.collection.mutable.HashMap[(scala.reflect.internal.Depth, List[SynchronizedTypes.this.Type]),SynchronizedTypes.this.Type];
    [strap.reflect]  lazy value _lubResults has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _lubResults = mkThreadLocalStorage(new mutable.HashMap[(Depth, List[Type]), Type])
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:70: error: overriding variable _glbResults in trait GlbLubs of type scala.collection.mutable.HashMap[(scala.reflect.internal.Depth, List[SynchronizedTypes.this.Type]),SynchronizedTypes.this.Type];
    [strap.reflect]  lazy value _glbResults has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _glbResults = mkThreadLocalStorage(new mutable.HashMap[(Depth, List[Type]), Type])
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:73: error: overriding variable _indent in trait Types of type String;
    [strap.reflect]  lazy value _indent has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _indent = mkThreadLocalStorage("")
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:77: error: overriding variable _toStringRecursions in trait TypeToStrings of type Int;
    [strap.reflect]  lazy value _toStringRecursions has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _toStringRecursions = mkThreadLocalStorage(0)
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:81: error: overriding variable _toStringSubjects in trait TypeToStrings of type scala.collection.mutable.HashSet[SynchronizedTypes.this.Type];
    [strap.reflect]  lazy value _toStringSubjects has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _toStringSubjects = mkThreadLocalStorage(new mutable.HashSet[Type])
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:21: error: overriding variable uniques in trait Types of type scala.reflect.internal.util.WeakHashSet[SynchronizedTypes.this.Type];
    [strap.reflect]  variable uniques has incompatible type
    [strap.reflect]   private val uniques = mutable.WeakHashMap[Type, jWeakRef[Type]]()
    [strap.reflect]               ^
    [strap.reflect] 15 errors found

    make private vals in traits not-private

    TODO: refine

    only look at strict accessors

    don't widen type for getter -- wtf

    current TODO: overriding vals

    mor compact accessor synth

    major cleanup

    compiles library & reflect, but not compiler:

    [strap.compiler] /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/CompileServer.scala:40: error: object creation impossible, since:
    [strap.compiler] it has 151 unimplemented members.

    last error flag pickling issue?

    info mangling, traitsetter

    remove hacks from other files

    trait fields stuff
adriaanm added a commit to adriaanm/scala that referenced this pull request Nov 12, 2015
and past commit messages:

commit abae762 (adriaanm/traits-late-fields)
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   2 hours ago

    bootstrapped compiler needs new partest

commit 81d7c25
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   5 hours ago

    update test to reflect useless constant fields are now dropped

commit 5f8fe87
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   16 hours ago

    Reduce flagbit usage, remove some stale comments

commit 9368256
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   16 hours ago

    annotations cleanup/fix for slitting between fields and getter annotation targets

commit 4336eb1
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 days ago

    fix printerstest

commit 4b4932e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 days ago

    do assignment to trait fields in AddInterfaces

    regular class vals get assignments during constructors, as before

commit 822913e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   9 days ago

    refactor accessor/field derivation

    in preparation of moving to compute-method style
    which in turn hopefully will be more manageable for specialization

commit cf845ab
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    don't suppress field for unit-typed vals

    it affects the memory model -- even a write of unit to a field is relevant...

commit 675f937
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    docs

commit baf568d
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    produce identical bytecode for constant trait val getters

    I couldn't bring myself to emit the unused fields that we
    used to emit for constant vals, even though the getters
    immediately return the constant, and thus the field goes unused.

    In the next version, there's no need to synthesize impls
    for these in subclasses -- the getter can be implemented
    in the interface.

commit 874f48b
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    one fewer warning: can't currently distinguish getter and setter in unused defs in traits

commit 7d21968
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    update skolems again...

commit 20165ea
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    test/files/neg/t5455.scala: trait lazy val needs field

commit b9052da
Author: Lukas Rytz <lukas.rytz@gmail.com>
Date:   3 weeks ago

    Fix enclosing method attribute for classes nested in trait fields

    Trait fields are now created as MethodSymbol (no longer TermSymbol).
    This symbol shows up in the `originalOwner` chain of a class declared
    within the field initializer. This promoted the field getter to
    being the enclosing method of the nested class, which it is not
    (the EnclosingMethod attribute is a source-level property).

commit 2b916f4
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    update skolems in check file for neg/t6829.scala

commit 3ac6aad
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    wip: neg/t6276.scala

    vals no longer have rhs after fields,
    so must check the assign node it was lifted out to

commit 892e13c
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    detect trait vals

    see neg/delayed-init-ref.scala and neg/t562.scala

commit 536b978
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    error on concrete val in universal trait

    see neg/anytrait.scala

commit d7c1de8
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    refactor field memoization logic -- wip

commit 337a9dd
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    unit-typed lazy vals should never receive a field

    this need was unmasked by test/files/run/t7843-jsr223-service.scala,
    which no longer printed the output expected from the `0 to 10 foreach`

commit 8405e72
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    benign checkfile updates

commit 3dbcd57
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    Revert "broken tests -- for check file diffing ease"

    This reverts commit 631b636,
    at least the part that masked actual breakage

    Currently failing tests:

     - test/files/pos/t6780.scala
     - test/files/neg/anytrait.scala
     - test/files/neg/delayed-init-ref.scala
     - test/files/neg/t562.scala
     - test/files/neg/t6276.scala
     - test/files/run/delambdafy_uncurry_byname_inline.scala
     - test/files/run/delambdafy_uncurry_byname_method.scala
     - test/files/run/delambdafy_uncurry_inline.scala
     - test/files/run/delambdafy_uncurry_method.scala
     - test/files/run/inner-obj-auto.scala
     - test/files/run/lazy-traits.scala
     - test/files/run/reify_lazyunit.scala
     - test/files/run/showraw_mods.scala
     - test/files/run/t3670.scala
     - test/files/run/t3980.scala
     - test/files/run/t4047.scala
     - test/files/run/t6622.scala
     - test/files/run/t7406.scala
     - test/files/run/t7843-jsr223-service.scala
     - test/files/jvm/innerClassAttribute
     - test/files/specialized/SI-7343.scala
     - test/files/specialized/constant_lambda.scala
     - test/files/specialized/spec-early.scala
     - test/files/specialized/spec-init.scala
     - test/files/specialized/spec-matrix-new.scala
     - test/files/specialized/spec-matrix-old.scala
     - test/files/presentation/scope-completion-3

commit 08cbc35
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    fix nondeterminism in printerstest???

commit b1b4e5c
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    wip: lambdalift fix

    test/files/trait-defaults/lambdalift.scala works,
    but still some related tests failing

    (note that we can't use a bootstrapped compiler yet
    due to binary incompatibility in partest)

    Selected 34 tests drawn from specified tests

    !! 1 - pos/t6780.scala                           [compilation failed]

    ok  1 - neg/anytrait.scala
    ok  2 - neg/t1960.scala
    ok  3 - neg/t562.scala
    ok  4 - neg/t2796.scala
    ok  5 - neg/t5455.scala
    ok  6 - neg/delayed-init-ref.scala
    ok  7 - neg/t6446-show-phases.scala
    ok  8 - neg/t6446-missing
    ok  9 - neg/t6276.scala
    ok 10 - neg/t6829.scala
    ok 11 - neg/t6446-additional
    ok 12 - neg/t7494-no-options

    !!  1 - run/bugs.scala                            [output differs]
    !!  2 - run/inner-obj-auto.scala                  [non-zero exit code]
    ok  3 - run/delambdafy_t6555.scala
    ok  4 - run/delambdafy_t6028.scala
    ok  5 - run/preinits.scala
    ok  6 - run/lazy-locals.scala
    ok  7 - run/analyzerPlugins.scala
    ok  8 - run/t0936.scala
    ok  9 - run/programmatic-main.scala
    !! 10 - run/showraw_mods.scala                    [output differs]
    ok 11 - run/t4426.scala
    ok 12 - run/t5938.scala
    ok 13 - run/t6733.scala
    !! 14 - run/t7406.scala                           [non-zero exit code]
    ok 15 - run/t6555.scala
    ok 16 - run/t6028.scala
    ok 17 - run/t8002.scala
    ok 18 - run/t7533.scala
    ok 19 - run/t7569.scala

    ok 1 - jvm/t7006
    !! 2 - jvm/innerClassAttribute                   [non-zero exit code]

    test/partest --update-check \
      /Users/adriaan/git/scala/test/files/pos/t6780.scala \
      /Users/adriaan/git/scala/test/files/run/bugs.scala \
      /Users/adriaan/git/scala/test/files/run/inner-obj-auto.scala \
      /Users/adriaan/git/scala/test/files/run/showraw_mods.scala \
      /Users/adriaan/git/scala/test/files/run/t7406.scala \
      /Users/adriaan/git/scala/test/files/jvm/innerClassAttribute

commit c4694d9
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    refactor

commit e676a2a
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    cleanups

commit a3bc708
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    centralize fields flag juggling

commit eae7dac
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update check now that trait vals can be concrete, use names not letters

    note the progression in a concrete trait val now being recognized as such
    ```
    -trait T => true
    -method $init$ => false
    -value z1 => true
    -value z2 => true // z2 is actually concrete!
    ```

commit 255cc06
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update check files sensitive to <subsynth> modifier being printed

commit 6555c74
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    bootstraps again by running info transform once per class...

    not sure how this ever worked, as separate compilation would transform a trait's info
    multiple times, resulting in double defs...

commit 33ac5e0
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    flag simplification, but double def errors in in strap.comp

    Compiling 327 files to /Users/adriaan/git/scala/build/strap/classes/compiler
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/transform/Constructors.scala:170: warning: postfix operator toMap should be enabled
    by making the implicit value scala.language.postfixOps visible.
    This can be achieved by adding the import clause 'import scala.language.postfixOps'
    or by setting the compiler option -language:postfixOps.
    See the Scala docs for value scala.language.postfixOps for a discussion
    why the feature should be explicitly enabled.
            lazy val bodyOfOuterAccessor = defs collect { case dd: DefDef if omittableOuterAcc(dd.symbol) => dd.symbol -> dd.rhs } toMap
                                                                                                                                   ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/transform/Fields.scala:193: warning: postfix operator nonEmpty should be enabled
    by making the implicit value scala.language.postfixOps visible.
            if (newSetters nonEmpty) {
                           ^
    /Users/adriaan/git/scala/src/compiler/scala/reflect/macros/contexts/Context.scala:6: error: double definition:
    def scala$reflect$macros$Aliases$_setter_$TypeTag_=(x$1: Context.this.universe.TypeTag.type): Unit at line 6 and
    def scala$reflect$macros$Aliases$_setter_$TypeTag_=(x$1: Context.this.universe.TypeTag.type): Unit at line 6
    have same type
    abstract class Context extends scala.reflect.macros.blackbox.Context
                   ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/Global.scala:1155: error: double definition:
    def scala$reflect$internal$Reporting$RunReporting$_setter_$reporting_=(x$1: Global.this.PerRunReporting): Unit at line 1155 and
    def scala$reflect$internal$Reporting$RunReporting$_setter_$reporting_=(x$1: Global.this.PerRunReporting): Unit at line 1155
    have same type
      class Run extends RunContextApi with RunReporting with RunParsing {
            ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/Properties.scala:10: error: double definition:
    def scala$util$PropertiesTrait$_setter_$copyrightString_=(x$1: String): Unit at line 10 and
    def scala$util$PropertiesTrait$_setter_$copyrightString_=(x$1: String): Unit at line 10
    have same type
    object Properties extends scala.util.PropertiesTrait {
           ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala:224: error: double definition:
    def selfOrSuperCalls_=(x$1: scala.collection.mutable.Stack[ExplicitOuter.this.global.Symbol]): Unit at line 224 and
    def selfOrSuperCalls_=(x$1: scala.collection.mutable.Stack[ExplicitOuter.this.global.Symbol]): Unit at line 224
    have same type
      abstract class OuterPathTransformer(unit: CompilationUnit) extends TypingTransformer(unit) with UnderConstructionTransformer {
                     ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/transform/UnCurry.scala:48: error: double definition:
    def uncurryType_=(x$1: UnCurry.this.global.TypeMap): Unit at line 48 and
    def uncurryType_=(x$1: UnCurry.this.global.TypeMap): Unit at line 48
    have same type
    abstract class UnCurry extends InfoTransform
                   ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/typechecker/TreeCheckers.scala:279: error: double definition:
    def scala$reflect$internal$Trees$TreeStackTraverser$_setter_$path_=(x$1: scala.collection.mutable.Stack[TreeCheckers.this.global.Tree]): Unit at line 279 and
    def scala$reflect$internal$Trees$TreeStackTraverser$_setter_$path_=(x$1: scala.collection.mutable.Stack[TreeCheckers.this.global.Tree]): Unit at line 279
    have same type
        object precheck extends TreeStackTraverser {
               ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/util/ShowPickled.scala:18: error: double definition:
    def scala$reflect$internal$Names$_setter_$TypeNameTag_=(x$1: scala.reflect.ClassTag[scala.tools.nsc.util.ShowPickled.TypeName]): Unit at line 18 and
    def scala$reflect$internal$Names$_setter_$TypeNameTag_=(x$1: scala.reflect.ClassTag[scala.tools.nsc.util.ShowPickled.TypeName]): Unit at line 18
    have same type
    object ShowPickled extends Names {
           ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/reflect/ReflectGlobal.scala:13: error: double definition:
    def scala$reflect$api$JavaUniverse$_setter_$RuntimeClassTag_=(x$1: scala.reflect.ClassTag[ReflectGlobal.this.RuntimeClass]): Unit at line 13 and
    def scala$reflect$api$JavaUniverse$_setter_$RuntimeClassTag_=(x$1: scala.reflect.ClassTag[ReflectGlobal.this.RuntimeClass]): Unit at line 13
    have same type
    class ReflectGlobal(currentSettings: Settings, reporter: Reporter, override val rootClassLoader: ClassLoader)
          ^
    /Users/adriaan/git/scala/src/compiler/scala/tools/reflect/WrappedProperties.scala:42: error: double definition:
    def scala$util$PropertiesTrait$_setter_$copyrightString_=(x$1: String): Unit at line 42 and
    def scala$util$PropertiesTrait$_setter_$copyrightString_=(x$1: String): Unit at line 42
    have same type
      object AccessControl extends WrappedProperties {
             ^
    two warnings found
    9 errors found

commit ae34ac7
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update skolem ids in check file

commit 8672bb1
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    cleanup, no intended functional change

commit 319d3d2
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    clarify: all trait vals receive accessors

    those that wouldn't are synthesized later anyway -- right?

commit ab16f32
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    backwards compat: leave final?

    maybe we can save a few flag bits by using DEFERRED | FINAL
    instead of SYNTHESIZE_IMPL_IN_SUBCLASS, as a deferred final
    member must necessarily receive an implementation automatically
    to meet the constraints implied by this keyword combo

commit ccb8363
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    non-unit-typed lazy vals in traits still get field -- see neg/t5455.scala

commit 273cb20
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    skip presuper vals in new encoding

commit 631b636
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    broken tests -- for check file diffing ease

commit 9ff7869
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    benign, though rough check file updates

commit 90af847
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    unexplained updates to check files in printers test

commit 728e71e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    incoherent cyclic references between synthesized members

    must replace old trait accessor symbols by mixed in symbols
    in the infos of the mixed in symbols

    ```
    trait T { val a: String ; val b: a.type }
    class C extends T {
      // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
    }
    ```

    symbols occurring in types of synthesized members
    do not get rebound to other synthesized symbols

    package <empty>#4 {
      abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
        <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
        N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
        <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
        N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
      };
      abstract class M#7353 extends scala#22.AnyRef#2378 {
        <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
          M#7353.super.<init>scala#2719();
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
        <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
      };
      class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
        <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
        <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
        <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
        <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
        <method> def <init>#14997(): <empty>#3.this.C#7354 = {
          C#7354.super.<init>#13465();
          ()
        }
      }
    }

    [running phase pickler on dependent_rebind.scala]
    [running phase refchecks on dependent_rebind.scala]
    test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
     value n #15017 has incompatible type;
     found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
     required: => N#7352.this.self#7442.type
    class C extends M with N
          ^

commit ec2283e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    pos/t9111-inliner-workaround

commit 115e880
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    mark synthesized protected member as notPROTECTED,

    TODO: this doesn't work because protected[this] is supposed to be a
    variance checking escape hatch, and making these notPROTECTED here will trigger errors in refchecks

    so that it stays in overriding relation with the trait member in later phases

    make notPROTECTED a bit later?

    protected local variance bla

commit b56ca2f
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    static forwarders & private[this] val in trait

    object Properties extends PropertiesTrait

    trait PropertiesTrait {
      // the protected member is not emitted as a static member of  -- it works when dropping the access modifier
      // somehow, the module class member is considered deferred in BForwardersGen
      protected val propFilename: String = /
    }

    // [log jvm] No forwarder for 'getter propFilename' from Properties to 'module class Properties': false || m.isDeferred == true || false || false

    // the following method is missing compared to scalac
    // public final class Properties {
    //     public static String propFilename() {
    //         return Properties$.MODULE$.propFilename();
    //     }

    trait Chars {
      private[this] val char2uescapeArray = Array[Char]('\', 'u', 0, 0, 0, 0)
    }

    object Chars extends Chars

    // +++ w/reflect/scala/reflect/internal/Chars$.class
    // -  private final [C scala83014char2uescapeArray

commit ed7625f
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    finality for trait setters, annotations

    traitsetter annot for all concrete trait-owned setters

    stumble towards juggling annotations correctly

commit 492aa60
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    constant fold in forwarder for backwards compat

commit b8a7aa0
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    constant-typed final val in trait should yield impl method

commit 1655d1b
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    bean{setter,getter} delegates to setter/getter

commit 968fc30
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   2 months ago

    Fields phase

    Constructors: simplify transform loop

    Also encapsulate mixin ctor creation in `newMixinConstructor`

    Constructors: emit mixin-super constructor calls

    This was previously done by AddInterfaces, whose days are numbered.

    wip: trait fields 1

    wip: drop stuff from constructors

    lazyGetterBody

    wippythewipwip

    constructors transforminfo

    wip for unit-typed getters, delay trait setters until constructors, mix in accessors and fields there as well

    bare bones info transform is "working"

    ```
    trait OneConcreteVal[T] {
      val x = 1 // : T = ???
    }

    trait OneOtherConcreteVal[T] {
      var y: T = ???
    }

    class C extends OneConcreteVal[Int] with OneOtherConcreteVal[String]
    ```

    /*
    old decls for trait trait OneOtherConcreteVal: Scope{
      def y(): Object;
      def y_=(x$1: Object): Unit
    }
    new decls for trait trait OneOtherConcreteVal: Scope{
      def y(): Object;
      def y_=(x$1: Object): Unit;
      def $init$(): Unit
    }
    old decls for trait trait OneConcreteVal: Scope{
      val x(): Int
    }
    new decls for trait trait OneConcreteVal: Scope{
      val x(): Int;
      def $init$(): Unit;
      private[this] def x_=(x$1: Int): Unit
    }
    old decls for class C: Scope{
      def <init>(): C
    }
    mixing in List(method y, method y_=, value x, method x_=) from List(trait OneOtherConcreteVal, trait OneConcreteVal)
    new decls for class C: Scope{
      def <init>(): C;
      def y(): Object;
      private[this] var y: Object;
      def y_=(x$1: Object): Unit;
      val x(): Int;
      private[this] val x: Int;
      private[this] def x_=(x$1: Int): Unit
    }
    */

    getting there: need to avoid MIXEDIN/lateDEFERRED so as not to confuse mixins?

    temporarily using ARTIFACT instead of MIXEDIN to not confuse mixin

    kinda working...

    impl classes get accessors until mixin,
    so that constructors acts on them there,
    and produced the init method in the required spot (the impl class)

    the info-transformed of constructors:
      - traits receive trait-setters for vals
      - classes receive fields & accessors for mixed in traits

    Constructors tree transformer
      - makes trees for decls added during above info transform
        (TODO: decide on the right flag to communicate this)
      - adds mixin super calls to the primary constructor

    Later, mixins will drop all accessors in the impl class,
    retaining only the init method.
    Selects of setters/getters (in that init method)
    are rewritten to refer to the getters/setters in the interface (TODO)

    TODO (among many other things)
      - no constructor in trait
      - trait setter for val isn't found when rewriting accessors in impl classes
      - annotations
      - privacy

    ```
    trait OneConcreteVal[T] {
      var x = 1 // : T = ???
      def foo = x
    }

    trait OneOtherConcreteVal[T] {
      var y: T = ???
    }

    class C extends OneConcreteVal[Int] with OneOtherConcreteVal[String]
    ```

    ```
    [[syntax trees at end of              constructors]] // fields.scala
    package <empty> {
      abstract trait OneConcreteVal extends Object {
        <empty>; // <-- TODO
        <accessor> def x(): Int;
        @scala.runtime.TraitSetter <accessor> def x_=(x$1: Int): Unit;
        def foo(): Int
      };
      abstract trait OneOtherConcreteVal extends Object {
        <empty>; // <-- TODO
        <accessor> def y(): Object;
        @scala.runtime.TraitSetter <accessor> def y_=(x$1: Object): Unit
      };
      class C extends Object with OneConcreteVal with OneOtherConcreteVal {
        def <init>(): C = {
          C.super.<init>();
          C.this./*OneConcreteVal$class*/$init$();
          C.this./*OneOtherConcreteVal$class*/$init$();
          ()
        };
        <accessor> <artifact> def y(): Object = C.this.y;
        <artifact> private[this] var y: Object = _;
        @scala.runtime.TraitSetter <accessor> <artifact> def y_=(x$1: Object): Unit = C.this.y = x$1;
        <accessor> <artifact> def x(): Int = C.this.x;
        <artifact> private[this] var x: Int = _;
        @scala.runtime.TraitSetter <accessor> <artifact> def x_=(x$1: Int): Unit = C.this.x = x$1
      };
      abstract trait OneConcreteVal$class extends Object with OneConcreteVal {
        def /*OneConcreteVal$class*/$init$(): Unit = {
          OneConcreteVal$class.this.x_=(1);
          ()
        };
        <accessor> def x(): Int;
        @scala.runtime.TraitSetter <accessor> def x_=(x$1: Int): Unit;
        def foo(): Int = OneConcreteVal$class.this.x()
      };
      abstract trait OneOtherConcreteVal$class extends Object with OneOtherConcreteVal {
        def /*OneOtherConcreteVal$class*/$init$(): Unit = {
          OneOtherConcreteVal$class.this.y_=(scala.this.Predef.???());
          ()
        };
        <accessor> def y(): Object;
        @scala.runtime.TraitSetter <accessor> def y_=(x$1: Object): Unit
      }
    }
    ```

    ```
    [[syntax trees at end of                     mixin]] // fields.scala
    package <empty> {
      abstract trait OneConcreteVal extends Object {
        <accessor> def x(): Int;
        @scala.runtime.TraitSetter <accessor> def x_=(x$1: Int): Unit;
        def foo(): Int
      };
      abstract trait OneOtherConcreteVal extends Object {
        <accessor> def y(): Object;
        @scala.runtime.TraitSetter <accessor> def y_=(x$1: Object): Unit
      };
      class C extends Object with OneConcreteVal with OneOtherConcreteVal {
        def foo(): Int = OneConcreteVal$class.foo(C.this);
        def <init>(): C = {
          C.super.<init>();
          OneConcreteVal$class./*OneConcreteVal$class*/$init$(C.this);
          OneOtherConcreteVal$class./*OneOtherConcreteVal$class*/$init$(C.this);
          ()
        };
        <accessor> <artifact> def y(): Object = C.this.y;
        <artifact> private[this] var y: Object = _;
        @scala.runtime.TraitSetter <accessor> <artifact> def y_=(x$1: Object): Unit = C.this.y = x$1;
        <accessor> <artifact> def x(): Int = C.this.x;
        <artifact> private[this] var x: Int = _;
        @scala.runtime.TraitSetter <accessor> <artifact> def x_=(x$1: Int): Unit = C.this.x = x$1
      };
      abstract trait OneConcreteVal$class extends  {
        def /*OneConcreteVal$class*/$init$($this: OneConcreteVal): Unit = {
          $this.x_=(1);
          ()
        };
        def foo($this: OneConcreteVal): Int = $this.x()
      };
      abstract trait OneOtherConcreteVal$class extends  {
        def /*OneOtherConcreteVal$class*/$init$($this: OneOtherConcreteVal): Unit = {
          $this.y_=(scala.this.Predef.???());
          ()
        }
      }
    }
    ```

    emit trait setters, target interface for setter

    don't emit trait constructors yet, don't mess with mixin class ctors

    hack to explore where to keep annotations on trait fields

    we don't have a field -- only a getter -- so,
    where will we keep non-getter but-field annotations?

    restore mixins

    reduce OOification re: annotation derivation

      - replace virtual dispatch on sealed traits by matches
      - rename `keepClean` to `defaultRetention`
      - allow multiple categories in annotationFilter (for trait fields)

    mixin only deals with lazy accessors/vals

    do not used referenced to correlate getter/setter

    it messes with paramaccessor's usage, and we don't really need it

    annotations

    typo

    poking around overriding and unit-typed vars

    detect unit correctly

    setter should be considered deferred, just like getter and val

    fixup constructor triaging

    introduce constructor's very own flag

    stop using referenced entirely

    refactor

    add Fields phase

    meh

    mehmeh

    meeeeeh

    Fields phase is kind of working. Yay.

    emit synthetic setter for trait val

    make sure to clone info's, so we don't share symbols for method args
    this manifests itself as an exception in lambdalift, finding proxies

    ```
    trait OneAbstractVar[T] {
      val x: Int = 123
    }

    class ConcVar extends OneAbstractVar[Int]
    ```

    compiles to the following (as desired!):

    ```
    ➜  scala git:(traits-late-fields) ✗ cfr /tmp/ConcVar.class
    /*
     * Decompiled with CFR 0_102.
     *
     * Could not load the following classes:
     *  scala.reflect.ScalaSignature
     */
    import OneAbstractVar;
    import OneAbstractVar$class;
    import scala.reflect.ScalaSignature;

    @ScalaSignature(bytes="\u0006\u0001\u00112A!\u0001\u0002\u0001\u000b\t91i\u001c8d-\u0006\u0014(\"A\u0002\u0002\u000fq*W\u000e\u001d;z}\r\u00011c\u0001\u0001\u0007\u0019A\u0011qAC\u0007\u0002\u0011)\t\u0011\"A\u0003tG\u0006d\u0017-\u0003\u0002\f\u0011\t1\u0011I\\=SK\u001a\u00042!\u0004\b\u0011\u001b\u0005\u0011\u0011BA\b\u0003\u00059ye.Z!cgR\u0014\u0018m\u0019;WCJ\u0004\"aB\t\n\u0005IA!aA%oi\")A\u0003\u0001C\u0001+\u00051A(\u001b8jiz\"\u0012A\u0006\t\u0003\u001b\u0001A\u0011\u0002\u0007\u0001A\u0002\u000b\u0007I\u0011A\r\u0002\u0003a,\u0012\u0001\u0005\u0005\n7\u0001\u0001\r\u0011!Q\u0001\nA\t!\u0001\u001f\u0011\t\u0013u\u0001\u0001\u0019aa\u0001J\u0003q\u0012!H(oK\u0006\u00137\u000f\u001e:bGR4\u0016M\u001d\u0013`g\u0016$H/\u001a:`Ia|F%Z9\u0015\u0005}\u0011\u0003CA\u0004!\u0013\t\t\u0003B\u0001\u0003V]&$\bbB\u0012\u001d\u0003\u0003\u0005\r\u0001E\u0001\u0004q\u0012\n\u0004")
    public class ConcVar
    implements OneAbstractVar<Object> {
        private final int x;

        public ConcVar() {
            OneAbstractVar$class.$init$(this);
        }

        @OverRide
        public int x() {
            return this.x;
        }

        @OverRide
        public void OneAbstractVar$_setter_$x_$eq(int x$1) {
            this.x = x$1;
        }
    }
    ➜  scala git:(traits-late-fields) ✗ cfr /tmp/OneAbstractVar\$class.class
    /*
     * Decompiled with CFR 0_102.
     */
    import OneAbstractVar;

    public abstract class OneAbstractVar$class {
        public static void $init$(OneAbstractVar $this) {
            $this.OneAbstractVar$_setter_$x_$eq(123);
        }
    }
    ➜  scala git:(traits-late-fields) ✗ cfr /tmp/OneAbstractVar.class
    /*
     * Decompiled with CFR 0_102.
     *
     * Could not load the following classes:
     *  scala.reflect.ScalaSignature
     */
    import scala.reflect.ScalaSignature;

    @ScalaSignature(bytes="\u0006\u0001\u001d2q!\u0001\u0002\u0011\u0002\u0007\u0005QA\u0001\bP]\u0016\f%m\u001d;sC\u000e$h+\u0019:\u000b\u0003\r\tq\u0001P3naRLhh\u0001\u0001\u0016\u0005\u0019q2C\u0001\u0001\b!\tA1\"D\u0001\n\u0015\u0005Q\u0011!B:dC2\f\u0017B\u0001\u0007\n\u0005\u0019\te.\u001f*fM\")a\u0002\u0001C\u0001\u001f\u00051A%\u001b8ji\u0012\"\u0012\u0001\u0005\t\u0003\u0011EI!AE\u0005\u0003\tUs\u0017\u000e\u001e\u0005\b)\u0001\u0011\rQ\"\u0001\u0016\u0003\u0005AX#\u0001\f\u0011\u0005!9\u0012B\u0001\r\n\u0005\rIe\u000e\u001e\u0005\n5\u0001\u0001\r11A'\u0002m\tQd\u00148f\u0003\n\u001cHO]1diZ\u000b'\u000fJ0tKR$XM]0%q~#S-\u001d\u000b\u0003!qAq!H\r\u0002\u0002\u0003\u0007a#A\u0002yIE\"Qa\b\u0001C\u0002\u0001\u0012\u0011\u0001V\t\u0003C\u0011\u0002\"\u0001\u0003\u0012\n\u0005\rJ!a\u0002(pi\"Lgn\u001a\t\u0003\u0011\u0015J!AJ\u0005\u0003\u0007\u0005s\u0017\u0010")
    public interface OneAbstractVar<T> {
        public void OneAbstractVar$_setter_$x_$eq(int var1);

        public int x();
    }
    ```

    cleanup

    TODO: overriding accessors

    don't mix in accessors if conflicting member exists

    getting closer to bootstrap

    exclude lazy vals, don't makeNotPrivate

    lazy accessors and presupers require old treatment

    constructors should leave strict valdefs alone

    restore constructors to minimal diff compared to scala#4723

    revert more gratuitous stuff

    revert more in mixins

    trying to get to bootstrap.. currently failing in scala.util.Properties

    reduction of bootstrap failures

    on a bed of TODOs, with a hint of minimalism

    use primary constructor as owner for stats in template?

    fix pattern match in infotransform, remove mutation

    deferred setter does need impl in subclass

    remove SYNTHESIZE_IMPL_IN_SUBCLASS

    Use NEEDS_TREES for all comms between InfoTransform and tree transform

    We can now compile the library again, though the bytecode diff
    is not empty yet :-)

    TODO:
      - Weirdly, scala signatures are not emitted?
      - Fields are no longer emitted for constants
        (an improvement, but should not do this until next milestone)
      - the volatile annotation is not preserved
      - App, Enumeration compiled differently
      - Owner chain changes due to lifting of rhs affects:
        --> anonymous function in Iterator, PartialFunction, scala/collection/immutable/HashMap
      - traitsetter name mangling differences
      - abortflag accessors duplicated in scala/collection/generic/VolatileAbort.class
      - ...

    yep, need SYNTHESIZE_IMPL_IN_SUBCLASS

    distinguish accessors that should be mixed into subclass,
    and those that simply need to be implemented in tree transform,
    after info transform added the decl

    emit const vals for now to minimize bytecode diff

    TODO: still some bytecode diffs with constants remain (Enumeration)

    correct owner for stats in template

    closing in on boostrap

    strap.done:
        [mkdir] Created dir: /Users/adriaan/git/scala/build/strap/classes/library
    [strap.library] Compiling 584 files to /Users/adriaan/git/scala/build/strap/classes/library
    [strap.library] /Users/adriaan/git/scala/src/library/scala/collection/convert/WrapAsScala.scala:173: warning: abstract type A in type pattern scala.collection.convert.Wrappers.ConcurrentMapWrapper[A,B] is unchecked since it is eliminated by erasure
    [strap.library]     case cmw: ConcurrentMapWrapper[A, B]  => cmw.underlying
    [strap.library]               ^
    [strap.library] warning: there were 111 deprecation warnings; re-run with -deprecation for details
    [strap.library] two warnings found
        [javac] Compiling 165 source files to /Users/adriaan/git/scala/build/strap/classes/library
        [javac] Note: Some input files use unchecked or unsafe operations.
        [javac] Note: Recompile with -Xlint:unchecked for details.
    [propertyfile] Creating new property file: /Users/adriaan/git/scala/build/strap/classes/library/library.properties
         [copy] Copying 1 file to /Users/adriaan/git/scala/build/strap/classes/library
    [stopwatch] [strap.library.timer: 1:31.668 sec]
        [mkdir] Created dir: /Users/adriaan/git/scala/build/strap/classes/reflect
    [strap.reflect] Compiling 157 files to /Users/adriaan/git/scala/build/strap/classes/reflect
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/JavaUniverse.scala:16: error: overriding variable uniques in class SymbolTable of type scala.reflect.internal.util.WeakHashSet[JavaUniverse.this.Type];
    [strap.reflect]  value uniques needs `override' modifier
    [strap.reflect] class JavaUniverse extends InternalSymbolTable with JavaUniverseForce with ReflectSetup with RuntimeSymbolTable { self =>
    [strap.reflect]       ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedOps.scala:6: error: overriding variable uniques in trait SynchronizedTypes of type scala.collection.mutable.WeakHashMap[SynchronizedOps.this.Type,java.lang.ref.WeakReference[SynchronizedOps.this.Type]];
    [strap.reflect]  variable uniques in class SymbolTable of type scala.reflect.internal.util.WeakHashSet[SynchronizedOps.this.Type] needs to be a stable, immutable value
    [strap.reflect] private[reflect] trait SynchronizedOps extends internal.SymbolTable
    [strap.reflect]                        ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedSymbols.scala:16: error: overriding variable _recursionTable in trait Symbols of type scala.collection.immutable.Map[SynchronizedSymbols.this.Symbol,Int];
    [strap.reflect]  lazy value _recursionTable has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _recursionTable = mkThreadLocalStorage(immutable.Map.empty[Symbol, Int])
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:43: error: overriding variable _skolemizationLevel in trait Types of type Int;
    [strap.reflect]  lazy value _skolemizationLevel has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _skolemizationLevel = mkThreadLocalStorage(0)
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:50: error: overriding variable _intersectionWitness in trait Types of type scala.collection.mutable.WeakHashMap[List[SynchronizedTypes.this.Type],scala.ref.WeakReference[SynchronizedTypes.this.Type]];
    [strap.reflect]  lazy value _intersectionWitness has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _intersectionWitness = mkThreadLocalStorage(perRunCaches.newWeakMap[List[Type], sWeakRef[Type]]())
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:53: error: overriding variable _subsametypeRecursions in trait TypeComparers of type Int;
    [strap.reflect]  lazy value _subsametypeRecursions has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _subsametypeRecursions = mkThreadLocalStorage(0)
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:57: error: overriding variable _pendingSubTypes in trait TypeComparers of type scala.collection.mutable.HashSet[SynchronizedTypes.this.SubTypePair];
    [strap.reflect]  lazy value _pendingSubTypes has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _pendingSubTypes = mkThreadLocalStorage(new mutable.HashSet[SubTypePair])
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:60: error: overriding variable _basetypeRecursions in trait Types of type Int;
    [strap.reflect]  lazy value _basetypeRecursions has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _basetypeRecursions = mkThreadLocalStorage(0)
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:64: error: overriding variable _pendingBaseTypes in trait Types of type scala.collection.mutable.HashSet[SynchronizedTypes.this.Type];
    [strap.reflect]  lazy value _pendingBaseTypes has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _pendingBaseTypes = mkThreadLocalStorage(new mutable.HashSet[Type])
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:67: error: overriding variable _lubResults in trait GlbLubs of type scala.collection.mutable.HashMap[(scala.reflect.internal.Depth, List[SynchronizedTypes.this.Type]),SynchronizedTypes.this.Type];
    [strap.reflect]  lazy value _lubResults has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _lubResults = mkThreadLocalStorage(new mutable.HashMap[(Depth, List[Type]), Type])
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:70: error: overriding variable _glbResults in trait GlbLubs of type scala.collection.mutable.HashMap[(scala.reflect.internal.Depth, List[SynchronizedTypes.this.Type]),SynchronizedTypes.this.Type];
    [strap.reflect]  lazy value _glbResults has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _glbResults = mkThreadLocalStorage(new mutable.HashMap[(Depth, List[Type]), Type])
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:73: error: overriding variable _indent in trait Types of type String;
    [strap.reflect]  lazy value _indent has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _indent = mkThreadLocalStorage("")
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:77: error: overriding variable _toStringRecursions in trait TypeToStrings of type Int;
    [strap.reflect]  lazy value _toStringRecursions has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _toStringRecursions = mkThreadLocalStorage(0)
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:81: error: overriding variable _toStringSubjects in trait TypeToStrings of type scala.collection.mutable.HashSet[SynchronizedTypes.this.Type];
    [strap.reflect]  lazy value _toStringSubjects has weaker access privileges; it should not be private
    [strap.reflect]   private lazy val _toStringSubjects = mkThreadLocalStorage(new mutable.HashSet[Type])
    [strap.reflect]                    ^
    [strap.reflect] /Users/adriaan/git/scala/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala:21: error: overriding variable uniques in trait Types of type scala.reflect.internal.util.WeakHashSet[SynchronizedTypes.this.Type];
    [strap.reflect]  variable uniques has incompatible type
    [strap.reflect]   private val uniques = mutable.WeakHashMap[Type, jWeakRef[Type]]()
    [strap.reflect]               ^
    [strap.reflect] 15 errors found

    make private vals in traits not-private

    TODO: refine

    only look at strict accessors

    don't widen type for getter -- wtf

    current TODO: overriding vals

    mor compact accessor synth

    major cleanup

    compiles library & reflect, but not compiler:

    [strap.compiler] /Users/adriaan/git/scala/src/compiler/scala/tools/nsc/CompileServer.scala:40: error: object creation impossible, since:
    [strap.compiler] it has 151 unimplemented members.

    last error flag pickling issue?

    info mangling, traitsetter

    remove hacks from other files

    trait fields stuff
adriaanm added a commit to adriaanm/scala that referenced this pull request Nov 12, 2015
the info-transformed of constructors:
  - traits receive trait-setters for vals
  - classes receive fields & accessors for mixed in traits

Constructors tree transformer
  - makes trees for decls added during above info transform
  - adds mixin super calls to the primary constructor

```
trait OneConcreteVal[T] {
var x = 1 // : T = ???
def foo = x
}

trait OneOtherConcreteVal[T] {
var y: T = ???
}

class C extends OneConcreteVal[Int] with OneOtherConcreteVal[String]
```

we don't have a field -- only a getter -- so,
where will we keep non-getter but-field annotations?

mixin only deals with lazy accessors/vals

do not used referenced to correlate getter/setter
it messes with paramaccessor's usage, and we don't really need it

make sure to clone info's, so we don't share symbols for method args
this manifests itself as an exception in lambdalift, finding proxies

Use NEEDS_TREES for all comms between InfoTransform and tree transform

yep, need SYNTHESIZE_IMPL_IN_SUBCLASS

distinguish accessors that should be mixed into subclass,
and those that simply need to be implemented in tree transform,
after info transform added the decl

commit 4b4932e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 days ago

    do assignment to trait fields in AddInterfaces

    regular class vals get assignments during constructors, as before

impl classes get accessors + assignments through trait setters in addinterfaces
so that constructors acts on them there,
and produced the init method in the required spot (the impl class)

bootstrapped compiler needs new partest

commit baf568d
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    produce identical bytecode for constant trait val getters

    I couldn't bring myself to emit the unused fields that we
    used to emit for constant vals, even though the getters
    immediately return the constant, and thus the field goes unused.

    In the next version, there's no need to synthesize impls
    for these in subclasses -- the getter can be implemented
    in the interface.

commit b9052da
Author: Lukas Rytz <lukas.rytz@gmail.com>
Date:   3 weeks ago

    Fix enclosing method attribute for classes nested in trait fields

    Trait fields are now created as MethodSymbol (no longer TermSymbol).
    This symbol shows up in the `originalOwner` chain of a class declared
    within the field initializer. This promoted the field getter to
    being the enclosing method of the nested class, which it is not
    (the EnclosingMethod attribute is a source-level property).

commit cf845ab
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    don't suppress field for unit-typed vals

    it affects the memory model -- even a write of unit to a field is relevant...

commit 337a9dd
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    unit-typed lazy vals should never receive a field

    this need was unmasked by test/files/run/t7843-jsr223-service.scala,
    which no longer printed the output expected from the `0 to 10 foreach`

    Currently failing tests:

     - test/files/pos/t6780.scala
     - test/files/neg/anytrait.scala
     - test/files/neg/delayed-init-ref.scala
     - test/files/neg/t562.scala
     - test/files/neg/t6276.scala
     - test/files/run/delambdafy_uncurry_byname_inline.scala
     - test/files/run/delambdafy_uncurry_byname_method.scala
     - test/files/run/delambdafy_uncurry_inline.scala
     - test/files/run/delambdafy_uncurry_method.scala
     - test/files/run/inner-obj-auto.scala
     - test/files/run/lazy-traits.scala
     - test/files/run/reify_lazyunit.scala
     - test/files/run/showraw_mods.scala
     - test/files/run/t3670.scala
     - test/files/run/t3980.scala
     - test/files/run/t4047.scala
     - test/files/run/t6622.scala
     - test/files/run/t7406.scala
     - test/files/run/t7843-jsr223-service.scala
     - test/files/jvm/innerClassAttribute
     - test/files/specialized/SI-7343.scala
     - test/files/specialized/constant_lambda.scala
     - test/files/specialized/spec-early.scala
     - test/files/specialized/spec-init.scala
     - test/files/specialized/spec-matrix-new.scala
     - test/files/specialized/spec-matrix-old.scala
     - test/files/presentation/scope-completion-3

commit b1b4e5c
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    wip: lambdalift fix

    test/files/trait-defaults/lambdalift.scala works,
    but still some related tests failing

    (note that we can't use a bootstrapped compiler yet
    due to binary incompatibility in partest)

commit eae7dac
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update check now that trait vals can be concrete, use names not letters

    note the progression in a concrete trait val now being recognized as such
    ```
    -trait T => true
    -method $init$ => false
    -value z1 => true
    -value z2 => true // z2 is actually concrete!
    ```

commit 6555c74
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    bootstraps again by running info transform once per class...

    not sure how this ever worked, as separate compilation would transform a trait's info
    multiple times, resulting in double defs...

commit 273cb20
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    skip presuper vals in new encoding

commit 728e71e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    incoherent cyclic references between synthesized members

    must replace old trait accessor symbols by mixed in symbols
    in the infos of the mixed in symbols

    ```
    trait T { val a: String ; val b: a.type }
    class C extends T {
      // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
    }
    ```

    symbols occurring in types of synthesized members
    do not get rebound to other synthesized symbols

    package <empty>#4 {
      abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
        <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
        N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
        <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
        N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
      };
      abstract class M#7353 extends scala#22.AnyRef#2378 {
        <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
          M#7353.super.<init>scala#2719();
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
        <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
      };
      class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
        <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
        <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
        <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
        <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
        <method> def <init>#14997(): <empty>#3.this.C#7354 = {
          C#7354.super.<init>#13465();
          ()
        }
      }
    }

    [running phase pickler on dependent_rebind.scala]
    [running phase refchecks on dependent_rebind.scala]
    test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
     value n #15017 has incompatible type;
     found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
     required: => N#7352.this.self#7442.type
    class C extends M with N
          ^

    pos/t9111-inliner-workaround revealed need for:
-  override def transformInfo(sym: Symbol, tp: Type): Type = synthFieldsAndAccessors(tp)
+  override def transformInfo(sym: Symbol, tp: Type): Type = if (!sym.isJavaDefined) synthFieldsAndAccessors(tp) else tp

commit b56ca2f
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    static forwarders & private[this] val in trait

    object Properties extends PropertiesTrait

    trait PropertiesTrait {
      // the protected member is not emitted as a static member of  -- it works when dropping the access modifier
      // somehow, the module class member is considered deferred in BForwardersGen
      protected val propFilename: String = /
    }

    // [log jvm] No forwarder for 'getter propFilename' from Properties to 'module class Properties': false || m.isDeferred == true || false || false

    // the following method is missing compared to scalac
    // public final class Properties {
    //     public static String propFilename() {
    //         return Properties$.MODULE$.propFilename();
    //     }

    trait Chars {
      private[this] val char2uescapeArray = Array[Char]('\', 'u', 0, 0, 0, 0)
    }

    object Chars extends Chars

    // +++ w/reflect/scala/reflect/internal/Chars$.class
    // -  private final [C scala83014char2uescapeArray

    constant fold in forwarder for backwards compat
    constant-typed final val in trait should yield impl method

    bean{setter,getter} delegates to setter/getter (commit 1655d1b)
adriaanm added a commit to adriaanm/scala that referenced this pull request Nov 12, 2015
the info-transformed of constructors:
  - traits receive trait-setters for vals
  - classes receive fields & accessors for mixed in traits

Constructors tree transformer
  - makes trees for decls added during above info transform
  - adds mixin super calls to the primary constructor

```
trait OneConcreteVal[T] {
var x = 1 // : T = ???
def foo = x
}

trait OneOtherConcreteVal[T] {
var y: T = ???
}

class C extends OneConcreteVal[Int] with OneOtherConcreteVal[String]
```

we don't have a field -- only a getter -- so,
where will we keep non-getter but-field annotations?

mixin only deals with lazy accessors/vals

do not used referenced to correlate getter/setter
it messes with paramaccessor's usage, and we don't really need it

make sure to clone info's, so we don't share symbols for method args
this manifests itself as an exception in lambdalift, finding proxies

Use NEEDS_TREES for all comms between InfoTransform and tree transform

yep, need SYNTHESIZE_IMPL_IN_SUBCLASS

distinguish accessors that should be mixed into subclass,
and those that simply need to be implemented in tree transform,
after info transform added the decl

commit 4b4932e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 days ago

    do assignment to trait fields in AddInterfaces

    regular class vals get assignments during constructors, as before

impl classes get accessors + assignments through trait setters in addinterfaces
so that constructors acts on them there,
and produced the init method in the required spot (the impl class)

bootstrapped compiler needs new partest

commit baf568d
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    produce identical bytecode for constant trait val getters

    I couldn't bring myself to emit the unused fields that we
    used to emit for constant vals, even though the getters
    immediately return the constant, and thus the field goes unused.

    In the next version, there's no need to synthesize impls
    for these in subclasses -- the getter can be implemented
    in the interface.

commit b9052da
Author: Lukas Rytz <lukas.rytz@gmail.com>
Date:   3 weeks ago

    Fix enclosing method attribute for classes nested in trait fields

    Trait fields are now created as MethodSymbol (no longer TermSymbol).
    This symbol shows up in the `originalOwner` chain of a class declared
    within the field initializer. This promoted the field getter to
    being the enclosing method of the nested class, which it is not
    (the EnclosingMethod attribute is a source-level property).

commit cf845ab
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    don't suppress field for unit-typed vals

    it affects the memory model -- even a write of unit to a field is relevant...

commit 337a9dd
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    unit-typed lazy vals should never receive a field

    this need was unmasked by test/files/run/t7843-jsr223-service.scala,
    which no longer printed the output expected from the `0 to 10 foreach`

    Currently failing tests:

     - test/files/pos/t6780.scala
     - test/files/neg/anytrait.scala
     - test/files/neg/delayed-init-ref.scala
     - test/files/neg/t562.scala
     - test/files/neg/t6276.scala
     - test/files/run/delambdafy_uncurry_byname_inline.scala
     - test/files/run/delambdafy_uncurry_byname_method.scala
     - test/files/run/delambdafy_uncurry_inline.scala
     - test/files/run/delambdafy_uncurry_method.scala
     - test/files/run/inner-obj-auto.scala
     - test/files/run/lazy-traits.scala
     - test/files/run/reify_lazyunit.scala
     - test/files/run/showraw_mods.scala
     - test/files/run/t3670.scala
     - test/files/run/t3980.scala
     - test/files/run/t4047.scala
     - test/files/run/t6622.scala
     - test/files/run/t7406.scala
     - test/files/run/t7843-jsr223-service.scala
     - test/files/jvm/innerClassAttribute
     - test/files/specialized/SI-7343.scala
     - test/files/specialized/constant_lambda.scala
     - test/files/specialized/spec-early.scala
     - test/files/specialized/spec-init.scala
     - test/files/specialized/spec-matrix-new.scala
     - test/files/specialized/spec-matrix-old.scala
     - test/files/presentation/scope-completion-3

commit b1b4e5c
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    wip: lambdalift fix

    test/files/trait-defaults/lambdalift.scala works,
    but still some related tests failing

    (note that we can't use a bootstrapped compiler yet
    due to binary incompatibility in partest)

commit eae7dac
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update check now that trait vals can be concrete, use names not letters

    note the progression in a concrete trait val now being recognized as such
    ```
    -trait T => true
    -method $init$ => false
    -value z1 => true
    -value z2 => true // z2 is actually concrete!
    ```

commit 6555c74
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    bootstraps again by running info transform once per class...

    not sure how this ever worked, as separate compilation would transform a trait's info
    multiple times, resulting in double defs...

commit 273cb20
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    skip presuper vals in new encoding

commit 728e71e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    incoherent cyclic references between synthesized members

    must replace old trait accessor symbols by mixed in symbols
    in the infos of the mixed in symbols

    ```
    trait T { val a: String ; val b: a.type }
    class C extends T {
      // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
    }
    ```

    symbols occurring in types of synthesized members
    do not get rebound to other synthesized symbols

    package <empty>#4 {
      abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
        <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
        N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
        <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
        N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
      };
      abstract class M#7353 extends scala#22.AnyRef#2378 {
        <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
          M#7353.super.<init>scala#2719();
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
        <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
      };
      class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
        <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
        <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
        <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
        <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
        <method> def <init>#14997(): <empty>#3.this.C#7354 = {
          C#7354.super.<init>#13465();
          ()
        }
      }
    }

    [running phase pickler on dependent_rebind.scala]
    [running phase refchecks on dependent_rebind.scala]
    test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
     value n #15017 has incompatible type;
     found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
     required: => N#7352.this.self#7442.type
    class C extends M with N
          ^

    pos/t9111-inliner-workaround revealed need for:
-  override def transformInfo(sym: Symbol, tp: Type): Type = synthFieldsAndAccessors(tp)
+  override def transformInfo(sym: Symbol, tp: Type): Type = if (!sym.isJavaDefined) synthFieldsAndAccessors(tp) else tp

commit b56ca2f
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    static forwarders & private[this] val in trait

    object Properties extends PropertiesTrait

    trait PropertiesTrait {
      // the protected member is not emitted as a static member of  -- it works when dropping the access modifier
      // somehow, the module class member is considered deferred in BForwardersGen
      protected val propFilename: String = /
    }

    // [log jvm] No forwarder for 'getter propFilename' from Properties to 'module class Properties': false || m.isDeferred == true || false || false

    // the following method is missing compared to scalac
    // public final class Properties {
    //     public static String propFilename() {
    //         return Properties$.MODULE$.propFilename();
    //     }

    trait Chars {
      private[this] val char2uescapeArray = Array[Char]('\', 'u', 0, 0, 0, 0)
    }

    object Chars extends Chars

    // +++ w/reflect/scala/reflect/internal/Chars$.class
    // -  private final [C scala83014char2uescapeArray

    constant fold in forwarder for backwards compat
    constant-typed final val in trait should yield impl method

    bean{setter,getter} delegates to setter/getter (commit 1655d1b)
adriaanm added a commit to adriaanm/scala that referenced this pull request Nov 13, 2015
the info-transformed of constructors:
  - traits receive trait-setters for vals
  - classes receive fields & accessors for mixed in traits

Constructors tree transformer
  - makes trees for decls added during above info transform
  - adds mixin super calls to the primary constructor

```
trait OneConcreteVal[T] {
var x = 1 // : T = ???
def foo = x
}

trait OneOtherConcreteVal[T] {
var y: T = ???
}

class C extends OneConcreteVal[Int] with OneOtherConcreteVal[String]
```

we don't have a field -- only a getter -- so,
where will we keep non-getter but-field annotations?

mixin only deals with lazy accessors/vals

do not used referenced to correlate getter/setter
it messes with paramaccessor's usage, and we don't really need it

make sure to clone info's, so we don't share symbols for method args
this manifests itself as an exception in lambdalift, finding proxies

Use NEEDS_TREES for all comms between InfoTransform and tree transform

yep, need SYNTHESIZE_IMPL_IN_SUBCLASS

distinguish accessors that should be mixed into subclass,
and those that simply need to be implemented in tree transform,
after info transform added the decl

commit 4b4932e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 days ago

    do assignment to trait fields in AddInterfaces

    regular class vals get assignments during constructors, as before

impl classes get accessors + assignments through trait setters in addinterfaces
so that constructors acts on them there,
and produced the init method in the required spot (the impl class)

bootstrapped compiler needs new partest

commit baf568d
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    produce identical bytecode for constant trait val getters

    I couldn't bring myself to emit the unused fields that we
    used to emit for constant vals, even though the getters
    immediately return the constant, and thus the field goes unused.

    In the next version, there's no need to synthesize impls
    for these in subclasses -- the getter can be implemented
    in the interface.

commit b9052da
Author: Lukas Rytz <lukas.rytz@gmail.com>
Date:   3 weeks ago

    Fix enclosing method attribute for classes nested in trait fields

    Trait fields are now created as MethodSymbol (no longer TermSymbol).
    This symbol shows up in the `originalOwner` chain of a class declared
    within the field initializer. This promoted the field getter to
    being the enclosing method of the nested class, which it is not
    (the EnclosingMethod attribute is a source-level property).

commit cf845ab
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    don't suppress field for unit-typed vals

    it affects the memory model -- even a write of unit to a field is relevant...

commit 337a9dd
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    unit-typed lazy vals should never receive a field

    this need was unmasked by test/files/run/t7843-jsr223-service.scala,
    which no longer printed the output expected from the `0 to 10 foreach`

    Currently failing tests:

     - test/files/pos/t6780.scala
     - test/files/neg/anytrait.scala
     - test/files/neg/delayed-init-ref.scala
     - test/files/neg/t562.scala
     - test/files/neg/t6276.scala
     - test/files/run/delambdafy_uncurry_byname_inline.scala
     - test/files/run/delambdafy_uncurry_byname_method.scala
     - test/files/run/delambdafy_uncurry_inline.scala
     - test/files/run/delambdafy_uncurry_method.scala
     - test/files/run/inner-obj-auto.scala
     - test/files/run/lazy-traits.scala
     - test/files/run/reify_lazyunit.scala
     - test/files/run/showraw_mods.scala
     - test/files/run/t3670.scala
     - test/files/run/t3980.scala
     - test/files/run/t4047.scala
     - test/files/run/t6622.scala
     - test/files/run/t7406.scala
     - test/files/run/t7843-jsr223-service.scala
     - test/files/jvm/innerClassAttribute
     - test/files/specialized/SI-7343.scala
     - test/files/specialized/constant_lambda.scala
     - test/files/specialized/spec-early.scala
     - test/files/specialized/spec-init.scala
     - test/files/specialized/spec-matrix-new.scala
     - test/files/specialized/spec-matrix-old.scala
     - test/files/presentation/scope-completion-3

commit b1b4e5c
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    wip: lambdalift fix

    test/files/trait-defaults/lambdalift.scala works,
    but still some related tests failing

    (note that we can't use a bootstrapped compiler yet
    due to binary incompatibility in partest)

commit eae7dac
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update check now that trait vals can be concrete, use names not letters

    note the progression in a concrete trait val now being recognized as such
    ```
    -trait T => true
    -method $init$ => false
    -value z1 => true
    -value z2 => true // z2 is actually concrete!
    ```

commit 6555c74
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    bootstraps again by running info transform once per class...

    not sure how this ever worked, as separate compilation would transform a trait's info
    multiple times, resulting in double defs...

commit 273cb20
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    skip presuper vals in new encoding

commit 728e71e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    incoherent cyclic references between synthesized members

    must replace old trait accessor symbols by mixed in symbols
    in the infos of the mixed in symbols

    ```
    trait T { val a: String ; val b: a.type }
    class C extends T {
      // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
    }
    ```

    symbols occurring in types of synthesized members
    do not get rebound to other synthesized symbols

    package <empty>#4 {
      abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
        <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
        N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
        <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
        N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
      };
      abstract class M#7353 extends scala#22.AnyRef#2378 {
        <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
          M#7353.super.<init>scala#2719();
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
        <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
      };
      class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
        <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
        <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
        <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
        <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
        <method> def <init>#14997(): <empty>#3.this.C#7354 = {
          C#7354.super.<init>#13465();
          ()
        }
      }
    }

    [running phase pickler on dependent_rebind.scala]
    [running phase refchecks on dependent_rebind.scala]
    test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
     value n #15017 has incompatible type;
     found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
     required: => N#7352.this.self#7442.type
    class C extends M with N
          ^

    pos/t9111-inliner-workaround revealed need for:
-  override def transformInfo(sym: Symbol, tp: Type): Type = synthFieldsAndAccessors(tp)
+  override def transformInfo(sym: Symbol, tp: Type): Type = if (!sym.isJavaDefined) synthFieldsAndAccessors(tp) else tp

commit b56ca2f
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    static forwarders & private[this] val in trait

    object Properties extends PropertiesTrait

    trait PropertiesTrait {
      // the protected member is not emitted as a static member of  -- it works when dropping the access modifier
      // somehow, the module class member is considered deferred in BForwardersGen
      protected val propFilename: String = /
    }

    // [log jvm] No forwarder for 'getter propFilename' from Properties to 'module class Properties': false || m.isDeferred == true || false || false

    // the following method is missing compared to scalac
    // public final class Properties {
    //     public static String propFilename() {
    //         return Properties$.MODULE$.propFilename();
    //     }

    trait Chars {
      private[this] val char2uescapeArray = Array[Char]('\', 'u', 0, 0, 0, 0)
    }

    object Chars extends Chars

    // +++ w/reflect/scala/reflect/internal/Chars$.class
    // -  private final [C scala83014char2uescapeArray

    constant fold in forwarder for backwards compat
    constant-typed final val in trait should yield impl method

    bean{setter,getter} delegates to setter/getter (commit 1655d1b)
adriaanm added a commit to adriaanm/scala that referenced this pull request Nov 13, 2015
the info-transformed of constructors:
  - traits receive trait-setters for vals
  - classes receive fields & accessors for mixed in traits

Constructors tree transformer
  - makes trees for decls added during above info transform
  - adds mixin super calls to the primary constructor

```
trait OneConcreteVal[T] {
var x = 1 // : T = ???
def foo = x
}

trait OneOtherConcreteVal[T] {
var y: T = ???
}

class C extends OneConcreteVal[Int] with OneOtherConcreteVal[String]
```

we don't have a field -- only a getter -- so,
where will we keep non-getter but-field annotations?

mixin only deals with lazy accessors/vals

do not used referenced to correlate getter/setter
it messes with paramaccessor's usage, and we don't really need it

make sure to clone info's, so we don't share symbols for method args
this manifests itself as an exception in lambdalift, finding proxies

Use NEEDS_TREES for all comms between InfoTransform and tree transform

yep, need SYNTHESIZE_IMPL_IN_SUBCLASS

distinguish accessors that should be mixed into subclass,
and those that simply need to be implemented in tree transform,
after info transform added the decl

commit 4b4932e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 days ago

    do assignment to trait fields in AddInterfaces

    regular class vals get assignments during constructors, as before

impl classes get accessors + assignments through trait setters in addinterfaces
so that constructors acts on them there,
and produced the init method in the required spot (the impl class)

bootstrapped compiler needs new partest

commit baf568d
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    produce identical bytecode for constant trait val getters

    I couldn't bring myself to emit the unused fields that we
    used to emit for constant vals, even though the getters
    immediately return the constant, and thus the field goes unused.

    In the next version, there's no need to synthesize impls
    for these in subclasses -- the getter can be implemented
    in the interface.

commit b9052da
Author: Lukas Rytz <lukas.rytz@gmail.com>
Date:   3 weeks ago

    Fix enclosing method attribute for classes nested in trait fields

    Trait fields are now created as MethodSymbol (no longer TermSymbol).
    This symbol shows up in the `originalOwner` chain of a class declared
    within the field initializer. This promoted the field getter to
    being the enclosing method of the nested class, which it is not
    (the EnclosingMethod attribute is a source-level property).

commit cf845ab
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    don't suppress field for unit-typed vals

    it affects the memory model -- even a write of unit to a field is relevant...

commit 337a9dd
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    unit-typed lazy vals should never receive a field

    this need was unmasked by test/files/run/t7843-jsr223-service.scala,
    which no longer printed the output expected from the `0 to 10 foreach`

    Currently failing tests:

     - test/files/pos/t6780.scala
     - test/files/neg/anytrait.scala
     - test/files/neg/delayed-init-ref.scala
     - test/files/neg/t562.scala
     - test/files/neg/t6276.scala
     - test/files/run/delambdafy_uncurry_byname_inline.scala
     - test/files/run/delambdafy_uncurry_byname_method.scala
     - test/files/run/delambdafy_uncurry_inline.scala
     - test/files/run/delambdafy_uncurry_method.scala
     - test/files/run/inner-obj-auto.scala
     - test/files/run/lazy-traits.scala
     - test/files/run/reify_lazyunit.scala
     - test/files/run/showraw_mods.scala
     - test/files/run/t3670.scala
     - test/files/run/t3980.scala
     - test/files/run/t4047.scala
     - test/files/run/t6622.scala
     - test/files/run/t7406.scala
     - test/files/run/t7843-jsr223-service.scala
     - test/files/jvm/innerClassAttribute
     - test/files/specialized/SI-7343.scala
     - test/files/specialized/constant_lambda.scala
     - test/files/specialized/spec-early.scala
     - test/files/specialized/spec-init.scala
     - test/files/specialized/spec-matrix-new.scala
     - test/files/specialized/spec-matrix-old.scala
     - test/files/presentation/scope-completion-3

commit b1b4e5c
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    wip: lambdalift fix

    test/files/trait-defaults/lambdalift.scala works,
    but still some related tests failing

    (note that we can't use a bootstrapped compiler yet
    due to binary incompatibility in partest)

commit eae7dac
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update check now that trait vals can be concrete, use names not letters

    note the progression in a concrete trait val now being recognized as such
    ```
    -trait T => true
    -method $init$ => false
    -value z1 => true
    -value z2 => true // z2 is actually concrete!
    ```

commit 6555c74
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    bootstraps again by running info transform once per class...

    not sure how this ever worked, as separate compilation would transform a trait's info
    multiple times, resulting in double defs...

commit 273cb20
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    skip presuper vals in new encoding

commit 728e71e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    incoherent cyclic references between synthesized members

    must replace old trait accessor symbols by mixed in symbols
    in the infos of the mixed in symbols

    ```
    trait T { val a: String ; val b: a.type }
    class C extends T {
      // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
    }
    ```

    symbols occurring in types of synthesized members
    do not get rebound to other synthesized symbols

    package <empty>#4 {
      abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
        <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
        N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
        <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
        N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
      };
      abstract class M#7353 extends scala#22.AnyRef#2378 {
        <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
          M#7353.super.<init>scala#2719();
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
        <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
      };
      class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
        <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
        <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
        <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
        <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
        <method> def <init>#14997(): <empty>#3.this.C#7354 = {
          C#7354.super.<init>#13465();
          ()
        }
      }
    }

    [running phase pickler on dependent_rebind.scala]
    [running phase refchecks on dependent_rebind.scala]
    test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
     value n #15017 has incompatible type;
     found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
     required: => N#7352.this.self#7442.type
    class C extends M with N
          ^

    pos/t9111-inliner-workaround revealed need for:
-  override def transformInfo(sym: Symbol, tp: Type): Type = synthFieldsAndAccessors(tp)
+  override def transformInfo(sym: Symbol, tp: Type): Type = if (!sym.isJavaDefined) synthFieldsAndAccessors(tp) else tp

commit b56ca2f
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    static forwarders & private[this] val in trait

    object Properties extends PropertiesTrait

    trait PropertiesTrait {
      // the protected member is not emitted as a static member of  -- it works when dropping the access modifier
      // somehow, the module class member is considered deferred in BForwardersGen
      protected val propFilename: String = /
    }

    // [log jvm] No forwarder for 'getter propFilename' from Properties to 'module class Properties': false || m.isDeferred == true || false || false

    // the following method is missing compared to scalac
    // public final class Properties {
    //     public static String propFilename() {
    //         return Properties$.MODULE$.propFilename();
    //     }

    trait Chars {
      private[this] val char2uescapeArray = Array[Char]('\', 'u', 0, 0, 0, 0)
    }

    object Chars extends Chars

    // +++ w/reflect/scala/reflect/internal/Chars$.class
    // -  private final [C scala83014char2uescapeArray

    constant fold in forwarder for backwards compat
    constant-typed final val in trait should yield impl method

    bean{setter,getter} delegates to setter/getter (commit 1655d1b)
adriaanm added a commit to adriaanm/scala that referenced this pull request Nov 14, 2015
the info-transformed of constructors:
  - traits receive trait-setters for vals
  - classes receive fields & accessors for mixed in traits

Constructors tree transformer
  - makes trees for decls added during above info transform
  - adds mixin super calls to the primary constructor

```
trait OneConcreteVal[T] {
var x = 1 // : T = ???
def foo = x
}

trait OneOtherConcreteVal[T] {
var y: T = ???
}

class C extends OneConcreteVal[Int] with OneOtherConcreteVal[String]
```

we don't have a field -- only a getter -- so,
where will we keep non-getter but-field annotations?

mixin only deals with lazy accessors/vals

do not used referenced to correlate getter/setter
it messes with paramaccessor's usage, and we don't really need it

make sure to clone info's, so we don't share symbols for method args
this manifests itself as an exception in lambdalift, finding proxies

Use NEEDS_TREES for all comms between InfoTransform and tree transform

yep, need SYNTHESIZE_IMPL_IN_SUBCLASS

distinguish accessors that should be mixed into subclass,
and those that simply need to be implemented in tree transform,
after info transform added the decl

commit 4b4932e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 days ago

    do assignment to trait fields in AddInterfaces

    regular class vals get assignments during constructors, as before

impl classes get accessors + assignments through trait setters in addinterfaces
so that constructors acts on them there,
and produced the init method in the required spot (the impl class)

bootstrapped compiler needs new partest

commit baf568d
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    produce identical bytecode for constant trait val getters

    I couldn't bring myself to emit the unused fields that we
    used to emit for constant vals, even though the getters
    immediately return the constant, and thus the field goes unused.

    In the next version, there's no need to synthesize impls
    for these in subclasses -- the getter can be implemented
    in the interface.

commit b9052da
Author: Lukas Rytz <lukas.rytz@gmail.com>
Date:   3 weeks ago

    Fix enclosing method attribute for classes nested in trait fields

    Trait fields are now created as MethodSymbol (no longer TermSymbol).
    This symbol shows up in the `originalOwner` chain of a class declared
    within the field initializer. This promoted the field getter to
    being the enclosing method of the nested class, which it is not
    (the EnclosingMethod attribute is a source-level property).

commit cf845ab
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    don't suppress field for unit-typed vals

    it affects the memory model -- even a write of unit to a field is relevant...

commit 337a9dd
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    unit-typed lazy vals should never receive a field

    this need was unmasked by test/files/run/t7843-jsr223-service.scala,
    which no longer printed the output expected from the `0 to 10 foreach`

    Currently failing tests:

     - test/files/pos/t6780.scala
     - test/files/neg/anytrait.scala
     - test/files/neg/delayed-init-ref.scala
     - test/files/neg/t562.scala
     - test/files/neg/t6276.scala
     - test/files/run/delambdafy_uncurry_byname_inline.scala
     - test/files/run/delambdafy_uncurry_byname_method.scala
     - test/files/run/delambdafy_uncurry_inline.scala
     - test/files/run/delambdafy_uncurry_method.scala
     - test/files/run/inner-obj-auto.scala
     - test/files/run/lazy-traits.scala
     - test/files/run/reify_lazyunit.scala
     - test/files/run/showraw_mods.scala
     - test/files/run/t3670.scala
     - test/files/run/t3980.scala
     - test/files/run/t4047.scala
     - test/files/run/t6622.scala
     - test/files/run/t7406.scala
     - test/files/run/t7843-jsr223-service.scala
     - test/files/jvm/innerClassAttribute
     - test/files/specialized/SI-7343.scala
     - test/files/specialized/constant_lambda.scala
     - test/files/specialized/spec-early.scala
     - test/files/specialized/spec-init.scala
     - test/files/specialized/spec-matrix-new.scala
     - test/files/specialized/spec-matrix-old.scala
     - test/files/presentation/scope-completion-3

commit b1b4e5c
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    wip: lambdalift fix

    test/files/trait-defaults/lambdalift.scala works,
    but still some related tests failing

    (note that we can't use a bootstrapped compiler yet
    due to binary incompatibility in partest)

commit eae7dac
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update check now that trait vals can be concrete, use names not letters

    note the progression in a concrete trait val now being recognized as such
    ```
    -trait T => true
    -method $init$ => false
    -value z1 => true
    -value z2 => true // z2 is actually concrete!
    ```

commit 6555c74
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    bootstraps again by running info transform once per class...

    not sure how this ever worked, as separate compilation would transform a trait's info
    multiple times, resulting in double defs...

commit 273cb20
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    skip presuper vals in new encoding

commit 728e71e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    incoherent cyclic references between synthesized members

    must replace old trait accessor symbols by mixed in symbols
    in the infos of the mixed in symbols

    ```
    trait T { val a: String ; val b: a.type }
    class C extends T {
      // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
    }
    ```

    symbols occurring in types of synthesized members
    do not get rebound to other synthesized symbols

    package <empty>#4 {
      abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
        <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
        N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
        <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
        N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
      };
      abstract class M#7353 extends scala#22.AnyRef#2378 {
        <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
          M#7353.super.<init>scala#2719();
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
        <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
      };
      class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
        <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
        <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
        <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
        <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
        <method> def <init>#14997(): <empty>#3.this.C#7354 = {
          C#7354.super.<init>#13465();
          ()
        }
      }
    }

    [running phase pickler on dependent_rebind.scala]
    [running phase refchecks on dependent_rebind.scala]
    test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
     value n #15017 has incompatible type;
     found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
     required: => N#7352.this.self#7442.type
    class C extends M with N
          ^

    pos/t9111-inliner-workaround revealed need for:
-  override def transformInfo(sym: Symbol, tp: Type): Type = synthFieldsAndAccessors(tp)
+  override def transformInfo(sym: Symbol, tp: Type): Type = if (!sym.isJavaDefined) synthFieldsAndAccessors(tp) else tp

commit b56ca2f
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    static forwarders & private[this] val in trait

    object Properties extends PropertiesTrait

    trait PropertiesTrait {
      // the protected member is not emitted as a static member of  -- it works when dropping the access modifier
      // somehow, the module class member is considered deferred in BForwardersGen
      protected val propFilename: String = /
    }

    // [log jvm] No forwarder for 'getter propFilename' from Properties to 'module class Properties': false || m.isDeferred == true || false || false

    // the following method is missing compared to scalac
    // public final class Properties {
    //     public static String propFilename() {
    //         return Properties$.MODULE$.propFilename();
    //     }

    trait Chars {
      private[this] val char2uescapeArray = Array[Char]('\', 'u', 0, 0, 0, 0)
    }

    object Chars extends Chars

    // +++ w/reflect/scala/reflect/internal/Chars$.class
    // -  private final [C scala83014char2uescapeArray

    constant fold in forwarder for backwards compat
    constant-typed final val in trait should yield impl method

    bean{setter,getter} delegates to setter/getter (commit 1655d1b)
adriaanm added a commit to adriaanm/scala that referenced this pull request Nov 17, 2015
the info-transformed of constructors:
  - traits receive trait-setters for vals
  - classes receive fields & accessors for mixed in traits

Constructors tree transformer
  - makes trees for decls added during above info transform
  - adds mixin super calls to the primary constructor

```
trait OneConcreteVal[T] {
var x = 1 // : T = ???
def foo = x
}

trait OneOtherConcreteVal[T] {
var y: T = ???
}

class C extends OneConcreteVal[Int] with OneOtherConcreteVal[String]
```

we don't have a field -- only a getter -- so,
where will we keep non-getter but-field annotations?

mixin only deals with lazy accessors/vals

do not used referenced to correlate getter/setter
it messes with paramaccessor's usage, and we don't really need it

make sure to clone info's, so we don't share symbols for method args
this manifests itself as an exception in lambdalift, finding proxies

Use NEEDS_TREES for all comms between InfoTransform and tree transform

yep, need SYNTHESIZE_IMPL_IN_SUBCLASS

distinguish accessors that should be mixed into subclass,
and those that simply need to be implemented in tree transform,
after info transform added the decl

commit 4b4932e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 days ago

    do assignment to trait fields in AddInterfaces

    regular class vals get assignments during constructors, as before

impl classes get accessors + assignments through trait setters in addinterfaces
so that constructors acts on them there,
and produced the init method in the required spot (the impl class)

bootstrapped compiler needs new partest

commit baf568d
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    produce identical bytecode for constant trait val getters

    I couldn't bring myself to emit the unused fields that we
    used to emit for constant vals, even though the getters
    immediately return the constant, and thus the field goes unused.

    In the next version, there's no need to synthesize impls
    for these in subclasses -- the getter can be implemented
    in the interface.

commit b9052da
Author: Lukas Rytz <lukas.rytz@gmail.com>
Date:   3 weeks ago

    Fix enclosing method attribute for classes nested in trait fields

    Trait fields are now created as MethodSymbol (no longer TermSymbol).
    This symbol shows up in the `originalOwner` chain of a class declared
    within the field initializer. This promoted the field getter to
    being the enclosing method of the nested class, which it is not
    (the EnclosingMethod attribute is a source-level property).

commit cf845ab
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    don't suppress field for unit-typed vals

    it affects the memory model -- even a write of unit to a field is relevant...

commit 337a9dd
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    unit-typed lazy vals should never receive a field

    this need was unmasked by test/files/run/t7843-jsr223-service.scala,
    which no longer printed the output expected from the `0 to 10 foreach`

    Currently failing tests:

     - test/files/pos/t6780.scala
     - test/files/neg/anytrait.scala
     - test/files/neg/delayed-init-ref.scala
     - test/files/neg/t562.scala
     - test/files/neg/t6276.scala
     - test/files/run/delambdafy_uncurry_byname_inline.scala
     - test/files/run/delambdafy_uncurry_byname_method.scala
     - test/files/run/delambdafy_uncurry_inline.scala
     - test/files/run/delambdafy_uncurry_method.scala
     - test/files/run/inner-obj-auto.scala
     - test/files/run/lazy-traits.scala
     - test/files/run/reify_lazyunit.scala
     - test/files/run/showraw_mods.scala
     - test/files/run/t3670.scala
     - test/files/run/t3980.scala
     - test/files/run/t4047.scala
     - test/files/run/t6622.scala
     - test/files/run/t7406.scala
     - test/files/run/t7843-jsr223-service.scala
     - test/files/jvm/innerClassAttribute
     - test/files/specialized/SI-7343.scala
     - test/files/specialized/constant_lambda.scala
     - test/files/specialized/spec-early.scala
     - test/files/specialized/spec-init.scala
     - test/files/specialized/spec-matrix-new.scala
     - test/files/specialized/spec-matrix-old.scala
     - test/files/presentation/scope-completion-3

commit b1b4e5c
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    wip: lambdalift fix

    test/files/trait-defaults/lambdalift.scala works,
    but still some related tests failing

    (note that we can't use a bootstrapped compiler yet
    due to binary incompatibility in partest)

commit eae7dac
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update check now that trait vals can be concrete, use names not letters

    note the progression in a concrete trait val now being recognized as such
    ```
    -trait T => true
    -method $init$ => false
    -value z1 => true
    -value z2 => true // z2 is actually concrete!
    ```

commit 6555c74
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    bootstraps again by running info transform once per class...

    not sure how this ever worked, as separate compilation would transform a trait's info
    multiple times, resulting in double defs...

commit 273cb20
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    skip presuper vals in new encoding

commit 728e71e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    incoherent cyclic references between synthesized members

    must replace old trait accessor symbols by mixed in symbols
    in the infos of the mixed in symbols

    ```
    trait T { val a: String ; val b: a.type }
    class C extends T {
      // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
    }
    ```

    symbols occurring in types of synthesized members
    do not get rebound to other synthesized symbols

    package <empty>#4 {
      abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
        <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
        N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
        <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
        N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
      };
      abstract class M#7353 extends scala#22.AnyRef#2378 {
        <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
          M#7353.super.<init>scala#2719();
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
        <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
      };
      class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
        <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
        <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
        <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
        <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
        <method> def <init>#14997(): <empty>#3.this.C#7354 = {
          C#7354.super.<init>#13465();
          ()
        }
      }
    }

    [running phase pickler on dependent_rebind.scala]
    [running phase refchecks on dependent_rebind.scala]
    test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
     value n #15017 has incompatible type;
     found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
     required: => N#7352.this.self#7442.type
    class C extends M with N
          ^

    pos/t9111-inliner-workaround revealed need for:
-  override def transformInfo(sym: Symbol, tp: Type): Type = synthFieldsAndAccessors(tp)
+  override def transformInfo(sym: Symbol, tp: Type): Type = if (!sym.isJavaDefined) synthFieldsAndAccessors(tp) else tp

commit b56ca2f
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    static forwarders & private[this] val in trait

    object Properties extends PropertiesTrait

    trait PropertiesTrait {
      // the protected member is not emitted as a static member of  -- it works when dropping the access modifier
      // somehow, the module class member is considered deferred in BForwardersGen
      protected val propFilename: String = /
    }

    // [log jvm] No forwarder for 'getter propFilename' from Properties to 'module class Properties': false || m.isDeferred == true || false || false

    // the following method is missing compared to scalac
    // public final class Properties {
    //     public static String propFilename() {
    //         return Properties$.MODULE$.propFilename();
    //     }

    trait Chars {
      private[this] val char2uescapeArray = Array[Char]('\', 'u', 0, 0, 0, 0)
    }

    object Chars extends Chars

    // +++ w/reflect/scala/reflect/internal/Chars$.class
    // -  private final [C scala83014char2uescapeArray

    constant fold in forwarder for backwards compat
    constant-typed final val in trait should yield impl method

    bean{setter,getter} delegates to setter/getter (commit 1655d1b)
adriaanm added a commit to adriaanm/scala that referenced this pull request Nov 17, 2015
the info-transformed of constructors:
  - traits receive trait-setters for vals
  - classes receive fields & accessors for mixed in traits

Constructors tree transformer
  - makes trees for decls added during above info transform
  - adds mixin super calls to the primary constructor

```
trait OneConcreteVal[T] {
var x = 1 // : T = ???
def foo = x
}

trait OneOtherConcreteVal[T] {
var y: T = ???
}

class C extends OneConcreteVal[Int] with OneOtherConcreteVal[String]
```

we don't have a field -- only a getter -- so,
where will we keep non-getter but-field annotations?

mixin only deals with lazy accessors/vals

do not used referenced to correlate getter/setter
it messes with paramaccessor's usage, and we don't really need it

make sure to clone info's, so we don't share symbols for method args
this manifests itself as an exception in lambdalift, finding proxies

Use NEEDS_TREES for all comms between InfoTransform and tree transform

yep, need SYNTHESIZE_IMPL_IN_SUBCLASS

distinguish accessors that should be mixed into subclass,
and those that simply need to be implemented in tree transform,
after info transform added the decl

commit 4b4932e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 days ago

    do assignment to trait fields in AddInterfaces

    regular class vals get assignments during constructors, as before

impl classes get accessors + assignments through trait setters in addinterfaces
so that constructors acts on them there,
and produced the init method in the required spot (the impl class)

bootstrapped compiler needs new partest

commit baf568d
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    produce identical bytecode for constant trait val getters

    I couldn't bring myself to emit the unused fields that we
    used to emit for constant vals, even though the getters
    immediately return the constant, and thus the field goes unused.

    In the next version, there's no need to synthesize impls
    for these in subclasses -- the getter can be implemented
    in the interface.

commit b9052da
Author: Lukas Rytz <lukas.rytz@gmail.com>
Date:   3 weeks ago

    Fix enclosing method attribute for classes nested in trait fields

    Trait fields are now created as MethodSymbol (no longer TermSymbol).
    This symbol shows up in the `originalOwner` chain of a class declared
    within the field initializer. This promoted the field getter to
    being the enclosing method of the nested class, which it is not
    (the EnclosingMethod attribute is a source-level property).

commit cf845ab
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    don't suppress field for unit-typed vals

    it affects the memory model -- even a write of unit to a field is relevant...

commit 337a9dd
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    unit-typed lazy vals should never receive a field

    this need was unmasked by test/files/run/t7843-jsr223-service.scala,
    which no longer printed the output expected from the `0 to 10 foreach`

    Currently failing tests:

     - test/files/pos/t6780.scala
     - test/files/neg/anytrait.scala
     - test/files/neg/delayed-init-ref.scala
     - test/files/neg/t562.scala
     - test/files/neg/t6276.scala
     - test/files/run/delambdafy_uncurry_byname_inline.scala
     - test/files/run/delambdafy_uncurry_byname_method.scala
     - test/files/run/delambdafy_uncurry_inline.scala
     - test/files/run/delambdafy_uncurry_method.scala
     - test/files/run/inner-obj-auto.scala
     - test/files/run/lazy-traits.scala
     - test/files/run/reify_lazyunit.scala
     - test/files/run/showraw_mods.scala
     - test/files/run/t3670.scala
     - test/files/run/t3980.scala
     - test/files/run/t4047.scala
     - test/files/run/t6622.scala
     - test/files/run/t7406.scala
     - test/files/run/t7843-jsr223-service.scala
     - test/files/jvm/innerClassAttribute
     - test/files/specialized/SI-7343.scala
     - test/files/specialized/constant_lambda.scala
     - test/files/specialized/spec-early.scala
     - test/files/specialized/spec-init.scala
     - test/files/specialized/spec-matrix-new.scala
     - test/files/specialized/spec-matrix-old.scala
     - test/files/presentation/scope-completion-3

commit b1b4e5c
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    wip: lambdalift fix

    test/files/trait-defaults/lambdalift.scala works,
    but still some related tests failing

    (note that we can't use a bootstrapped compiler yet
    due to binary incompatibility in partest)

commit eae7dac
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update check now that trait vals can be concrete, use names not letters

    note the progression in a concrete trait val now being recognized as such
    ```
    -trait T => true
    -method $init$ => false
    -value z1 => true
    -value z2 => true // z2 is actually concrete!
    ```

commit 6555c74
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    bootstraps again by running info transform once per class...

    not sure how this ever worked, as separate compilation would transform a trait's info
    multiple times, resulting in double defs...

commit 273cb20
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    skip presuper vals in new encoding

commit 728e71e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    incoherent cyclic references between synthesized members

    must replace old trait accessor symbols by mixed in symbols
    in the infos of the mixed in symbols

    ```
    trait T { val a: String ; val b: a.type }
    class C extends T {
      // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
    }
    ```

    symbols occurring in types of synthesized members
    do not get rebound to other synthesized symbols

    package <empty>#4 {
      abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
        <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
        N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
        <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
        N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
      };
      abstract class M#7353 extends scala#22.AnyRef#2378 {
        <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
          M#7353.super.<init>scala#2719();
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
        <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
      };
      class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
        <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
        <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
        <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
        <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
        <method> def <init>#14997(): <empty>#3.this.C#7354 = {
          C#7354.super.<init>#13465();
          ()
        }
      }
    }

    [running phase pickler on dependent_rebind.scala]
    [running phase refchecks on dependent_rebind.scala]
    test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
     value n #15017 has incompatible type;
     found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
     required: => N#7352.this.self#7442.type
    class C extends M with N
          ^

    pos/t9111-inliner-workaround revealed need for:
-  override def transformInfo(sym: Symbol, tp: Type): Type = synthFieldsAndAccessors(tp)
+  override def transformInfo(sym: Symbol, tp: Type): Type = if (!sym.isJavaDefined) synthFieldsAndAccessors(tp) else tp

commit b56ca2f
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    static forwarders & private[this] val in trait

    object Properties extends PropertiesTrait

    trait PropertiesTrait {
      // the protected member is not emitted as a static member of  -- it works when dropping the access modifier
      // somehow, the module class member is considered deferred in BForwardersGen
      protected val propFilename: String = /
    }

    // [log jvm] No forwarder for 'getter propFilename' from Properties to 'module class Properties': false || m.isDeferred == true || false || false

    // the following method is missing compared to scalac
    // public final class Properties {
    //     public static String propFilename() {
    //         return Properties$.MODULE$.propFilename();
    //     }

    trait Chars {
      private[this] val char2uescapeArray = Array[Char]('\', 'u', 0, 0, 0, 0)
    }

    object Chars extends Chars

    // +++ w/reflect/scala/reflect/internal/Chars$.class
    // -  private final [C scala83014char2uescapeArray

    constant fold in forwarder for backwards compat
    constant-typed final val in trait should yield impl method

    bean{setter,getter} delegates to setter/getter (commit 1655d1b)
adriaanm added a commit to adriaanm/scala that referenced this pull request Nov 19, 2015
the info-transformed of constructors:
  - traits receive trait-setters for vals
  - classes receive fields & accessors for mixed in traits

Constructors tree transformer
  - makes trees for decls added during above info transform
  - adds mixin super calls to the primary constructor

```
trait OneConcreteVal[T] {
var x = 1 // : T = ???
def foo = x
}

trait OneOtherConcreteVal[T] {
var y: T = ???
}

class C extends OneConcreteVal[Int] with OneOtherConcreteVal[String]
```

we don't have a field -- only a getter -- so,
where will we keep non-getter but-field annotations?

mixin only deals with lazy accessors/vals

do not used referenced to correlate getter/setter
it messes with paramaccessor's usage, and we don't really need it

make sure to clone info's, so we don't share symbols for method args
this manifests itself as an exception in lambdalift, finding proxies

Use NEEDS_TREES for all comms between InfoTransform and tree transform

yep, need SYNTHESIZE_IMPL_IN_SUBCLASS

distinguish accessors that should be mixed into subclass,
and those that simply need to be implemented in tree transform,
after info transform added the decl

commit 4b4932e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 days ago

    do assignment to trait fields in AddInterfaces

    regular class vals get assignments during constructors, as before

impl classes get accessors + assignments through trait setters in addinterfaces
so that constructors acts on them there,
and produced the init method in the required spot (the impl class)

bootstrapped compiler needs new partest

commit baf568d
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    produce identical bytecode for constant trait val getters

    I couldn't bring myself to emit the unused fields that we
    used to emit for constant vals, even though the getters
    immediately return the constant, and thus the field goes unused.

    In the next version, there's no need to synthesize impls
    for these in subclasses -- the getter can be implemented
    in the interface.

commit b9052da
Author: Lukas Rytz <lukas.rytz@gmail.com>
Date:   3 weeks ago

    Fix enclosing method attribute for classes nested in trait fields

    Trait fields are now created as MethodSymbol (no longer TermSymbol).
    This symbol shows up in the `originalOwner` chain of a class declared
    within the field initializer. This promoted the field getter to
    being the enclosing method of the nested class, which it is not
    (the EnclosingMethod attribute is a source-level property).

commit cf845ab
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    don't suppress field for unit-typed vals

    it affects the memory model -- even a write of unit to a field is relevant...

commit 337a9dd
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    unit-typed lazy vals should never receive a field

    this need was unmasked by test/files/run/t7843-jsr223-service.scala,
    which no longer printed the output expected from the `0 to 10 foreach`

    Currently failing tests:

     - test/files/pos/t6780.scala
     - test/files/neg/anytrait.scala
     - test/files/neg/delayed-init-ref.scala
     - test/files/neg/t562.scala
     - test/files/neg/t6276.scala
     - test/files/run/delambdafy_uncurry_byname_inline.scala
     - test/files/run/delambdafy_uncurry_byname_method.scala
     - test/files/run/delambdafy_uncurry_inline.scala
     - test/files/run/delambdafy_uncurry_method.scala
     - test/files/run/inner-obj-auto.scala
     - test/files/run/lazy-traits.scala
     - test/files/run/reify_lazyunit.scala
     - test/files/run/showraw_mods.scala
     - test/files/run/t3670.scala
     - test/files/run/t3980.scala
     - test/files/run/t4047.scala
     - test/files/run/t6622.scala
     - test/files/run/t7406.scala
     - test/files/run/t7843-jsr223-service.scala
     - test/files/jvm/innerClassAttribute
     - test/files/specialized/SI-7343.scala
     - test/files/specialized/constant_lambda.scala
     - test/files/specialized/spec-early.scala
     - test/files/specialized/spec-init.scala
     - test/files/specialized/spec-matrix-new.scala
     - test/files/specialized/spec-matrix-old.scala
     - test/files/presentation/scope-completion-3

commit b1b4e5c
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    wip: lambdalift fix

    test/files/trait-defaults/lambdalift.scala works,
    but still some related tests failing

    (note that we can't use a bootstrapped compiler yet
    due to binary incompatibility in partest)

commit eae7dac
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update check now that trait vals can be concrete, use names not letters

    note the progression in a concrete trait val now being recognized as such
    ```
    -trait T => true
    -method $init$ => false
    -value z1 => true
    -value z2 => true // z2 is actually concrete!
    ```

commit 6555c74
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    bootstraps again by running info transform once per class...

    not sure how this ever worked, as separate compilation would transform a trait's info
    multiple times, resulting in double defs...

commit 273cb20
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    skip presuper vals in new encoding

commit 728e71e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    incoherent cyclic references between synthesized members

    must replace old trait accessor symbols by mixed in symbols
    in the infos of the mixed in symbols

    ```
    trait T { val a: String ; val b: a.type }
    class C extends T {
      // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
    }
    ```

    symbols occurring in types of synthesized members
    do not get rebound to other synthesized symbols

    package <empty>#4 {
      abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
        <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
        N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
        <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
        N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
      };
      abstract class M#7353 extends scala#22.AnyRef#2378 {
        <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
          M#7353.super.<init>scala#2719();
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
        <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
      };
      class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
        <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
        <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
        <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
        <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
        <method> def <init>#14997(): <empty>#3.this.C#7354 = {
          C#7354.super.<init>#13465();
          ()
        }
      }
    }

    [running phase pickler on dependent_rebind.scala]
    [running phase refchecks on dependent_rebind.scala]
    test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
     value n #15017 has incompatible type;
     found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
     required: => N#7352.this.self#7442.type
    class C extends M with N
          ^

    pos/t9111-inliner-workaround revealed need for:
-  override def transformInfo(sym: Symbol, tp: Type): Type = synthFieldsAndAccessors(tp)
+  override def transformInfo(sym: Symbol, tp: Type): Type = if (!sym.isJavaDefined) synthFieldsAndAccessors(tp) else tp

commit b56ca2f
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    static forwarders & private[this] val in trait

    object Properties extends PropertiesTrait

    trait PropertiesTrait {
      // the protected member is not emitted as a static member of  -- it works when dropping the access modifier
      // somehow, the module class member is considered deferred in BForwardersGen
      protected val propFilename: String = /
    }

    // [log jvm] No forwarder for 'getter propFilename' from Properties to 'module class Properties': false || m.isDeferred == true || false || false

    // the following method is missing compared to scalac
    // public final class Properties {
    //     public static String propFilename() {
    //         return Properties$.MODULE$.propFilename();
    //     }

    trait Chars {
      private[this] val char2uescapeArray = Array[Char]('\', 'u', 0, 0, 0, 0)
    }

    object Chars extends Chars

    // +++ w/reflect/scala/reflect/internal/Chars$.class
    // -  private final [C scala83014char2uescapeArray

    constant fold in forwarder for backwards compat
    constant-typed final val in trait should yield impl method

    bean{setter,getter} delegates to setter/getter (commit 1655d1b)
retronym pushed a commit to retronym/scala that referenced this pull request Jan 19, 2016
the info-transformed of constructors:
  - traits receive trait-setters for vals
  - classes receive fields & accessors for mixed in traits

Constructors tree transformer
  - makes trees for decls added during above info transform
  - adds mixin super calls to the primary constructor

```
trait OneConcreteVal[T] {
var x = 1 // : T = ???
def foo = x
}

trait OneOtherConcreteVal[T] {
var y: T = ???
}

class C extends OneConcreteVal[Int] with OneOtherConcreteVal[String]
```

we don't have a field -- only a getter -- so,
where will we keep non-getter but-field annotations?

mixin only deals with lazy accessors/vals

do not used referenced to correlate getter/setter
it messes with paramaccessor's usage, and we don't really need it

make sure to clone info's, so we don't share symbols for method args
this manifests itself as an exception in lambdalift, finding proxies

Use NEEDS_TREES for all comms between InfoTransform and tree transform

yep, need SYNTHESIZE_IMPL_IN_SUBCLASS

distinguish accessors that should be mixed into subclass,
and those that simply need to be implemented in tree transform,
after info transform added the decl

commit 4b4932e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 days ago

    do assignment to trait fields in AddInterfaces

    regular class vals get assignments during constructors, as before

impl classes get accessors + assignments through trait setters in addinterfaces
so that constructors acts on them there,
and produced the init method in the required spot (the impl class)

bootstrapped compiler needs new partest

commit baf568d
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    produce identical bytecode for constant trait val getters

    I couldn't bring myself to emit the unused fields that we
    used to emit for constant vals, even though the getters
    immediately return the constant, and thus the field goes unused.

    In the next version, there's no need to synthesize impls
    for these in subclasses -- the getter can be implemented
    in the interface.

commit b9052da
Author: Lukas Rytz <lukas.rytz@gmail.com>
Date:   3 weeks ago

    Fix enclosing method attribute for classes nested in trait fields

    Trait fields are now created as MethodSymbol (no longer TermSymbol).
    This symbol shows up in the `originalOwner` chain of a class declared
    within the field initializer. This promoted the field getter to
    being the enclosing method of the nested class, which it is not
    (the EnclosingMethod attribute is a source-level property).

commit cf845ab
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    don't suppress field for unit-typed vals

    it affects the memory model -- even a write of unit to a field is relevant...

commit 337a9dd
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    unit-typed lazy vals should never receive a field

    this need was unmasked by test/files/run/t7843-jsr223-service.scala,
    which no longer printed the output expected from the `0 to 10 foreach`

    Currently failing tests:

     - test/files/pos/t6780.scala
     - test/files/neg/anytrait.scala
     - test/files/neg/delayed-init-ref.scala
     - test/files/neg/t562.scala
     - test/files/neg/t6276.scala
     - test/files/run/delambdafy_uncurry_byname_inline.scala
     - test/files/run/delambdafy_uncurry_byname_method.scala
     - test/files/run/delambdafy_uncurry_inline.scala
     - test/files/run/delambdafy_uncurry_method.scala
     - test/files/run/inner-obj-auto.scala
     - test/files/run/lazy-traits.scala
     - test/files/run/reify_lazyunit.scala
     - test/files/run/showraw_mods.scala
     - test/files/run/t3670.scala
     - test/files/run/t3980.scala
     - test/files/run/t4047.scala
     - test/files/run/t6622.scala
     - test/files/run/t7406.scala
     - test/files/run/t7843-jsr223-service.scala
     - test/files/jvm/innerClassAttribute
     - test/files/specialized/SI-7343.scala
     - test/files/specialized/constant_lambda.scala
     - test/files/specialized/spec-early.scala
     - test/files/specialized/spec-init.scala
     - test/files/specialized/spec-matrix-new.scala
     - test/files/specialized/spec-matrix-old.scala
     - test/files/presentation/scope-completion-3

commit b1b4e5c
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    wip: lambdalift fix

    test/files/trait-defaults/lambdalift.scala works,
    but still some related tests failing

    (note that we can't use a bootstrapped compiler yet
    due to binary incompatibility in partest)

commit eae7dac
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update check now that trait vals can be concrete, use names not letters

    note the progression in a concrete trait val now being recognized as such
    ```
    -trait T => true
    -method $init$ => false
    -value z1 => true
    -value z2 => true // z2 is actually concrete!
    ```

commit 6555c74
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    bootstraps again by running info transform once per class...

    not sure how this ever worked, as separate compilation would transform a trait's info
    multiple times, resulting in double defs...

commit 273cb20
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    skip presuper vals in new encoding

commit 728e71e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    incoherent cyclic references between synthesized members

    must replace old trait accessor symbols by mixed in symbols
    in the infos of the mixed in symbols

    ```
    trait T { val a: String ; val b: a.type }
    class C extends T {
      // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
    }
    ```

    symbols occurring in types of synthesized members
    do not get rebound to other synthesized symbols

    package <empty>#4 {
      abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
        <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
        N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
        <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
        N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
      };
      abstract class M#7353 extends scala#22.AnyRef#2378 {
        <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
          M#7353.super.<init>scala#2719();
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
        <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
      };
      class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
        <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
        <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
        <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
        <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
        <method> def <init>#14997(): <empty>#3.this.C#7354 = {
          C#7354.super.<init>#13465();
          ()
        }
      }
    }

    [running phase pickler on dependent_rebind.scala]
    [running phase refchecks on dependent_rebind.scala]
    test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
     value n #15017 has incompatible type;
     found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
     required: => N#7352.this.self#7442.type
    class C extends M with N
          ^

    pos/t9111-inliner-workaround revealed need for:
-  override def transformInfo(sym: Symbol, tp: Type): Type = synthFieldsAndAccessors(tp)
+  override def transformInfo(sym: Symbol, tp: Type): Type = if (!sym.isJavaDefined) synthFieldsAndAccessors(tp) else tp

commit b56ca2f
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    static forwarders & private[this] val in trait

    object Properties extends PropertiesTrait

    trait PropertiesTrait {
      // the protected member is not emitted as a static member of  -- it works when dropping the access modifier
      // somehow, the module class member is considered deferred in BForwardersGen
      protected val propFilename: String = /
    }

    // [log jvm] No forwarder for 'getter propFilename' from Properties to 'module class Properties': false || m.isDeferred == true || false || false

    // the following method is missing compared to scalac
    // public final class Properties {
    //     public static String propFilename() {
    //         return Properties$.MODULE$.propFilename();
    //     }

    trait Chars {
      private[this] val char2uescapeArray = Array[Char]('\', 'u', 0, 0, 0, 0)
    }

    object Chars extends Chars

    // +++ w/reflect/scala/reflect/internal/Chars$.class
    // -  private final [C scala83014char2uescapeArray

    constant fold in forwarder for backwards compat
    constant-typed final val in trait should yield impl method

    bean{setter,getter} delegates to setter/getter (commit 1655d1b)
retronym pushed a commit to retronym/scala that referenced this pull request Feb 11, 2016
the info-transformed of constructors:
  - traits receive trait-setters for vals
  - classes receive fields & accessors for mixed in traits

Constructors tree transformer
  - makes trees for decls added during above info transform
  - adds mixin super calls to the primary constructor

```
trait OneConcreteVal[T] {
var x = 1 // : T = ???
def foo = x
}

trait OneOtherConcreteVal[T] {
var y: T = ???
}

class C extends OneConcreteVal[Int] with OneOtherConcreteVal[String]
```

we don't have a field -- only a getter -- so,
where will we keep non-getter but-field annotations?

mixin only deals with lazy accessors/vals

do not used referenced to correlate getter/setter
it messes with paramaccessor's usage, and we don't really need it

make sure to clone info's, so we don't share symbols for method args
this manifests itself as an exception in lambdalift, finding proxies

Use NEEDS_TREES for all comms between InfoTransform and tree transform

yep, need SYNTHESIZE_IMPL_IN_SUBCLASS

distinguish accessors that should be mixed into subclass,
and those that simply need to be implemented in tree transform,
after info transform added the decl

commit 4b4932e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 days ago

    do assignment to trait fields in AddInterfaces

    regular class vals get assignments during constructors, as before

impl classes get accessors + assignments through trait setters in addinterfaces
so that constructors acts on them there,
and produced the init method in the required spot (the impl class)

bootstrapped compiler needs new partest

commit baf568d
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    produce identical bytecode for constant trait val getters

    I couldn't bring myself to emit the unused fields that we
    used to emit for constant vals, even though the getters
    immediately return the constant, and thus the field goes unused.

    In the next version, there's no need to synthesize impls
    for these in subclasses -- the getter can be implemented
    in the interface.

commit b9052da
Author: Lukas Rytz <lukas.rytz@gmail.com>
Date:   3 weeks ago

    Fix enclosing method attribute for classes nested in trait fields

    Trait fields are now created as MethodSymbol (no longer TermSymbol).
    This symbol shows up in the `originalOwner` chain of a class declared
    within the field initializer. This promoted the field getter to
    being the enclosing method of the nested class, which it is not
    (the EnclosingMethod attribute is a source-level property).

commit cf845ab
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    don't suppress field for unit-typed vals

    it affects the memory model -- even a write of unit to a field is relevant...

commit 337a9dd
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    unit-typed lazy vals should never receive a field

    this need was unmasked by test/files/run/t7843-jsr223-service.scala,
    which no longer printed the output expected from the `0 to 10 foreach`

    Currently failing tests:

     - test/files/pos/t6780.scala
     - test/files/neg/anytrait.scala
     - test/files/neg/delayed-init-ref.scala
     - test/files/neg/t562.scala
     - test/files/neg/t6276.scala
     - test/files/run/delambdafy_uncurry_byname_inline.scala
     - test/files/run/delambdafy_uncurry_byname_method.scala
     - test/files/run/delambdafy_uncurry_inline.scala
     - test/files/run/delambdafy_uncurry_method.scala
     - test/files/run/inner-obj-auto.scala
     - test/files/run/lazy-traits.scala
     - test/files/run/reify_lazyunit.scala
     - test/files/run/showraw_mods.scala
     - test/files/run/t3670.scala
     - test/files/run/t3980.scala
     - test/files/run/t4047.scala
     - test/files/run/t6622.scala
     - test/files/run/t7406.scala
     - test/files/run/t7843-jsr223-service.scala
     - test/files/jvm/innerClassAttribute
     - test/files/specialized/SI-7343.scala
     - test/files/specialized/constant_lambda.scala
     - test/files/specialized/spec-early.scala
     - test/files/specialized/spec-init.scala
     - test/files/specialized/spec-matrix-new.scala
     - test/files/specialized/spec-matrix-old.scala
     - test/files/presentation/scope-completion-3

commit b1b4e5c
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    wip: lambdalift fix

    test/files/trait-defaults/lambdalift.scala works,
    but still some related tests failing

    (note that we can't use a bootstrapped compiler yet
    due to binary incompatibility in partest)

commit eae7dac
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update check now that trait vals can be concrete, use names not letters

    note the progression in a concrete trait val now being recognized as such
    ```
    -trait T => true
    -method $init$ => false
    -value z1 => true
    -value z2 => true // z2 is actually concrete!
    ```

commit 6555c74
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    bootstraps again by running info transform once per class...

    not sure how this ever worked, as separate compilation would transform a trait's info
    multiple times, resulting in double defs...

commit 273cb20
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    skip presuper vals in new encoding

commit 728e71e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    incoherent cyclic references between synthesized members

    must replace old trait accessor symbols by mixed in symbols
    in the infos of the mixed in symbols

    ```
    trait T { val a: String ; val b: a.type }
    class C extends T {
      // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
    }
    ```

    symbols occurring in types of synthesized members
    do not get rebound to other synthesized symbols

    package <empty>#4 {
      abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
        <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
        N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
        <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
        N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
      };
      abstract class M#7353 extends scala#22.AnyRef#2378 {
        <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
          M#7353.super.<init>scala#2719();
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
        <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
      };
      class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
        <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
        <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
        <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
        <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
        <method> def <init>#14997(): <empty>#3.this.C#7354 = {
          C#7354.super.<init>#13465();
          ()
        }
      }
    }

    [running phase pickler on dependent_rebind.scala]
    [running phase refchecks on dependent_rebind.scala]
    test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
     value n #15017 has incompatible type;
     found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
     required: => N#7352.this.self#7442.type
    class C extends M with N
          ^

    pos/t9111-inliner-workaround revealed need for:
-  override def transformInfo(sym: Symbol, tp: Type): Type = synthFieldsAndAccessors(tp)
+  override def transformInfo(sym: Symbol, tp: Type): Type = if (!sym.isJavaDefined) synthFieldsAndAccessors(tp) else tp

commit b56ca2f
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    static forwarders & private[this] val in trait

    object Properties extends PropertiesTrait

    trait PropertiesTrait {
      // the protected member is not emitted as a static member of  -- it works when dropping the access modifier
      // somehow, the module class member is considered deferred in BForwardersGen
      protected val propFilename: String = /
    }

    // [log jvm] No forwarder for 'getter propFilename' from Properties to 'module class Properties': false || m.isDeferred == true || false || false

    // the following method is missing compared to scalac
    // public final class Properties {
    //     public static String propFilename() {
    //         return Properties$.MODULE$.propFilename();
    //     }

    trait Chars {
      private[this] val char2uescapeArray = Array[Char]('\', 'u', 0, 0, 0, 0)
    }

    object Chars extends Chars

    // +++ w/reflect/scala/reflect/internal/Chars$.class
    // -  private final [C scala83014char2uescapeArray

    constant fold in forwarder for backwards compat
    constant-typed final val in trait should yield impl method

    bean{setter,getter} delegates to setter/getter (commit 1655d1b)
retronym pushed a commit to retronym/scala that referenced this pull request Feb 12, 2016
the info-transformed of constructors:
  - traits receive trait-setters for vals
  - classes receive fields & accessors for mixed in traits

Constructors tree transformer
  - makes trees for decls added during above info transform
  - adds mixin super calls to the primary constructor

```
trait OneConcreteVal[T] {
var x = 1 // : T = ???
def foo = x
}

trait OneOtherConcreteVal[T] {
var y: T = ???
}

class C extends OneConcreteVal[Int] with OneOtherConcreteVal[String]
```

we don't have a field -- only a getter -- so,
where will we keep non-getter but-field annotations?

mixin only deals with lazy accessors/vals

do not used referenced to correlate getter/setter
it messes with paramaccessor's usage, and we don't really need it

make sure to clone info's, so we don't share symbols for method args
this manifests itself as an exception in lambdalift, finding proxies

Use NEEDS_TREES for all comms between InfoTransform and tree transform

yep, need SYNTHESIZE_IMPL_IN_SUBCLASS

distinguish accessors that should be mixed into subclass,
and those that simply need to be implemented in tree transform,
after info transform added the decl

commit 4b4932e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 days ago

    do assignment to trait fields in AddInterfaces

    regular class vals get assignments during constructors, as before

impl classes get accessors + assignments through trait setters in addinterfaces
so that constructors acts on them there,
and produced the init method in the required spot (the impl class)

bootstrapped compiler needs new partest

commit baf568d
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    produce identical bytecode for constant trait val getters

    I couldn't bring myself to emit the unused fields that we
    used to emit for constant vals, even though the getters
    immediately return the constant, and thus the field goes unused.

    In the next version, there's no need to synthesize impls
    for these in subclasses -- the getter can be implemented
    in the interface.

commit b9052da
Author: Lukas Rytz <lukas.rytz@gmail.com>
Date:   3 weeks ago

    Fix enclosing method attribute for classes nested in trait fields

    Trait fields are now created as MethodSymbol (no longer TermSymbol).
    This symbol shows up in the `originalOwner` chain of a class declared
    within the field initializer. This promoted the field getter to
    being the enclosing method of the nested class, which it is not
    (the EnclosingMethod attribute is a source-level property).

commit cf845ab
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    don't suppress field for unit-typed vals

    it affects the memory model -- even a write of unit to a field is relevant...

commit 337a9dd
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    unit-typed lazy vals should never receive a field

    this need was unmasked by test/files/run/t7843-jsr223-service.scala,
    which no longer printed the output expected from the `0 to 10 foreach`

    Currently failing tests:

     - test/files/pos/t6780.scala
     - test/files/neg/anytrait.scala
     - test/files/neg/delayed-init-ref.scala
     - test/files/neg/t562.scala
     - test/files/neg/t6276.scala
     - test/files/run/delambdafy_uncurry_byname_inline.scala
     - test/files/run/delambdafy_uncurry_byname_method.scala
     - test/files/run/delambdafy_uncurry_inline.scala
     - test/files/run/delambdafy_uncurry_method.scala
     - test/files/run/inner-obj-auto.scala
     - test/files/run/lazy-traits.scala
     - test/files/run/reify_lazyunit.scala
     - test/files/run/showraw_mods.scala
     - test/files/run/t3670.scala
     - test/files/run/t3980.scala
     - test/files/run/t4047.scala
     - test/files/run/t6622.scala
     - test/files/run/t7406.scala
     - test/files/run/t7843-jsr223-service.scala
     - test/files/jvm/innerClassAttribute
     - test/files/specialized/SI-7343.scala
     - test/files/specialized/constant_lambda.scala
     - test/files/specialized/spec-early.scala
     - test/files/specialized/spec-init.scala
     - test/files/specialized/spec-matrix-new.scala
     - test/files/specialized/spec-matrix-old.scala
     - test/files/presentation/scope-completion-3

commit b1b4e5c
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    wip: lambdalift fix

    test/files/trait-defaults/lambdalift.scala works,
    but still some related tests failing

    (note that we can't use a bootstrapped compiler yet
    due to binary incompatibility in partest)

commit eae7dac
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update check now that trait vals can be concrete, use names not letters

    note the progression in a concrete trait val now being recognized as such
    ```
    -trait T => true
    -method $init$ => false
    -value z1 => true
    -value z2 => true // z2 is actually concrete!
    ```

commit 6555c74
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    bootstraps again by running info transform once per class...

    not sure how this ever worked, as separate compilation would transform a trait's info
    multiple times, resulting in double defs...

commit 273cb20
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    skip presuper vals in new encoding

commit 728e71e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    incoherent cyclic references between synthesized members

    must replace old trait accessor symbols by mixed in symbols
    in the infos of the mixed in symbols

    ```
    trait T { val a: String ; val b: a.type }
    class C extends T {
      // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
    }
    ```

    symbols occurring in types of synthesized members
    do not get rebound to other synthesized symbols

    package <empty>#4 {
      abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
        <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
        N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
        <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
        N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
      };
      abstract class M#7353 extends scala#22.AnyRef#2378 {
        <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
          M#7353.super.<init>scala#2719();
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
        <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
      };
      class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
        <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
        <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
        <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
        <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
        <method> def <init>#14997(): <empty>#3.this.C#7354 = {
          C#7354.super.<init>#13465();
          ()
        }
      }
    }

    [running phase pickler on dependent_rebind.scala]
    [running phase refchecks on dependent_rebind.scala]
    test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
     value n #15017 has incompatible type;
     found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
     required: => N#7352.this.self#7442.type
    class C extends M with N
          ^

    pos/t9111-inliner-workaround revealed need for:
-  override def transformInfo(sym: Symbol, tp: Type): Type = synthFieldsAndAccessors(tp)
+  override def transformInfo(sym: Symbol, tp: Type): Type = if (!sym.isJavaDefined) synthFieldsAndAccessors(tp) else tp

commit b56ca2f
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    static forwarders & private[this] val in trait

    object Properties extends PropertiesTrait

    trait PropertiesTrait {
      // the protected member is not emitted as a static member of  -- it works when dropping the access modifier
      // somehow, the module class member is considered deferred in BForwardersGen
      protected val propFilename: String = /
    }

    // [log jvm] No forwarder for 'getter propFilename' from Properties to 'module class Properties': false || m.isDeferred == true || false || false

    // the following method is missing compared to scalac
    // public final class Properties {
    //     public static String propFilename() {
    //         return Properties$.MODULE$.propFilename();
    //     }

    trait Chars {
      private[this] val char2uescapeArray = Array[Char]('\', 'u', 0, 0, 0, 0)
    }

    object Chars extends Chars

    // +++ w/reflect/scala/reflect/internal/Chars$.class
    // -  private final [C scala83014char2uescapeArray

    constant fold in forwarder for backwards compat
    constant-typed final val in trait should yield impl method

    bean{setter,getter} delegates to setter/getter (commit 1655d1b)
retronym pushed a commit to retronym/scala that referenced this pull request Feb 17, 2016
the info-transformed of constructors:
  - traits receive trait-setters for vals
  - classes receive fields & accessors for mixed in traits

Constructors tree transformer
  - makes trees for decls added during above info transform
  - adds mixin super calls to the primary constructor

```
trait OneConcreteVal[T] {
var x = 1 // : T = ???
def foo = x
}

trait OneOtherConcreteVal[T] {
var y: T = ???
}

class C extends OneConcreteVal[Int] with OneOtherConcreteVal[String]
```

we don't have a field -- only a getter -- so,
where will we keep non-getter but-field annotations?

mixin only deals with lazy accessors/vals

do not used referenced to correlate getter/setter
it messes with paramaccessor's usage, and we don't really need it

make sure to clone info's, so we don't share symbols for method args
this manifests itself as an exception in lambdalift, finding proxies

Use NEEDS_TREES for all comms between InfoTransform and tree transform

yep, need SYNTHESIZE_IMPL_IN_SUBCLASS

distinguish accessors that should be mixed into subclass,
and those that simply need to be implemented in tree transform,
after info transform added the decl

commit 4b4932e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 days ago

    do assignment to trait fields in AddInterfaces

    regular class vals get assignments during constructors, as before

impl classes get accessors + assignments through trait setters in addinterfaces
so that constructors acts on them there,
and produced the init method in the required spot (the impl class)

bootstrapped compiler needs new partest

commit baf568d
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    produce identical bytecode for constant trait val getters

    I couldn't bring myself to emit the unused fields that we
    used to emit for constant vals, even though the getters
    immediately return the constant, and thus the field goes unused.

    In the next version, there's no need to synthesize impls
    for these in subclasses -- the getter can be implemented
    in the interface.

commit b9052da
Author: Lukas Rytz <lukas.rytz@gmail.com>
Date:   3 weeks ago

    Fix enclosing method attribute for classes nested in trait fields

    Trait fields are now created as MethodSymbol (no longer TermSymbol).
    This symbol shows up in the `originalOwner` chain of a class declared
    within the field initializer. This promoted the field getter to
    being the enclosing method of the nested class, which it is not
    (the EnclosingMethod attribute is a source-level property).

commit cf845ab
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    don't suppress field for unit-typed vals

    it affects the memory model -- even a write of unit to a field is relevant...

commit 337a9dd
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    unit-typed lazy vals should never receive a field

    this need was unmasked by test/files/run/t7843-jsr223-service.scala,
    which no longer printed the output expected from the `0 to 10 foreach`

    Currently failing tests:

     - test/files/pos/t6780.scala
     - test/files/neg/anytrait.scala
     - test/files/neg/delayed-init-ref.scala
     - test/files/neg/t562.scala
     - test/files/neg/t6276.scala
     - test/files/run/delambdafy_uncurry_byname_inline.scala
     - test/files/run/delambdafy_uncurry_byname_method.scala
     - test/files/run/delambdafy_uncurry_inline.scala
     - test/files/run/delambdafy_uncurry_method.scala
     - test/files/run/inner-obj-auto.scala
     - test/files/run/lazy-traits.scala
     - test/files/run/reify_lazyunit.scala
     - test/files/run/showraw_mods.scala
     - test/files/run/t3670.scala
     - test/files/run/t3980.scala
     - test/files/run/t4047.scala
     - test/files/run/t6622.scala
     - test/files/run/t7406.scala
     - test/files/run/t7843-jsr223-service.scala
     - test/files/jvm/innerClassAttribute
     - test/files/specialized/SI-7343.scala
     - test/files/specialized/constant_lambda.scala
     - test/files/specialized/spec-early.scala
     - test/files/specialized/spec-init.scala
     - test/files/specialized/spec-matrix-new.scala
     - test/files/specialized/spec-matrix-old.scala
     - test/files/presentation/scope-completion-3

commit b1b4e5c
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    wip: lambdalift fix

    test/files/trait-defaults/lambdalift.scala works,
    but still some related tests failing

    (note that we can't use a bootstrapped compiler yet
    due to binary incompatibility in partest)

commit eae7dac
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update check now that trait vals can be concrete, use names not letters

    note the progression in a concrete trait val now being recognized as such
    ```
    -trait T => true
    -method $init$ => false
    -value z1 => true
    -value z2 => true // z2 is actually concrete!
    ```

commit 6555c74
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    bootstraps again by running info transform once per class...

    not sure how this ever worked, as separate compilation would transform a trait's info
    multiple times, resulting in double defs...

commit 273cb20
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    skip presuper vals in new encoding

commit 728e71e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    incoherent cyclic references between synthesized members

    must replace old trait accessor symbols by mixed in symbols
    in the infos of the mixed in symbols

    ```
    trait T { val a: String ; val b: a.type }
    class C extends T {
      // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
    }
    ```

    symbols occurring in types of synthesized members
    do not get rebound to other synthesized symbols

    package <empty>#4 {
      abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
        <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
        N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
        <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
        N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
      };
      abstract class M#7353 extends scala#22.AnyRef#2378 {
        <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
          M#7353.super.<init>scala#2719();
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
        <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
      };
      class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
        <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
        <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
        <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
        <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
        <method> def <init>#14997(): <empty>#3.this.C#7354 = {
          C#7354.super.<init>#13465();
          ()
        }
      }
    }

    [running phase pickler on dependent_rebind.scala]
    [running phase refchecks on dependent_rebind.scala]
    test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
     value n #15017 has incompatible type;
     found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
     required: => N#7352.this.self#7442.type
    class C extends M with N
          ^

    pos/t9111-inliner-workaround revealed need for:
-  override def transformInfo(sym: Symbol, tp: Type): Type = synthFieldsAndAccessors(tp)
+  override def transformInfo(sym: Symbol, tp: Type): Type = if (!sym.isJavaDefined) synthFieldsAndAccessors(tp) else tp

commit b56ca2f
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    static forwarders & private[this] val in trait

    object Properties extends PropertiesTrait

    trait PropertiesTrait {
      // the protected member is not emitted as a static member of  -- it works when dropping the access modifier
      // somehow, the module class member is considered deferred in BForwardersGen
      protected val propFilename: String = /
    }

    // [log jvm] No forwarder for 'getter propFilename' from Properties to 'module class Properties': false || m.isDeferred == true || false || false

    // the following method is missing compared to scalac
    // public final class Properties {
    //     public static String propFilename() {
    //         return Properties$.MODULE$.propFilename();
    //     }

    trait Chars {
      private[this] val char2uescapeArray = Array[Char]('\', 'u', 0, 0, 0, 0)
    }

    object Chars extends Chars

    // +++ w/reflect/scala/reflect/internal/Chars$.class
    // -  private final [C scala83014char2uescapeArray

    constant fold in forwarder for backwards compat
    constant-typed final val in trait should yield impl method

    bean{setter,getter} delegates to setter/getter (commit 1655d1b)
retronym pushed a commit to retronym/scala that referenced this pull request Feb 18, 2016
the info-transformed of constructors:
  - traits receive trait-setters for vals
  - classes receive fields & accessors for mixed in traits

Constructors tree transformer
  - makes trees for decls added during above info transform
  - adds mixin super calls to the primary constructor

```
trait OneConcreteVal[T] {
var x = 1 // : T = ???
def foo = x
}

trait OneOtherConcreteVal[T] {
var y: T = ???
}

class C extends OneConcreteVal[Int] with OneOtherConcreteVal[String]
```

we don't have a field -- only a getter -- so,
where will we keep non-getter but-field annotations?

mixin only deals with lazy accessors/vals

do not used referenced to correlate getter/setter
it messes with paramaccessor's usage, and we don't really need it

make sure to clone info's, so we don't share symbols for method args
this manifests itself as an exception in lambdalift, finding proxies

Use NEEDS_TREES for all comms between InfoTransform and tree transform

yep, need SYNTHESIZE_IMPL_IN_SUBCLASS

distinguish accessors that should be mixed into subclass,
and those that simply need to be implemented in tree transform,
after info transform added the decl

commit 4b4932e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 days ago

    do assignment to trait fields in AddInterfaces

    regular class vals get assignments during constructors, as before

impl classes get accessors + assignments through trait setters in addinterfaces
so that constructors acts on them there,
and produced the init method in the required spot (the impl class)

bootstrapped compiler needs new partest

commit baf568d
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    produce identical bytecode for constant trait val getters

    I couldn't bring myself to emit the unused fields that we
    used to emit for constant vals, even though the getters
    immediately return the constant, and thus the field goes unused.

    In the next version, there's no need to synthesize impls
    for these in subclasses -- the getter can be implemented
    in the interface.

commit b9052da
Author: Lukas Rytz <lukas.rytz@gmail.com>
Date:   3 weeks ago

    Fix enclosing method attribute for classes nested in trait fields

    Trait fields are now created as MethodSymbol (no longer TermSymbol).
    This symbol shows up in the `originalOwner` chain of a class declared
    within the field initializer. This promoted the field getter to
    being the enclosing method of the nested class, which it is not
    (the EnclosingMethod attribute is a source-level property).

commit cf845ab
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    don't suppress field for unit-typed vals

    it affects the memory model -- even a write of unit to a field is relevant...

commit 337a9dd
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    unit-typed lazy vals should never receive a field

    this need was unmasked by test/files/run/t7843-jsr223-service.scala,
    which no longer printed the output expected from the `0 to 10 foreach`

    Currently failing tests:

     - test/files/pos/t6780.scala
     - test/files/neg/anytrait.scala
     - test/files/neg/delayed-init-ref.scala
     - test/files/neg/t562.scala
     - test/files/neg/t6276.scala
     - test/files/run/delambdafy_uncurry_byname_inline.scala
     - test/files/run/delambdafy_uncurry_byname_method.scala
     - test/files/run/delambdafy_uncurry_inline.scala
     - test/files/run/delambdafy_uncurry_method.scala
     - test/files/run/inner-obj-auto.scala
     - test/files/run/lazy-traits.scala
     - test/files/run/reify_lazyunit.scala
     - test/files/run/showraw_mods.scala
     - test/files/run/t3670.scala
     - test/files/run/t3980.scala
     - test/files/run/t4047.scala
     - test/files/run/t6622.scala
     - test/files/run/t7406.scala
     - test/files/run/t7843-jsr223-service.scala
     - test/files/jvm/innerClassAttribute
     - test/files/specialized/SI-7343.scala
     - test/files/specialized/constant_lambda.scala
     - test/files/specialized/spec-early.scala
     - test/files/specialized/spec-init.scala
     - test/files/specialized/spec-matrix-new.scala
     - test/files/specialized/spec-matrix-old.scala
     - test/files/presentation/scope-completion-3

commit b1b4e5c
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    wip: lambdalift fix

    test/files/trait-defaults/lambdalift.scala works,
    but still some related tests failing

    (note that we can't use a bootstrapped compiler yet
    due to binary incompatibility in partest)

commit eae7dac
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update check now that trait vals can be concrete, use names not letters

    note the progression in a concrete trait val now being recognized as such
    ```
    -trait T => true
    -method $init$ => false
    -value z1 => true
    -value z2 => true // z2 is actually concrete!
    ```

commit 6555c74
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    bootstraps again by running info transform once per class...

    not sure how this ever worked, as separate compilation would transform a trait's info
    multiple times, resulting in double defs...

commit 273cb20
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    skip presuper vals in new encoding

commit 728e71e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    incoherent cyclic references between synthesized members

    must replace old trait accessor symbols by mixed in symbols
    in the infos of the mixed in symbols

    ```
    trait T { val a: String ; val b: a.type }
    class C extends T {
      // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
    }
    ```

    symbols occurring in types of synthesized members
    do not get rebound to other synthesized symbols

    package <empty>#4 {
      abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
        <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
        N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
        <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
        N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
      };
      abstract class M#7353 extends scala#22.AnyRef#2378 {
        <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
          M#7353.super.<init>scala#2719();
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
        <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
      };
      class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
        <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
        <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
        <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
        <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
        <method> def <init>#14997(): <empty>#3.this.C#7354 = {
          C#7354.super.<init>#13465();
          ()
        }
      }
    }

    [running phase pickler on dependent_rebind.scala]
    [running phase refchecks on dependent_rebind.scala]
    test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
     value n #15017 has incompatible type;
     found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
     required: => N#7352.this.self#7442.type
    class C extends M with N
          ^

    pos/t9111-inliner-workaround revealed need for:
-  override def transformInfo(sym: Symbol, tp: Type): Type = synthFieldsAndAccessors(tp)
+  override def transformInfo(sym: Symbol, tp: Type): Type = if (!sym.isJavaDefined) synthFieldsAndAccessors(tp) else tp

commit b56ca2f
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    static forwarders & private[this] val in trait

    object Properties extends PropertiesTrait

    trait PropertiesTrait {
      // the protected member is not emitted as a static member of  -- it works when dropping the access modifier
      // somehow, the module class member is considered deferred in BForwardersGen
      protected val propFilename: String = /
    }

    // [log jvm] No forwarder for 'getter propFilename' from Properties to 'module class Properties': false || m.isDeferred == true || false || false

    // the following method is missing compared to scalac
    // public final class Properties {
    //     public static String propFilename() {
    //         return Properties$.MODULE$.propFilename();
    //     }

    trait Chars {
      private[this] val char2uescapeArray = Array[Char]('\', 'u', 0, 0, 0, 0)
    }

    object Chars extends Chars

    // +++ w/reflect/scala/reflect/internal/Chars$.class
    // -  private final [C scala83014char2uescapeArray

    constant fold in forwarder for backwards compat
    constant-typed final val in trait should yield impl method

    bean{setter,getter} delegates to setter/getter (commit 1655d1b)
adriaanm added a commit to adriaanm/scala that referenced this pull request Mar 15, 2016
the info-transformed of constructors:
  - traits receive trait-setters for vals
  - classes receive fields & accessors for mixed in traits

Constructors tree transformer
  - makes trees for decls added during above info transform
  - adds mixin super calls to the primary constructor

```
trait OneConcreteVal[T] {
var x = 1 // : T = ???
def foo = x
}

trait OneOtherConcreteVal[T] {
var y: T = ???
}

class C extends OneConcreteVal[Int] with OneOtherConcreteVal[String]
```

we don't have a field -- only a getter -- so,
where will we keep non-getter but-field annotations?

mixin only deals with lazy accessors/vals

do not used referenced to correlate getter/setter
it messes with paramaccessor's usage, and we don't really need it

make sure to clone info's, so we don't share symbols for method args
this manifests itself as an exception in lambdalift, finding proxies

Use NEEDS_TREES for all comms between InfoTransform and tree transform

yep, need SYNTHESIZE_IMPL_IN_SUBCLASS

distinguish accessors that should be mixed into subclass,
and those that simply need to be implemented in tree transform,
after info transform added the decl

commit 4b4932e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 days ago

    do assignment to trait fields in AddInterfaces

    regular class vals get assignments during constructors, as before

impl classes get accessors + assignments through trait setters in addinterfaces
so that constructors acts on them there,
and produced the init method in the required spot (the impl class)

bootstrapped compiler needs new partest

commit baf568d
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    produce identical bytecode for constant trait val getters

    I couldn't bring myself to emit the unused fields that we
    used to emit for constant vals, even though the getters
    immediately return the constant, and thus the field goes unused.

    In the next version, there's no need to synthesize impls
    for these in subclasses -- the getter can be implemented
    in the interface.

commit b9052da
Author: Lukas Rytz <lukas.rytz@gmail.com>
Date:   3 weeks ago

    Fix enclosing method attribute for classes nested in trait fields

    Trait fields are now created as MethodSymbol (no longer TermSymbol).
    This symbol shows up in the `originalOwner` chain of a class declared
    within the field initializer. This promoted the field getter to
    being the enclosing method of the nested class, which it is not
    (the EnclosingMethod attribute is a source-level property).

commit cf845ab
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    don't suppress field for unit-typed vals

    it affects the memory model -- even a write of unit to a field is relevant...

commit 337a9dd
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    unit-typed lazy vals should never receive a field

    this need was unmasked by test/files/run/t7843-jsr223-service.scala,
    which no longer printed the output expected from the `0 to 10 foreach`

    Currently failing tests:

     - test/files/pos/t6780.scala
     - test/files/neg/anytrait.scala
     - test/files/neg/delayed-init-ref.scala
     - test/files/neg/t562.scala
     - test/files/neg/t6276.scala
     - test/files/run/delambdafy_uncurry_byname_inline.scala
     - test/files/run/delambdafy_uncurry_byname_method.scala
     - test/files/run/delambdafy_uncurry_inline.scala
     - test/files/run/delambdafy_uncurry_method.scala
     - test/files/run/inner-obj-auto.scala
     - test/files/run/lazy-traits.scala
     - test/files/run/reify_lazyunit.scala
     - test/files/run/showraw_mods.scala
     - test/files/run/t3670.scala
     - test/files/run/t3980.scala
     - test/files/run/t4047.scala
     - test/files/run/t6622.scala
     - test/files/run/t7406.scala
     - test/files/run/t7843-jsr223-service.scala
     - test/files/jvm/innerClassAttribute
     - test/files/specialized/SI-7343.scala
     - test/files/specialized/constant_lambda.scala
     - test/files/specialized/spec-early.scala
     - test/files/specialized/spec-init.scala
     - test/files/specialized/spec-matrix-new.scala
     - test/files/specialized/spec-matrix-old.scala
     - test/files/presentation/scope-completion-3

commit b1b4e5c
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    wip: lambdalift fix

    test/files/trait-defaults/lambdalift.scala works,
    but still some related tests failing

    (note that we can't use a bootstrapped compiler yet
    due to binary incompatibility in partest)

commit eae7dac
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update check now that trait vals can be concrete, use names not letters

    note the progression in a concrete trait val now being recognized as such
    ```
    -trait T => true
    -method $init$ => false
    -value z1 => true
    -value z2 => true // z2 is actually concrete!
    ```

commit 6555c74
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    bootstraps again by running info transform once per class...

    not sure how this ever worked, as separate compilation would transform a trait's info
    multiple times, resulting in double defs...

commit 273cb20
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    skip presuper vals in new encoding

commit 728e71e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    incoherent cyclic references between synthesized members

    must replace old trait accessor symbols by mixed in symbols
    in the infos of the mixed in symbols

    ```
    trait T { val a: String ; val b: a.type }
    class C extends T {
      // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
    }
    ```

    symbols occurring in types of synthesized members
    do not get rebound to other synthesized symbols

    package <empty>#4 {
      abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
        <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
        N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
        <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
        N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
      };
      abstract class M#7353 extends scala#22.AnyRef#2378 {
        <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
          M#7353.super.<init>scala#2719();
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
        <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
      };
      class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
        <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
        <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
        <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
        <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
        <method> def <init>#14997(): <empty>#3.this.C#7354 = {
          C#7354.super.<init>#13465();
          ()
        }
      }
    }

    [running phase pickler on dependent_rebind.scala]
    [running phase refchecks on dependent_rebind.scala]
    test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
     value n #15017 has incompatible type;
     found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
     required: => N#7352.this.self#7442.type
    class C extends M with N
          ^

    pos/t9111-inliner-workaround revealed need for:
-  override def transformInfo(sym: Symbol, tp: Type): Type = synthFieldsAndAccessors(tp)
+  override def transformInfo(sym: Symbol, tp: Type): Type = if (!sym.isJavaDefined) synthFieldsAndAccessors(tp) else tp

commit b56ca2f
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    static forwarders & private[this] val in trait

    object Properties extends PropertiesTrait

    trait PropertiesTrait {
      // the protected member is not emitted as a static member of  -- it works when dropping the access modifier
      // somehow, the module class member is considered deferred in BForwardersGen
      protected val propFilename: String = /
    }

    // [log jvm] No forwarder for 'getter propFilename' from Properties to 'module class Properties': false || m.isDeferred == true || false || false

    // the following method is missing compared to scalac
    // public final class Properties {
    //     public static String propFilename() {
    //         return Properties$.MODULE$.propFilename();
    //     }

    trait Chars {
      private[this] val char2uescapeArray = Array[Char]('\', 'u', 0, 0, 0, 0)
    }

    object Chars extends Chars

    // +++ w/reflect/scala/reflect/internal/Chars$.class
    // -  private final [C scala83014char2uescapeArray

    constant fold in forwarder for backwards compat
    constant-typed final val in trait should yield impl method

    bean{setter,getter} delegates to setter/getter (commit 1655d1b)
adriaanm added a commit to adriaanm/scala that referenced this pull request Mar 15, 2016
the info-transformed of constructors:
  - traits receive trait-setters for vals
  - classes receive fields & accessors for mixed in traits

Constructors tree transformer
  - makes trees for decls added during above info transform
  - adds mixin super calls to the primary constructor

```
trait OneConcreteVal[T] {
var x = 1 // : T = ???
def foo = x
}

trait OneOtherConcreteVal[T] {
var y: T = ???
}

class C extends OneConcreteVal[Int] with OneOtherConcreteVal[String]
```

we don't have a field -- only a getter -- so,
where will we keep non-getter but-field annotations?

mixin only deals with lazy accessors/vals

do not used referenced to correlate getter/setter
it messes with paramaccessor's usage, and we don't really need it

make sure to clone info's, so we don't share symbols for method args
this manifests itself as an exception in lambdalift, finding proxies

Use NEEDS_TREES for all comms between InfoTransform and tree transform

yep, need SYNTHESIZE_IMPL_IN_SUBCLASS

distinguish accessors that should be mixed into subclass,
and those that simply need to be implemented in tree transform,
after info transform added the decl

commit 4b4932e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 days ago

    do assignment to trait fields in AddInterfaces

    regular class vals get assignments during constructors, as before

impl classes get accessors + assignments through trait setters in addinterfaces
so that constructors acts on them there,
and produced the init method in the required spot (the impl class)

bootstrapped compiler needs new partest

commit baf568d
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    produce identical bytecode for constant trait val getters

    I couldn't bring myself to emit the unused fields that we
    used to emit for constant vals, even though the getters
    immediately return the constant, and thus the field goes unused.

    In the next version, there's no need to synthesize impls
    for these in subclasses -- the getter can be implemented
    in the interface.

commit b9052da
Author: Lukas Rytz <lukas.rytz@gmail.com>
Date:   3 weeks ago

    Fix enclosing method attribute for classes nested in trait fields

    Trait fields are now created as MethodSymbol (no longer TermSymbol).
    This symbol shows up in the `originalOwner` chain of a class declared
    within the field initializer. This promoted the field getter to
    being the enclosing method of the nested class, which it is not
    (the EnclosingMethod attribute is a source-level property).

commit cf845ab
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    don't suppress field for unit-typed vals

    it affects the memory model -- even a write of unit to a field is relevant...

commit 337a9dd
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    unit-typed lazy vals should never receive a field

    this need was unmasked by test/files/run/t7843-jsr223-service.scala,
    which no longer printed the output expected from the `0 to 10 foreach`

    Currently failing tests:

     - test/files/pos/t6780.scala
     - test/files/neg/anytrait.scala
     - test/files/neg/delayed-init-ref.scala
     - test/files/neg/t562.scala
     - test/files/neg/t6276.scala
     - test/files/run/delambdafy_uncurry_byname_inline.scala
     - test/files/run/delambdafy_uncurry_byname_method.scala
     - test/files/run/delambdafy_uncurry_inline.scala
     - test/files/run/delambdafy_uncurry_method.scala
     - test/files/run/inner-obj-auto.scala
     - test/files/run/lazy-traits.scala
     - test/files/run/reify_lazyunit.scala
     - test/files/run/showraw_mods.scala
     - test/files/run/t3670.scala
     - test/files/run/t3980.scala
     - test/files/run/t4047.scala
     - test/files/run/t6622.scala
     - test/files/run/t7406.scala
     - test/files/run/t7843-jsr223-service.scala
     - test/files/jvm/innerClassAttribute
     - test/files/specialized/SI-7343.scala
     - test/files/specialized/constant_lambda.scala
     - test/files/specialized/spec-early.scala
     - test/files/specialized/spec-init.scala
     - test/files/specialized/spec-matrix-new.scala
     - test/files/specialized/spec-matrix-old.scala
     - test/files/presentation/scope-completion-3

commit b1b4e5c
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    wip: lambdalift fix

    test/files/trait-defaults/lambdalift.scala works,
    but still some related tests failing

    (note that we can't use a bootstrapped compiler yet
    due to binary incompatibility in partest)

commit eae7dac
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update check now that trait vals can be concrete, use names not letters

    note the progression in a concrete trait val now being recognized as such
    ```
    -trait T => true
    -method $init$ => false
    -value z1 => true
    -value z2 => true // z2 is actually concrete!
    ```

commit 6555c74
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    bootstraps again by running info transform once per class...

    not sure how this ever worked, as separate compilation would transform a trait's info
    multiple times, resulting in double defs...

commit 273cb20
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    skip presuper vals in new encoding

commit 728e71e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    incoherent cyclic references between synthesized members

    must replace old trait accessor symbols by mixed in symbols
    in the infos of the mixed in symbols

    ```
    trait T { val a: String ; val b: a.type }
    class C extends T {
      // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
    }
    ```

    symbols occurring in types of synthesized members
    do not get rebound to other synthesized symbols

    package <empty>#4 {
      abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
        <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
        N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
        <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
        N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
      };
      abstract class M#7353 extends scala#22.AnyRef#2378 {
        <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
          M#7353.super.<init>scala#2719();
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
        <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
      };
      class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
        <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
        <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
        <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
        <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
        <method> def <init>#14997(): <empty>#3.this.C#7354 = {
          C#7354.super.<init>#13465();
          ()
        }
      }
    }

    [running phase pickler on dependent_rebind.scala]
    [running phase refchecks on dependent_rebind.scala]
    test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
     value n #15017 has incompatible type;
     found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
     required: => N#7352.this.self#7442.type
    class C extends M with N
          ^

    pos/t9111-inliner-workaround revealed need for:
-  override def transformInfo(sym: Symbol, tp: Type): Type = synthFieldsAndAccessors(tp)
+  override def transformInfo(sym: Symbol, tp: Type): Type = if (!sym.isJavaDefined) synthFieldsAndAccessors(tp) else tp

commit b56ca2f
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    static forwarders & private[this] val in trait

    object Properties extends PropertiesTrait

    trait PropertiesTrait {
      // the protected member is not emitted as a static member of  -- it works when dropping the access modifier
      // somehow, the module class member is considered deferred in BForwardersGen
      protected val propFilename: String = /
    }

    // [log jvm] No forwarder for 'getter propFilename' from Properties to 'module class Properties': false || m.isDeferred == true || false || false

    // the following method is missing compared to scalac
    // public final class Properties {
    //     public static String propFilename() {
    //         return Properties$.MODULE$.propFilename();
    //     }

    trait Chars {
      private[this] val char2uescapeArray = Array[Char]('\', 'u', 0, 0, 0, 0)
    }

    object Chars extends Chars

    // +++ w/reflect/scala/reflect/internal/Chars$.class
    // -  private final [C scala83014char2uescapeArray

    constant fold in forwarder for backwards compat
    constant-typed final val in trait should yield impl method

    bean{setter,getter} delegates to setter/getter (commit 1655d1b)
adriaanm added a commit to adriaanm/scala that referenced this pull request Apr 28, 2016
the info-transformed of constructors:
  - traits receive trait-setters for vals
  - classes receive fields & accessors for mixed in traits

Constructors tree transformer
  - makes trees for decls added during above info transform
  - adds mixin super calls to the primary constructor

```
trait OneConcreteVal[T] {
var x = 1 // : T = ???
def foo = x
}

trait OneOtherConcreteVal[T] {
var y: T = ???
}

class C extends OneConcreteVal[Int] with OneOtherConcreteVal[String]
```

we don't have a field -- only a getter -- so,
where will we keep non-getter but-field annotations?

mixin only deals with lazy accessors/vals

do not used referenced to correlate getter/setter
it messes with paramaccessor's usage, and we don't really need it

make sure to clone info's, so we don't share symbols for method args
this manifests itself as an exception in lambdalift, finding proxies

Use NEEDS_TREES for all comms between InfoTransform and tree transform

yep, need SYNTHESIZE_IMPL_IN_SUBCLASS

distinguish accessors that should be mixed into subclass,
and those that simply need to be implemented in tree transform,
after info transform added the decl

commit 4b4932e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 days ago

    do assignment to trait fields in AddInterfaces

    regular class vals get assignments during constructors, as before

impl classes get accessors + assignments through trait setters in addinterfaces
so that constructors acts on them there,
and produced the init method in the required spot (the impl class)

bootstrapped compiler needs new partest

commit baf568d
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    produce identical bytecode for constant trait val getters

    I couldn't bring myself to emit the unused fields that we
    used to emit for constant vals, even though the getters
    immediately return the constant, and thus the field goes unused.

    In the next version, there's no need to synthesize impls
    for these in subclasses -- the getter can be implemented
    in the interface.

commit b9052da
Author: Lukas Rytz <lukas.rytz@gmail.com>
Date:   3 weeks ago

    Fix enclosing method attribute for classes nested in trait fields

    Trait fields are now created as MethodSymbol (no longer TermSymbol).
    This symbol shows up in the `originalOwner` chain of a class declared
    within the field initializer. This promoted the field getter to
    being the enclosing method of the nested class, which it is not
    (the EnclosingMethod attribute is a source-level property).

commit cf845ab
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    don't suppress field for unit-typed vals

    it affects the memory model -- even a write of unit to a field is relevant...

commit 337a9dd
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    unit-typed lazy vals should never receive a field

    this need was unmasked by test/files/run/t7843-jsr223-service.scala,
    which no longer printed the output expected from the `0 to 10 foreach`

    Currently failing tests:

     - test/files/pos/t6780.scala
     - test/files/neg/anytrait.scala
     - test/files/neg/delayed-init-ref.scala
     - test/files/neg/t562.scala
     - test/files/neg/t6276.scala
     - test/files/run/delambdafy_uncurry_byname_inline.scala
     - test/files/run/delambdafy_uncurry_byname_method.scala
     - test/files/run/delambdafy_uncurry_inline.scala
     - test/files/run/delambdafy_uncurry_method.scala
     - test/files/run/inner-obj-auto.scala
     - test/files/run/lazy-traits.scala
     - test/files/run/reify_lazyunit.scala
     - test/files/run/showraw_mods.scala
     - test/files/run/t3670.scala
     - test/files/run/t3980.scala
     - test/files/run/t4047.scala
     - test/files/run/t6622.scala
     - test/files/run/t7406.scala
     - test/files/run/t7843-jsr223-service.scala
     - test/files/jvm/innerClassAttribute
     - test/files/specialized/SI-7343.scala
     - test/files/specialized/constant_lambda.scala
     - test/files/specialized/spec-early.scala
     - test/files/specialized/spec-init.scala
     - test/files/specialized/spec-matrix-new.scala
     - test/files/specialized/spec-matrix-old.scala
     - test/files/presentation/scope-completion-3

commit b1b4e5c
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    wip: lambdalift fix

    test/files/trait-defaults/lambdalift.scala works,
    but still some related tests failing

    (note that we can't use a bootstrapped compiler yet
    due to binary incompatibility in partest)

commit eae7dac
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update check now that trait vals can be concrete, use names not letters

    note the progression in a concrete trait val now being recognized as such
    ```
    -trait T => true
    -method $init$ => false
    -value z1 => true
    -value z2 => true // z2 is actually concrete!
    ```

commit 6555c74
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    bootstraps again by running info transform once per class...

    not sure how this ever worked, as separate compilation would transform a trait's info
    multiple times, resulting in double defs...

commit 273cb20
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    skip presuper vals in new encoding

commit 728e71e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    incoherent cyclic references between synthesized members

    must replace old trait accessor symbols by mixed in symbols
    in the infos of the mixed in symbols

    ```
    trait T { val a: String ; val b: a.type }
    class C extends T {
      // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
    }
    ```

    symbols occurring in types of synthesized members
    do not get rebound to other synthesized symbols

    package <empty>#4 {
      abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
        <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
        N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
        <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
        N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
      };
      abstract class M#7353 extends scala#22.AnyRef#2378 {
        <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
          M#7353.super.<init>scala#2719();
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
        <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
      };
      class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
        <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
        <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
        <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
        <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
        <method> def <init>#14997(): <empty>#3.this.C#7354 = {
          C#7354.super.<init>#13465();
          ()
        }
      }
    }

    [running phase pickler on dependent_rebind.scala]
    [running phase refchecks on dependent_rebind.scala]
    test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
     value n #15017 has incompatible type;
     found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
     required: => N#7352.this.self#7442.type
    class C extends M with N
          ^

    pos/t9111-inliner-workaround revealed need for:
-  override def transformInfo(sym: Symbol, tp: Type): Type = synthFieldsAndAccessors(tp)
+  override def transformInfo(sym: Symbol, tp: Type): Type = if (!sym.isJavaDefined) synthFieldsAndAccessors(tp) else tp

commit b56ca2f
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    static forwarders & private[this] val in trait

    object Properties extends PropertiesTrait

    trait PropertiesTrait {
      // the protected member is not emitted as a static member of  -- it works when dropping the access modifier
      // somehow, the module class member is considered deferred in BForwardersGen
      protected val propFilename: String = /
    }

    // [log jvm] No forwarder for 'getter propFilename' from Properties to 'module class Properties': false || m.isDeferred == true || false || false

    // the following method is missing compared to scalac
    // public final class Properties {
    //     public static String propFilename() {
    //         return Properties$.MODULE$.propFilename();
    //     }

    trait Chars {
      private[this] val char2uescapeArray = Array[Char]('\', 'u', 0, 0, 0, 0)
    }

    object Chars extends Chars

    // +++ w/reflect/scala/reflect/internal/Chars$.class
    // -  private final [C scala83014char2uescapeArray

    constant fold in forwarder for backwards compat
    constant-typed final val in trait should yield impl method

    bean{setter,getter} delegates to setter/getter (commit 1655d1b)
adriaanm added a commit to adriaanm/scala that referenced this pull request Apr 29, 2016
the info-transformed of constructors:
  - traits receive trait-setters for vals
  - classes receive fields & accessors for mixed in traits

Constructors tree transformer
  - makes trees for decls added during above info transform
  - adds mixin super calls to the primary constructor

```
trait OneConcreteVal[T] {
var x = 1 // : T = ???
def foo = x
}

trait OneOtherConcreteVal[T] {
var y: T = ???
}

class C extends OneConcreteVal[Int] with OneOtherConcreteVal[String]
```

we don't have a field -- only a getter -- so,
where will we keep non-getter but-field annotations?

mixin only deals with lazy accessors/vals

do not used referenced to correlate getter/setter
it messes with paramaccessor's usage, and we don't really need it

make sure to clone info's, so we don't share symbols for method args
this manifests itself as an exception in lambdalift, finding proxies

Use NEEDS_TREES for all comms between InfoTransform and tree transform

yep, need SYNTHESIZE_IMPL_IN_SUBCLASS

distinguish accessors that should be mixed into subclass,
and those that simply need to be implemented in tree transform,
after info transform added the decl

commit 4b4932e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 days ago

    do assignment to trait fields in AddInterfaces

    regular class vals get assignments during constructors, as before

impl classes get accessors + assignments through trait setters in addinterfaces
so that constructors acts on them there,
and produced the init method in the required spot (the impl class)

bootstrapped compiler needs new partest

commit baf568d
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    produce identical bytecode for constant trait val getters

    I couldn't bring myself to emit the unused fields that we
    used to emit for constant vals, even though the getters
    immediately return the constant, and thus the field goes unused.

    In the next version, there's no need to synthesize impls
    for these in subclasses -- the getter can be implemented
    in the interface.

commit b9052da
Author: Lukas Rytz <lukas.rytz@gmail.com>
Date:   3 weeks ago

    Fix enclosing method attribute for classes nested in trait fields

    Trait fields are now created as MethodSymbol (no longer TermSymbol).
    This symbol shows up in the `originalOwner` chain of a class declared
    within the field initializer. This promoted the field getter to
    being the enclosing method of the nested class, which it is not
    (the EnclosingMethod attribute is a source-level property).

commit cf845ab
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    don't suppress field for unit-typed vals

    it affects the memory model -- even a write of unit to a field is relevant...

commit 337a9dd
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    unit-typed lazy vals should never receive a field

    this need was unmasked by test/files/run/t7843-jsr223-service.scala,
    which no longer printed the output expected from the `0 to 10 foreach`

    Currently failing tests:

     - test/files/pos/t6780.scala
     - test/files/neg/anytrait.scala
     - test/files/neg/delayed-init-ref.scala
     - test/files/neg/t562.scala
     - test/files/neg/t6276.scala
     - test/files/run/delambdafy_uncurry_byname_inline.scala
     - test/files/run/delambdafy_uncurry_byname_method.scala
     - test/files/run/delambdafy_uncurry_inline.scala
     - test/files/run/delambdafy_uncurry_method.scala
     - test/files/run/inner-obj-auto.scala
     - test/files/run/lazy-traits.scala
     - test/files/run/reify_lazyunit.scala
     - test/files/run/showraw_mods.scala
     - test/files/run/t3670.scala
     - test/files/run/t3980.scala
     - test/files/run/t4047.scala
     - test/files/run/t6622.scala
     - test/files/run/t7406.scala
     - test/files/run/t7843-jsr223-service.scala
     - test/files/jvm/innerClassAttribute
     - test/files/specialized/SI-7343.scala
     - test/files/specialized/constant_lambda.scala
     - test/files/specialized/spec-early.scala
     - test/files/specialized/spec-init.scala
     - test/files/specialized/spec-matrix-new.scala
     - test/files/specialized/spec-matrix-old.scala
     - test/files/presentation/scope-completion-3

commit b1b4e5c
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    wip: lambdalift fix

    test/files/trait-defaults/lambdalift.scala works,
    but still some related tests failing

    (note that we can't use a bootstrapped compiler yet
    due to binary incompatibility in partest)

commit eae7dac
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update check now that trait vals can be concrete, use names not letters

    note the progression in a concrete trait val now being recognized as such
    ```
    -trait T => true
    -method $init$ => false
    -value z1 => true
    -value z2 => true // z2 is actually concrete!
    ```

commit 6555c74
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    bootstraps again by running info transform once per class...

    not sure how this ever worked, as separate compilation would transform a trait's info
    multiple times, resulting in double defs...

commit 273cb20
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    skip presuper vals in new encoding

commit 728e71e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    incoherent cyclic references between synthesized members

    must replace old trait accessor symbols by mixed in symbols
    in the infos of the mixed in symbols

    ```
    trait T { val a: String ; val b: a.type }
    class C extends T {
      // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
    }
    ```

    symbols occurring in types of synthesized members
    do not get rebound to other synthesized symbols

    package <empty>#4 {
      abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
        <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
        N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
        <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
        N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
      };
      abstract class M#7353 extends scala#22.AnyRef#2378 {
        <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
          M#7353.super.<init>scala#2719();
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
        <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
      };
      class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
        <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
        <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
        <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
        <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
        <method> def <init>#14997(): <empty>#3.this.C#7354 = {
          C#7354.super.<init>#13465();
          ()
        }
      }
    }

    [running phase pickler on dependent_rebind.scala]
    [running phase refchecks on dependent_rebind.scala]
    test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
     value n #15017 has incompatible type;
     found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
     required: => N#7352.this.self#7442.type
    class C extends M with N
          ^

    pos/t9111-inliner-workaround revealed need for:
-  override def transformInfo(sym: Symbol, tp: Type): Type = synthFieldsAndAccessors(tp)
+  override def transformInfo(sym: Symbol, tp: Type): Type = if (!sym.isJavaDefined) synthFieldsAndAccessors(tp) else tp

commit b56ca2f
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    static forwarders & private[this] val in trait

    object Properties extends PropertiesTrait

    trait PropertiesTrait {
      // the protected member is not emitted as a static member of  -- it works when dropping the access modifier
      // somehow, the module class member is considered deferred in BForwardersGen
      protected val propFilename: String = /
    }

    // [log jvm] No forwarder for 'getter propFilename' from Properties to 'module class Properties': false || m.isDeferred == true || false || false

    // the following method is missing compared to scalac
    // public final class Properties {
    //     public static String propFilename() {
    //         return Properties$.MODULE$.propFilename();
    //     }

    trait Chars {
      private[this] val char2uescapeArray = Array[Char]('\', 'u', 0, 0, 0, 0)
    }

    object Chars extends Chars

    // +++ w/reflect/scala/reflect/internal/Chars$.class
    // -  private final [C scala83014char2uescapeArray

    constant fold in forwarder for backwards compat
    constant-typed final val in trait should yield impl method

    bean{setter,getter} delegates to setter/getter (commit 1655d1b)
adriaanm added a commit to adriaanm/scala that referenced this pull request May 16, 2016
the info-transformed of constructors:
  - traits receive trait-setters for vals
  - classes receive fields & accessors for mixed in traits

Constructors tree transformer
  - makes trees for decls added during above info transform
  - adds mixin super calls to the primary constructor

```
trait OneConcreteVal[T] {
var x = 1 // : T = ???
def foo = x
}

trait OneOtherConcreteVal[T] {
var y: T = ???
}

class C extends OneConcreteVal[Int] with OneOtherConcreteVal[String]
```

we don't have a field -- only a getter -- so,
where will we keep non-getter but-field annotations?

mixin only deals with lazy accessors/vals

do not used referenced to correlate getter/setter
it messes with paramaccessor's usage, and we don't really need it

make sure to clone info's, so we don't share symbols for method args
this manifests itself as an exception in lambdalift, finding proxies

Use NEEDS_TREES for all comms between InfoTransform and tree transform

yep, need SYNTHESIZE_IMPL_IN_SUBCLASS

distinguish accessors that should be mixed into subclass,
and those that simply need to be implemented in tree transform,
after info transform added the decl

commit 4b4932e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 days ago

    do assignment to trait fields in AddInterfaces

    regular class vals get assignments during constructors, as before

impl classes get accessors + assignments through trait setters in addinterfaces
so that constructors acts on them there,
and produced the init method in the required spot (the impl class)

bootstrapped compiler needs new partest

commit baf568d
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    produce identical bytecode for constant trait val getters

    I couldn't bring myself to emit the unused fields that we
    used to emit for constant vals, even though the getters
    immediately return the constant, and thus the field goes unused.

    In the next version, there's no need to synthesize impls
    for these in subclasses -- the getter can be implemented
    in the interface.

commit b9052da
Author: Lukas Rytz <lukas.rytz@gmail.com>
Date:   3 weeks ago

    Fix enclosing method attribute for classes nested in trait fields

    Trait fields are now created as MethodSymbol (no longer TermSymbol).
    This symbol shows up in the `originalOwner` chain of a class declared
    within the field initializer. This promoted the field getter to
    being the enclosing method of the nested class, which it is not
    (the EnclosingMethod attribute is a source-level property).

commit cf845ab
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   3 weeks ago

    don't suppress field for unit-typed vals

    it affects the memory model -- even a write of unit to a field is relevant...

commit 337a9dd
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    unit-typed lazy vals should never receive a field

    this need was unmasked by test/files/run/t7843-jsr223-service.scala,
    which no longer printed the output expected from the `0 to 10 foreach`

    Currently failing tests:

     - test/files/pos/t6780.scala
     - test/files/neg/anytrait.scala
     - test/files/neg/delayed-init-ref.scala
     - test/files/neg/t562.scala
     - test/files/neg/t6276.scala
     - test/files/run/delambdafy_uncurry_byname_inline.scala
     - test/files/run/delambdafy_uncurry_byname_method.scala
     - test/files/run/delambdafy_uncurry_inline.scala
     - test/files/run/delambdafy_uncurry_method.scala
     - test/files/run/inner-obj-auto.scala
     - test/files/run/lazy-traits.scala
     - test/files/run/reify_lazyunit.scala
     - test/files/run/showraw_mods.scala
     - test/files/run/t3670.scala
     - test/files/run/t3980.scala
     - test/files/run/t4047.scala
     - test/files/run/t6622.scala
     - test/files/run/t7406.scala
     - test/files/run/t7843-jsr223-service.scala
     - test/files/jvm/innerClassAttribute
     - test/files/specialized/SI-7343.scala
     - test/files/specialized/constant_lambda.scala
     - test/files/specialized/spec-early.scala
     - test/files/specialized/spec-init.scala
     - test/files/specialized/spec-matrix-new.scala
     - test/files/specialized/spec-matrix-old.scala
     - test/files/presentation/scope-completion-3

commit b1b4e5c
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    wip: lambdalift fix

    test/files/trait-defaults/lambdalift.scala works,
    but still some related tests failing

    (note that we can't use a bootstrapped compiler yet
    due to binary incompatibility in partest)

commit eae7dac
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    update check now that trait vals can be concrete, use names not letters

    note the progression in a concrete trait val now being recognized as such
    ```
    -trait T => true
    -method $init$ => false
    -value z1 => true
    -value z2 => true // z2 is actually concrete!
    ```

commit 6555c74
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   4 weeks ago

    bootstraps again by running info transform once per class...

    not sure how this ever worked, as separate compilation would transform a trait's info
    multiple times, resulting in double defs...

commit 273cb20
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    skip presuper vals in new encoding

commit 728e71e
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    incoherent cyclic references between synthesized members

    must replace old trait accessor symbols by mixed in symbols
    in the infos of the mixed in symbols

    ```
    trait T { val a: String ; val b: a.type }
    class C extends T {
      // a, b synthesized, but the a in b's type, a.type, refers to the original symbol, not the clone in C
    }
    ```

    symbols occurring in types of synthesized members
    do not get rebound to other synthesized symbols

    package <empty>#4 {
      abstract <defaultparam/trait> trait N#7352 extends scala#22.AnyRef#2378 {
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$self_$eq#15011(x$1#15012: <empty>#3.this.N#7352): scala#23.this.Unit#2340;
        <method> <deferred> <mutable> <accessor> <triedcooking> <sub_synth> def N$_setter_$n_$eq#15013(x$1#15014: N#7352.this.self#7442.type): scala#23.this.Unit#2340;
        <method> def /*N*/$init$scala#7441(): scala#23.this.Unit#2340 = {
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> <sub_synth> def self#7442: <empty>#3.this.N#7352;
        N#7352.this.N$_setter_$self_$eq#15011(scala#22.Predef#1729.$qmark$qmark$qmark#6917);
        <method> <deferred> <stable> <accessor> <sub_synth> def n#7443: N#7352.this.self#7442.type;
        N#7352.this.N$_setter_$n_$eq#15013(N#7352.this.self#7442)
      };
      abstract class M#7353 extends scala#22.AnyRef#2378 {
        <method> <triedcooking> def <init>#13465(): <empty>#3.this.M#7353 = {
          M#7353.super.<init>scala#2719();
          ()
        };
        <method> <deferred> <stable> <accessor> <triedcooking> def self#13466: <empty>#3.this.N#7352;
        <method> <deferred> <stable> <accessor> def n#13467: M#7353.this.self#13466.type
      };
      class C#7354 extends M#7353 with <empty>#3.this.N#7352 {
        <method> <stable> <accessor> <triedcooking> def self#15016: <empty>#3.this.N#7352 = C#7354.this.self #15015;
        <triedcooking> private[this] val self #15015: <empty>#3.this.N#7352 = _;
        <method> <stable> <accessor> def n#15018: C#7354.this.self#7442.type = C#7354.this.n #15017;
        <triedcooking> private[this] val n #15017: C#7354.this.self#7442.type = _;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$self_$eq#15019(x$1#15021: <empty>#3.this.N#7352): scala#23.this.Unit#2340 = C#7354.this.self #15015 = x$1#15021;
        <method> <mutable> <accessor> <triedcooking> def N$_setter_$n_$eq#15022(x$1#15025: C#7354.this.self#7442.type): scala#23.this.Unit#2340 = C#7354.this.n #15017 = x$1#15025;
        <method> def <init>#14997(): <empty>#3.this.C#7354 = {
          C#7354.super.<init>#13465();
          ()
        }
      }
    }

    [running phase pickler on dependent_rebind.scala]
    [running phase refchecks on dependent_rebind.scala]
    test/files/trait-defaults/dependent_rebind.scala:16: error: overriding field n#15049 in trait N#7352 of type C#7354.this.self#15016.type;
     value n #15017 has incompatible type;
     found   : => C#7354.this.self#7442.type (with underlying type => C#7354.this.self#7442.type)
     required: => N#7352.this.self#7442.type
    class C extends M with N
          ^

    pos/t9111-inliner-workaround revealed need for:
-  override def transformInfo(sym: Symbol, tp: Type): Type = synthFieldsAndAccessors(tp)
+  override def transformInfo(sym: Symbol, tp: Type): Type = if (!sym.isJavaDefined) synthFieldsAndAccessors(tp) else tp

commit b56ca2f
Author: Adriaan Moors <adriaan.moors@typesafe.com>
Date:   6 weeks ago

    static forwarders & private[this] val in trait

    object Properties extends PropertiesTrait

    trait PropertiesTrait {
      // the protected member is not emitted as a static member of  -- it works when dropping the access modifier
      // somehow, the module class member is considered deferred in BForwardersGen
      protected val propFilename: String = /
    }

    // [log jvm] No forwarder for 'getter propFilename' from Properties to 'module class Properties': false || m.isDeferred == true || false || false

    // the following method is missing compared to scalac
    // public final class Properties {
    //     public static String propFilename() {
    //         return Properties$.MODULE$.propFilename();
    //     }

    trait Chars {
      private[this] val char2uescapeArray = Array[Char]('\', 'u', 0, 0, 0, 0)
    }

    object Chars extends Chars

    // +++ w/reflect/scala/reflect/internal/Chars$.class
    // -  private final [C scala83014char2uescapeArray

    constant fold in forwarder for backwards compat
    constant-typed final val in trait should yield impl method

    bean{setter,getter} delegates to setter/getter (commit 1655d1b)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
3 participants